Błąd podczas wklejania walidacji w VBA - wskazówki dotyczące programu Excel

Spisie treści

Jeśli przeczytałeś kilka pierwszych rozdziałów VBA i makr dla Microsoft Excel, wiesz, że narzekam, że rejestrator makr Excela nie radzi sobie najlepiej z zapisywaniem używalnego kodu. Zwykle kod działa dobrze, ale jest zapisywany w taki sposób, że może nie być przydatny w przypadku zestawów danych o różnych rozmiarach. Kod może działać dobrze dzisiaj, ale nie jutro.

Napotkałem naprawdę dziwny problem, w którym rejestrator makr faktycznie rejestrował kod, który nie działał. Pisałem makro, które próbowało skopiować walidację z jednej komórki do zakresu komórek. W programie Excel 2002 ten kod wyglądał następująco:

Range(“E5”).Copy Range(“E6:E12”).PasteSpecial Paste:=xlPasteValidation

Ten kod działał dobrze w programie Excel 2002, ale zawiódł na komputerze klienta z programem Excel 2000. Jeden ze starych komputerów w biurze nadal ma program Excel 2000, więc próbowałem tam kod. Problem dotyczył xlPasteValidation. Zawsze, gdy napotykam coś niezwykłego, uruchamiam rejestrator makr, aby zobaczyć, jak rejestrator makr zarejestruje kod. Ustawiłem walidację w E5, włączyłem rejestrator makr, skopiowałem E5 i użyłem Paste Special - Validation. Po zatrzymaniu rejestratora makr zauważyłem, że Excel 2000 zapisał stałą jako:

Range(“E6:E12”).PasteSpecial Paste:=xlDataValidation

Poszedłem więc do aplikacji klienckiej, zmieniłem kod na xlDataValidation i uruchomiłem go ponownie. O dziwo, spowodował ten sam błąd!

Okazuje się, że rejestrator makr programu Excel 2000 faktycznie ma błąd. Zapisuje stałą xlDataValidation, ale interpreter makr nie rozpoznaje ani xlDataValidation, ani xlPasteValidation. Pomoc programu Excel VBA w programie Excel 2000 udaje, że nie ma możliwości wklejenia samych walidacji.

Aby to zadziałało, musisz odkryć podstawową wartość xlPasteValidation. Na mojej maszynie XL2002 przeszedłem do edytora VBA. Naciśnij Ctrl + G, aby otworzyć bezpośrednie okno i wpisz to w bezpośrednim okienku:

Print xlPasteValidation

Wciśnij Enter, a Excel 2002 powie Ci, że xlPasteValidation to przyjazny sposób powiedzenia „6”. Na komputerze z programem Excel 2000 wypróbowałem ten kod:

Range(“E6:E12”).PasteSpecial Paste:=6

Na szczęście to działa. W rzeczywistości jesteś zmuszony użyć podstawowej wartości zamiast stałej. W książce ostrzegam przed taką praktyką, ponieważ powoduje to, że program jest naprawdę trudny do odczytania dla następnej osoby, która patrzy na kod. W tym konkretnym przypadku naprawdę nie masz wyboru. Dodaj komentarz wyjaśniający, dlaczego zakodowałeś to w ten sposób:

‘Bug in XL2000; need to use “6” instead of the constant Range(“E6:E12”).PasteSpecial Paste:=6

Tak więc - dzisiejsza mała lekcja dotyczy bardzo specyficznego problemu, jak wkleić specjalną walidację w programie Excel 2000, ale większą lekcją jest praca detektywa wymagana do ustalenia, co się dzieje, gdy w Excel VBA dzieje się coś dziwnego.

Interesujące artykuły...