Microsoft Excel

Herbers Excel/VBA-Archiv

Objektvariablen zum Zweiten


Betrifft: Objektvariablen zum Zweiten von: Daniel
Geschrieben am: 28.03.2018 21:11:55

Geschätzte Excel Liebhaber

Für ein Projekt möchte ich nun Objektvariablen definieren. Nachdem ich den ganzen Nachmittag Theorie gebüffelt habe, komme ich trotzdem nicht auf einen grünen Zweig. Was ich will:

Die Objektreferenz Sheets("A1") soll für alle Prozeduren in der gesamten Arbeitsmappe "A1" lauten, d.h. z.B. A1.Range("D1") = 3

Die Deklaration ist das eine, wo aber kann ich die Set-Anweisung (Set A1 = Sheets("A1")) unterbringen, damit ich nicht in jeder Prozedur die Set-Anweisung wiederholen muss? In einem Modul? Als Prozedur, die ich dann wieder aufrufen muss? Momentan scheint Nichts zu klappen...

Dieser Code am Anfang des Moduls erkennt z.B. eine in einer UserForm hinterlegte Prozedur nicht:

Option Explicit

Dim A1 As Worksheet
Set A1 = Sheets("A1")

[...]

Wäre um Hilfestellung sehr erfreut

  

Betrifft: AW: Objektvariablen zum Zweiten von: Gerd L
Geschrieben am: 28.03.2018 21:43:06

Hallo Daniel,

das Exceleigene Schachbrettmuster für Tabellennamen und Variablennamen zu verwenden,
ist Plasphemie. :-)

Public MeinBlatt As Worksheet
Sub Egal()
Set MeinBlatt = Worksheets("Tabelle1")
End Sub

Gruß Gerd


  

Betrifft: AW: Objektvariablen zum Zweiten von: Daniel
Geschrieben am: 28.03.2018 22:27:00

Salü Gerd

Danke für die Antwort, das mit dem Schachbrett ist mir gerade etwas zu hoch. Was meinst du damit?

Deine Vorschlag hatte ich bereits früher diesen Nachmittag in einem Modul platziert, aber es hat nicht funktioniert. Ich möchte, dass irgendwo eine Objektvariable platziert ist, die ich ändern kann, damit alle anderen Prozeduren in UserForms, Tabellen etc. diese Variable so übernehmen. Wie und wo mache ich dies? Wenn ich also als Beispiel die Objektvariable myVar = Sheets("A1") in Sheets("A2") ändere, sollen alle Prozeduren in der ganzen Arbeitsmappe entsprechend auf Sheet A2 Bezug nehmen.

Die Sache mit der Set-Anweisung in einer Prozedur im Modul hat das Problem, dass sie in einer Prozedur in einer UserForm oder in einem Tabellenblatt - wie denn auch? - nicht erkannt wird.

Weisst du weiter?


  

Betrifft: AW: Objektvariablen zum Zweiten von: Daniel
Geschrieben am: 28.03.2018 22:27:02

Salü Gerd

Danke für die Antwort, das mit dem Schachbrett ist mir gerade etwas zu hoch. Was meinst du damit?

Deine Vorschlag hatte ich bereits früher diesen Nachmittag in einem Modul platziert, aber es hat nicht funktioniert. Ich möchte, dass irgendwo eine Objektvariable platziert ist, die ich ändern kann, damit alle anderen Prozeduren in UserForms, Tabellen etc. diese Variable so übernehmen. Wie und wo mache ich dies? Wenn ich also als Beispiel die Objektvariable myVar = Sheets("A1") in Sheets("A2") ändere, sollen alle Prozeduren in der ganzen Arbeitsmappe entsprechend auf Sheet A2 Bezug nehmen.

Die Sache mit der Set-Anweisung in einer Prozedur im Modul hat das Problem, dass sie in einer Prozedur in einer UserForm oder in einem Tabellenblatt - wie denn auch? - nicht erkannt wird.

Weisst du weiter?


  

Betrifft: AW: Objektvariablen zum Zweiten von: Peter(silie)
Geschrieben am: 28.03.2018 22:29:42

Hallo,

kommt auf deinen restliche Code drauf an...
In einigen fällen reicht es per ByRef statement ein Object weiter zu geben an die nächste Funktion.

Liefer uns Code und dein Problem kann tatsächlich gelöst werden.

Schau dir nochmal Klassenmodule an und Getter/ Setter sowie Konstanten.

Hier Beispiele zu Private Variablen und Const sowie ByRef:
(Erstelle eine Mappe mit zwei Tabellen mit dem Namen Tabelle1 und Tabelle2
Kopiere den Code da rein und teste ihn mit dem debugger)

Option Explicit

Private shA1 As Worksheet
Private shA2 As Worksheet

Private Const NAME_1 As String = "Tabelle1"
Private Const NAME_2 As String = "Tabelle2"

'ganz normal mit private + const
Private Sub Initialize()
    
    Set shA1 = ThisWorkbook.Sheets(NAME_1)
    Set shA2 = ThisWorkbook.Sheets(NAME_2)
    
End Sub

Private Sub ReturnName()
    
    Debug.Print shA1.Name
    Debug.Print shA2.Name
    
End Sub


'ByRef
Private Sub ByRef_Test()
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Sheets(NAME_1)
    b ws
    
End Sub

Private Sub b(ByRef worksheet_ As Worksheet)
    Debug.Print worksheet_.Name
End Sub


Public Sub Test()
    
    Initialize
    ReturnName
    
    ByRef_Test
    
End Sub



  

Betrifft: AW: Objektvariablen zum Zweiten von: Daniel
Geschrieben am: 28.03.2018 22:35:11

Danke Peter(silie), da vertiefe ich mich mal darin. Den Code würde ich gerne geben, aber er ist äusserst umfangreich und dies möchte ich dir nicht zumuten. Ich gehe mal deinen Hinweisen nach und bastle eine Testdatei.


  

Betrifft: AW: Objektvariablen zum Zweiten von: Daniel
Geschrieben am: 28.03.2018 22:52:24

Hi

die Deklaration der Variable muss mit Public in einem allgemeinen Modul oberhalb der Makros stattfinden.

Option Explicit
Public A1 as Worksheet

Die Deklaration darf nur hier erfolgen.
Deklarierst du A1 nochmal an anderere Stelle innerhalb eines Makros, so hast du zwei verschiedene Variablen, die zwar gleich heißen, aber nichts miteinander zu tun haben.



die Zusweisung muss dann in einem normalen Makro erfolgen und zwar bevor du diese Variable das erstemal anderweitig verwendest
Sub Makro1
Set A1 = Sheets("A1")

dh du solltest diese Codezeile in deinem Startmakro an den Anfang stellen (also das Makro, dass du normalerweis von Excel aus aufrufst).

ab diesem zeitpunkt kannst du dann die Variable in allen anderen Makros verwenden.

Gruß Daniel


  

Betrifft: AW: Objektvariablen zum Zweiten von: Daniel
Geschrieben am: 29.03.2018 00:15:24

Herzlichen Dank Daniel, genau das ist es! Ich hatte ursprünglich auch an diese Lösung gedacht, hatte aber statt im Modul Public immer Dim verwendet, da muss ich noch Verständnislücken aufarbeiten. Ich habe schon an meinem Verstand gezweifelt. Vielen Dank, jetzt kann ich in Ruhe schlafen :)

Liebe Grüsse - Daniel


Beiträge aus dem Excel-Forum zum Thema "Objektvariablen zum Zweiten"