Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Arbeits-Sheet mittels Variable übergeben

Arbeits-Sheet mittels Variable übergeben
05.06.2020 14:36:41
Marc
Hallo zusammen
Ich möchte aus einer ersten Routine in die 2. springen, in der ersten gebe ich den Variablennamen mit:
Sub Projektuebersicht_Monate()
Dim wks As Worksheet
wks = "Monate"
Call Copy_to_Blatt1
End Sub

In der 2. Routine dann:
Sub Copy_to_Blatt1
Worksheets("wks").Activate
ActiveSheet.Columns("A:E").Select
Selection.ClearCo…..
Ich erhalte immer wieder eine Fehlermeldung. Was mache ich hier denn schon wieder falsch?
Mit herzlichem Dank und Gruss
Marc



		
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Arbeits-Sheet mittels Variable übergeben
05.06.2020 14:54:30
Tino
Hallo,
vielleicht so, nicht getestet!
Sub Projektuebersicht_Monate()
Dim wks$
wks = "Monate"
Call Copy_to_Blatt1(wks)
End Sub
Sub Copy_to_Blatt1(wks$)
Worksheets(wks).Activate
ActiveSheet.Columns("A:E").Select
Selection.ClearCo…..
Gruß Tino
AW: Arbeits-Sheet mittels Variable übergeben
05.06.2020 15:05:22
Marc
Super, danke Tino, es hat funktioniert :)
Vielleicht finde ich sogar mal raus, wo der Fehler lag, aber das hat noch Zeit
Grüess
Marc
Anzeige
Das kann noch lange dauern, mit dem Rausfinden
05.06.2020 16:08:05
EtoPHG
Marc,
Denn deine Posts drehen sich immer wieder um das Gleiche: Variablen, Datentypen, Parameter.
Lies doch mal die VBA Grundlangen wie Zusammenfassung der Datentypen.
Du definierst wks As WorkSheet. Damit ist wks vom Datentyp Objekt.
Dann weisst du diesem Objekt ein "String" zu, denn alles was in VBA in "Gänsefüssen" geschrieben wird ist ein fixer unveränderbarer Text.
Du übergibst keine Parameter an die nächste Sub, sondern führst dort "wks" als Namen des Blatts auf. Es gibt aber keinen Bezug zwischen der Variablen wks der ersten Routine zum String "wks" in der Zweiten.
Tino arbeitet nur mit Strings, und Parametern. Die Variable wks übergibt also den Inhalt an die Subroutine 2 (die wiederum einen String als Parameter verlangt). Dieser Parameter/Variable hat aber nichts mit dem wks der Routine zu tun, sondern im Call wird nur der inhalt von wks/Routine1 nach wks/Routine2 verschoben.
Gruess Hansueli
Anzeige
Verschieden Codes, für Dasselbe
05.06.2020 16:53:43
EtoPHG
Hallo Marc,
Mal ein Codebeispiel, für eine Mappe mit 3 Registern "?", "Monate", "Jahr"
Hier mal Code in 2 Varianten, bei denen du vielleicht aufgrund der Kommentare mehr Zusammenhänge von VBA erschliessen kannst.
Option Explicit
' 2x Dasselbe in Grün'
' Vorschlag mit Objekten
Sub Projektuebersicht_Monate_Jahr()
' Definition von Variablen
Dim objBlatt As Worksheet, objZielBlatt As Worksheet
' Quellblatt ist "Monate"-Register
Set objBlatt = ThisWorkbook.Worksheets("Monate")
' Zielblatt ist Register 1 (unabhängig vom Namen)
Set objZielBlatt = ThisWorkbook.Worksheets(1)
' lösche & kopiere
Copy_to_Blatt objBlatt, objZielBlatt
' Quellblatt ist jetzt "Jahr"-Register
Set objBlatt = ThisWorkbook.Worksheets("Jahr")
' und wieder lösche & kopiere
Copy_to_Blatt objBlatt, objZielBlatt
End Sub
' Löscht Spalte A-E im Quellenblatt
' Kopiert Spalte F:G ins Zielblatt
Sub Copy_to_Blatt(objSource As Worksheet, objTarget As Worksheet)
With objSource
.Range("A:E").ClearContents    ' Spalte A-E löschen
.Range("F:G").Copy objTarget.Range("B1") ' Spalte F:G kopieren
End With
End Sub
' Tino's String Vorschlag
Sub Projektuebersicht_Monate()
Dim sNameQuellblatt As String
Dim sNameZielblatt As String
Copy_to_Blatt_Name "Monate", 1
Copy_to_Blatt_Name "Jahr", 1
End Sub
' Löscht Spalte A-E im Quellenblatt
' Kopiert Spalte F:G ins Zielblatt
Sub Copy_to_Blatt_Name(NameQuellBlatt As String, lIndexZiel As Long)
With ThisWorkbook.Worksheets(NameQuellBlatt)
.Range("A:E").ClearContents    ' Spalte A-E löschen
.Range("F:G").Copy ThisWorkbook.Worksheets(lIndexZiel).Range("B1") ' Spalte F:G  _
kopieren
End With
End Sub
Du siehst auch, dass das Ganze .Activate und .Select Gedöns völlig überflüssig ist.
Diese Befehle kommen v.a. vom Makrorekorder (weil der nicht anders kann). Anstelle dieser ist eine saubere und vollständige Referenzierung einfacher und führt nicht zu unerwünschten Nebeneffekten wie Blätter-Flackern und anderes.
Gruess Hansueli
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

