Zeilen aus mehreren Excel Dateien auslesen

  • Excel

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Sam85.

    Zeilen aus mehreren Excel Dateien auslesen

    Hi!
    Bin absoluter VB Neuling und brauche eure Hilfe.
    Ich habe 50 Excel Dateien in einem Ordner und es kommen ständig neue dazu.
    Jede Datei besteht aus 8 Tabellenblättern
    Jetzt möchte ich aus jeder Datei vom Tabellenblatt1= "Übersicht" die ersten 9 Zeilen (A1:L9) auslesen und in eine Neue Excel Datei "Daten-Sammlung" einfügen.
    Habe Excel 2016 ;)
    Vielen Dank für eure Unterstützung
    Charles

    Topic verschoben nach VBA ~VaporiZed

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

    Willkommen im Forum.

    Ok, willst Du das jetzt innerhalb von Excel über ein Makro lösen oder hast Du Visual Studio installiert und willst das über eine App lösen? Denn Du hast diesen Thread hier im Forum mit VB.NET getaggt, was auf Visual Studio hinweist. Wenn Du aber nur in Office unterwegs bist, arbeitest Du nicht mit VB.NET, sondern mit VBA. Dann würde eine Lösung komplett anders aussehen. Nun?
    VB.NET, VB6, VBA, VBS — Mit welcher Sprache programmiere ich eigentlich?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Charles schrieb:

    Vielen Dank für eure Unterstützung
    Wie soll die Unterstützung denn aussehen?

    Erwartest du eine Komplettlösung?
    Dazu sind die Infos nicht ausreichend. Und der Thread sollte besser in den Marktplatz verschoben werden.

    Oder sollen wir deinen Code korrigieren, weil er nicht macht, was du erwartest?
    Dann solltest du den Code hier posten und beschreiben, was er nicht nach Wunsch macht.

    Oder du fragst etwas konkreter.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich habe mal etwas herumprobiert und schon einen kleinen Erfolg gehabt.
    Ziel:
    Excel Dateien öffnen und Werte aus Tabellenblatt1 auslesen und in eine Übersicht schreiben.
    Anbei der Code. Es geht sicher einfacher und besser! Aber er tut was er soll.

    Mein nächstes Projekt soll folgendes machen:
    Wieder Excel Dateien in einem Ordner öffnen und Werte aus verschiedenen Zellen in eine Übersicht schreiben.
    Aber vielleicht geht es etwas einfacher mit der Zuweisung z.B Zelle A1 aus Datei in Zelle B1 in Übersicht schreiben und nicht so umständlich wie ich es gemacht habe. Weiteres wäre es super, wenn bereits importierte Excel Dateien, beim nächsten Durchgang nicht mehr geöffnet werden, weil sonst bei jedem Durchgang sämtliche Dateien geöffnet werden müssen.
    Vielen Dank
    Charles

    Visual Basic-Quellcode

    1. Sub GetData()
    2. Set oMe = ThisWorkbook.ActiveSheet 'ZielDatei/-Tabelle (= die aktuelle Tabelle der aktuellen Datei)
    3. Const sDateiPfad As String = "T:\20_Laboratory\TR\06_MK\01_P\M1\" 'Pfad für zu durchsuchende Excel-Dateien; mit Backslash am Ende
    4. sZelle1 = "A6" 'auszulesende Zelle
    5. sZelle2 = "B6" 'weitere auszulesende Zelle
    6. sZelle3 = "C6" 'weitere auszulesende Zelle
    7. sZelle4 = "D6" 'weitere auszulesende Zelle
    8. sZelle5 = "E6" 'weitere auszulesende Zelle
    9. sZelle6 = "F6" 'weitere auszulesende Zelle
    10. sZelle7 = "H6" 'weitere auszulesende Zelle
    11. sZelle8 = "K6" 'weitere auszulesende Zelle
    12. sZelle9 = "L6" 'weitere auszulesende Zelle
    13. sZelle10 = "I6" 'weitere auszulesende Zelle
    14. sZelle11 = "J6" 'weitere auszulesende Zelle
    15. iZeile = 2 'ab Zeile 2 in Zieltabelle eintragen
    16. iSpalte = 1 'ab Spalte A in Zieltabelle eintragen
    17. Set oFS = CreateObject("Scripting.FileSystemObject")
    18. For Each oDatei In oFS.GetFolder(sDateiPfad).Files
    19. sWbName = oDatei.Name
    20. If Left(LCase(oFS.GetExtensionName(sWbName)), 3) = "xls" Then
    21. Workbooks.Open (sDateiPfad & sWbName)
    22. oMe.Cells(iZeile, iSpalte).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle1).Value
    23. oMe.Cells(iZeile, iSpalte + 1).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle2).Value
    24. oMe.Cells(iZeile, iSpalte + 2).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle3).Value
    25. oMe.Cells(iZeile, iSpalte + 3).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle4).Value
    26. oMe.Cells(iZeile, iSpalte + 4).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle5).Value
    27. oMe.Cells(iZeile, iSpalte + 5).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle6).Value
    28. oMe.Cells(iZeile, iSpalte + 6).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle7).Value
    29. oMe.Cells(iZeile, iSpalte + 9).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle8).Value
    30. oMe.Cells(iZeile, iSpalte + 10).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle9).Value
    31. oMe.Cells(iZeile, iSpalte + 7).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle10).Value
    32. oMe.Cells(iZeile, iSpalte + 8).Value = Workbooks(sWbName).ActiveSheet.Range(sZelle11).Value
    33. Workbooks(sWbName).Saved = True
    34. Workbooks(sWbName).Close
    35. iZeile = iZeile + 1
    36. End If
    37. Next
    38. End Sub


    bitte beim nächsten Mal selber CodeTags verwenden ~VaporiZed

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    hier ein Bsp. allerdings für .Net
    sollte aber mit VBA auch gehen, verwendet habe ich eine .Range zu kopieren
    innerhalb der Mappe

    probiermal ob's geht

    VB.NET-Quellcode

    1. Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click
    2. Dim Path As String = "E:\a9.xlsx" 'die Datei
    3. Dim Excel As ApplicationClass = New ApplicationClass
    4. Dim WorkBook As Workbook = Excel.Workbooks.Open(Path)
    5. Dim WorkSheets As Sheets = WorkBook.Sheets
    6. 'kopiere von Tabelle
    7. Dim WorkSheet As Worksheet = CType(WorkSheets(1), Microsoft.Office.Interop.Excel.Worksheet)
    8. 'hinzufügen in Tabelle
    9. Dim WorkSheet2 As Worksheet = CType(WorkSheets(2), Microsoft.Office.Interop.Excel.Worksheet)
    10. 'mit Range kopieren von Worksheet nach Worksheet2
    11. WorkSheet.Range("A6:B10").Copy(WorkSheet2.Range("C1:D5"))
    12. WorkBook.Save()
    13. Excel.Application.Quit()
    14. End Sub

    Charles schrieb:

    Set oMe = ThisWorkbook.ActiveSheet 'ZielDatei/-Tabelle (= die aktuelle Tabelle der aktuellen Datei)
    Ist es immer dasselbe Sheet?
    Dann benenne es direkt.
    Wenn dein Code ausgeführt wird, wenn ein anderes Sheet angewählt ist, passiert Murks.

    Charles schrieb:

    Workbooks.Open (sDateiPfad & sWbName)
    ...
    Workbooks(sWbName).Saved = True
    Workbooks(sWbName).Close
    1. Weise dem Workbook eine Objektvariable zu.

    Visual Basic-Quellcode

    1. Set oWb = Workbooks.Open (sDateiPfad & sWbName)
    Dann kannst du sie später direkt ansprechen.

    Visual Basic-Quellcode

    1. oWb.Close

    2. Das .Saved = True kannst du dir sparen, wenn du dem Close einen Parameter mitgibst, dass er nicht speichern soll.

    Visual Basic-Quellcode

    1. oWb.Close False


    Noch eine Bemerkung zur Namenskonvention:
    Du benennst deine Variablen nach ungarischer Notation (Prefix mit Datentyp).
    Das ist zwar nicht verboten, aber macht den Code schwer lesbar.
    Ein Relikt aus den Zeiten, als man noch keine IDE hatte und mit dem Editor codierte.
    Damit hatte man im Namen wenigstens einen Anhaltspunkt zum Datentyp.

    Verwende zur sicheren Deklaration lieber Option Explicit.
    Und PascalCase als Namenskonvention. So macht es Microsoft.

    Charles schrieb:

    Weiteres wäre es super, wenn bereits importierte Excel Dateien, beim nächsten Durchgang nicht mehr geöffnet werden, weil sonst bei jedem Durchgang sämtliche Dateien geöffnet werden müssen.
    Möglichkeit 1:
    Du führst selbst darüber Buch, welche Dateien du eingelesen hast.

    Möglichkeit 2:
    Du merkst dir das Datum des letzten Imports und liest nur noch Dateien ein, die neuer sind.
    Das File Objekt hat eine Eigenschaft DateLastModified.

    Möglichkeit 3:
    Du verschiebst bereits verarbeite Dateien in einen anderen Ordner (Move).
    Oder du löschst sie nach Verarbeitung (Delete).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Charles schrieb:

    Fehler beim Kompilieren, Erwartet: Anweisungsende
    Vermutlich schon in der ersten Zeile.
    Das ist VB.Net-Code.
    Hast du den 1:1 kopiert?
    Das läuft nicht ohne Anpassung.

    Außerdem kopiert er nur einen fixen Range in einen anderen.
    Für deine gewünschten Zwecke ist dein eigener Code schon zweckmäßiger.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Kasi schrieb:

    VB.NET-Quellcode



    Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click

    Dim Path As String = "E:\a9.xlsx" 'die Datei

    Dim Excel As ApplicationClass = New ApplicationClass

    Dim WorkBook As Workbook = Excel.Workbooks.Open(Path)

    Dim WorkSheets As Sheets = WorkBook.Sheets



    'kopiere von Tabelle

    Dim WorkSheet As Worksheet = CType(WorkSheets(1), Microsoft.Office.Interop.Excel.Worksheet)

    'hinzufügen in Tabelle

    Dim WorkSheet2 As Worksheet = CType(WorkSheets(2), Microsoft.Office.Interop.Excel.Worksheet)

    'mit Range kopieren von Worksheet nach Worksheet2

    WorkSheet.Range("A6:B10").Copy(WorkSheet2.Range("C1:D5"))



    WorkBook.Save()

    Excel.Application.Quit()

    End Sub


    petaod schrieb:

    Charles schrieb:




    Set oMe = ThisWorkbook.ActiveSheet 'ZielDatei/-Tabelle (= die aktuelle Tabelle der aktuellen Datei)
    Ist es immer dasselbe Sheet?
    Dann benenne es direkt.
    Wenn dein Code ausgeführt wird, wenn ein anderes Sheet angewählt ist, passiert Murks.


    Hi petaod!
    Ja es ist immer der selbe sheet mit dem Namen Übersicht!
    Ich habe es mal versucht mit ActiveSheet = "Übersicht" aber es haut einfach nicht hin!?!?
    Kannst du mit bitte helfen?
    LG
    Charles
    Hi charles,

    mein Code war für .Net, der Denkanstoß sollte .Range sein.

    hab seit ewigkeiten nix mit Excel VBA gemacht.

    füge das im VBA Editor in Tabelle1

    VB.NET-Quellcode

    1. Public Sub doCopy()
    2. 'kopiere von
    3. Dim SourceRange As Range
    4. Set SourceRange = ThisWorkbook.Worksheets("Tabelle1").Range("A2:B4")
    5. 'finde nächste freie Zeile in Tabelle3
    6. Dim NextFreeCell As Range
    7. Set NextFreeCell = ThisWorkbook.Worksheets("Tabelle3").Cells(Rows.Count, "A").End(xlUp).Offset(RowOffset:=1)
    8. 'copy & paste
    9. SourceRange.Copy
    10. NextFreeCell.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    11. ThisWorkbook.Save
    12. End Sub


    du solltest jetzt ein Makro sehen unter
    Menu -> Ansicht->Makros->Makros anzeigen -> -doCopy-

    gruss
    kasi
    @Charles PowerQuery kann ganze Verzeichnisse mit mehreren Dateien verarbeiten, wenn du nun aber eine Lösung in VBA hast :) passt es doch. Jenachdem was du mit den Daten dann vorhast kann PowerQuery oder PowerPivot, sicherlich noch einiges mehr leisten.