Dim wkbkdestination As Workbook
Dim destsheet As Worksheet
For Each ThisWorkSheet In wkbkorigin.Worksheets
'this throws subscript out of range if there is not a sheet in the destination
'workbook that has the same name as the current sheet in the origin workbook.
Set destsheet = wkbkdestination.Worksheets(ThisWorkSheet.Name)
Next
Zasadniczo przeglądam wszystkie arkusze w skoroszycie źródłowym, a następnie ustawiam destsheet
w skoroszycie docelowym arkusz o tej samej nazwie, co obecnie iterowany arkusz w skoroszycie źródłowym.
Jak mogę sprawdzić, czy ten arkusz istnieje? Coś jak:
If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then
Odpowiedzi:
Niektórzy ludzie nie lubią tego podejścia z powodu „niewłaściwego” użycia obsługi błędów, ale myślę, że jest to akceptowalne w VBA ... Alternatywnym podejściem jest zapętlenie wszystkich arkuszy, aż znajdziesz dopasowanie.
źródło
ActiveWorkbook
zamiastThisWorkbook
. To ostatnie odnosi się do skoroszytu zawierającego kod makra, który może różnić się od skoroszytu, niż chce się przetestować. Myślę, żeActiveWorkbook
przydałby się w większości przypadków (jednak wymyślone sytuacje są zawsze dostępne).sht Is Nothing
będzieTrue
, jeśli nie ma arkusz o tej nazwie, ale chcemy wrócićTrue
, jeśli nie jest arkusz o tej nazwie, stąd też nie. Jest to trochę łatwiejsze (ale nie ważne), jeśli trochę zmienisz ustawienieSheetExists = sht Is Not Nothing
If wb Is Nothing Then Set wb = ThisWorkbook
naIf wb Is Nothing Then Set wb = ActiveWorkbook
Jeśli jesteś szczególnie zainteresowany tylko arkuszami roboczymi, możesz skorzystać z prostego wezwania do oceny:
źródło
Aby to osiągnąć, nie potrzebujesz obsługi błędów. Wszystko, co musisz zrobić, to powtórzyć wszystkie arkusze robocze i sprawdzić, czy określona nazwa istnieje:
źródło
Ponieważ sprawdzanie członków kolekcji jest ogólnym problemem, oto abstrakcyjna wersja odpowiedzi Tima:
Funkcja ta może być stosowana do każdego zbioru, jak obiekt (
Shapes
,Range
,Names
,Workbooks
, itd.).Aby sprawdzić istnienie arkusza, użyj
If Contains(Sheets, "SheetName") ...
źródło
Set
słowo kluczowe zgłosi błąd . Okazało się, że zamiast używaćSet
, proszenieTypeName
członka kolekcji działa we wszystkich przypadkach, tj.TypeName objCollection(strName)
Sub Test() On Error GoTo errhandler Debug.Print Contains(Workbooks, "SomeBookThatIsNotOpen") errhandler: If Err.Number <> 0 Then Stop End Sub
Poprawione: bez obsługi błędów:
źródło
W przypadku, gdy ktoś chce uniknąć VBA i sprawdzić, czy arkusz istnieje wyłącznie w formule komórki, można użyć funkcji
ISREF
iINDIRECT
:=ISREF(INDIRECT("SheetName!A1"))
Zwróci to,
TRUE
jeśli skoroszyt zawiera arkusz o nazwieSheetName
lub wFALSE
inny sposób.źródło
Napisałem to:
źródło
sheetExist = ActiveWorkbook.Sheets(sSheet).Index
Moje rozwiązanie wygląda podobnie jak Tims, ale działa również w przypadku arkuszy innych niż arkusze - wykresów
.
źródło
Umieść test w funkcji, a będziesz mógł go ponownie użyć i będziesz mieć lepszą czytelność kodu.
NIE używaj opcji „Przy następnym wznowieniu błędu”, ponieważ może to powodować konflikt z inną częścią kodu.
źródło
Wiele lat spóźniłem się, ale po prostu musiałem to zrobić i nie podobało mi się żadne z opublikowanych rozwiązań ... Więc wymyśliłem jedno, wszystko dzięki magii (gest tęczowych rąk SpongeBoba) „Oceń ()”!
Zwraca wartość TRUE, jeśli arkusz NIE istnieje; FAŁSZ, jeśli arkusz istnieje. Możesz zamienić dowolny zakres na „1: 1”, ale odradzam używanie pojedynczej komórki, ponieważ jeśli zawiera błąd (np. # N / A), zwróci True.
źródło
Kompaktowa
wsExists
funkcja ( bez polegania na obsłudze błędów!)Oto krótka i prosta funkcja, która nie polega na obsłudze błędów w celu określenia, czy arkusz istnieje ( i czy jest prawidłowo zadeklarowany do działania w każdej sytuacji!)
Przykładowe zastosowanie:
Poniższy przykład dodaje nowy arkusz o nazwie
myNewSheet
, jeśli jeszcze nie istnieje:Więcej informacji:
For Each
…Next
Instrukcja (VBA)Exit
Oświadczenie (VBA)źródło
Dlaczego po prostu nie użyć małej pętli do określenia, czy nazwany arkusz istnieje? Powiedz, czy szukasz arkusza roboczego o nazwie „Arkusz1” w aktualnie otwartym skoroszycie.
źródło
Jeśli jesteś fanem
WorksheetFunction.
lub pracujesz z kraju nieanglojęzycznego z programem Excel w języku innym niż angielski, jest to dobre rozwiązanie, które działa:Lub w funkcji takiej jak ta:
źródło
źródło
źródło
Zmień „Dane” na dowolną nazwę arkusza, dla którego testujesz ...
źródło
Bez wątpienia powyższa funkcja może działać, właśnie skończyłem z następującym kodem, który działa całkiem nieźle:
Uwaga: w tym
Sheets_Name
miejscu proszę użytkownika o wprowadzenie nazwy, więc może to nie być to samo dla Ciebie.źródło
Zrobiłem inną rzecz: usuń arkusz tylko wtedy, gdy istnieje - aby nie otrzymać błędu, jeśli nie:
źródło
Wymyśliłem łatwy sposób na zrobienie tego, ale nie stworzyłem dla niego nowego subwoofera. Zamiast tego po prostu „sprawdziłem” w subie, nad którym pracowałem. Zakładając, że nazwa arkusza, którego szukamy, to „Sheet_Exist” i chcemy ją po prostu aktywować, jeśli zostanie znaleziona:
Dodałem również wyskakujące okienko, gdy arkusz nie istnieje.
źródło
Wiem, że to stary post, ale oto inne proste rozwiązanie, które jest szybkie.
źródło
Krótkie i czyste:
źródło
Właściwie miałem prosty sposób, aby sprawdzić, czy arkusz istnieje, a następnie wykonać jakąś instrukcję:
W moim przypadku chciałem usunąć arkusz, a następnie odtworzyć ten sam arkusz o tej samej nazwie, ale kod został przerwany, jeśli program nie mógł usunąć arkusza, ponieważ został już usunięty
źródło