wake-up-neo.net

Variable Arbeitsmappe/Arbeitsblatt vba deklarieren

Ich weiß, dass dies eine triviale Frage sein kann, aber ich kann anscheinend keine workbook oder worksheet als Variable in VBA deklarieren. Ich habe den folgenden Code, aber ich kann nicht herausfinden, was ich falsch mache, es sollte klar sein. Normalerweise habe ich keine Probleme bei der Deklaration von Variablen wie Dim i As Integer usw. 

sub kl() 

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ActiveWorkbook
    Set ws = Sheet("name")

    wb.ws.Select

End Sub

Beim Ausführen des obigen Codes erhalte ich einen type missmatch-Fehler.

Verwenden Sie Sheets anstelle von Sheet und aktivieren Sie sie nacheinander:

Sub kl()
    Dim wb As Workbook
    Dim ws As Worksheet
    Set wb = ActiveWorkbook
    Set ws = Sheets("Sheet1")
    wb.Activate
    ws.Select
End Sub
15
Gary's Student

Wenn das Arbeitsblatt, das Sie abrufen möchten, zur Kompilierzeit in ThisWorkbook vorhanden ist (dh der Arbeitsmappe, die den VBA-Code enthält, den Sie betrachten), besteht der einfachste und zuverlässigste Weg, auf das Worksheet-Objekt zu verweisen, auf dessen Code Name:

Debug.Print Sheet1.Range("A1").Value

Sie können Codename auf alles setzen, was Sie benötigen (sofern es sich um einen gültigen VBA-Bezeichner handelt), unabhängig von seinem "Registernamen" (den der Benutzer jederzeit ändern kann), indem Sie die (Name)-Eigenschaft ändern im Eigenschaften Werkzeugfenster (F4):

Sheet1 properties

Die Name-Eigenschaft bezieht sich auf den "Tabulator-Namen", den der Benutzer nach Belieben ändern kann. Die (Name)-Eigenschaft bezieht sich auf das Codename des Arbeitsblatts, und der Benutzer kann es nicht ändern, ohne auf den Visual Basic-Editor zuzugreifen.

VBA verwendet diese Codename, um automatisch eine Objektvariable mit globalem Gültigkeitsbereich Worksheet zu deklarieren, die Ihr Code an beliebiger Stelle verwenden kann, um kostenlos auf dieses Blatt zu verweisen.

Mit anderen Worten, wenn das Blatt zum Zeitpunkt der Kompilierung in ThisWorkbook vorhanden ist, müssen Sie niemals eine Variable dafür deklarieren. Die Variable ist bereits vorhanden!


Wenn das Arbeitsblatt zur Laufzeit erstellt wird (innerhalb von ThisWorkbook oder nicht), müssen Sie dann deklarieren und ihm eine Variable Worksheet zuweisen.

Verwenden Sie die Worksheets-Eigenschaft eines Workbook-Objekts, um es abzurufen:

Dim wb As Workbook
Set wb = Application.Workbooks.Open(path)

Dim ws As Worksheet
Set ws = wb.Worksheets(nameOrIndex)

Wichtige Notizen...

  • Sowohl der Name als auch der Index eines Arbeitsblatts können vom Benutzer leicht geändert werden (versehentlich oder nicht), sofern die Arbeitsmappenstruktur nicht geschützt ist . Wenn die Arbeitsmappe nicht geschützt ist, können Sie einfach nicht davon ausgehen, dass der Name oder der Index allein das Arbeitsblatt enthält, nach dem Sie suchen. Es ist immer eine gute Idee, das Format des Arbeitsblatts zu überprüfen (überprüfen Sie beispielsweise, ob Zelle A1 bestimmten Text enthält (oder es gibt eine Tabelle mit einem bestimmten Namen, die bestimmte Spaltenüberschriften enthält).

  • Die Verwendung der Sheets-Auflistung enthält Worksheet-Objekte, kann jedoch auch Chart-Instanzen und ein halbes Dutzend älterer Blatttypen enthalten, die und keine Arbeitsblätter sind. Beim Zuweisen einer Worksheet-Referenz aus dem, was Sheets(nameOrIndex) zurückgibt, besteht die Gefahr, dass aus diesem Grund ein Typenkonflikt-Laufzeitfehler ausgegeben wird.

  • Nicht qualifying Die Worksheets-Auflistung ist implizite ActiveWorkbook-Referenz - was bedeutet, dass die Worksheets-Auflistung aus der Arbeitsmappe zieht, die zu dem Zeitpunkt aktiv ist, zu dem die Anweisung ausgeführt wird. Solche impliziten Verweise machen den Code anfällig und fehleranfällig, insbesondere wenn der Benutzer während der Ausführung von Code mit der Excel-Benutzeroberfläche navigieren und interagieren kann.

  • Wenn Sie nicht auf Aktivieren eines bestimmten Arbeitsblatts gemeint sind, müssen Sie niemals ws.Activate aufrufen, um 99% dessen zu erreichen, was Sie mit einem Arbeitsblatt tun möchten. Verwenden Sie stattdessen einfach Ihre Variable ws.

7
Mathieu Guindon

Dritte Lösung: Ich würde ws auf eine Arbeitsmappe wb setzen, da die Verwendung von Sheet("name") immer auf die aktive Arbeitsmappe verweist, die sich mit der Entwicklung Ihres Codes ändern kann.

sub kl() 

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ActiveWorkbook
    'be aware as this might produce an error, if Shet "name" does not exist
    Set ws = wb.Sheets("name")
    ' if wb is other than the active workbook
    wb.activate
    ws.Select

End Sub
2
DrMarbuse

zu Ihrer Überraschung müssen Sie in Excel 2007 oder einer höheren Version eine Variable für Arbeitsmappe und Arbeitsblatt deklarieren. Fügen Sie einfach einen einzeiligen Ausdruck hinzu.

Sub kl()

    Set ws = ThisWorkbook.Sheets("name")
    ws.select
End Sub

Entfernen Sie alles andere und genießen Sie ... Aber warum wählen Sie ein Blatt aus? Die Auswahl der Blätter ist jetzt für die Berechnung und Manipulation altmodisch ..__ Fügen Sie einfach eine Formel wie diese hinzu

Sub kl()

    Set ws = ThisWorkbook.Sheets("name")
    ws.range("cell reference").formula = "your formula"
'OR in case you are using copy paste formula, just use 'insert or formula method instead of ActiveSheet.paste e.g.:
   ws.range("your cell").formula
'or
   ws.colums("your col: one col e.g. "A:A").insert
'if you need to clear the previous value, just add the following above insert line
   ws.columns("your column").delete

End Sub
0
P K Prabhakar

Versuchen Sie, den Namen der Variablen zu ändern, da sie manchmal mit anderen Modulen/Subs kollidiert

 Dim Workbk As Workbook
 Dim Worksh As Worksheet

Versuchen Sie es aber auch

 Set ws = wb.Sheets("name")

Ich kann mich nicht erinnern, ob es mit Sheet funktioniert

0
DannyBland