/ / Pewne wątpliwości dotyczące Dim and Set Worksheet - excel, vba

Pewne wątpliwości dotyczące Dim and Set Worksheet - excel, vba

Zwykle należy najpierw wykonać Dim, a potem Set w kodzie vba, jak w poniższym kodzie.

Dim xWs1 As Worksheet
Dim xWs2 As Worksheet
.
.
.
Dim xWsN As Worksheet
Set xWs1 = Worksheets("A")
Set xWs2 = Worksheets("B")
.
.
.
Set xWsN = Worksheets("NNN")

Jeśli potrzebuję przyciemnić i ustawić 5 arkuszy, potrzebne będzie 10 wierszy kodu. Wygląda na to, że kod będzie zbyt długi, gdy będę musiał przyciemnić i ustawić więcej niż 5 arkuszy.

Odkryłem, że jeśli użyję Set, kod vba może również działać poprawnie. Chciałbym zapytać, czy nie spowoduje to żadnych problemów, jeśli nie użyję Dim?

Set xWs1 = Worksheets("A")
Set xWs2 = Worksheets("B")
.
.
.
Set xWsN = Worksheets("NNN")

Dzięki!

Odpowiedzi:

2 dla odpowiedzi № 1

Weźmy następujący przykład, dlaczego użycie niejawnej deklaracji zmiennej jest zazwyczaj zły pomysł:

Sub Test()

myVariable = 10

myOutcome = myVaraible + 5

End Test

myOutcome = 5. Czy widzisz dlaczego?

Źle napisałem myVariable w drugiej linii, więc po prostu stworzyłem zupełnie nową zmienną myVaraible (która miała domyślną wartość 0).

Dlatego zawsze powinieneś używać Option Explicit na początku każdego modułu; i dlaczego powinieneś zawsze jawnie deklarować wszystkie zmienne.

Mimo że nadal działa, ustawiamy się na niepotrzebne debugowanie bólów głowy.


Jeśli problem polega na tym, że chcesz skompresować swój kod, aby użyć mniej linii, możesz zrobić coś takiego:

Option Explicit

Sub Test()

Dim myVariable As Long:    myVariable = 10
Dim myOutput As Long
myOutput = myVariable + 5

End Sub

Możesz także zadeklarować wiele zmiennych w tej samej linii:

Option Explicit

Sub Test()

Dim myVariable As Long, myOutput As Long
myVariable = 10
myOutput = myVariable + 5

End Sub

Niekoniecznie polecam to (jak to możliwe)obniżenie czytelności), ale to kolejna metoda deklarowania zmiennych. Wymaga to tego samego typu danych, ale możesz dodać swoje arkusze w tablicy (z Twojego przykładu):

Option Explicit

Sub Test()

Dim xWs(1 To 5) As Worksheet

Set xWs(1) = Worksheets("A")
Set xWs(2) = Worksheets("B")
Set xWs(3) = Worksheets("C")
Set xWs(4) = Worksheets("D")
Set xWs(5) = Worksheets("E")

End Sub

1 dla odpowiedzi nr 2

Jeśli nie używasz instrukcji dim, zmienna jest automatycznie tworzona jako typ Variant.

Typ Variant może być liczbą całkowitą, ciągiem znaków, askoroszyt lub jakikolwiek inny typ zmiennej i może się zmieniać wraz ze zmianą zmiennej, w jednym momencie może być ciągiem, a następnie można go zmienić na skoroszyt.

Używanie Dim

wprowadź opis obrazu tutaj

Bez użycia Dim

wprowadź opis obrazu tutaj

Istnieją dwa główne problemy z nie używaniem Dim,

  1. Warianty używają więcej pamięci komputera, dzięki czemu kod będzie spowalniał, zwłaszcza gdy używasz pętli.
  2. Trudno znaleźć błędy (w twoim przypadku możesz przypisać coś do zmiennej XWs1, takiej jak liczby, nazwy itp., Których można uniknąć, jeśli używasz przyciemnienia)

1 dla odpowiedzi nr 3

Jeśli „zajmowanie miejsca” jest twoim problemem, a hipotetycznie chcesz wyraźnie ustawić 5 zmienne poziomu procedury (w1..w5) do Set do 5 arkusze robocze (Sht1..Sht5), możesz użyć:

Przykład 1:

DefObj W
Sub wSet1()
Dim w1, w2, w3, w4, w5
Set w1=[Sht1]:Set w2=[Sht2]:Set w3=[Sht3]:Set w4=[Sht4]:Set w5=[Sht5]
End Sub

... lub jeszcze bardziej wydajne miejsce, na przykład 92 arkusze robocze do Set w 92 zadeklarowane zmienne? Następnie:

Przykład # 2:

DefObj W
Sub wSet2():Dim wks(1To 92),x:For x=1To 92:Set wks(x)=Sheets("Sht"&x):Next x:End Sub

(To 92 znaki ... nie licząc posuwu wiersza!)


Wyjaśnienie:

Pomiędzy tymi dwoma sposobami skracania deklaracji używamy sześciu skrótów. Poniżej znajduje się podsumowanie każdego z nich i zobacz linki pod „Więcej informacji”, aby uzyskać pełną dokumentację każdego z nich.

Zrzeczenie się: Jest wiele powodów, których nie powinniśmy używaćskróty w programowaniu. Oczywistym jest to, że im bardziej kompresujesz kod, tym trudniej jest go przeczytać i zrozumieć (zwłaszcza przez innych), a zatem może być trudniej rozwiązać lub rozwinąć.

Jeśli nie wiesz, jakie są „standardowe metody”nie, najpierw nie ucz się skrótów! Dowiedz się, jak robić rzeczy „WŁAŚCIWY SPOSÓB” przed nauką skrótów, bez względu na to, jak atrakcyjne mogą się wydawać. Był czas, kiedy twierdziłem, że schludność jest jak wcięcie i komentowanie, i pełny, właściwe techniki, to nie miało znaczenia. Myliłem się, musiałem się tego nauczyć w trudny sposób. ale przynajmniej:

Nie używaj skrótów podczas publikowania przykładowy kod w pytaniach dotyczących przepełnienia stosu. (To jest nie metoda [MCVE]!) Prawdopodobnie będziesz krzyczał na! ... a może masz pytania w dół lub zignorowane ... Zostałeś ostrzeżony!


DefObj (Domyślne typy danych)

[Deftype statements][1] are a forgotten method of declaring default data types.  Normally, the default data type is [`Variant`][2], so this:

Dim myVariable as Variant

... jest identyczny z:

Dim myVariable

...Jednakże DefObj W instrukcja (używana na poziomie modułu) mówi:

Wszystkie zmienne zadeklarowane w tym module, to zaczyna się od litery „W” domyślnie wpisz Object (o ile nie podano inaczej). Zauważ to Defekty oświadczenia muszą być używane na poziomie modułu (przed pierwszym Sub).

Cała lista: (Więcej informacji)

DefBool DefByte DefCur DefDate DefDbl DefDec DefInt DefLng DefSng DefStr DefObj DefVar


, (Przecinki w „Dim” Statements)

Podczas deklarowania zmiennych za pomocą Dim, wiele zmiennych może być wymienionych w tej samej linii, oddzielonych przecinkiem. Dlatego:

Sub mySub()
Dim myVariable1 as Currency
Dim myVariable2 as Currency
…

... jest identyczny z tym: (łącząc przykłady z Defekty)

DefCur m
Sub mySub()
Dim myVariable1, myVariable1
…

