Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1908to1912
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

Import von Tabellen

Import von Tabellen
09.12.2022 13:02:59
Tabellen
Hallo Zusammen,
ich bin mal wieder auf der Suche nach einer Lösung. Ich habe im Internet recherchiert, aber nichts brauchbares gefunden. Da meine Kenntnisse auch nicht allzu tief sind, benötige ich eure Hilfe.
Ich habe nachfolgenden Code der mit aus den Datei WBQuelle das Tabellenblatt "Übersicht" korrekt in die Ziel Datei übernimmt. Nun möchte ich aber zusätzlich, dass alle Tabellenblätter ab dem 7. Tabellenblatt, falls in der Ziel Datei noch nicht vorhanden, ebenfalls kopiert wird.
Ich habe zwar aus einem anderen Makro versucht, die Passage hier einzufügen... bekomme das aber nicht gebacken (siehe ganz unten *****).
Ich hoffe, jemand kann mir hier helfen.
Besten Dank
Günther
PS: Kann sein, ich melde mich erst Anfang nächster Woche, also nicht böse sein.
Sub DatenHolen()
Dim ExportDatei As Variant
Dim WBQuelle As Workbook, WBZiel As Workbook
Dim lngCalc As Long
On Error GoTo ErrExit
With Application
.ScreenUpdating = False
.EnableEvents = False
lngCalc = .Calculation
.Calculation = -4135
.DisplayAlerts = False
End With
Set WBZiel = ThisWorkbook
'DateiÖffnen Dialog anbieten
ExportDatei = Application.GetOpenFilename("Micrsoft Excel-Dateien (*.xlsm),*.xlsm", , "Bitte die Datei xyz.xls öffnen ...")
If ExportDatei CStr(False) Then
'öffnen der ausgewählten Datei
Set WBQuelle = Workbooks.Open(ExportDatei)
With WBZiel
WBQuelle.Sheets(Array("Übersicht")).Copy After:=.Sheets(.Sheets.Count)
'Hier sollen also alle neuen Tabellenblätter ab Tab 7 ebenfalls kopiert werden
End With
WBQuelle.Close False
Set WBZiel = Nothing
Set WBQuelle = Nothing
ErrExit:
With Err
If .Number 0 Then
MsgBox "Fehler in Prozedur:" & vbTab & "'DatenHolen'" & vbLf & String(60, "_") & _
vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
"Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
.Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
"VBA - Fehler in Prozedur - DatenHolen"
.Clear
End If
End With

**************
Ich komm hier nicht klar um den richtigen Code oben einzufügen
Dim lwbTarget As Workbook
Dim liThis As Integer, lshTarget As Worksheet, lboExist As Boolean
Dim wbkQuelle As Workbook
Dim wbkZiel As Workbook
Dim wksQuelle As Worksheet
Set wbkQuelle = Workbooks.Open(ExportDatei)
Set wbkZiel = Workbooks("Version_2.xlsm")
Set wksQuelle = wbkQuelle.Worksheets("Links")
Set lwbTarget = Workbooks("Version_2.xlsm") 'wenn deine geöffnete Zieldatei anders heißt, dann hier anpassen
With ThisWorkbook
For liThis = 7 To .Sheets.Count 'ab Tabellenblatt 7
For Each lshTarget In lwbTarget.Sheets
If .Sheets(liThis).Name = lshTarget.Name Then
lboExist = True
Exit For
End If
Next
If lboExist = True Then
lboExist = False
Else
.Sheets(liThis).Copy After:=lwbTarget.Sheets(lwbTarget.Sheets.Count)
End If
Next
End With
******************************************

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Import von Tabellen
09.12.2022 13:28:11
Tabellen
probiers mal aus.

Dim lshTarget As Worksheet
Dim liThis     As Integer
Dim lboExist As Boolean

With WBZiel
WBQuelle.Sheets("Übersicht").Copy After:=.Sheets(.Sheets.Count)
For liThis = 7 To WBQuelle.Sheets.Count 'ab Tabellenblatt 7
For Each lshTarget In .Sheets
If UCase(WBQuelle.Sheets(liThis).Name) = UCase(lshTarget.Name) Then
lboExist = True
Exit For
End If
Next
If lboExist = True Then
lboExist = False
Else
WBQuelle.Sheets(liThis).Copy After:=.Sheets(.Sheets.Count)
End If
Next
'Hier sollen also alle neuen Tabellenblätter ab Tab 7 ebenfalls kopiert werden
End With

Anzeige
AW: Import von Tabellen
09.12.2022 13:28:56
Tabellen
Hallo Günther,
um die Tabellenblätter ab dem 7. Tabellenblatt der Quelle-Datei in die Ziel-Datei zu kopieren, könntest du folgenden Code verwenden:

Sub DatenHolen()
Dim ExportDatei As Variant
Dim WBQuelle As Workbook, WBZiel As Workbook
Dim lngCalc As Long
On Error GoTo ErrExit
With Application
.ScreenUpdating = False
.EnableEvents = False
lngCalc = .Calculation
.Calculation = -4135
.DisplayAlerts = False
End With
Set WBZiel = ThisWorkbook
'DateiÖffnen Dialog anbieten
ExportDatei = Application.GetOpenFilename("Micrsoft Excel-Dateien (*.xlsm),*.xlsm", , "Bitte die Datei xyz.xls öffnen ...")
If ExportDatei  CStr(False) Then
'öffnen der ausgewählten Datei
Set WBQuelle = Workbooks.Open(ExportDatei)
With WBZiel
WBQuelle.Sheets(Array("Übersicht")).Copy After:=.Sheets(.Sheets.Count)
'Kopieren der Tabellenblätter ab Tab 7
Dim i As Integer
For i = 7 To WBQuelle.Sheets.Count
WBQuelle.Sheets(i).Copy After:=.Sheets(.Sheets.Count)
Next i
End With
WBQuelle.Close False
Set WBZiel = Nothing
Set WBQuelle = Nothing
End If
'Fehlerbehandlung
ErrExit:
With Err
If .Number  0 Then
MsgBox "Fehler in Prozedur:" & vbTab & "'DatenHolen'" & vbLf & String(60, "_") & _
vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
"Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
.Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
"VBA - Fehler in Prozedur - DatenHolen"
.Clear
End If
End With
End Sub

Anzeige
AW: Import von Tabellen
09.12.2022 13:54:14
Tabellen
Hallo Günther,
die Beschleunigungsschalter und die Auswertung des Vorhandenseins der Tabelle im Ziel-Wb habe ich je ausgelagert, sodass die Haupt-Sub schlank bleibt.
Beim letzteren geht es auch darum, dass man eine fehlertolerante Handlung vornimmt (On Error Resume Next), um eine Anzeige von nicht vorhandenen Blatt zu bekommen. Da die Fehlerbehandlung pro Sub gelten -> separaten Sub.
Die Fehlerbehandlung könntest Du dir auch sparen. Relevant wird es erst in komplexen Anwendungen, die an viele Anwender verteilt werden.

Sub DatenHolen()
Dim ExportDatei As Variant
Dim WBQuelle As Workbook
Dim WBZiel As Workbook
Dim i 'Lauf-Variable
On Error GoTo Catch
AllgSchalter_setzen False
Set WBZiel = ThisWorkbook
'Datei auswählen und öffnen
ExportDatei = Application.GetOpenFilename("Micrsoft Excel-Dateien (*.xlsm),*.xlsm", , "Bitte Datei zu öffnen auswählen...")
If ExportDatei = CStr(False) Then Exit Sub
Set WBQuelle = Workbooks.Open(ExportDatei)
With WBQuelle
.Worksheets("Übersicht").Copy After:=WBZiel.Sheets(WBZiel.Sheets.Count)
For i = 7 To .Sheets.Count 'ab Tabellenblatt 7
With Worksheets(i)
If .Name  "Übersicht" Then
If Not Worksheet_vorhanden(WBZiel, .Name) Then
.Copy After:=WBZiel.Sheets(WBZiel.Sheets.Count)
End If
End If
End With
Next
End With
WBQuelle.Close False
Set WBZiel = Nothing
GoTo Finally
Catch:
If Err.Number  0 Then
MsgBox "Fehler in Prozedur:" & vbTab & "'DatenHolen'" _
& vbLf & String(60, "_") & vbLf & vbLf _
& IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") _
& "Fehlernummer:" & vbTab & Err.Number & vbLf & vbLf _
& "Beschreibung:" & vbTab & Err.Description, _
vbExclamation + vbMsgBoxSetForeground, _
"VBA - Fehler in Prozedur - DatenHolen"
Err.Clear
End If
Finally:
AllgSchalter_setzen True
End Sub
Private Function Worksheet_vorhanden(wb As Workbook, WsName As String) As Boolean
Dim W As Worksheet
On Error Resume Next
Set W = wb.Worksheets(WsName)
Worksheet_vorhanden = Not W Is Nothing
End Function
Sub AllgSchalter_setzen(Optional bAn = False)
Static lngCalc As Long
With Application
.ScreenUpdating = bAn
.EnableEvents = bFalse
.DisplayAlerts = bAn
If bAn Then
.Calculation = lngCalc
Else
lngCalc = .Calculation
.Calculation = xlCalculationManual
End If
End With
End Sub
VG
Yal
Anzeige
AW: Import von Tabellen
12.12.2022 09:16:17
Tabellen
Hallo Leute,
jetzt versuche ich nochmals einen Beitrag einzustellen. Montag Montag...oh Gott.
Zunächst Besten Dank für die bereits eingestellten Lösungen. Die sind allesamt Super. Besten Dank.
Aber eine kleine Bitte habe ich noch. Vermutlich habe ich mich nicht korrekt ausgedrückt. Vorhandene Tabellenblätter, ab Tab 7, sollen überschrieben werden. Neue sollen kopiert werden. Das Tabellenblatt "Übersicht" natürlich auch überschreiben.
Vielleicht könnt Ihr mir ja nochmal helfen.
Besten Dank und einen guten Start in die Woche.
Grüße
Günther
AW: Import von Tabellen
12.12.2022 10:07:44
Tabellen
Hallo Günther,
noch einfacher:

Sub DatenHolen()
Dim ExportDatei As Variant
Dim WBQuelle As Workbook
Dim WBZiel As Workbook
Dim i 'Lauf-Variable
Dim Liste
On Error GoTo Catch
AllgSchalter_setzen False
Set WBZiel = ThisWorkbook
'Datei auswählen und öffnen
ExportDatei = Application.GetOpenFilename("Micrsoft Excel-Dateien (*.xlsm),*.xlsm", , "Bitte Datei zu öffnen auswählen...")
If ExportDatei = CStr(False) Then Exit Sub
Set WBQuelle = Workbooks.Open(ExportDatei)
With WBQuelle
'Tabellen Auflisten
Liste = "Übersicht"
For i = 7 To .Sheets.Count 'ab Tabellenblatt 7
If .Name  "Übersicht" Then Liste = Liste & ";" & .Name
Next
'Tabellen in Ziel löschen und übertragen
For Each i In Split(Liste, ";")
If Worksheet_vorhanden(WBZiel, i) Then WBZiel.Worksheets(i).Delete
Worksheets(i).Copy After:=WBZiel.Sheets(WBZiel.Sheets.Count)
Next
End With
WBQuelle.Close False
Set WBZiel = Nothing
GoTo Finally
Catch:
If Err.Number  0 Then
MsgBox "Fehler in Prozedur:" & vbTab & "'DatenHolen'" _
& vbLf & String(60, "_") & vbLf & vbLf _
& IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") _
& "Fehlernummer:" & vbTab & Err.Number & vbLf & vbLf _
& "Beschreibung:" & vbTab & Err.Description, _
vbExclamation + vbMsgBoxSetForeground, _
"VBA - Fehler in Prozedur - DatenHolen"
Err.Clear
End If
Finally:
AllgSchalter_setzen True
End Sub
die 2 zusätzlichen Prozeduren "AllgSchalter_setzen" und "Worksheet_vorhanden" habe ich nicht nochmal gepostet. Aus dem Beitrag https://www.herber.de/forum/archiv/1908to1912/1910643_Import_von_Tabellen.html#1910665 rausnehmen.
VG
Yal
Anzeige
AW: Import von Tabellen
12.12.2022 10:36:47
Tabellen
Hallo Yal,
ich scheitere bereits am Anfang.
Fehlermeldung: Fehler beim Kompilieren. Argumenttyp ByRef unvergräglich
Hast hierzu noch eine Lösung?
Grüße
Günther
AW: Import von Tabellen
12.12.2022 10:46:58
Tabellen
Hallo Günther,
also doch mit den Zusatz-Proc. Diese sind geändert worden. Nur diese Verwenden.

Sub DatenHolen()
Dim ExportDatei As Variant
Dim WBQuelle As Workbook
Dim WBZiel As Workbook
Dim i 'Lauf-Variable
Dim Liste
On Error GoTo Catch
AllgSchalter_setzen False
Set WBZiel = ThisWorkbook
'Datei auswählen und öffnen
ExportDatei = Application.GetOpenFilename("Micrsoft Excel-Dateien (*.xlsm),*.xlsm", , "Bitte Datei zu öffnen auswählen...")
If ExportDatei = CStr(False) Then Exit Sub
Set WBQuelle = Workbooks.Open(ExportDatei)
With WBQuelle
'Tabellen Auflisten
Liste = "Übersicht"
For i = 7 To .Sheets.Count 'ab Tabellenblatt 7
If .Name  "Übersicht" Then Liste = Liste & ";" & .Name
Next
'Tabellen in Ziel löschen und übertragen
For Each i In Split(Liste, ";")
If Worksheet_vorhanden(WBZiel, i) Then WBZiel.Worksheets(i).Delete
.Worksheets(i).Copy After:=WBZiel.Sheets(WBZiel.Sheets.Count)
Next
End With
WBQuelle.Close False
Set WBZiel = Nothing
GoTo Finally
Catch:
If Err.Number  0 Then
MsgBox "Fehler in Prozedur:" & vbTab & "'DatenHolen'" _
& vbLf & String(60, "_") & vbLf & vbLf _
& IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") _
& "Fehlernummer:" & vbTab & Err.Number & vbLf & vbLf _
& "Beschreibung:" & vbTab & Err.Description, _
vbExclamation + vbMsgBoxSetForeground, _
"VBA - Fehler in Prozedur - DatenHolen"
Err.Clear
End If
Finally:
AllgSchalter_setzen True
End Sub
Private Function Worksheet_vorhanden(wb As Workbook, ByVal WsName As String) As Boolean
Dim W As Worksheet
On Error Resume Next
Set W = wb.Worksheets(WsName)
Worksheet_vorhanden = Not W Is Nothing
End Function
Sub AllgSchalter_setzen(Optional bEinschalten = False)
Static lngCalc As Long
With Application
.ScreenUpdating = bEinschalten
.EnableEvents = bEinschalten
.DisplayAlerts = bEinschalten
If bEinschalten Then
.Calculation = lngCalc
Else
lngCalc = .Calculation
.Calculation = xlCalculationManual
End If
End With
End Sub
VG
Yal
Anzeige
AW: Import von Tabellen
12.12.2022 11:22:57
Tabellen
Hallo Yal,
was mache ich falsch. Ich habe Deine Code nochmals neu in ein neues Modul rein kopiert. Jetzt kommt Fehler 9 Index außerhalb des gültigen Bereichs.
Günther
AW: Import von Tabellen
12.12.2022 12:04:10
Tabellen
.
AW: Import von Tabellen
12.12.2022 13:52:35
Tabellen
Hallo Yal,
ich weiß nicht wie ich mich ausdrücken soll.
Das Tabellenblatt "Übersicht" muss auf jeden Fall kopiert und überschrieben werden. Dieses ist aber bei den ersten 7 Tabellenblätter dabei.
Unabhängig davon sollen allen anderen Tabellenblätter ab Tabellenblatt 7 in eine andere Excel Datei kopiert und falls schon vorhanden, überschrieben werden.
Grüße Günther
AW: Import von Tabellen
12.12.2022 14:34:03
Tabellen
Hallo Günther,
dass ich jetzt weiß, dass ein Fehler vorkommt, ist guter Anfang. Auch noch zu wissen wo, wäre hilfreich. Ich habe nämlich keine Dateien, um den Code zu testen.
Fehler 9 kommt vor, wenn man eine Element aus einer Auflistung per Name aufruft und diese nicht in der Auflistung ist.
Öffne das Direktfenster (Ansicht, Direktfenster) und lasse dein Code im Schritt-Modus lauf (F8). So kannst sehen wie der Zustand der Variablen vor einer Schritt stehen, und wo der Fehler vorkommt. Dann kannst Du zusätzliche Varaiblen einführen, um mehr Übersicht zu haben.
VG
Yal
Anzeige
AW: Import von Tabellen
12.12.2022 15:45:02
Tabellen
Hallo Yal,
alles klar. Ich melde mich morgen wieder....muss noch weg.
Bis dann
AW: Import von Tabellen
13.12.2022 09:16:39
Tabellen
Hallo Yal,
zunächst einen schönen guten Morgen.
Als Link hier die Quell-Datei.
Wie gesagt. Das Tabellenblatt "Übersicht" kopieren und überschreiben und alle anderen Tabellenblätter ab Tab 7, kopieren oder falls bereits vorhanden dann überschreiben.
https://www.herber.de/bbs/user/156686.xlsx
Grüße
Günther
AW: Import von Tabellen
13.12.2022 10:19:03
Tabellen
ach ja, da war noch was.
AW: Import von Tabellen
13.12.2022 17:23:34
Tabellen
Hallo Günther,
die Aufgabe hiess nicht "liefere mir eine Datei, sodass ich den Code testen kann" (die übrigens kein Code beinhaltet),
sondern "setze dich mit dem Code auseinander, um den Fehler zu finden und dabei VBA noch besser zu verstehen".
Nun ja. Fehler gefunden:

    'Tabellen Auflisten
Liste = "Übersicht"
For i = 7 To .Sheets.Count 'ab Tabellenblatt 7
If Worksheets(i).Name  "Übersicht" Then Liste = Liste & ";" & Worksheets(i).Name
Next
Erklärung: siehe Aufgabe.
VG
Yal
Anzeige
AW: Import von Tabellen
15.12.2022 10:25:03
Tabellen
Hallo Yal,
sorry, aber ich blicks nicht mehr.
1. Es wird zwar das Tabellenblatt "Übersicht" kopiert, aber beim 2. Durchlauf wird eine zweite Übersicht hineinkopiert (Übersicht(2)). Diese soll aber, falls vorhanden, überschrieben werden.
2. Alle Tabellenblätter ab Tab7 werden überhaupt nicht kopiert. Es kommt die Fehlernummer 9.
Wie gesagt, ich habe sehr wenig VBA Kenntnisse. Ich habe alles was ich im Internet gefunden habe, zusammen kopiert. Meine Kenntnisse werden zwar besser, aber sind immer noch sehr Laienhaft.
Vielleicht kannst Du u.a. Code nochmal prüfen, wo hier der Fehler ist.
Grüße
Günther

Sub DatenHolen_M4()
Dim ExportDatei As Variant
Dim WBQuelle As Workbook
Dim WBZiel As Workbook
Dim i 'Lauf-Variable
Dim Liste
On Error GoTo Catch
AllgSchalter_setzen False
Set WBZiel = ThisWorkbook
'Datei auswählen und öffnen
ExportDatei = Application.GetOpenFilename("Micrsoft Excel-Dateien (*.xlsx),*.xlsx", , "Bitte Datei zu öffnen auswählen...")
If ExportDatei = CStr(False) Then Exit Sub
Set WBQuelle = Workbooks.Open(ExportDatei)
With WBQuelle
'Tabellen Auflisten
Liste = "Übersicht"
For i = 7 To .Sheets.Count 'ab Tabellenblatt 7
If .Name  "Übersicht" Then Liste = Liste & ";" & .Name
Next
'Tabellen in Ziel löschen und übertragen
For Each i In Split(Liste, ";")
If Worksheet_vorhanden(WBZiel, i) Then WBZiel.Worksheets(i).Delete
.Worksheets(i).Copy After:=WBZiel.Sheets(WBZiel.Sheets.Count)
Next
End With
WBQuelle.Close False
Set WBZiel = Nothing
GoTo Finally
Catch:
If Err.Number  0 Then
MsgBox "Fehler in Prozedur:" & vbTab & "'DatenHolen'" _
& vbLf & String(60, "_") & vbLf & vbLf _
& IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") _
& "Fehlernummer:" & vbTab & Err.Number & vbLf & vbLf _
& "Beschreibung:" & vbTab & Err.Description, _
vbExclamation + vbMsgBoxSetForeground, _
"VBA - Fehler in Prozedur - DatenHolen"
Err.Clear
End If
Finally:
AllgSchalter_setzen True
End Sub

Anzeige
AW: Import von Tabellen
15.12.2022 14:21:45
Tabellen
Hallo Günther,
DER CODE, DEN DU HIER POSTEST, beinhaltet nicht die letzte Korrektur. Wenn Du programmieren möchtest, darfst Du nicht dilletantisch rangehen.
VBA ist leichter zu lesen als man denkt:
gehe den Code durch und lese diese auf deutsch und laut. Ja, richtig: laut lesen. Ich suche immer noch die medizinische Erklärung, warum es so besser funktioniert, aber es funktioniert.
Also:

Set WBQuelle = Workbooks.Open(ExportDatei)  // die Variable WBQuelle "zielt" (Set) auf die gerade geöffnete Datei
With WBQuelle  // man nicht die Variable WBQuelle als Referenz (spricht alles, was danach mit einem Punkt anfängt bezieht sich auf dieser referenz)
'Tabellen Auflisten
Liste = "Übersicht" // Die Variable Liste bekommt den Text "Übersicht" (ja, zu diesem Zeitpunkt ist es nichts anderes als ein Text. )
For i = 7 To .Sheets.Count 'ab Tabellenblatt 7  // wir starten eine Schleife für alle Zahlen von 7 bis den Anzahl an Blätter in der Referenz (da ist der ".")
//Was passiert, wenn diesen WB weniger als 7 Blätter hat? .Sheets.Count ist kleiner als 7 also keine Schleifen durchlauf
If Worksheets(i).Name  "Übersicht" Then Liste = Liste & ";" & Worksheets(i).Name // wir nehmen die "i" worksheet (i ist 7). Moment mal: Worksheet von welche Workbook? Es ist hier unklar. Es gibt keine "." davor und auch kein anderen Qualifier. Als es wird das ActiveWorkbook genommen (d.h. hier Fehlerquelle). Ist es war gewollt wird?
// und vergleicht diesen Namen (es ist ein Text) mit dem Text "Übersicht"
// wenn diese nicht gleich sind, bekommt die Variable Liste sein bisherigen Inhalt plus ";" plus Name der i-te Worksheet
Next // dann nächste, falls .Sheets.Count >= 8
Anders gesagt: Übung macht den Meister. Je mehr Du liest, desto mehr verstehst Du, desto schneller wirst Du gut.
Du merkst auch: es muss sehr präzise gelesen werden. Nicht überfliegen. Dein Computer überfliegt den Code auch nicht, sondern macht peinlichst, was da steht. Komma und Punkt genau. Insbesonders, wenn solche fehlen.
VG
Yal
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige