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

Abgleich und dazufügen

Abgleich und dazufügen
Andre
Hi Leute,
ich brauche dringend Hilfe für die genaue Deklaration in meinem Makro.
Da Makro sollte nacheinander jedes Excel Sheet in einem Ordner öffnen und danach in Spalte A einen Abgleich mit der Zieldatei machen und bei Treffer Spalte A farblich makieren und die Werte von Spalte B bis Ar kopieren. Falls der Wert nicht vorhanden ist einfach bei der Zieldatei unten dranhängen.
Leider kann ich die Quelle nicht sauber deklarieren, damit das Program immer weiss, dies ist die Quelle und das ist das Ziel.
Bei Set Quelle = ActiveWorkbook kommt der Fehler Run timer error '13'
Kann mir einer auf die Sprünge helfen?
Sub Update()
Dim ZeilePreli As Range
Dim LZData As Range
Dim Zeile, LetzteZeile, IndexPreli As Integer
Dim LZDataRow As Integer
Dim strfile As String
Dim Ziel, Quelle As Worksheets
Dim fso As Variant
Dim oFile As Variant
Dim ID As Range
Const sSourcePath = "D:\Arbeitsdateien\Procurement Savings\files"
Set Ziel = ActiveWorkbook
Set fso = CreateObject("Scripting.FileSystemObject")
For Each oFile In fso.GetFolder(sSourcePath).Files
'nur .xls-Dateien bearbeiten
If LCase(Right(oFile.Name, 4)) = ".xls" Then 'nur .xls-Dateien bearbeiten
Application.Workbooks.Open (oFile.Path)
Set Quelle = ActiveWorkbook
Zeile = 5                             'Startzeile für den Abgleich
LetzteZeile = Ziel.Worksheets(Measures).Cells(Cells.Rows.Count, 1).End(xlUp).row  ' _
Ermittlung der letzten Zeile in Zieldatei
Do While Quelle.Worksheets(Measures).Cells(Zeile, 1)  ""          ' Solange Zeilen in  _
Quelle
IndexPreli = Quelle.Worksheets(Measures).Cells(Zeile, 1).Value  ' ID aus Quelle
Set ZeilePreli = Ziel.Worksheets(Measures).Range("A:A").Find(IndexPreli)   ' In  _
Ziel den Bezug für die ID suchen
If Not ZeilePreli Is Nothing Then   ' In Ziel einen Bezug für ID aus input gefunden
Ziel.Worksheets(Measures).Cells(ZeilePreli.row, 1).Interior.ColorIndex = 33    '  _
gefundene ID in Data markieren
Quelle.Worksheets(Measures).Range(Cells(ZeilePreli.row, 1), Cells(ZeilePreli.row,  _
31)).Copy Destination:=Ziel.Worksheets(Measures).Cells(Zeile, 1)
Else ' Wenn in Ziel "Data" kein Bezug für die ID aus der gerade bearbeiteteten  _
Zeile in Quelle "Data" gefunden werden kann
Quelle.Worksheets(Measures).Range(Cells(Zeile, 1), Cells(Zeile, 31)).Copy  '  _
Datenbereich aus input (Ctrl-C)
Set LZData = Ziel.Range("A5:A65536").Find("") ' Bezug auf erste Spalte Data ab A5
LZDataRow = LZData.row                          ' Zeilennummer der ersten leere  _
Zelle in Spalte A
' MsgBox LZDataRow
Ziel.Worksheets(Measures).Activate
Cells(LZDataRow, 1).Select                      'Spalte B der ersten leeren Zeile  _
in Data
Selection.PasteSpecial Paste:=xlPasteValues     ' Werte einfügen (ALT B,F,W)
End If
Zeile = Zeile + 1       ' Nächste Zeile aus Quelle "data" bearbeiten
Loop
End If
Next 'Datei
MsgBox "Fertig"
End Sub

Ich wollte gerne
ich würde gerne eine Master Datei haben und

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Abgleich und dazufügen
10.01.2011 13:29:32
Holger,
Hallo,
du hast Quelle als Worksheet deklariert, willst aber ein Workbook öffnen.
Daher musst du Quelle als Workbook deklarieren.
AW: Abgleich und dazufügen
10.01.2011 13:33:26
Rudi
Hallo,
Dim Ziel as Workbook, Quelle As Workbook
Gruß
Rudi
AW: Abgleich und dazufügen
10.01.2011 13:51:36
Andre
Hi,
Danke für die schnelle Antwort. Leider läuft es später auch nicht weiter.
LetzteZeile = Ziel.Worksheets(Measures).Cells(Cells.Rows.Count, 1).End(xlUp).row
Er ermittelt hier nicht die letzte Zeile wieder Type 13 Fehler und wenn ich hier 1000 eingebe,
springt er bei der Zeile
Do While Quelle.Worksheets(Measures).Cells(Zeile, 1) ""
wieder auf Fehler.
Ich habe hier irgendeinen Denkfehler, den ich leider nicht finde.
Seht ihr den Fehler?
Gruss
Andre
Anzeige
AW: Abgleich und dazufügen
10.01.2011 14:27:59
Rudi
Hallo,
ein Cells. zuviel.
LetzteZeile = Ziel.Worksheets(Measures).Cells(Rows.Count, 1).End(xlUp).Row
Gruß
Rudi
AW: Abgleich und dazufügen
10.01.2011 14:56:46
Andre
Hi Rudi,
das klappt jetzt, aber bei Zeile
Do While Quelle.Worksheets(Measures).Cells(Zeile, 1) ""
bringt mir immer noch den Run Timer error?
Es ist doch richtig vorher das Ziel zu definieren ActiveWorkbook und
danach in der Schleife das Active Workbook als Quelle zu definieren?
Hier nochmal der ganze Code mit deinen Verbesserungen.
Zusätzlich habe ich noch mal eine test datei gemacht. Man muss jetzt nur einen Ordner bei D mit "test" anlegen und diese Datei einmal reinkopieren um zu testen.
https://www.herber.de/bbs/user/73015.xls
Sub Update()
Dim ZeilePreli As Range
Dim LZData As Range
Dim Zeile, LetzteZeile, IndexPreli As Integer
Dim LZDataRow As Integer
Dim strfile As String
Dim Ziel As Workbook, Quelle As Workbook
Dim fso As Variant
Dim oFile As Variant
Dim ID As Range
Const sSourcePath = "D:\Arbeitsdateien\Procurement Savings\files"
Set Ziel = ActiveWorkbook
Set fso = CreateObject("Scripting.FileSystemObject")
For Each oFile In fso.GetFolder(sSourcePath).Files
'nur .xls-Dateien bearbeiten
If LCase(Right(oFile.Name, 4)) = ".xls" Then 'nur .xls-Dateien bearbeiten
Application.Workbooks.Open (oFile.Path)
Set Quelle = ActiveWorkbook
Zeile = 4                             'Startzeile für den Abgleich
LetzteZeile = Ziel.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).row + 1  'Ermittlung  _
der letzten Zeile in Zieldatei
Do While Quelle.Worksheets(Measures).Cells(Zeile, 1)  ""          ' Solange Zeilen in  _
Quelle
IndexPreli = Quelle.Worksheets(Measures).Cells(Zeile, 1).Value  ' ID aus Quelle
Set ZeilePreli = Ziel.Worksheets(Measures).Range("A:A").Find(IndexPreli)   ' In  _
Ziel den Bezug für die ID suchen
If Not ZeilePreli Is Nothing Then   ' In Ziel einen Bezug für ID aus input gefunden
Ziel.Worksheets(Measures).Cells(ZeilePreli.row, 1).Interior.ColorIndex = 33    '  _
gefundene ID in Data markieren
Quelle.Worksheets(Measures).Range(Cells(ZeilePreli.row, 1), Cells(ZeilePreli.row,  _
31)).Copy Destination:=Ziel.Worksheets(Measures).Cells(Zeile, 1)
Else ' Wenn in Ziel "Data" kein Bezug für die ID aus der gerade bearbeiteteten  _
Zeile in Quelle "Data" gefunden werden kann
Quelle.Worksheets(Measures).Range(Cells(Zeile, 1), Cells(Zeile, 31)).Copy  '  _
Datenbereich aus input (Ctrl-C)
Set LZData = Ziel.Range("A5:A65536").Find("") ' Bezug auf erste Spalte Data ab A5
LZDataRow = LZData.row                          ' Zeilennummer der ersten leere  _
Zelle in Spalte A
' MsgBox LZDataRow
Ziel.Worksheets(Measures).Activate
Cells(LZDataRow, 1).Select                      'Spalte B der ersten leeren Zeile  _
in Data
Selection.PasteSpecial Paste:=xlPasteValues     ' Werte einfügen (ALT B,F,W)
End If
Zeile = Zeile + 1       ' Nächste Zeile aus Quelle "data" bearbeiten
Loop
End If
Next 'Datei
MsgBox "Fertig"
End Sub

Gruss
Andre
Anzeige
AW: Abgleich und dazufügen
10.01.2011 17:38:02
Andre
Hi,
ich habe den Code ein wenig verändert, da es noch ein paar bugs gegeben hat.
Jetzt habe ich beim kopieren ein Problem, beim zweiten Durchlauf funktioniert es nicht.
ws.Range(Cells(Zeile, 1), Cells(Zeile, 31)).Copy ' Datenbereich aus input (Ctrl-C)
Hat einer eine Idee? Sollte ich anders kopieren?
Zum Testen einfach das Sheet unter D:\test\test kopieren und nocheinmal in D:\test.
https://www.herber.de/bbs/user/73019.xls
Sub Update()
Dim ZeilePreli As Range
Dim LZData As Range
Dim Zeile, LetzteZeile As Integer
Dim LZDataRow As Integer
Dim strfile As String
Dim Ziel As Workbook, Quelle As Workbook
Dim fso, IndexPreli As Variant
Dim oFile As Variant
Dim ID As Range
Const sSourcePath = "D:\test\test"
Set Ziel = ActiveWorkbook
Set fso = CreateObject("Scripting.FileSystemObject")
For Each oFile In fso.GetFolder(sSourcePath).Files
'nur .xls-Dateien bearbeiten
If LCase(Right(oFile.Name, 4)) = ".xls" Then 'nur .xls-Dateien bearbeiten
Application.Workbooks.Open (oFile.Path)
Zeile = 4                             'Startzeile für den Abgleich
Set Quelle = ActiveWorkbook
Dim ws As Worksheet
Set ws = Quelle.Worksheets("Measures")
Do While ws.Cells(Zeile, 1)  ""          ' Solange Zeilen in Quelle
IndexPreli = ws.Cells(Zeile, 1).Value  ' ID aus Quelle
Set ZeilePreli = Ziel.Worksheets("Measures").Range("A:A").Find(IndexPreli)   ' In  _
Ziel den Bezug für die ID suchen
If Not ZeilePreli Is Nothing Then   ' In Ziel einen Bezug für ID aus input gefunden
Ziel.Worksheets("Measures").Cells(ZeilePreli.row, 1).Interior.ColorIndex = 33    '  _
gefundene ID in Data markieren
ws.Range(Cells(Zeile, 2), Cells(Zeile, 31)).Copy Destination:=Ziel.Worksheets(" _
Measures").Cells(ZeilePreli.row, 2)
Else ' Wenn in Ziel "Data" kein Bezug für die ID aus der gerade bearbeiteteten  _
Zeile in Quelle "Data" gefunden werden kann
ws.Range(Cells(Zeile, 1), Cells(Zeile, 31)).Copy  ' Datenbereich aus input (Ctrl-C)
Set LZData = Ziel.Worksheets("Measures").Range("A4:A65536").Find("") ' Bezug auf  _
erste Spalte Data ab A5
LZDataRow = LZData.row                          ' Zeilennummer der ersten leere  _
Zelle in Spalte A
' MsgBox LZDataRow
Ziel.Worksheets("Measures").Activate
Cells(LZDataRow, 1).Select                      'Spalte B der ersten leeren Zeile  _
in Data
Selection.PasteSpecial Paste:=xlPasteValues     ' Werte einfügen (ALT B,F,W)
End If
Zeile = Zeile + 1       ' Nächste Zeile aus Quelle "data" bearbeiten
Loop
End If
ActiveWorkbook.Close
Next 'Datei
MsgBox "Fertig"
End Sub

Vielen Dank vorab für die Hilfe.
Gruss
Andre
Anzeige
nicht referenziert
10.01.2011 18:16:01
Christian
Hallo Andre
mit ws.Range(Cells(Zeile, 1), Cells(Zeile, 31))
referenzierst du den Range auf das Worksheet "ws" aber "Cells(Zeile, 1)" und "Cells(Zeile, 31)" auf das aktive Worksheet.
also:
ws.Range(ws.Cells(Zeile, 1), ws.Cells(Zeile, 31))
oder
ws.Cells(Zeile, 1).Resize(, 31)
oder...
Gruß
Christian
AW: nicht referenziert
11.01.2011 11:23:23
Andre
Hi Christian,
Danke für deinen Tip. Habe jetzt Resize genommen, da es besser funktioniert.
Der Code funktioniert jetzt und kann benützt werden.
Ich habe nur noch ein Problem;
Der Master und die Quelldateien haben dieselbe Struktur und um die Eingabe zu erleichtern, habe ich bei
bestimmten Spalten Dropdown Menüs für eine einfachere Bedienung eingerichtet.
Jetzt frägt er mich bei jeder Zeile, ob er den Namen vom alten oder Neuen Sheet nehmen soll.
Kann ich bei dem Makro umgehen, dass er den Namen mitzieht (aber ich habe doch schon unten Paste:=xlPasterValues only geschrieben)?
Gruss
Andre
PS: Hier jetzt der Code, der normalerweise sehr gut funktioniert:
Sub Update()
Dim ZeilePreli As Range
Dim LZData As Range
Dim Zeile, LetzteZeile As Integer
Dim LZDataRow As Integer
Dim strfile As String
Dim Ziel As Workbook, Quelle As Workbook
Dim fso, IndexPreli As Variant
Dim oFile As Variant
Dim ID As Range
Const sSourcePath = "D:\test\test"
Set Ziel = ActiveWorkbook
Set fso = CreateObject("Scripting.FileSystemObject")
For Each oFile In fso.GetFolder(sSourcePath).Files
'nur .xls-Dateien bearbeiten
If LCase(Right(oFile.Name, 4)) = ".xls" Then 'nur .xls-Dateien bearbeiten
Application.Workbooks.Open (oFile.Path)
Zeile = 4                             'Startzeile für den Abgleich
Set Quelle = ActiveWorkbook
Dim ws As Worksheet
Set ws = Quelle.Worksheets("Measures")
Do While ws.Cells(Zeile, 1)  ""          ' Solange Zeilen in Quelle
IndexPreli = ws.Cells(Zeile, 1).Value  ' ID aus Quelle
Set ZeilePreli = Ziel.Worksheets("Measures").Range("A:A").Find(IndexPreli)   ' In  _
Ziel den Bezug für die ID suchen
If Not ZeilePreli Is Nothing Then   ' In Ziel einen Bezug für ID aus input gefunden
Ziel.Worksheets("Measures").Cells(ZeilePreli.row, 1).Interior.ColorIndex = 33    '  _
gefundene ID in Data markieren
ws.Cells(Zeile, 2).Resize(, 44).Copy Destination:=Ziel.Worksheets("Measures").Cells( _
ZeilePreli.row, 2)
Else ' Wenn in Ziel "Data" kein Bezug für die ID aus der gerade bearbeiteteten  _
Zeile in Quelle "Data" gefunden werden kann
ws.Cells(Zeile, 1).Resize(, 44).Copy  ' Datenbereich aus input (Ctrl-C)
Set LZData = Ziel.Worksheets("Measures").Range("A4:A65536").Find("") ' Bezug auf  _
erste Spalte Data ab A5
LZDataRow = LZData.row                          ' Zeilennummer der ersten leere  _
Zelle in Spalte A
' MsgBox LZDataRow
Ziel.Worksheets("Measures").Activate
Cells(LZDataRow, 1).Select                      'Spalte B der ersten leeren Zeile  _
in Data
Selection.PasteSpecial Paste:=xlPasteValues     ' Werte einfügen (ALT B,F,W)
End If
Zeile = Zeile + 1       ' Nächste Zeile aus Quelle "data" bearbeiten
Loop
End If
Quelle.Close
Next 'Datei
MsgBox "Fertig"
End Sub

Anzeige
Application.DisplayAlerts=False/True owT
11.01.2011 13:20:48
Rudi
AW: Application.DisplayAlerts=False/True owT
11.01.2011 13:48:00
Andre
Hi Rudi,
habe ich nicht ganz verstanden, aber ich habe den Code jetzt umgeschrieben und dieselbe Kopier routine wie bei keinem Treffer genommen.
Vielen Dank für eure Hilfe. Nochmal der ganze Code falls ihr ihn mal benötigt.
Gruss
Andre
Sub Updatenew()
Dim ZeilePreli As Range
Dim LZData As Range
Dim Zeile, LetzteZeile, LZDataRowIndex As Integer
Dim LZDataRow As Integer
Dim strfile As String
Dim Ziel As Workbook, Quelle As Workbook
Dim fso, IndexPreli As Variant
Dim oFile As Variant
Dim ID As Range
Const sSourcePath = "D:\Arbeitsdateien\Procurement Savings\files"
Set Ziel = ActiveWorkbook
Set fso = CreateObject("Scripting.FileSystemObject")
For Each oFile In fso.GetFolder(sSourcePath).Files
'nur .xls-Dateien bearbeiten
If LCase(Right(oFile.Name, 4)) = ".xls" Then 'nur .xls-Dateien bearbeiten
Application.Workbooks.Open (oFile.Path)
Zeile = 4                             'Startzeile für den Abgleich
Set Quelle = ActiveWorkbook
Dim ws As Worksheet
Set ws = Quelle.Worksheets("Measures")
Do While ws.Cells(Zeile, 1)  ""     ' Solange Zeilen in Quelle
IndexPreli = ws.Cells(Zeile, 1).Value  ' ID aus Quelle
Set ZeilePreli = Ziel.Worksheets("Measures").Range("A:A").Find(IndexPreli)   ' In  _
Ziel den Bezug für die ID suchen
If Not ZeilePreli Is Nothing Then   ' In Ziel einen Bezug für ID aus input gefunden
ws.Cells(Zeile, 2).Resize(, 44).Copy  ' Datenbereich aus Quelle (Ctrl-C)
Ziel.Worksheets("Measures").Activate
Ziel.Worksheets("Measures").Cells(ZeilePreli.row, 2).Select 'Zeile mit der selben  _
ID selektieren
Selection.PasteSpecial Paste:=xlPasteValues, Paste:=xlPasteFormats ' Werte und  _
Formate
Ziel.Worksheets("Measures").Cells(ZeilePreli.row, 1).Interior.ColorIndex = 33 '  _
gefundene ID farblich markieren
Else ' Wenn in Ziel "Data" kein Bezug für die ID aus der gerade bearbeiteteten  _
Zeile in Quelle "Data" gefunden werden kann
ws.Cells(Zeile, 1).Resize(, 44).Copy  ' Datenbereich aus Quelle (Ctrl-C)
Set LZData = Ziel.Worksheets("Measures").Range("A4:A65536").Find("") ' Bezug auf  _
erste Spalte Data ab A5
LZDataRow = LZData.row                          ' Zeilennummer der ersten leere  _
Zelle in Spalte A
Ziel.Worksheets("Measures").Activate
Cells(LZDataRow, 1).Select                      'Spalte B der ersten leeren Zeile  _
in Data
Selection.PasteSpecial Paste:=xlPasteValues, Paste:=xlPasteFormats     ' Werte einfü _
gen (ALT B,F,W)
Ziel.Worksheets("Measures").Cells(LZDataRow, 1).Interior.ColorIndex = 20 'neue ID  _
farblich markieren
End If
Zeile = Zeile + 1       ' Nächste Zeile aus Quelle "data" bearbeiten
Loop
End If
Quelle.Close
Next 'Datei
MsgBox "Fertig"
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige