2015-04-01 7 views
6

Jak mogę programowo określić bieżące ustawienie dla Option Base w VBA? Numer Option Base można ustawić na 0 lub 1, a to określa, czy indeksy tablic zaczynają się od 0 lub 1 (patrz MSDN).Jak programowo określić bieżące ustawienie Bazy opcji w VBA

Jednak nie widzę łatwego sposobu sprawdzenia aktualnego ustawienia. Miałam nadzieję, że może być Option() funkcja, że ​​mogę przekazać parametr do, coś takiego:

Debug.Print Option("Base") 

i byłoby mi powiedzieć, ale nie wydaje się tam być.

+4

Czy istnieje powód, dla którego tego potrzebujesz? Jeśli użyjesz 'LBound' i' UBound', nie ma znaczenia, które ustawienie zostanie użyte. – jonrsharpe

+0

Możesz zdefiniować tablicę i sprawdzić, czy 'LBound' to' 0' lub '1'. Ale jeśli "podstawa opcji" jest określona przez koder, dlaczego ta sama osoba musi ją znaleźć. Wyszukaj w kodzie instrukcję 'Option Base', aby ją znaleźć. –

+0

Downvoter/Close voter. Byłoby miło, gdyby zostawić komentarz wyjaśniający, co jest tak niejasne. Wygląda dla mnie całkiem jasno. – RubberDuck

Odpowiedz

7

Chociaż zgadzam się z @jonsharpe, że jeśli używasz Lbound(arr) i Ubound(arr), nie musisz wiedzieć o tym w czasie wykonywania, ale myślę, że to interesujące pytanie.

Najpierw przykład prawidłowego zapętlenia się w tablicy.

For i = LBound(arr) To Ubound(arr) 
    ' do something 
Next 

Teraz, w tym celu dokładnie co prosiłeś, będziesz mieć dostęp do korzystania z biblioteki VBIDE. Inaczej nazywana biblioteką "Microsoft Visual Basic for Applications Extensibility". Zapewnia dostęp do IDE i kodu za pomocą niego. Możesz go użyć, aby dowiedzieć się, czy zostało zadeklarowane, czy zostało ono oznaczone jako Option Base 1. Nie polecam jednak próbować tego zrobić w czasie wykonywania. Byłoby to bardziej przydatne jako rodzaj statycznej analizy kodu podczas tworzenia.

Najpierw musisz add a reference to the library i grant the code access to itself. Gdy to zrobisz, poniższy kod powinien zrobić to, co chcesz.

Public Sub FindOptionBase1Declarations() 

    Dim startLine As Long 
    startLine = 1 

    Dim startCol As Long 
    startCol = 1 

    Dim endLine As Long 
    endLine = 1 ' 1 represents the last line of the module 

    Dim endCol As Long 
    endCol = 1 ' like endLine, 1 designates the last Col 

    Dim module As CodeModule 
    Dim component As VBComponent 
    For Each component In Application.VBE.ActiveVBProject.VBComponents ' substitute with any VBProject you like 
     Set module = component.CodeModule 

     If module.Find("Option Base 1", startLine, startCol, endLine, endCol, WholeWord:=True, MatchCase:=True, PatternSearch:=False) Then 

      Debug.Print "Option Base 1 turned on in module " & component.Name 

      ' variables are passed by ref, so they tell us the exact location of the statement 
      Debug.Print "StartLine: " & startLine 
      Debug.Print "EndLine: " & endLine 
      Debug.Print "StartCol: " & startCol 
      Debug.Print "EndCol: " & endCol 

      ' this also means we have to reset them before we look in the next module 
      startLine = 1 
      startCol = 1 
      endLine = 1 
      endCol = 1 
     End If 

    Next 

End Sub 

Aby uzyskać więcej informacji, patrz CodeModule.Find documentation.


przypadku korzystania dodatek jest opcją, @ projektu open source Mat'sMug a ja za Rubberduck ma Code Inspection że pokaże wszystkie wystąpienia tego całego aktywnego projektu.

Option Base 1 Code Inspection

See this for more information on that particular inspection.

+0

Czy nie jest łatwiej po prostu utworzyć tablicę i sprawdzić jej "LBound"? – jonrsharpe

+0

Niesamowita odpowiedź i oczekuję, że można ją łatwo zmodyfikować, aby działała z innymi opcjami, a może nawet utworzyć funkcję uświęconej Option(), której szukam. @jonsharpe ma rację, to było trochę akademickie pytanie, ale cieszę się, że to też było interesujące. Jest to jednak rutyna rutyny i przewijanie do góry modułu (tak, wiem o Ctrl + Home) nie wydaje się jednak takim złym pomysłem. ;) – Caltor

+0

Tak. Pewnie, że to jest @jonrsharpe, ale nie o to prosił OP. – RubberDuck

2
Function GetBaseOption() As Long 

    Dim arr 

    arr = Array("a") 
    GetBaseOption = LBound(arr) 

End Sub 
+0

Ładne rozwiązanie. Zastanawiam się, czy udało ci się to z powodzeniem w bezpośrednim oknie. – RubberDuck

+0

@RubberDuck po prostu zmień go na funkcję i zwróć 'LBound' zamiast go wydrukować i możesz go użyć w Natychmiastowym nie ma problemu. – Brad

+1

@RubberDuck - Nie wiem, w jakim kontekście (jeśli uruchomiłeś go całkowicie w oknie Natychmiastowym) - może być niewiarygodny, ponieważ możesz mieć różne ustawienia Base w każdym module kodu. –

Powiązane problemy