Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

excel VBA vergleichen und neues einfügen
#1
Hallo,

ich habe aktuell eine sehr aufwendige VBA Abfrage, die zu viele Dateien täglich abfragt. Jetzt ist meine Überlegung, ob man das alles so einstellen kann, dass diese nur noch den aktuellen Monat abfragt (dieser in extra Ordner) und dann nur noch Neuerungen in eine zweite Liste einfügt.

ist das möglich??

VBA für die Abfrage:
Code:
Sub Lese()

Dim intBereich As Integer
Dim intZeile As Integer
Dim intSpalte As Integer
Dim strDatei As String
Dim intAnzVerz  As Integer
Dim intAktVerz  As Integer
Dim intAktBlatt As Integer
Dim intAktZeile As Integer
Dim intAktSpalte As Integer
Dim intSpDatum As Integer
Dim intSpBlatt As Integer
Dim intSpDatei As Integer
Dim intSpVerz As Integer
Dim strVerz As String
Dim strVerzA() As String
Dim varDatum As Variant
Dim varKopie As Variant
Dim varRngKopie As Variant
Dim bolLeer As Boolean
Dim rngAusgabe As Range
Dim wbLesen As Workbook
Dim wsLesen As Worksheet

Const intMaxVerz As Integer = 30
Const intMaxblatt As Integer = 2
Const strTeilDatei As String = ".xlsx"
Const strRngDatum As String = "C2"
Const strRngKopie As String = "B3:J55"
Const bolZeigVerz As Boolean = False
Const bolZeigDatei As Boolean = False
Const bolZeigBlatt As Boolean = False
Const bolZeigLeer As Boolean = True


Application.ScreenUpdating = False
'----------------------------------------------------
' Spalten für Verzeichnis, Datei und Blatt einrichten
'----------------------------------------------------
intSpDatum = 0
intSpBlatt = 0
intSpDatei = 0
intSpVerz = 0
If bolZeigBlatt Then
   intSpDatum = intSpDatum + 1
End If
If bolZeigDatei Then
   intSpDatum = intSpDatum + 1
   intSpBlatt = intSpBlatt + 1
End If
If bolZeigVerz Then
   intSpDatum = intSpDatum + 1
   intSpBlatt = intSpBlatt + 1
   intSpDatei = intSpDatei + 1
End If
varRngKopie = Split(strRngKopie)

'----------------------------------------------------
' Verzeichniseinlesen und Variablen initialisieren
'----------------------------------------------------

ReDim strVerzA(intMaxVerz)
intAktVerz = 1
intAnzVerz = 1
intAktZeile = 0
strVerzA(intAnzVerz) = ThisWorkbook.Names("Verzeichnis").RefersToRange
Set rngAusgabe = ThisWorkbook.Worksheets("Füllung").Cells(3, 1)
'Set rngAusgabe = ThisWorkbook.Names("Ausfüllen").RefersToRange

'----------------------------------------------------
' Schleife über Verzeichnisse
'----------------------------------------------------
While intAktVerz <= intAktVerz And intAktVerz <= intMaxVerz
   strVerz = strVerzA(intAktVerz)
   strDatei = Dir(strVerz, vbDirectory)
'----------------------------------------------------
' Schleife über Dateien im Verzeichnis
'----------------------------------------------------
   While strDatei <> ""
       If (GetAttr(strVerz & strDatei) And vbDirectory) = vbDirectory Then
           If strDatei <> "." And strDatei <> ".." And strDatei <> "" And intAnzVerz < intMaxVerz Then
               intAnzVerz = intAnzVerz + 1
               strVerzA(intAnzVerz) = strVerz & strDatei & "\"
           End If
       Else
           If InStr(strDatei, strTeilDatei) > 0 And strDatei <> ThisWorkbook.Name Then
               intAktBlatt = 0
               Set wbLesen = Workbooks.Open(Filename:=strVerz & strDatei, ReadOnly:=True)
               For Each wsLesen In wbLesen.Worksheets
                   intAktBlatt = intAktBlatt + 1
                   If intAktBlatt <= intMaxblatt Then
                       varDatum = wsLesen.Range(strRngDatum)
                       For intBereich = 0 To UBound(varRngKopie)
                           varKopie = wsLesen.Range(varRngKopie(intBereich)).Value
                           For intZeile = 1 To UBound(varKopie, 1)
'----------------------------------------------------
' Prüfen ob Werte leer
'----------------------------------------------------
                               If bolZeigLeer Then
                                   bolLeer = False
                               Else
                                   bolLeer = True
                                   For intSpalte = 1 To UBound(varKopie, 2)
                                       If varKopie(intZeile, intSpalte) <> "" Then
                                           bolLeer = False
                                       End If
                                   Next intSpalte
                               End If
'----------------------------------------------------
' Schreiben wenn nicht leer
'----------------------------------------------------
                               If Not bolLeer Then
                                   For intSpalte = 1 To UBound(varKopie, 2)
                                       rngAusgabe.Offset(intAktZeile, intSpalte + intSpDatum).Value = varKopie(intZeile, intSpalte)
                                   Next intSpalte
                                   rngAusgabe.Offset(intAktZeile, intSpVerz).Value = strVerz
                                   rngAusgabe.Offset(intAktZeile, intSpDatei).Value = strDatei
                                   rngAusgabe.Offset(intAktZeile, intSpBlatt).Value = wsLesen.Name
                                   rngAusgabe.Offset(intAktZeile, intSpDatum).Value = varDatum
                                   intAktZeile = intAktZeile + 1
                               End If
                           Next intZeile
                       Next intBereich
                   End If
               Next wsLesen
               wbLesen.Close savechanges:=False
           End If
       End If
   strDatei = Dir()
   Wend
   intAktVerz = intAktVerz + 1
Wend
Application.ScreenUpdating = True
End Sub

Aktuell Exportiere ich komplett:

Code:
Sub Tabelle_kopieren()
' Tabelle_kopieren Makro
Const strZiel As String = "R:\xxx.xlsm"   'Pfad + Dateiname
Const strZiel2 As String = "R:\xxxx.xlsm"   'Pfad + Dateiname
Const strZiel3 As String = "R:\xxxxx.xlsm"   'Pfad + Dateiname
Const strZiel4 As String = "R:\xxxxxx.xlsx"   'Pfad + Dateiname
Dim WB_B As Workbook
Dim WsQuelle As Worksheet
Dim WsZiel As Worksheet

'Quellesheet definieren
  Set WsQuelle = ThisWorkbook.Sheets("Füllung") ' <= eventuell falsch angepasst? Hier muss der Name des Ausgangsblattes hin, oder?

'Ziel öffnen
  Set WB_B = Workbooks.Open(strZiel)

'Zielsheet definieren:
  Set WsZiel = WB_B.Sheets(1)              ' <= wie "richtig" anpassen?

'kopieren:
  WsZiel.Range("A:J").Value = WsQuelle.Range("A:J").Value
   
'Zieldatei speichern und schließen
  WB_B.Close savechanges:=True
 
'Ziel öffnen
  Set WB_B = Workbooks.Open(strZiel2)

'Zielsheet definieren:
  Set WsZiel = WB_B.Sheets(1)              ' <= wie "richtig" anpassen?

'kopieren:
  WsZiel.Range("A:J").Value = WsQuelle.Range("A:J").Value
   
'Zieldatei speichern und schließen
  WB_B.Close savechanges:=True
 
'Ziel öffnen
  Set WB_B = Workbooks.Open(strZiel3)

'Zielsheet definieren:
  Set WsZiel = WB_B.Sheets(1)              ' <= wie "richtig" anpassen?

'kopieren:
  WsZiel.Range("A:J").Value = WsQuelle.Range("A:J").Value
   
'Zieldatei speichern und schließen
  WB_B.Close savechanges:=True

'Ziel öffnen
  Set WB_B = Workbooks.Open(strZiel4)

'Zielsheet definieren:
  Set WsZiel = WB_B.Sheets(1)              ' <= wie "richtig" anpassen?

'kopieren:
  WsZiel.Range("A:J").Value = WsQuelle.Range("A:J").Value
   
'Zieldatei speichern und schließen
  WB_B.Close savechanges:=True
 
 
End Sub

Kann ich jetzt Quasi vor dem Schritt exportieren, einen schritt einfügen, die Tabelle "Füllung" mit der Tabelle "Komplett" zu vergleichen und die Neuerungen anzufügen??

Vielen Dank schon mal im voraus.

Gruß
Antworten Top
#2
Hallo,

ich habe aktuell eine sehr aufwendige VBA Abfrage, die zu viele Dateien täglich abfragt. Jetzt ist meine Überlegung, ob man das alles so einstellen kann, dass diese nur noch den aktuellen Monat abfragt (dieser in extra Ordner) und dann nur noch Neuerungen in eine zweite Liste einfügt.

ist das möglich??

VBA für die Abfrage:
Code:
Sub Lese()

Dim intBereich As Integer
Dim intZeile As Integer
Dim intSpalte As Integer
Dim strDatei As String
Dim intAnzVerz  As Integer
Dim intAktVerz  As Integer
Dim intAktBlatt As Integer
Dim intAktZeile As Integer
Dim intAktSpalte As Integer
Dim intSpDatum As Integer
Dim intSpBlatt As Integer
Dim intSpDatei As Integer
Dim intSpVerz As Integer
Dim strVerz As String
Dim strVerzA() As String
Dim varDatum As Variant
Dim varKopie As Variant
Dim varRngKopie As Variant
Dim bolLeer As Boolean
Dim rngAusgabe As Range
Dim wbLesen As Workbook
Dim wsLesen As Worksheet

Const intMaxVerz As Integer = 30
Const intMaxblatt As Integer = 2
Const strTeilDatei As String = ".xlsx"
Const strRngDatum As String = "C2"
Const strRngKopie As String = "B3:J55"
Const bolZeigVerz As Boolean = False
Const bolZeigDatei As Boolean = False
Const bolZeigBlatt As Boolean = False
Const bolZeigLeer As Boolean = True


Application.ScreenUpdating = False
'----------------------------------------------------
' Spalten für Verzeichnis, Datei und Blatt einrichten
'----------------------------------------------------
intSpDatum = 0
intSpBlatt = 0
intSpDatei = 0
intSpVerz = 0
If bolZeigBlatt Then
   intSpDatum = intSpDatum + 1
End If
If bolZeigDatei Then
   intSpDatum = intSpDatum + 1
   intSpBlatt = intSpBlatt + 1
End If
If bolZeigVerz Then
   intSpDatum = intSpDatum + 1
   intSpBlatt = intSpBlatt + 1
   intSpDatei = intSpDatei + 1
End If
varRngKopie = Split(strRngKopie)

'----------------------------------------------------
' Verzeichniseinlesen und Variablen initialisieren
'----------------------------------------------------

ReDim strVerzA(intMaxVerz)
intAktVerz = 1
intAnzVerz = 1
intAktZeile = 0
strVerzA(intAnzVerz) = ThisWorkbook.Names("Verzeichnis").RefersToRange
Set rngAusgabe = ThisWorkbook.Worksheets("Füllung").Cells(3, 1)
'Set rngAusgabe = ThisWorkbook.Names("Ausfüllen").RefersToRange

'----------------------------------------------------
' Schleife über Verzeichnisse
'----------------------------------------------------
While intAktVerz <= intAktVerz And intAktVerz <= intMaxVerz
   strVerz = strVerzA(intAktVerz)
   strDatei = Dir(strVerz, vbDirectory)
'----------------------------------------------------
' Schleife über Dateien im Verzeichnis
'----------------------------------------------------
   While strDatei <> ""
       If (GetAttr(strVerz & strDatei) And vbDirectory) = vbDirectory Then
           If strDatei <> "." And strDatei <> ".." And strDatei <> "" And intAnzVerz < intMaxVerz Then
               intAnzVerz = intAnzVerz + 1
               strVerzA(intAnzVerz) = strVerz & strDatei & "\"
           End If
       Else
           If InStr(strDatei, strTeilDatei) > 0 And strDatei <> ThisWorkbook.Name Then
               intAktBlatt = 0
               Set wbLesen = Workbooks.Open(Filename:=strVerz & strDatei, ReadOnly:=True)
               For Each wsLesen In wbLesen.Worksheets
                   intAktBlatt = intAktBlatt + 1
                   If intAktBlatt <= intMaxblatt Then
                       varDatum = wsLesen.Range(strRngDatum)
                       For intBereich = 0 To UBound(varRngKopie)
                           varKopie = wsLesen.Range(varRngKopie(intBereich)).Value
                           For intZeile = 1 To UBound(varKopie, 1)
'----------------------------------------------------
' Prüfen ob Werte leer
'----------------------------------------------------
                               If bolZeigLeer Then
                                   bolLeer = False
                               Else
                                   bolLeer = True
                                   For intSpalte = 1 To UBound(varKopie, 2)
                                       If varKopie(intZeile, intSpalte) <> "" Then
                                           bolLeer = False
                                       End If
                                   Next intSpalte
                               End If
'----------------------------------------------------
' Schreiben wenn nicht leer
'----------------------------------------------------
                               If Not bolLeer Then
                                   For intSpalte = 1 To UBound(varKopie, 2)
                                       rngAusgabe.Offset(intAktZeile, intSpalte + intSpDatum).Value = varKopie(intZeile, intSpalte)
                                   Next intSpalte
                                   rngAusgabe.Offset(intAktZeile, intSpVerz).Value = strVerz
                                   rngAusgabe.Offset(intAktZeile, intSpDatei).Value = strDatei
                                   rngAusgabe.Offset(intAktZeile, intSpBlatt).Value = wsLesen.Name
                                   rngAusgabe.Offset(intAktZeile, intSpDatum).Value = varDatum
                                   intAktZeile = intAktZeile + 1
                               End If
                           Next intZeile
                       Next intBereich
                   End If
               Next wsLesen
               wbLesen.Close savechanges:=False
           End If
       End If
   strDatei = Dir()
   Wend
   intAktVerz = intAktVerz + 1
Wend
Application.ScreenUpdating = True
End Sub

Aktuell Exportiere ich komplett:

Code:
Sub Tabelle_kopieren()
' Tabelle_kopieren Makro
Const strZiel As String = "R:\xxx.xlsm"   'Pfad + Dateiname
Const strZiel2 As String = "R:\xxxx.xlsm"   'Pfad + Dateiname
Const strZiel3 As String = "R:\xxxxx.xlsm"   'Pfad + Dateiname
Const strZiel4 As String = "R:\xxxxxx.xlsx"   'Pfad + Dateiname
Dim WB_B As Workbook
Dim WsQuelle As Worksheet
Dim WsZiel As Worksheet

'Quellesheet definieren
  Set WsQuelle = ThisWorkbook.Sheets("Füllung") ' <= eventuell falsch angepasst? Hier muss der Name des Ausgangsblattes hin, oder?

'Ziel öffnen
  Set WB_B = Workbooks.Open(strZiel)

'Zielsheet definieren:
  Set WsZiel = WB_B.Sheets(1)              ' <= wie "richtig" anpassen?

'kopieren:
  WsZiel.Range("A:J").Value = WsQuelle.Range("A:J").Value
   
'Zieldatei speichern und schließen
  WB_B.Close savechanges:=True
 
'Ziel öffnen
  Set WB_B = Workbooks.Open(strZiel2)

'Zielsheet definieren:
  Set WsZiel = WB_B.Sheets(1)              ' <= wie "richtig" anpassen?

'kopieren:
  WsZiel.Range("A:J").Value = WsQuelle.Range("A:J").Value
   
'Zieldatei speichern und schließen
  WB_B.Close savechanges:=True
 
'Ziel öffnen
  Set WB_B = Workbooks.Open(strZiel3)

'Zielsheet definieren:
  Set WsZiel = WB_B.Sheets(1)              ' <= wie "richtig" anpassen?

'kopieren:
  WsZiel.Range("A:J").Value = WsQuelle.Range("A:J").Value
   
'Zieldatei speichern und schließen
  WB_B.Close savechanges:=True

'Ziel öffnen
  Set WB_B = Workbooks.Open(strZiel4)

'Zielsheet definieren:
  Set WsZiel = WB_B.Sheets(1)              ' <= wie "richtig" anpassen?

'kopieren:
  WsZiel.Range("A:J").Value = WsQuelle.Range("A:J").Value
   
'Zieldatei speichern und schließen
  WB_B.Close savechanges:=True
 
 
End Sub

Kann ich jetzt Quasi vor dem Schritt exportieren, einen schritt einfügen, die Tabelle "Füllung" mit der Tabelle "Komplett" zu vergleichen und die Neuerungen anzufügen??

Vielen Dank schon mal im voraus.

Gruß
Antworten Top
#3
Ok, habe eben etwas gesucht. Habe daraufhin das hier gefunden.

http://www.clever-excel-forum.de/Thread-...-ergaenzen



nur bekomme ich das jetzt nicht so ans laufen wie gewünscht.

Kann man den Code so anpassen, dass er spalte A vergleicht und Spalte A:J kopiert, wenn er in der Spalte a die Werte nicht findet?

Code:
Sub FehlendeIDKopieren()
' ID ohne Zuordnung werden aus der Tabelle Source in die Tabelle SAA kopiert

Dim z As Long
Dim zm As Long
Dim zz As Long

'Ermittlung der ersten freien Zeile in der Zieltabelle.Voraussetzung: keine Leerzeilen. Sonst ".Cells(Rows.Count, 1).End(XlUp).row" verwenden
With Sheets("SAA_List")
   zz = 1
   zm = .UsedRange.Rows.Count
   zz = zm + 1
End With

'Festlegen der Verarbeitungstabelle
With Sheets("Source")

   'Auffinden der letzten verwendeten Zeile in "Source". Voraussetzung: keine Leerzeilen (s.o.)
   zm = .UsedRange.Rows.Count
   
   'Aufsetzen der Schleife. Voraussetzung: Tabelle hat Überschriften. Sonst z = 1
   For z = 2 To zm

       'Alle Sätze, die nicht in SAA-List vorkommen aus Source übertragen
       If WorksheetFunction.CountIf(Sheets("SAA_List").Range("A:A"), .Range("A" & z).Value) = 0 Then
           Sheets("SAA_List").Cells(zz, 1).Value = .Cells(z, 1).Value
           zz = zz + 1
       End If
       
   Next z

End With

End Sub



Vielen Dank
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste