Mam plik programu Excel z wieloma kartami. Mam arkusz roboczy z pewnym kodem, który działa poprawnie. Ten kod odnosi się również do danych na niektórych kartach "wzorcowych". Muszę zduplikować ten arkusz, aby przenieść wspólne funkcje do modułu. Teraz otrzymuję VBA 1004
błąd podczas próby uzyskania dostępu do zakresu w tym samym arkuszu.
Dim selectedRange As Range
Set selectedRange = Worksheets(name).Range("A1", _
Range("A" & Rows.count).End(xlUp)) "Error Line
Ten kod zadziałał dobrze, dopóki nie przeniosłem go do modułu. Działa, jeśli umieściłem
Worksheets(name).Select
przed nim, ale będę musiał to zrobić zbyt wiele razy. Na podstawie tego zapytania: Błąd VBA 1004 - wybrana metoda klasy zakresu nie powiodła się
kod powinien działać poprawnie bez .Select
. I działa tak długo, jak kod znajduje się w arkuszu roboczym. Dlaczego przeniesienie kodu do modułu powoduje problem?
Odpowiedzi:
1 dla odpowiedzi № 1U użyj Właściwości Range i Rows bez kwalifikatora obiektu. W przypadku użycia bez kwalifikatora obiektu te właściwości są skrótem dla ActiveSheet.Range / ActiveSheet.Rows.
Tak więc kod robi to:
Worksheets(Name).Range("A1", ActiveSheet.Range("A" & ActiveSheet.Rows.Count).End(xlUp))
Ale arkusz roboczy (nazwa) może się różnić od aktywnego arkusza, więc jest lepszy:
Worksheets(Name).Range("A1", Worksheets(Name).Range("A" & Worksheets(Name).Rows.Count).End(xlUp))
W bloku With-End With:
With Worksheets(name)
Set selectedRange = .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
End With
Zapewniono więc, że właściwości Zakres / Wiersze są stosowane w obiekcie arkusza roboczego (nazwa).
0 dla odpowiedzi nr 2
Kiedy robisz rzeczy na arkuszu, naprawdę nie potrzebujesz wyraźnych deklaracji do tego arkusza.
Jednak podczas pracy z modułem i interakcji z innymi arkuszami, musisz określić, z którym arkuszem chcesz pracować. Więc Wybierz arkusz, zanim możesz Wybierz Zakres. Aby powiedzieć: WYBIERZ RODZICĘ PRZED WYBOREM DZIECI :) Należy pamiętać, że poniżej jest tylko wyjaśnienie logiczne. Nie dokładna składnia kodu.
Dlatego sugeruję utworzenie poniższej zmiennej arkusza roboczego i ustawienie w niej potrzebnego obiektu arkusza roboczego.
na przykład
Dim WS as Worksheet
Dim selectedRange As Range
Set WS = Sheets("Shee1")
Set selectedRange = WS.Range("A1", _
Range("A" & Rows.count).End(xlUp)) "Error Line
Jeśli chcesz odnieść się do wszystkich arkuszy, możesz użyć indeksu każdego arkusza
Na przykład. ThisWorkBook.Sheets(i) "i is an integer
Następnie pętla lub cokolwiek, jak uważa, do struktury programu.
Dalej nie musisz używać Select
w arkuszu roboczym, aby wskazać zakres w tym arkuszu. Zgodnie z powyższym kodem można ustawić arkusz roboczy i ustawić zakres, który należy przetworzyć. Podczas optymalizacji wykonywania VBA select
jest zwykle tabu. Ponadto program Excel 2007 nie zachowuje aktywnego arkusza w taki sam sposób, w jaki były używane starsze wersje.