Arbeits-Sheet über Variable in Excel VBA übergeben


Schritt-für-Schritt-Anleitung

Um ein Arbeitsblatt in Excel VBA durch eine Variable zu übergeben, folge diesen Schritten:

  1. Definiere die Variable: Lege eine Variable für dein Arbeitsblatt fest. Du kannst entweder den Datentyp Worksheet verwenden oder einen String für den Namen des Arbeitsblatts.

    Dim wks As Worksheet
    wks = ThisWorkbook.Worksheets("Monate") ' für Worksheet Variable

    oder

    Dim wksName As String
    wksName = "Monate" ' für String Variable
  2. Rufe die Subroutine auf: Übergebe die Variable an die Subroutine, die das Arbeitsblatt verwenden soll.

    Call Copy_to_Blatt1(wks) ' bei Worksheet Variable

    oder

    Call Copy_to_Blatt1(wksName) ' bei String Variable
  3. Aktiviere das Arbeitsblatt in der Subroutine: Verwende die übergebene Variable, um das Arbeitsblatt zu aktivieren und bearbeite die gewünschten Bereiche.

    Sub Copy_to_Blatt1(wks As Worksheet)
       wks.Activate
       wks.Columns("A:E").ClearContents
    End Sub

Häufige Fehler und Lösungen

  1. Fehlermeldung bei der Aktivierung: Wenn du versuchst, das Arbeitsblatt mit Worksheets("wks").Activate zu aktivieren, wird ein Fehler angezeigt, weil "wks" als String interpretiert wird. Stelle sicher, dass du die Variable ohne Anführungszeichen übergibst.

    Lösung: Verwende Worksheets(wks).Activate.

  2. Datentypen missverstanden: Wenn du Dim wks As Worksheet verwendest, aber dann einen String zuweist, wird ein Typkonflikt erzeugt.

    Lösung: Verwende den richtigen Datentyp oder übergebe den Namen als String.

  3. Unnötige Verwendung von Activate und Select: Diese Befehle können oft vermieden werden.

    Lösung: Arbeite direkt mit der Variable, um unerwünschte Nebeneffekte zu vermeiden.


Alternative Methoden

Es gibt verschiedene Wege, wie du eine vba worksheet variable ansprechen kannst:

  1. Objekt-Referenzierung: Anstatt nur den Namen zu verwenden, kannst du das Arbeitsblatt direkt in einer Variablen festlegen.

    Dim objBlatt As Worksheet
    Set objBlatt = ThisWorkbook.Worksheets("Monate")
  2. String-Parameter: Du kannst auch die Namen der Blätter als String übergeben und sie dann innerhalb der Subroutine aktivieren.

    Sub Copy_to_Blatt_Name(NameQuellBlatt As String)
       With ThisWorkbook.Worksheets(NameQuellBlatt)
           .Range("A:E").ClearContents
       End With
    End Sub

Praktische Beispiele

Hier sind einige Beispiele zur Verwendung von vba variable worksheet:

Beispiel 1: Arbeitsblätter durch Objekte referenzieren.

Sub BeispielMitObjekten()
    Dim objBlatt As Worksheet
    Set objBlatt = ThisWorkbook.Worksheets("Monate")
    objBlatt.Range("A1").Value = "Test"
End Sub

Beispiel 2: String-Namen verwenden.

Sub BeispielMitString()
    Dim sName As String
    sName = "Monate"
    With ThisWorkbook.Worksheets(sName)
        .Range("A1").Value = "Test"
    End With
End Sub

Tipps für Profis

  • Vermeide Activate und Select: Dies verbessert die Leistung und sorgt für weniger Flackern und unerwartete Nebeneffekte.
  • Verwende Option Explicit: Dies zwingt dich, alle Variablen zu deklarieren, was Fehler verhindert.
  • Nutze Error Handling: Erstelle Fehlerbehandlungsroutinen, um unerwartete Fehler abzufangen.

FAQ: Häufige Fragen

1. Wie kann ich eine vba worksheet variable in einer anderen Sub verwenden?
Du musst die Variable als Parameter an die Sub übergeben, wie im Beispiel mit Call Copy_to_Blatt1(wks).

2. Was ist der Unterschied zwischen Dim wks As Worksheet und Dim wks As String?
Der erste Datentyp ist ein Objekt, während der zweite ein Text ist. Sie müssen entsprechend behandelt werden.

3. Warum sollte ich Option Explicit verwenden?
Es hilft dabei, Tippfehler bei Variablennamen zu vermeiden und stellt sicher, dass alle Variablen ordnungsgemäß deklariert sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige