Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Daten auslesen und einlesen mit VBA

Daten auslesen und einlesen mit VBA
09.04.2013 20:31:17
Daniel
Guten Abend,
aus einem Anwenderprogramm exportiere ich nach Auswertungslauf eine csv-Datei und speichere sie als xlsx-Datei. Die Datei kann mehrere hundert Datensätze enthalten.
Hieraus will ich per VBA ausgewählte Daten auslesen und in eine Berichtsdatei einlesen.
Dazu verwende ich folgenden Code:
Sub WerteFinden()
Application.ScreenUpdating=False
Set wb2=Workbooks.Open("C:\Berichte\AP.xlsx")
Set ws1=wb1.Sheets("Tabelle1")
Set ws2=wb2.Sheets("ABLstEin")
For i= "" & a & "" To "" & b & ""
Such = ws1.Range("A" & i).Value
Dim rngBereich As Range
Dim rngFund As Range
Set rngBereich = ws2.Range("D:D")
Set rngFund = rngBereich.Find(what:=Such, LookIn:=xlValues, LookAt:=xlWhole)
On Error Resume Next
rngFund.Activate
ActiveCell.Offset(0, 11).Select
ws2.Range("AO" & i) = Selection.Value
rngFund.Activate
If ActiveCell.Offset(0, 15).Value="H" Then  '  "H" steht für eine Haben-Buchung
ActiveCell.Offset(0, 14).Select
ws2.Range("AP" & i)=Selection.Value * -1
Else
ActiveCell.Offset(0, 14).Select
ws2.Range("AP" & i)=Selection.Value
End If
ws1.Range("C" & i)=ws2.Range("AO" & i).Value
ws1.Range("D" & i)=ws2.Range("AP" & i).Value
Next i
MsgBox ("Auswertung ist fertig!")
wb2.Save
wb2.Close
Application.ScreenUpdating=True
End Sub
Der Code funktioniert. Allerdings sehe ich mich maximal als fortgeschrittener Anfänger in VBA und suche nach einer Code-Verbesserung, mindestens der Zeilen zwischen den Markierungen.
Kann jemand helfen?
Grüße
Daniel B.

Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Daten auslesen und einlesen mit VBA
10.04.2013 09:18:22
fcs
Hallo Daniel,
hier mein allerdings ungetesteter Verbesserungsvorschlag.
Gruß
Franz
Sub WerteFinden()
Application.ScreenUpdating = False
Dim rngBereich As Range
Dim rngFund As Range
Set wb2 = Workbooks.Open("C:\Berichte\AP.xlsx")
Set ws1 = wb1.Sheets("Tabelle1")
Set ws2 = wb2.Sheets("ABLstEin")
For i = "" & a & "" To "" & b & ""  'wo kommwn die Werte für a und b her ? Start/Endwert _
der Schleife sollten ganze Zahlen sein - keine Textkonstruktion!
'    For i = a To b  'sollte es auch tun
Such = ws1.Range("A" & i).Value
Set rngBereich = ws2.Range("D:D")
Set rngFund = rngBereich.Find(what:=Such, LookIn:=xlValues, LookAt:=xlWhole)
On Error Resume Next
If rngFund Is Nothing Then
'do nothing
Else
ws2.Range("AO" & i) = rngFund.Offset(0, 11).Value
rngFund.Activate 'Diese Zeile ist evtl auch noch überflüssig
If rngFund.Offset(0, 15).Value = "H" Then '  "H" steht für eine Haben-Buchung
ws2.Range("AP" & i) = rngFund.Offset(0, 14).Value * -1
Else
ws2.Range("AP" & i) = rngFund.Offset(0, 14).Value
End If
ws1.Range("C" & i) = ws2.Range("AO" & i).Value
ws1.Range("D" & i) = ws2.Range("AP" & i).Value
End If
Next i
MsgBox ("Auswertung ist fertig!")
wb2.Save
wb2.Close
Application.ScreenUpdating = True
End Sub

Anzeige
AW: Daten auslesen und einlesen mit VBA
10.04.2013 19:28:09
Daniel
Hallo Franz,
danke für Deinen Vorschlag. Leider war in meinem Beitrag nicht der gesamte Code zu sehen, obwohl vollständig eingegeben.
Deshalb nachfolgend noch mal alles inkl. Deiner Vorschläge.
If rngFund Is Nothing Then
'do nothing
For i = "" & a usw musste ich lassen, wurde anders nicht akzeptiert.
habe ich weg gelassen, führt bei mir zum Stopp der Prozedur. Ansonsten läuft die Prozedur wie meine eigene, ohne bemerkenswerte Veränderungen. Dann soll es so gut sein.
Hier nun der Code:
Sub WerteFinden()
Application.ScreenUpdating=False
Dim a As Long
Dim b As Long
a=8
b=Cells(Rows.Count, 1).End(xlUp).Row-1
Dim Such As Variant
Dim i As Integer
Dim wb1 As Workbook
Dim wb2 As Workbook
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Set wb1=ThisWorkbook
Dim rngBereich As Range
Dim rngFund As Range
Set wb2=Workbooks.Open("C:\Berichte\AP.xlsx")
Set ws1=wb1.Sheets("Tabelle1")
Set ws2=wb2.Sheets("ABLstEin")
For i= "" & a & "" To "" & b & ""
Such = ws1.Range("A" & i).Value
Set rngBereich = ws2.Range("D:D")
Set rngFund = rngBereich.Find(what:=Such, LookIn:=xlValues, LookAt:=xlWhole)
On Error Resume Next
ws2.Range("AO" & i)=rngFund.Offset(0, 11).Value
rngFund.Activate
If rngFund.Offset(0, 15).Value="H" Then  '  "H" steht für eine Haben-Buchung
ws2.Range("AP" & i)=rngFund.Offset(0, 14).Value * -1 * -1
Else
ws2.Range("AP" & i)=rngFund.Offset(0, 14).Value
End If
ws1.Range("C" & i)=ws2.Range("AO" & i).Value
ws1.Range("D" & i)=ws2.Range("AP" & i).Value
Next i
MsgBox ("Auswertung ist fertig!")
wb2.Save
wb2.Close
Application.ScreenUpdating=True
End Sub

Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Daten auslesen und einlesen mit VBA


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor in Excel zu öffnen.
  2. Neues Modul erstellen: Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)", wähle "Einfügen" und dann "Modul".
  3. Code einfügen: Kopiere den folgenden Code in das Modul:
Sub WerteFinden()
    Application.ScreenUpdating = False
    Dim a As Long
    Dim b As Long
    a = 8
    b = Cells(Rows.Count, 1).End(xlUp).Row - 1
    Dim Such As Variant
    Dim i As Integer
    Dim wb1 As Workbook
    Dim wb2 As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Set wb1 = ThisWorkbook
    Set wb2 = Workbooks.Open("C:\Berichte\AP.xlsx")
    Set ws1 = wb1.Sheets("Tabelle1")
    Set ws2 = wb2.Sheets("ABLstEin")

    For i = a To b
        Such = ws1.Range("A" & i).Value
        Dim rngBereich As Range
        Dim rngFund As Range
        Set rngBereich = ws2.Range("D:D")
        Set rngFund = rngBereich.Find(what:=Such, LookIn:=xlValues, LookAt:=xlWhole)

        On Error Resume Next
        If Not rngFund Is Nothing Then
            ws2.Range("AO" & i) = rngFund.Offset(0, 11).Value
            If rngFund.Offset(0, 15).Value = "H" Then
                ws2.Range("AP" & i) = rngFund.Offset(0, 14).Value * -1
            Else
                ws2.Range("AP" & i) = rngFund.Offset(0, 14).Value
            End If
            ws1.Range("C" & i) = ws2.Range("AO" & i).Value
            ws1.Range("D" & i) = ws2.Range("AP" & i).Value
        End If
    Next i

    MsgBox ("Auswertung ist fertig!")
    wb2.Save
    wb2.Close
    Application.ScreenUpdating = True
End Sub
  1. Code ausführen: Schließe den VBA-Editor und gehe zurück zu Excel. Drücke ALT + F8, wähle WerteFinden aus und klicke auf "Ausführen".

Häufige Fehler und Lösungen

  • Fehler: "Typen nicht übereinstimmend": Stelle sicher, dass die Variablen a und b korrekt definiert sind und keine Textwerte enthalten. Verwende Long für Ganzzahlen.

  • Fehler: "Objekt nicht gefunden": Überprüfe den Pfad der Datei AP.xlsx. Stelle sicher, dass die Datei existiert und der Pfad korrekt ist.

  • Fehler: "Index außerhalb des Bereichs": Stelle sicher, dass die Arbeitsblätter Tabelle1 und ABLstEin existieren und korrekt benannt sind.


Alternative Methoden

Eine alternative Methode zum Daten einlesen könnte die Verwendung von Power Query sein, um CSV-Daten direkt in Excel zu importieren. Dies ermöglicht eine visuelle Bearbeitung und kann helfen, komplexe Datenverarbeitungen ohne VBA vorzunehmen.


Praktische Beispiele

Hier ist ein Beispiel, wie Du den Code anpassen kannst, um Daten aus einer Access-Datenbank zu lesen:

Sub AccessDatenAuslesen()
    Dim cn As Object
    Set cn = CreateObject("ADODB.Connection")
    Dim rs As Object
    Set rs = CreateObject("ADODB.Recordset")

    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\DeineDatenbank.accdb;"
    rs.Open "SELECT * FROM DeineTabelle", cn

    ' Beispiel für das Auslesen von Werten
    If Not rs.EOF Then
        ws1.Range("A1").Value = rs.Fields("DeinFeld").Value
    End If

    rs.Close
    cn.Close
End Sub

Tipps für Profis

  • Verwende Fehlerbehandlung: Ergänze den Code mit On Error GoTo für eine bessere Fehlerverfolgung.
  • Optimiere die Leistung: Deaktiviere Bildschirmaktualisierungen und Ereignisse während der Ausführung des Codes, um die Geschwindigkeit zu erhöhen.
  • Setze Option Explicit am Anfang Deines Moduls, um sicherzustellen, dass alle Variablen deklariert werden.

FAQ: Häufige Fragen

1. Wie kann ich eine CSV-Datei mit VBA einlesen?
Du kannst die Workbooks.Open Methode verwenden, um die CSV-Datei zu öffnen und dann mit dem VBA-Code die Daten zu verarbeiten.

2. Was bedeutet "On Error Resume Next"?
Diese Anweisung ignoriert Laufzeitfehler und fährt mit dem nächsten Befehl fort. Es ist wichtig, diese Anweisung mit Bedacht zu verwenden, um unerwartete Fehler zu vermeiden.

3. Wie kann ich Daten aus einer Access-Datenbank auslesen?
Verwende ADO (ActiveX Data Objects) in VBA, um eine Verbindung zur Access-Datenbank herzustellen und Daten abzufragen.

4. Gibt es eine Möglichkeit, Daten ohne VBA zu importieren?
Ja, Du kannst Daten direkt über die Importfunktion in Excel einlesen, indem Du auf "Daten" -> "Daten abrufen" -> "Aus Datei" -> "Aus Text/CSV" gehst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige