2012-03-29 26 views
6

Zrobiłem mały projekt, który składa się z 5 arkuszy Excela, kod działa poprawnie i uzyskuję dokładny wynik również, ale jeśli zmienię nazwę arkusza z arkusza 1 na inną nazwę, Dostaję Indeks dolny poza zasięgiem Błąd.Indeks dolny poza zakresem Błąd po zmianie nazwy arkuszy

Jaki jest tego powód i co należy zrobić, aby temu zaradzić. Proszę pomóż.

Poniżej znajduje się kod

Public Sub amount_final() 

Dim Row1Crnt As Long 
Dim Row2Crnt As Long 


With Sheets("sheet4") 
Row1Last = .Cells(Rows.Count, "B").End(xlUp).Row 
End With 

Row1Crnt = 2 
With Sheets("sheet3") 
Row2Last = .Cells(Rows.Count, "B").End(xlUp).Row 
End With 
+0

proszę pisać kodu, jak również –

+0

Proszę wkleić kod tutaj – playercharlie

Odpowiedz

11

Nie ma nic złego z kodem per se. Otrzymasz Subscript out of range błąd, jeśli Excel nie jest w stanie znaleźć konkretnego arkusza, który jest dość oczywisty, ponieważ zmieniłeś jego nazwę. Jeśli na przykład zmienisz nazwę arkusza "Arkusz3" na "Arkusz XYZ", program Excel nie będzie mógł go znaleźć.

Jedynym sposobem na uniknięcie tego rodzaju błędów jest użycie CODENAME arkuszy. Zobacz Snapshot

enter image description here

Tutaj mamy arkusz, który ma nazwę „Nazwa Odsłuch przed zmianą nazwy”

więc rozważyć ten kod

Sheets("Sample Name before Renaming").Range("A1").Value = "Blah Blah" 

Ten sam kod może być zapisana jako

Sheet2.Range("A1").Value = "Blah Blah" 

Teraz bez względu na to, ile razy zmienisz nazwę e arkusza, powyższy kod będzie zawsze działa :)

HTH

Sid

+0

+1 ładne wyjaśnienie z migawka :) –

+0

Dzięki siddharth, ładne i proste wyjaśnienie. – neobee

+0

+1 dobrze osłonięty Sid – brettdj

1

Podstawowym problemem jest to, że odnoszą się do arkuszy przy użyciu ich nazw zwyczajowych, a nie ich nazwy kodowe. Ilekroć odwołujesz się do Arkuszy ("arkusz 4"), polegasz na arkuszu o tej nazwie w Excelu. Nazwy kodowe to nazwy przypisane w języku Visual Basic, więc użytkownik końcowy nie wchodzi z nimi w interakcje/jako programista można zmienić nazwy Excela w dowolnym momencie. Nazwa użytkownika jest oznaczona na około 9:40 w tym . Zauważ, że są one szybsze do wpisania niż nazwy w Excelu, ponieważ nie wymagają kwalifikatora "Arkuszy()"

Nie mogę zobaczyć Arkuszy ("Arkusz1") w próbce kodu, ale możesz przełączyć na nazwy kodowe dla wszystkie arkusze bardzo szybko, znajdując/zastępując wszystkie przykłady np "Arkusze (" Arkusz2 ")." z "Arkusz2".

0

Odwołaj się do każdego arkusza zamiast ich nazw kodowych. Są one ustawione domyślnie jako Arkusz1, Arkusz2 itd., Ale możesz zmienić ich nazwę w oknie Właściwości dla każdego arkusza, jeśli chcesz. W ten sposób możesz napisać swój kod, jak poniżej, bez względu na to, jak nazywasz arkusze.

With Sheet1 
Row1Last = .Cells(Rows.Count, "B").End(xlUp).Row 
End With 

Row1Crnt = 2 
With Sheet2 
Row2Last = .Cells(Rows.Count, "B").End(xlUp).Row 
End With 

etc... 
0

Chciałem podzielić się moim doświadczeniem, walcząc z tym problemem. Oto błąd popełniłem:

Dim DailyWSNameNew As String 
lastrow = Sheets("DailyWSNameNew").Range("A65536").End(xlUp).Row + 1 -- This is wrong as I included a placeholder worksheet name in quotes 

Korekta:

lastrow = Sheets(DailyWSNameNew).Range("A65536").End(xlUp).Row + 1 

to rozwiązać go.

0

Napotkano ten błąd wcześniej, ale nie mogłem użyć żadnego rozwiązania powyżej, jednak w końcu udało mi się go rozwiązać samodzielnie.

Moja sytuacja polegała na tym, że miałem listę zawartą w kolumnie A. Dla każdej komórki z wartością zapisałem wartość w zmiennej, utworzyłem nowy arkusz i nazwałam arkusz zgodnie z wartością przechowywaną w zmiennej.

Nieco później w kodzie Starałem się wybrać nowo utworzonego arkusza za pomocą kodu:

Sheets(ValueVariable).Select 

natknąłem się „Indeks dolny spoza zakresu” błąd i nie mogę zrozumieć, dlaczego. Użyłem już tego samego kodu z powodzeniem. Jednak udało mi się go rozwiązać, odrzucając zmienną jako ciąg znaków. Deklarowanie zmiennej jako łańcucha wydawało się nie działać dla mnie.

Tak więc, jeśli ktoś wystąpi ten błąd i chcą czegoś spróbować, być może to będzie pracować dla Ciebie:

Sheets(Cstr(ValueVariable)).Select 
Powiązane problemy