Sheets (Kolekcja „Arkusze”)

  • The WorkSheets Obiekt odnosi się do kolekcji wszystkie Arkusz roboczy obiekty w określonym lub aktywnym skoroszycie.

  • The Charts Obiekt` odnosi się do kolekcji ** wszystkich Wykres obiekty w określonym lub aktywnym skoroszycie.

    • Ale **Sheets Obiektrefers to ***both*** theArkusze robocze*and*Kolekcje wykresów.

Tak więc, jeśli skoroszyt ma 3 arkusze robocze i 2 arkusze wykresów, w VBA:

  • Sheets.Count wróci 5

  • Worksheets.Count wróci 3

Ostrzeżenie: Za pomocą Sheets może spowodować konflikt, jeśli masz wykres i aArkusz o tej samej nazwie (i należy go unikać również w przypadku odwoływania się do arkuszy w innych plikach). Ale w przypadku prostego skoroszytu z pojedynczym plikiem i arkuszem roboczym zaoszczędź trochę Work i trzymaj się tylko Sheets.


[ ] (Skróty odniesienia do wsporników kwadratowych)

[Nawiasy kwadratowe] mogą być używane jako skróty w odniesieniu do Arkusze robocze, Zakresy komórek i indywidualny Komórki. Możesz użyć albo A1 Styl odniesienia lub nazwany zakres w nawiasie jako skrót dla właściwości Range. Nie musisz wpisywać słowa „Zakres” ani używać cudzysłowów.

Worksheets("Sheet1").[A1:B5].ClearContents

[MyRange].Value = 30

To jest ledwo udokumentowanea nawet mniej udokumentowany jest fakt, że w przypadku użycia w porządku logicznym nawiasy kwadratowe mogą być używane w odniesieniu do arkuszy.

Łączenie przykładów, wszystkie te stwierdzenia będą miały identyczny wynik:

Worksheets("Sheet1").Range("A1") = Now()
Sheets("Sheet1").Range("A1") = Now()
Worksheets("Sheet1").[A1] = Now()
Sheets("Sheet1").[A1] = Now()
[Sheet1].[A1] = Now()

wks() (Tablice zmiennych)

Jeśli masz dużą liczbę podobnych obiektówdeklaruj, to jest często łatwiejsze (i bardziej zorganizowane) grupowanie ich w tablicy.Można zadeklarować tablicę jako dowolny typ, na przykład Obiekt, Arkusz. (... lub nawet rzadko używane i dziwaczne typy jak LongLong i IConverterApplicationPreferences. (Najwyraźniej ktokolwiek wymyślił, że nie dba o skróty.)


For..Set..Next (Pętla, aby ustawić tablice zmiennych)

Przy użyciu tablicy obiektów (dowolnych zestawów zmiennych), następnym logicznym krokiem jest zredukowanie kodu za pomocą wszelkich zadań, które muszą być wykonane na całej grupie obiektów.


Inne notatki:

Przykład # 1 mógł zostać skompresowany do jednej linii, ale chciałem, aby był łatwy do odczytania w odpowiedzi. Jeśli nasze nazwy arkuszy były S1..S5 zamiast oh-tak-długi Sht1..Sht5, i Używamy :, moglibyśmy osiągnąć to samo za pomocą 105 znaków:

Przykład # 1b:

DefObj W
Sub wSet():Dim w1,w2,w3,w4,w5:Set w1=[S1]:Set w2=[S2]:Set w3=[S3]:Set w4=[S4]:Set w5=[S5]:End Sub

Symbole skrótów typu danych

Inny rzadko używany zestaw pochodzi z 1974 roku: skróty typu danych wybrane przez Gary Kildall dla systemu operacyjnego CP / M

Symbol  Data Type  Constant                                                            

%       Integer    vbInteger = 2
$       String     vbString = 8
&       Long       vbLong = 3
@       Decimal    vbDecimal = 6
!       Single     vbSingle = 4
#       Double     vbDouble = 5

Wciąż wspierane dzisiaj w wielu językach kodowania, można na przykład używać ich zamiennie:

Dim myVariable as String
Dim myVariable$

Więcej informacji: