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

Datenaustausch

Datenaustausch
06.04.2020 11:45:18
Steve
Moin Leute,
ich hab mal eine Frage. Ich habe ein Makro mit dem kann ich Daten mit einer zuvor ausgewählten Datei austauschen. Das Makro funktioniert auch. Aber ich möchte es so umschreiben, das es mit jedweder Quelldatei funktioniert.
Derzeit ist im Makro sowohl die Quelldatei, wie auch das ZielSheet festgeschrieben. Ich habe nun versucht das so dynamisch zu gestalten, das der Code zunächst prüft wie die Quelldatei und dann anhand einer definierten Zelle prüft wie das Zielsheet heisst. Dabei scheine ich mich allerdings irgendwie zu verzetteln, denn was auch immer ich versuche, es möchte einfach nicht klappen.
Kann mir jemand sagen was ich falsch mache und wo mein Denkfehler liegt?
Ich sende mal die Datei QUELLE und AUSTAUSCH mit.
https://www.herber.de/bbs/user/136442.zip
Liebe Grüße
Steve

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Halbe Lösung
06.04.2020 12:13:08
Steve
Moin,
ich glaube ich habe es rausgefunden.
Nun habe ich aber festgestellt, das es vorkommen kann, das das Sheet das ausgetauscht werden soll noch nicht existiert. Dann kommt natürlich eine Fehlermeldung.
1. Wie bekomme ich wohl eine Abfrage hin die mich auf diesen Umstand hinweist und mich fragt ob ich das entsprechenden Sheet neu anlegen möchte?
2. Gibt es eine Möglichkeit, das sich der Code den zuletzt gewählten Pfad zur Austauschdatei merkt und entsprechend bei der nächsten Abfrage vorschlägt?
Hier sende ich mal meinen bisherige Code.
Sub AUSTAUSCH()
Dim aktWB As String
Dim ws As String
Dim wb As Workbook
Dim lngZ As Long
Dim strFileName
Dim strFilter As String
aktWB = ActiveWorkbook.Name
ws = Range("N_Austausch")
strFilter = "Excel-Dateien(*.xlsm*), *.xlsm*"
ChDrive "C"
ChDir "C:\Users\Computer\Desktop"
strFileName = Application.GetOpenFilename(strFilter)
If strFileName = False Then Exit Sub
Set wb = Workbooks.Open(strFileName)
With Workbooks("AUSTAUSCH.xlsm")
With .Worksheets(ws)
.Cells.Delete Shift:=xlUp
.ListObjects.Add(xlSrcRange, .Range("$A$1"), , xlYes).Name = "Tabelle1"
Workbooks(aktWB).Sheets("LISTE").Range("T_Liste1[#All]").Copy
.Range("A1").PasteSpecial xlPasteAll
.ListObjects("T_Liste1").Name = "T_" & aktWB
.ListObjects("T_" & aktWB).ShowAutoFilterDropDown = False
.Cells.EntireColumn.AutoFit
Application.CutCopyMode = False
End With
.Close SaveChanges:=True
End With
Application.DisplayAlerts = True
End Sub
Liebe Grüße
Steve
Anzeige
AW: Halbe Lösung
08.04.2020 21:14:38
Dieter
Hallo Steve,
das könnte folgendermaßen aussehen (das vom Anwender ausgewählte Verzeichnis wird in F2 von Blatt "Start" gespeichert):
Sub AUSTAUSCH()
Dim anlegen As Long
Dim aktWB As String
Dim pfad As String
Dim ws As String
Dim wsNeu As Worksheet
Dim wsStart As Worksheet
Dim wb As Workbook
Dim wbQ As Workbook
Dim lngZ As Long
Dim strFileName
Dim strFilter As String
Set wbQ = ThisWorkbook
aktWB = wbQ.Name
Set wsStart = wbQ.Worksheets("START")
ws = wsStart.Range("N_Austausch")
strFilter = "Excel-Dateien(*.xlsm*), *.xlsm*"
If IsEmpty(wsStart.Range("F2")) Then
ChDrive "C"
ChDir "C:\Users\Computer\Desktop"
Else
ChDir wsStart.Range("F2")
End If
strFileName = Application.GetOpenFilename(strFilter)
If strFileName = False Then Exit Sub
Set wb = Workbooks.Open(strFileName)
pfad = wb.Path & "\"
' Ausgewähltes Verzeichnis speichern
wsStart.Range("F2") = pfad
wbQ.Save
If BlattExistiert(Mappe:=wb, _
Blattname:=ws) Then
' Blatt ist vorhanden
Set wsNeu = wb.Worksheets(ws)
Else
' Blatt ist nicht vorhanden
anlegen = MsgBox(Prompt:="Soll das Blatt """ & ws & """ angelegt werden?", _
Buttons:=vbYesNo + vbQuestion)
If anlegen = vbNo Then
MsgBox "Ausstieg"
Exit Sub
Else
Set wsNeu = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
End If
End If
With wsNeu
.Cells.Delete Shift:=xlUp
.ListObjects.Add(xlSrcRange, .Range("$A$1"), , xlYes).Name = "Tabelle1"
wbQ.Sheets("LISTE").Range("T_Liste1[#All]").Copy
.Range("A1").PasteSpecial xlPasteAll
.ListObjects("T_Liste1").Name = "T_" & aktWB
.ListObjects("T_" & aktWB).ShowAutoFilterDropDown = False
.Cells.EntireColumn.AutoFit
Application.CutCopyMode = False
End With
wb.Close SaveChanges:=True
Application.DisplayAlerts = True
End Sub
Function BlattExistiert(Mappe As Workbook, _
Blattname As String) As Boolean
Dim sh As Object
For Each sh In Mappe.Sheets
If UCase$(sh.Name) = UCase$(Blattname) Then
BlattExistiert = True
Exit Function
End If
Next sh
End Function
https://www.herber.de/bbs/user/136548.xlsm
Viele Grüße
Dieter
Anzeige
AW: Halbe Lösung
10.04.2020 18:28:42
Steve
Moin Dieter,
Ich komme leider erst am Dienstag dazu mir das alles anzuschauen. Das ist sehr schade weil ich das sehr gerne jetzt umsetzen möchte.
Ich danke dir für deine Hilfe und gebe alsbald Rückmeldung ob alles funktioniert.
Liebe Grüße.
Steve
AW: Halbe Lösung
10.04.2020 18:28:43
Steve
Moin Dieter,
Ich komme leider erst am Dienstag dazu mir das alles anzuschauen. Das ist sehr schade weil ich das sehr gerne jetzt umsetzen möchte.
Ich danke dir für deine Hilfe und gebe alsbald Rückmeldung ob alles funktioniert.
Liebe Grüße.
Steve
AW: Halbe Lösung
14.04.2020 10:26:38
Steve
Moin Dieter,
das klappt super.
Zuerst hat er gemeckert weil da noch C:\Herber stand. Aber nachdem ich einmalig den Pfad auf Desktop geändert habe, hat alles funktioniert.
Nur eine Frage habe ich. Wenn das zu übertragende Tabellenblatt nicht existiert, dann wird gefragt ob es angelegt werden soll. Bejaht man das, wird zwar ein Tabellenblatt angelegt, aber dieses wird nicht umbenannt. Es soll ja den Namen aus B2 also Range N_Austausch erhalten.
Sehe ich das richtig, das ich das in diesem Bereich deines Codes unterbringen muss?
With wsNeu
.Cells.Delete Shift:=xlUp
.ListObjects.Add(xlSrcRange, .Range("$A$1"), , xlYes).Name = "Tabelle1"
wbQ.Sheets("LISTE").Range("T_Liste1[#All]").Copy
.Range("A1").PasteSpecial xlPasteAll
.ListObjects("T_Liste1").Name = "T_" & aktWB
.ListObjects("T_" & aktWB).ShowAutoFilterDropDown = False
.Cells.EntireColumn.AutoFit
Application.CutCopyMode = False
End With
Vielen Dank schon einmal und liebe Grüße
Bleib gesund
Steve
Anzeige
AW: Halbe Lösung
14.04.2020 10:41:10
Steve
Moin Dieter,
mir ist noch eine Sache aufgefallen die ich selber verbockt habe.
Die Tabelle die neu angelegt wird, erhält soll ja umbenannt werden.
Dabei soll sie den Namen der Quelldatei mit einem vorgesetzten T_ erhalten.
Aber mir ist aufgefallen, das die Dateiendung, also .xlsm auch dabei ist.
Kannst du mir sagen wie ich die wegbekomme?
Liebe Grüße
Steve
Ich glaube ich habs....
14.04.2020 10:56:41
Steve
Sorry, ich nochmal.
Ich glaube ich hab eine Lösung. Sie funktioniert und sieht so aus:
With wsNeu
.Cells.Delete Shift:=xlUp
.ListObjects.Add(xlSrcRange, .Range("$A$1"), , xlYes).Name = "Tabelle1"
wbQ.Sheets("LISTE").Range("T_Liste1[#All]").Copy
.Range("A1").PasteSpecial xlPasteAll
.ListObjects("T_Liste1").Name = "T_" & ws
.ListObjects("T_" & ws).ShowAutoFilterDropDown = False
.Cells.EntireColumn.AutoFit
Application.CutCopyMode = False
.Name = ws
End With
Mit den Änderungen heissen Tabelle und Sheet gleich (mit T_ als ausnahme). so kann ich dann mit der nächsten Datei diese Daten bequem wieder abgreifen, da ich mich dann ja nur an dem Namen der Quelldatei orientieren muss.
Kann man das so lassen oder hab ich da einen Denkfehler?
Liebe Grüße
Steve
Anzeige
AW: Ich glaube ich habs....
14.04.2020 12:12:46
Dieter
Hallo Steve,
die Umbennenung des Blattes habe ich tatsächlich vergessen, tut mir leid.
Du bist ja schon super aktiv. Soweit ih das sehe, ist dein Vorschlag ganz korrekt.
Ich würde aber trotzdem vorschlagen, die Umbenennung des neu eingefügten Blattes direkt hinter _
den Add-Befehl zu setzen:

If BlattExistiert(Mappe:=wb, _
Blattname:=ws) Then
' Blatt ist vorhanden
Set wsNeu = wb.Worksheets(ws)
Else
' Blatt ist nicht vorhanden
anlegen = MsgBox(Prompt:="Soll das Blatt """ & ws & """ angelegt werden?", _
Buttons:=vbYesNo + vbQuestion)
If anlegen = vbNo Then
MsgBox "Ausstieg"
Exit Sub
Else
Set wsNeu = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
wsNeu.Name = ws
End If
End If

Wenn du die Umbenennung in dem Bereich With wsNeu ... End With unterbringst, dann wird das Blatt auch umbenannt, wenn es bereits existiert hat und diesen Namen bereits hatte. Das ist zwar in keiner Weise schlimm, stört mich aber aus formalen Gründen etwas.
Übrigens, um von aktWB die Dateiendung abzuschneiden, kannst du den folgenden Befehl verwenden:
zf = Left$(aktWB, Len(aktWB)-5)
(Dim zf As String)
Ich wünsche dir weiter viel Erfolg und bleib gesund.
Viele Grüße
Dieter
Anzeige
AW: Ich glaube ich habs....
14.04.2020 14:45:36
Steve
Hallo Dieter,
danke für den Hinweis - habe ich direkt mal umgesetzt - und den Tipp mit der Dateiendung.
Den hebe ich mir mal auf. Brauche ich sicherlich noch einmal.
Ich habe übrigens einen dusseligen Fehler gemacht. Als ich meine Beispieldatei gesendet habe, war die nur zum Teil so aufgebaut wie das Original. War nicht weiter schlimm. Ich habe das alles anpassen können, aber es sind ein paar Fragen, wahrscheinlich aus Unkenntnis, aufgekommen.
Set wsStart = wbQ.Worksheets("DATEN") 'bei deiner Version war es noch "START"
ws = wsStart.Range("N_Austausch")
Wenn ich das richtig verstehe, dann steht da letztlich N_Austausch befindet sich im Sheet "DATEN".
N_Austausch ist ja eine mit Namen versehene Zelle, deshalb habe ich bisher immer darauf verzichtet letztlich festzulegen wo diese sich befindet. Kannst du mir erklären was es damit auf sich hat?
Den gespeicherten Pfad hast du in F2 angelegt. Den zu verändern ist nicht schwer gewesen.
Also hab ich ihn in das Sheet DATEN in B7 verlegt. (Bis hierhing funktioniert auch alles.)
Dann habe ich für diese Zelle ebenfalls einen Namen vergeben.
Ziel der dynamischen Namen ist, das diese Zellen später, wenn das Layout vergeben werden soll, verschoben werden können ohne dass das Makro darunter leidet.
Habe den Namen vergeben, ihn als String deklariert und dann genauso behandelt wie die Austauschzelle:
lpf = wsStart.Range("N_lpfad")
Dann habe ich die Stellen mit "B7" entsprechend ersetzt. Leider funktioniert das nicht. Kannst du mir sagen was ich da falsch mache?
Ich hänge die Datei mal in geänderter Form an.
https://www.herber.de/bbs/user/136699.xlsm
Da das Original vorsieht, dass das Sheet DATEN ausgeblendet und geschützt ist, habe ich das nun ebenfalls gemacht. Habe in das Makro mit eingebaut, das der Schutz aufgehoben und wieder gesetzt wird.
Wenn ich das richtig verstanden habe, ist das einblenden des Sheets ja nicht zwingend erforderlich - korrekt?
Liebe Grüße
Steve
Anzeige
Folgeproblem in DIESE ARBEITSMAPPE
14.04.2020 15:29:21
Steve
Sorry Dieter,
ich habe das Makro in der Originaldatei eingebaut. In DIESEARBEITSMAPPE habe ich ebenfalls ein Makro. Im Laufe des Vorgangs springt dein Code vor dem Speichern rein und produziert eine Fehlermeldung 1004.
Ich sehe aber den zusammenhang überhaupt nicht.
wäre es wohl möglich dir das mal anzuschauen und mir zu sagen was hierfür die Ursache ist?
Ich hänge dir die Datei als ZIP an, weil standartmäßig zwei Ordner dazugehören. Diese sind aber derzeit leer. Ich sende es dir nur der vollständigkeit halber mit.
wäre echt super du könntest mir dabei helfen. Ich danke dir schon einmal im vorraus.
https://www.herber.de/bbs/user/136701.zip
Steve
Anzeige
Da muss einer erst einmal drauf kommen...
14.04.2020 15:55:45
Steve
Ich habe nun die Quelle gefunden und hab auch eine Idee
In diese Arbeitsmappe werden die Einträge aus den Sheets die angelegt werden in das Sheet LISTE übertragen. Das passiert anhand des definierten Ranges DATEN.
' Ausgewähltes Verzeichnis speichern
' wsStart.Range("E9") = pfad
' wbQ.Save

Hier wird aus wsStart - DATEN.Range("E9")
Ich nehme an das kollidiert miteinander und das andere Makro meint es ist angesprochen. Liege ich da richtig und wie kann ich das umgehen?
Fakt ist, kommentiere ich den oben eingefügten Code aus, dann funktioniert alles.
Bin gespannt ob ich da richtig liege.
Liebe Grüße
Steve
PS.: Sorry das ich dich damit zutexte, aber ich versuche natürlich auch selber noch auf die Lösung zu kommen.
Anzeige
AW: Da muss einer erst einmal drauf kommen...
14.04.2020 17:55:02
Dieter
Hallo Steve,
du hast im Codemodul "DieseArbeitsmappe" eine Workbook_SheetChange-Prozedur, die auf jede Zellinhaltsänderung anspricht, die irgendwo in der Arbeitsmappe stattfindet.
Der Befehl
wsStart.Range("E9") = pfad
in der Prozedur "AUSTAUSCH" bewirkt eine Änderung und deine Workbook_SheetChange-Prozedur wird tätig.
Du kannst das aber verhindern, indem du vor dem obigen Schreibbefehl die Ereignisbehandlung ausschaltest. Nach dem Schreibbefehl schaltest du sie wieder ein.
Das würde dann so aussehen
  ' Ausgewähltes Verzeichnis speichern
Application.EnableEvents = False
wsStart.Range("E9") = pfad
Application.EnableEvents = True
Viele Grüße
Dieter
Anzeige
AW: Da muss einer erst einmal drauf kommen...
16.04.2020 11:03:45
Steve
Moin Dieter,
das klappt super. Und wieder etwas das ich mir merken kann. Das problem hatte ich namlich schon einmal an anderer Stelle und musste mir dann eine andere Lösung überlegen.
Ich danke dir.
Jetzt muss ich nur noch schauen, das ich die Zelle in der der Pfad gespeichert ist dynamisieren kann damit die Zelle gefahrlos hin und her geschoben werden kann.
Liebe Grüße
Steve

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige