/ / VBA Excel błąd po przeniesieniu kodu z arkusza roboczego do modułu - vba, excel-vba, excel-2007, excel

Błąd programu VBA Excel po przeniesieniu kodu z arkusza roboczego do modułu - vba, excel-vba, excel-2007, excel

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 № 1

U 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.