2009-07-24 9 views
7

Naprawiam kilka modułów w skoroszycie programu Excel 2003 i ten sam zestaw arkuszy roboczych jest zadeklarowany w każdej procedurze w każdym module; Chciałbym je zadeklarować raz na świecie. Mogę ustawić nazwę arkusza jako dosłownym, npCzy obiekt z arkuszem roboczym może być zadeklarowany globalnie w programie Excel VBA?

Public Const xlwkGSModel = "gs_model" As String 

a potem w zastosowaniu procedury:

...ActiveWorkbook.Worksheets(xlwkGSModel).Cells(1,1) 

Ale czy istnieje sposób deklarowania obiekt arkusza tak, że kod w procedurze mogą być:

...xlwkGSModel.Cells(1,1) 

Odpowiedz

10

„1. Wstaw moduł

'2. Zadeklaruj publiczną zmienną arkusza roboczego w module w następujący sposób:

Public xlwkGSModel As Worksheet 

"3. Wystąpienia tej zmiennej publicznych w przypadku obciążenia aplikacji

Sub Workbook_Open() 

    Set xlwkGSModel = ActiveWorkbook.Worksheets("gs_model") 

End Sub 

„Teraz można odnieść arkusz gs_model ze zmienną xlwkGSModel

” Na przykład

dim x as string 

x = xlwkGSModel.Cells(1,1) 
0

Edit: komentarz przez Alistair Knock jest poprawna, powinienem przeczytać pytanie dokładnie - oczywiście moja odpowiedź brzmi: nie t ważny dla obiektów, tylko dla typów takich jak ciąg lub liczba całkowita. W przypadku obiektów potrzebna jest funkcja lub podła, która tworzy instancję.


Tak, możesz, ostatnio to zrobiłem. Jeśli zdefiniujesz swoje definicje jako Public, możesz ich użyć bezpośrednio w innych modułach (oczywiście w tym samym skoroszycie).

Być może najlepszym rozwiązaniem jest posiadanie osobnego modułu Globals i umieszczenie ich tam.

+0

Przypuszczalnie podczas gdy definicje można wprowadzić na poziomie modułu, wartości będą musiały zostać przypisane w procedurze, np. w Workbook_Open()? Ponieważ stała nie może zawierać przedmiotów ... –

4

Można, ale czy naprawdę chcesz więcej zmiennych globalnych? Dlaczego nie stworzyć (w standardowym module) własność publiczną ModelWorksheet, tak:

Public Property Get ModelWorksheet As Worksheet 
    Const ModelWorksheetName As String = "gs_model" 
    Set ModelWorksheet = ActiveWorkbook.Worksheets(ModelWorksheetName) 
End Property 

... wtedy kod może zrobić:

With ModelWorksheet 
    .Cells(1,1).Value = "foo" 
    .Font.Bold = True 
End With 

Należy również zauważyć, że można odwołać się do któregokolwiek z arkusze w bieżącym skoroszycie bezpośrednio, więc jeśli istnieje arkusz o nazwie Arkusz1 można zrobić:

With Sheet1 
    .Cells(1,1).Value = "foo" 
    .Font.Bold = True 
End With 
+1

Myśląc o tym ... Nie wiem, czy bym to polecił. Problem z właściwością polega na tym, że wygląda jak obiekt i jeśli znajdujesz się w pętli, która aktualizuje, powiedzmy, 15000 komórek jeden po drugim, to jest dużo dodatkowego pośrednictwa, aby przejść przez każdy cykl. Myślę, że byłoby lepiej użyć bezpośredniego odniesienia do arkusza, ale YMMV. Nadal uważam, że lepiej jest przejść do Dim sht jako Arkusz roboczy/Set sht = ModelWorksheet()/sht.Cells (1,1) ... i umieścić chwytak arkuszy w funkcji ModelWorksheet. Wiem, że nie zmniejsza to liczby linii, ale globalne podejście jest zwykle nierozsądne. –

+0

@goodgai: Zgadzam się z całego serca; to właśnie dlatego użyłem instrukcji With, aby uniknąć dwukrotnego odniesienia do właściwości, ale powinienem być bardziej konkretny. I masz rację, nawet ta metoda nie jest zbyt pomocna w pętli (chyba że z ... End With zawija całą pętlę). –

+2

Tak, zauważyłem Zsów w twojej odpowiedzi i zobaczyłem, co robiłeś, ale zabrakło mi postów w moim komentarzu =) Wypracowałem to, co starałem się teraz powiedzieć, zwięźle: programowanie obronne - unikając własności, którą jesteś mniej prawdopodobne, że wpadną w pułapkę wyników przez przypadek. –

5

Jest to bardzo dawno temu, ale lepiej późno niż wcale ;-) Nie wiem, czy to działa w programie Excel 2003 (testowane z 2007):

Nie musisz nawet deklować są arkuszami w kodzie, ponieważ są już zadeklarowane. Pracuję z niemiecką wersją programu Excel i mogę uzyskać dostęp do arkusza roboczego, wpisując "Tabelle1.Cells (...) ...". Zakładam, że w wersji angielskiej jest to coś w rodzaju "Table1" lub "Sheet1".

Możesz również zmienić te nazwy. W Edytorze Visual Basic zajrzyj do obiektów Microsoft Excel w projekcie VBA. (Są tuż nad Twoimi modułami i UserForms w widoku VBA-Project). Istnieją skoroszyt-Obiekty skoroszytu. Wybierz arkusz i aktywuj Okno narzędziowe Właściwości. Tam możesz edytować nazwę arkusza i uzyskać do niego dostęp za pomocą tej nazwy w kodzie.

2

Jeśli nie chcesz używać zdarzenia Excel, możesz również publicznie zadeklarować arkusz roboczy, a następnie utworzyć dla niego podrzędny zestaw wartości. Wywołaj ten element podrzędny na początku każdego sub, aby zainicjować wartość. (Zrobiłem to z odpowiedzią Orwella.)


Public WSRawData As Worksheet 

Public Sub RawDataWSInit() 

Set WSRawData = Worksheets(RawData) 

End Sub 

Sub Main() 

Call RawDataWSInit 

End Sub 

0

arkuszach są "Przedmioty Microsoft Excel" zdefiniowane w VBA Project-Explorer :

Worksheet Properties editing

na ekranie powyżej nazwałem mój Arkusz arkuszu danych, więc teraz mogę do niego dostęp bezpośrednio z poziomu kodu:

Set SomeRange = DataSheet.Range("A3:B6") 

domyślnie arkuszach zostanie nazwany „Arkusz1”, „Arkusz2” aso ... w zależności od języka.

Powiązane problemy