Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1548to1552
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA verschieben Tabelenblätter

VBA verschieben Tabelenblätter
21.03.2017 12:55:57
Matthias
Hallo liebe Experten,
ich stehe mal wieder vor einem Problem mit VBA wo ich nicht weiter komme...
Ich möchte aus einem Workbook diverse Tabellenblätter in andere kopieren
  • dabei wird zuerst die Datei geöffnet in der die Tabellenblätter sind

  • Pfad = "C:\Dateipfad"
    PfadSt = "\Ordner Augangsdatei\"
    DateiSt = "Dateiname.xlsx"
    Workbooks.Open Filename:= Pfad & PfadSt & DateiSt 'öffnen Workbook Ausgang
    Set wbSt = Workbook(DateiSt) 'deklarieren des Ganzen
    
  • jetzt soll die Zieldatei geöffnet werden - jedoch sind es über 10 verschiedene
  • Zieldateien in unterschiedlichen Ordnern, daher weiß ich jetz hier nicht wie ich das Ganze am cleversten lösen lasse - es gibt nur 2 verschiedene Möglichkeiten wie verschoben werden soll:
    Variante 1: Zieldatei hat ein leeres Dokument, die Worksheets sollen reinkopiert werden und das leere Sheet gelöscht werden - Sheets(wksArray).Move = wbTarg [ich geh von aus die wäre so nicht richtig...]
    Variante 2: Zieldatei hat bereits einen Aufbau und es sollen ein oder zwei Arrays (mit den Worksheets) an eine bestimmte stelle kopiert werden bspw.: Array before worksheet("test1") - .Sheets(wksArray).Move Before:=targetWB.Sheets("test1")
    Ändern tun sich dabei max. folgende Aspekte:
    PfadTarg = "\Zielordner\"
    DateiTarg = "Zieldatei.xlsx"
    wksArray = Array("zu kopierende Worksheets")
    ggf. ein zweites Array --> wksArray2 = Array("an andere stelle zu kopierende Worksheets im gleichen Workbook")
    
    Meine Hoffnung war das ich jetzt Cases definieren kann für jedes Target Workbook und dann eine schleife laufen lassen kann wo für Case 1 -5 die Variante 1 durchgeführt wird und für 6-10 Variante 2
    Ich möchte es vermeiden das ich für jedes Dokument das gleiche schreiben muss.... - da es sich bei Anpassungen dann schwieriger gestaltet...
    Hoffe es kann jmd helfen und es ist verständlich :)
    Vielen Dank im Voraus
    Matthias

    6
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: VBA verschieben Tabelenblätter
    21.03.2017 13:24:48
    ChrisL
    Hi Matthias
    Wenn es immer 5 und 5 Varianten sind, dann könnte man auch einfach den Schleifen-Zähler abfragen. Aber ansonsten würde ich es wie von dir beschrieben machen, sinngemäss:
    Sub t()
    Dim ar1() As Variant, ar2() As Variant
    Dim i As Integer
    ar1() = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j")
    ar2() = Array(True, True, True, True, True, False, False, False, False, False)
    For i = 0 To UBound(ar1)
    Select Case ar2(i)
    Case True
    Debug.Print "Verhalten 1 mit Mappe " & ar1(i)
    Case Else
    Debug.Print "Verhalten 2 mit Mappe " & ar1(i)
    End Select
    Next i
    End Sub
    
    (a-j sind symbolisch die Mappennamen)
    cu
    Chris
    Anzeige
    AW: VBA verschieben Tabelenblätter
    22.03.2017 11:50:16
    Matthias
    Hey Chris
    vielen Dank - leider hab ich deins nicht voll und ganz verstanden aber es hat mir trotzdem zu einer Lsg verholfen^^ - vermutlich geht es eleganter aber sie läuft:
    Option Explicit
    Sub TabellenblattVerschieben()
    'Deklarationen & anderes Gewäsch
    For i = 1 To 10 '(es sind nicht immer 10 is nur im bsp so gewählt)
    Select Case i
    Case 1 'hier werden jetzt nacheinander alle verschiedenen Dateien aufgelistet
    PfadTarg = "Testpfad\" 'Ordner wo die Datei liegt
    DateiTarg = "Test.xlsx" 'Dateiname
    wksArray = Array("Testsheet1", "Testsheet2") 'Zu kopierende Tabellenblätter
    SheetTarg = "hier" 'Ziel des einfügens
    Var = True 'Welche Rechnung
    End Select
    If Var = True Then
    'hier folgt die Rechnung
    Else
    '2te Variante Rechnung
    End If
    Next i
    End Sub
    
    Ich hätte jedoch noch eine Frage bezüglich Deklarationen und definieren von Variablen :)
    Ich benötige viele Variablen in mehreren Modulen und hab daher an stelle des bspw.
    
    Dim wks As Worksheet
    
    auf

    Public wks As worksheet
    zurückgegriffen und das klappt soweit auch
    Jetzt gibt es aber bspw. auch einige Workbooks die ich in allen Modulen brauche und deshalb _ also sowas wie
    
    Set wbTest = Workbooks("Testdatei1")
    
    global für alle Module definiert haben will oder sowas wie

    heute = wbTest.wksTest.Cells(...)

    Geht das iwie und wenn ja wie :)
    Vielen Dank im Vorraus :)
    Matthias
    Anzeige
    AW: VBA verschieben Tabelenblätter
    22.03.2017 13:17:07
    ChrisL
    Hi Matthias
    Allgemein:
    Mit Public Variablen würde ich nicht übertreiben. Persönlich tendiere ich eher darauf Variablen von einer Prozedur an die andere zu übergeben, aber in Einzelfällen kann eine Public-Variable natürlich durchaus Sinn machen resp. lässt sich u.U. nicht vermeiden.
    Die Vorteile von Public hast du ja scheinbar bereits entdeckt, darum gehe ich nur auf die Nachteile ein:
    - Der Speicherplatz bleibt die ganze Zeit belegt (Speicherplatzprobleme existieren heute zwar kaum mehr, aber ist halt so)
    - Gefahr, dass gleiche Variablen lokal und öffentlich definiert werden (Fehlerquelle)
    - Die Variablen können innerhalb der Applikation von irgendeiner Prozedur verändert werden. Es können Abhängigkeiten zwischen vermeintlich unzusammenhängenden Prozeduren entstehen, die nicht mehr einfach überschaubar sind.

    Deklaration von Public Variablen:

    Genau so wie du im Beispiel das Worksheet Public deklariert hast, kannst du auch Workbooks/Mappen öffentlich deklarieren.
    Wert-/Objekt-Zuweisung:
    Die Wertzuweisung erfolgt innerhalb von Prozeduren:
    Variable = Wert
    resp.
    Set Variable = Objekt
    Falls deine Prozesse immer mit der gleichen Prozedur beginnen, dann kannst du die Zuweisung innerhalb des ersten Makros vornehmen. Ansonsten könntest du dafür auch ein Workbook_Open Ereignis verwenden.
    Fazit:
    Es ist zu unterscheiden zwischen der Deklaration von Variablen und der Wert-Zuweisung. Nur die Deklaration erfolgt Public.
    Public WB As Workbook
    Public WS As Worksheet
    Public strText As String
    Sub t()
    Set WB = Workbooks("Testdatei1.xlsm")
    Set WS = WB.Worksheets("Tabelle1")
    strText = WS.Cells(...)
    End Sub
    
    cu
    Chris
    Anzeige
    AW: VBA verschieben Tabelenblätter
    22.03.2017 13:48:21
    Matthias
    Hey Chris,
    erstmal danke für die ganzen Hinweise :) die Nachteile werde ich gut im Hinterkopf behalten - mir geht es halt darum eine gewisse Übersichtlichkeit zu wahren und da sind 30 Zeilen Deklarationen zu Beginn jeder Prozedur bzw. Moduls doch unübersichtlich - aber ich vermute die Mischung machts :)
    Und genau mir geht's um die Wertzuweisung :) Also das ich das innerhalb der Prozedur machen muss ist mir schon klar :) Die Sache ist ich möchte jetzt bspw. in einer Prozedur alle Variablen/ Objekte die für alle Module/ Prozeduren gelten definieren - du meintest ja jetz gerade übergeben - wie genau geht das? ich hatte das halt mit Public Sub probiert aber ieinen Fehler muss ich noch machen
    Danke für deine Hilfe - es fördert auf jeden Fall das Verständnis :)
    Matthias
    Anzeige
    AW: VBA verschieben Tabelenblätter
    22.03.2017 14:03:15
    ChrisL
    Hi Matthias
    30 Variablen in einer einzigen Prozedur ist schon recht ungewöhnlich (so etwas habe ich noch nie gesehen). Vielleicht müsste man bereits bei der Programmierung ansetzen und die vielen Variablen hinterfragen. Aber wollen wir mal keine neue Baustelle auftun :)
    Mit "übergeben" meinte ich folgendes Beispiel:
    Sub StartMakro()
    Dim WB As Workbook
    Set WB = ThisWorkbook
    Call Folgemakro(WB)
    End Sub
    

    Sub Folgemakro(WB As Workbook)
    MsgBox WB.Name
    End Sub
    
    Für eine handvoll Variablen ist die Methode zweckmässig, aber 30 Variablen würde ich so auch nicht übergeben.
    Wie gesagt, die Zuweisung erfolgt in irgendeinem Makro.
    Public WB As Workbook
    Public WS As Worksheet
    Public strText As String
    Sub MeinMakro()
    Call WerteZuweisen
    ' der Rest von deinem Code
    End Sub
    Sub WerteZuweisen()
    Set WB = Workbooks("Testdatei1.xlsm")
    Set WS = WB.Worksheets("Tabelle1")
    strText = WS.Cells(...)
    End Sub
    

    Oder eben im Workbook_Open Ereignis (kein Standardmodul sondern "DieseArbeitsmappe")
    Private Sub Workbook_Open()
    Call WerteZuweisen
    End Sub
    
    cu
    Chris
    Anzeige
    AW: VBA verschieben Tabelenblätter
    22.03.2017 19:50:38
    ChrisL
    Hi Matthias
    Kurz noch zwei Ideen zur Vermeidung von "zu" vielen Variablen (oder Konstante).
    Falls du die Variablen verwendest um z.B. Zeilennummern oder Spalten zu definieren, weil sich die manchmal verschieben und du nur eine Codestelle anpassen willst, dann sind "Namen" (in der Tabelle, Bereichen Namen vergeben) ein gute Idee. Definierte Namen verschieben sich bei Tabellenveränderungen mit. In VBA dann z.B.
    Range("Name") = "x"
    Cells(Range("Name").Row, 1) = "x"
    Falls du durchnummerierte Variablen hast z.B.
    strText1 = TextBox1
    strText2 = TextBox2
    usw.
    Dann wären lokale Array/Datenfelder eine Alternative...
    cu
    Chris
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige