VBA - 2 Excel Dateien auslesen - beschreiben

  • Excel

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von miga.

    VBA - 2 Excel Dateien auslesen - beschreiben

    Hi,

    ich habe folgendes Problem:

    1. eine Excel Datei test.xls in der stehen von Zelle A4-A254 siebenstellige Zahlen
    2. eine Excel Datei test2.xls in der steht in der Zelle B4 eine siebenstellige Zahl

    Nun soll mein kleines Programm welches in der test2.xls ausgeführt wird die Zahl in der Zelle B4 mit den Zahlen in der test.xls vergleichen. Wenn es eine übereinstimmung gibt, soll es in der test.xls also hinter der Zahl ein "ok" schreiben.

    D.h. die test.xls Datei wird nacheinander in den Zellen B4-B254 mit "ok" beschrieben. Dabei dient diese Datei als Checkliste.

    Hat von euch jemand eine Idee wie ich das umsetzten kann. Theoretisch weiß ich es auch, aber praktisch kenn ich mich zuwenig mit VBA aus um es umzusetzten.


    Danke für Eure Hilfe!


    MFG

    Visual Basic-Quellcode

    1. Public Sub Check()
    2. testzeile = ThisWorkbook.Worksheets(1).Range("B4").Value
    3. On Error Resume Next
    4. Set test = Workbooks("test.xls")
    5. If Not Err.Number = 0 Then
    6. Set test = Workbooks.Open("D:\Tester\test.xls")
    7. Err.Clear
    8. End If
    9. On Error GoTo 0
    10. For a = 4 To 254
    11. If test.Worksheets(1).Range("A" & a).Value = testzeile Then
    12. test.Worksheets(1).Range("B" & a).Value = "OK"
    13. End If
    14. Next
    15. End Sub


    So in etwa..

    gruß mono
    Das ist meine Signatur und sie wird wunderbar sein!
    Servus Miga,
    oder so:

    Visual Basic-Quellcode

    1. Private Sub Auswertung_Click()
    2. Dim strAktuellerPfad As String
    3. Dim strMasterDatei As String
    4. Dim i As Integer
    5. Dim intAnzahlGefundenerWerte As Integer
    6. Dim exApp As Excel.Application
    7. Dim exWkb As Excel.Workbook
    8. Dim aryUsedRange As Variant
    9. Dim strGesuchterWert As String
    10. 'Masterdatei im gleichen Pfad öffnen
    11. strAktuellerPfad = Me.Application.ActiveWorkbook.Path & "\"
    12. strMasterDatei = "test.xls"
    13. Set exApp = New Excel.Application
    14. Set exWkb = exApp.Workbooks.Open(strAktuellerPfad & strMasterDatei)
    15. 'gesuchter Wert Variable zuweisen
    16. strGesuchterWert = Application.Cells(4, 2)
    17. 'genutzer Bereich in ein Arry kopieren. Geht extrem viel schnell
    18. 'wenn man da drauf schaut, anstatt immer über ...app.cell(x,y)
    19. aryUsedRange = exWkb.Application.ActiveCell.Worksheet.UsedRange.Value2
    20. 'Array durch schaun und vergleichen, ob unsere Vorgabe existiert.
    21. For i = 1 To 251
    22. If strGesuchterWert = aryUsedRange(i, 1) Then
    23. exWkb.Application.Cells(i + 3, 2).Value = "Ok"
    24. intAnzahlGefundenerWerte = intAnzahlGefundenerWerte + 1
    25. End If
    26. Next
    27. exWkb.Save
    28. exWkb.Close
    29. exApp.Quit
    30. Set exWkb = Nothing
    31. Set exApp = Nothing
    32. MsgBox "Es wurden folgende Anzahl an Übereinstimmungen gefunden: " & CStr(intAnzahlGefundenerWerte), vbInformation, "Ergebnis"
    33. End Sub


    Gruß Markus
    Wenn alle Zellen mit der besagten Zahl ausgefüllt sind dauerts bei mir ca: 0,0156 sekunden..
    könnte sicher schneller gehen, aber bei nur 250 werten ist es denk ich egal
    bei 2000 werten ca 0,375 sekunden. ^^
    Das ist meine Signatur und sie wird wunderbar sein!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mono“ ()

    Danke für Eure Hilfe!!

    Ich hab das Problem nun folgendermaßen gelöst:

    Sub check2()
    Dim i As Long, rng As Range, suchi As Long
    Workbooks.Open ThisWorkbook.Path & "/Kostenstellen Aufstellung.xls"
    i = Workbooks("Kostenstellen Aufstellung.xls").Sheets("USM DE Kostenstellen").Range("A65536").End(xlUp).Row
    Set rng = Workbooks("Kostenstellen Aufstellung.xls").Sheets("USM DE Kostenstellen").Range("A4:A" & i)
    suchi = ThisWorkbook.Sheets("Planung 2009").Range("B4").Value
    For Each zelle In rng
    If zelle.Value = suchi Then
    zelle.Offset(0, 1).Value = "ok"
    End If
    Next zelle
    i = 0: Set rng = Nothing: suchi = 0

    Workbooks("Kostenstellen Aufstellung.xls").Close SaveChanges:=True

    End Sub


    MFG
    Noch was....

    Ich hab nun 2 kleine Programme.

    Das eine wandelt meine Excel Datei in eine CSV Datei um und das andere checkt welche Datei schon umgewandelt wurde.

    Ich habe beide Programme zu einem gemacht, damit ich sie mit einem Makro ausführen kann.

    Funktioniert soweit alles wunderbar!

    So jetzt meine Frage. Bis jetzt betätige ich einen Button um das Makro abzuspielen. Ich würde aber gerne einen Button in der Symbolleiste in Excel anlegen. Dies funktioniert nur bei der ersten Datei. Wenn ich nun das Makro für die anderen Datei benutze bezieht sich der Button immer auf das erste Makro. Gibt es eine Lösung?

    Danke!

    MFG
    Mono: Da hast Du schon recht Mono. War nur gleich der Hintergrund, wenn er anfängt zu programmieren, kann er auch gleich ein paar Tricks lernen. Hab schon ne größere Anwendung in Excel programmiert, in der ich über 30.000 Datensätze miteinander vergleiche (je 8 Spalten). Hier waren es über 30sek Unterschied.

    Miga: In Deinem Fall kannst Du na klar auch direkt mit "application.cells(x,y)" auf die Zellen zugreifen. Stimmt schon, wird da kein Unterschied machen... Aber im Hinterkopf behalten: Wenn Du mal mehr in den Zellen rumsuchst und Daten hin und her schaukelst, arbeite über ein Array und schreib dann das ganze wieder zurück in die Zellen.
    Miga, ich kann Dir nicht ganz folgen. Wenn ich es richtig verstanden hab, hast Du lokal ein Macro erstellt und rufst das auf. Um es von allen XLS-Files aufrufen zu können, geh her und erstell ein Macro in der personl.xls. Dies ist ein "speicher" für globale persönliche Macros.

    Weißt wie das geht?
    Nochmal......

    Die test.xls dient einfach nur als Checkliste damit ich weiß welche Excel Datei ich schon umgewandelt habe.

    Die test2.xls in der ja in der Zelle "B4" ein wert steht gibt es 254 mal. D.h. ich erstelle 254mal eine test2 Datei; welche immer eine andere Bezeichnunng hat (test3, test4,...)

    Bis jetzt hab ich einen Button in der Excel Datei. Wenn ich nun die test2.xls kopiere und zu test3.xls unbenenne funktioniert alles funderbar. Geh ich aber hin und erstell eine Schaltfläche im Menü von Excel, bezieht er immer mein Makro aus der test2 Datei. Er soll aber immer das Makro aus der geöffneten Datei benutzen. Schließlich ändert sich der Wert in der Zelle "B4" immer, jenach dem welche Datei offen ist.

    .....Ne, kenn die Vorgehensweise nicht!!!

    MFG
    Also: Es gib mehrer Wege wie Du es erstellen kannst, wir gehen diesen:

    1.) Extras -> Makro's -> Aufzeichnen
    2.) Gib einen Namen an. Bsp: "ExcelImportCheck" und WICHTIG wähle Makro speichern in "persönliche Makroarbeitsmappe" aus!
    3.) Ok betätigen
    4.) Makro Aufzeichnung stoppen
    5.) Gehe nun in den VBA Editor
    6.) Auf der linken Seite findest Du einen Baum mit folgenden Einträgen "EuroTool", "VBAProject (PERSONL.xls)", "VBAProject (test2.xls)" oder ähnlich...
    7.) Öffne den Baum bei "VBAProject (PERSONL.xls)" -> Module -> Modul1
    8.) Hier findest DU nun Dein selbst angelegtes Makro (Bsp: ExcelImportCheck)
    9.) Kopier nun Dein Code von Deinem Button in dieses Makro und speicher dieses
    10.) Erstell eine Verknüpfung im Menu (der wie sonst gewünscht) und benütz Dein neues Makro in der "personl.xls"

    Nun steht Dir diese Funktion in ALLE XLS-Files zur Verfügung. Die personl.xls wird im Hintergrund IMMER mitgeladen und ist nicht an irgendeine XLS-Datei gebunden. Somit kannst Du diese Funktion auch aus test3.xls...test27.xls...test167.xls aufrufen.

    Gruß Markus
    Hi,

    danke erstmal für deine Hilfe.

    Die Umwandlung in eine csv Datei hat jetztr funktioniert. NUR ich lass ja zwei kleine Programme hintereinander laufen. Mein zweites Programm bezieht sich auf die geöffnete Datei in meinem Fall ja die test3.xls z.b. Da aber jetzt alles über das personel.xls laüft hat er den Pfad nicht. Ich kann aber auch nicht einfach den richtigen Pfad eingeben, da sich ja die test...xls Datei immer ändert und dadurch auch immer der Wert in der Zelle B4.

    Anbei mal den Quellcode:

    Sub ExcelImportCheck()

    Dim FN As Integer
    Dim Pfad
    Dim i As Long
    Dim j As Long

    Pfad = "C:\Dokumente und Einstellungen\gam\Desktop\SAP\CSV\TEST" & Cells(4, 2).Value & ".CSV"
    FN = FreeFile()

    Open Pfad For Output As FN

    'Kopf der CSV-Datei erzeugen
    Print #FN, "Version;0;Plan/Ist - Version"
    Print #FN, "Periode 1;bis;12"
    Print #FN, "Geschäftsjahr;2009"
    Print #FN, "Kostenstelle;1010001"

    'Schleifendurchlaeufe zur Erstellung der einzelnen Aufträge
    i = 36

    Do Until Cells(i, 1).Value = "Primäre Kosten"

    If Left(Cells(i, 1).Value, 7) <> "1000BWA" Then
    Print #FN, Cells(i, 1).Value & ";"; Cells(i, 8).Value
    End If
    i = i + 1

    Loop

    Close #FN

    MsgBox Pfad

    Call check2

    End Sub

    Sub check2()
    Dim i As Long, rng As Range, suchi As Long
    Workbooks.Open "C:\Dokumente und Einstellungen\gam\Desktop\SAP/Kostenstellen Aufstellung.xls"
    i = Workbooks("Kostenstellen Aufstellung.xls").Sheets("HSM DE Kostenstellen").Range("A65536").End(xlUp).Row
    Set rng = Workbooks("Kostenstellen Aufstellung.xls").Sheets("HSM DE Kostenstellen").Range("A4:A" & i)
    suchi = ThisWorkbook.Sheets("Planung 2009").Range("B4").Value
    For Each zelle In rng
    If zelle.Value = suchi Then
    zelle.Offset(0, 1).Value = "ok"
    End If
    Next zelle
    i = 0: Set rng = Nothing: suchi = 0

    Workbooks("Kostenstellen Aufstellung.xls").Close SaveChanges:=True

    End Sub
    Ich probiers gleich mal aus!

    Hast du noch ne Idee wie ich in der Zeile Print #FN, "Kostenstelle;1010001"

    Die Kostenstelle immer auf die Celle (4,2) bezieht. D.h. wenn ich die Testxx.xls öffne mit der Kostenstelle 1010050 in der Zelle B4 soll es auch in meine csv Datei geschrieben werden.



    MFG
    1.) Sorry, hab das Problem jetzt noch nicht verstanden.

    Was geht nicht?
    Bekommst DU ne Fehlermeldung?


    2.) Kostenstelle:

    Print #FN, "Kostenstelle;" & Cells(4, 2).Value

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Markus2006“ ()

    Ja ich bekomm eine Fehlermeldung!

    Laufzeitfehler '438'

    Ist in der Zeile suchi....

    Kenn mich ja nicht so aus in VBA, aber ich vermute mal da es über die Personel Datei läuft findet er dort die Zelle B4 nicht. Wenn ich es ganz normal über meine testxx.xls laufen lass über den Button dann hat der in der testxx.xls Datei in der Zeile B4 eine Kostenzelle die, diese benötigt er ja um in der Datei "Kostenstellen Aufstellung.xls" die gleiche Zahl zu suchen um dann mit "ok" zu bestätigen. Wenn es aber nun über die personel läuft hat er die Zelle B4 nicht mehr oder? Seh ich das richtig?



    MFG