Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

VBA Daten einlesen mit var. Überschriftenzeile | Herbers Excel-Forum


Betrifft: VBA Daten einlesen mit var. Überschriftenzeile von: Stefan
Geschrieben am: 16.11.2009 18:17:38

Hallo zusammen,
ich habe vor einiger Zeit hier schon mal um Rat gefragt als ich Daten aus einer externen Arbeitsmappe einlesen wolle. Nun möchte ich in einem Optionsblatt eine Variable einbinden in der die Überschriftenzeile zum einlesen steht:

Public Sub data()
 

Dim objWB As Workbook, objWS As Worksheet, objWSImport As Worksheet, objOption As Worksheet
Dim objText As Range, objIdentifier As Range
Dim strFile As String
Dim lngLast As Long, lngCol As Long, lngLastCol As Long
Dim varRes As Variant

MsgBox "Bitte zu importierende Datei auswählen!"


strFile = Application.GetOpenFilename("Excel Dateien (*.xls; *.xlsx; *.xlsm)," & _
                                                    "*.xls; *.xlsx; *.xlsm")

If strFile = "Falsch" Then Exit Sub

Set objOption = ThisWorkbook.Sheets("Optionen")
Set objText = ThisWorkbook.Sheets("Optionen").Cells(1, 3)
Set objIdentifier = ThisWorkbook.Sheets("Optionen").Cells(2, 3)
Set objWSImport = ThisWorkbook.Sheets("Daten")

Set objWB = Workbooks.Open(strFile)

If Not SheetExist(objText.Value, objWB.Name) Then
    MsgBox "Die ausgewählte Datei enthält kein Sheet mit dem Namen " & objOption.Cells(11, 3). _
Value & "! Der Import wurde abgebrochen."
 Else
  Set objWS = objWB.Sheets(objText.Value)
End If

With objWSImport
  .Range("B3:DC30000").ClearContents
  
  lngLastCol = Application.Max(1, objWS.Cells(objIdentifier.Value, Columns.Count).End(xlToLeft). _
Column)
  
  For lngCol = 1 To lngLastCol
    If objWS.Cells(1, lngCol) <> "" Then
      varRes = Application.Match(objWS.Cells(objIdentifier.Value, lngCol), .Rows(1), 0)
      If IsNumeric(varRes) Then
        lngLast = objWS.Cells(Rows.Count, lngCol).End(xlUp).Row
        objWS.Range(objWS.Cells(objIdentifier.Value + 1, lngCol), objWS.Cells(lngLast, lngCol)). _
Copy
        .Cells(3, varRes).PasteSpecial xlValues
      End If
    End If
  Next

End With

MsgBox "Neue Daten importiert!"

End Sub

--> irgendwie ist das mit dem "objIdentifier.Value" Befehl nicht korrekt oder? Zudem hätte ich noch gerne ein Schleife die mir überprüft ob die Überschriftenzeile gefunden wurde.

  

Betrifft: AW: VBA Daten einlesen mit var. Überschriftenzeile von: Björn B.
Geschrieben am: 17.11.2009 13:40:57

Hallo,

 irgendwie ist das mit dem "objIdentifier.Value" Befehl nicht korrekt oder? 
Warum nicht? Kommt irgendein Fehler oder was funktioniert nicht.
Was soll denn passieren?
Bitte besser beschreiben, sonst muss ich mich da ewig einarbeiten.

Gruß
Björn


  

Betrifft: AW: VBA Daten einlesen mit var. Überschriftenzeile von: Stefan
Geschrieben am: 17.11.2009 13:45:30

Hallo Björn,

in dem unteren Bereich muss ein Fehler sein den ich leider nicht finde:

For lngCol = 1 To lngLastCol
If objWS.Cells(1, lngCol) <> "" Then
varRes = Application.Match(objWS.Cells(objIdentifier.Value, lngCol), .Rows(1), 0)
If IsNumeric(varRes) Then
lngLast = objWS.Cells(Rows.Count, lngCol).End(xlUp).Row
objWS.Range(objWS.Cells(objIdentifier.Value + 1, lngCol), objWS.Cells(lngLast, lngCol)). _
Copy
.Cells(3, varRes).PasteSpecial xlValues
End If
End If
Next


Wenn der Werte im Tabellenblatt welcher durch "objIdentifier.Value" angesprochen wird 3 ist wird trotzdem die Überschrift in der ersten Zeile gesucht und nicht in der dritten wie gewünscht. Falls es zu kompliziert ist kann ich auch eine Beispieldatei hochladen.


  

Betrifft: AW: VBA Daten einlesen mit var. Überschriftenzeile von: Björn B.
Geschrieben am: 17.11.2009 14:05:44

Hallo,

was macht denn diese Zeile?

varRes = Application.Match(objWS.Cells(objIdentifier.Value, lngCol), .Rows(1), 0)

Ich kenne Application.Match nicht.
Lass Dir mal deine Variable ausgeben. Hat die überhaupt den richtigen Wert?

Versuch noch mal zu beschreiben (schritt für schritt), was das makro macht.

Gruß
Björn


  

Betrifft: AW: VBA Daten einlesen mit var. Überschriftenzeile von: Stefan
Geschrieben am: 17.11.2009 14:44:47

also unten die Erklärung der einzelnen Zeilen:

lngLastCol = Application.Max(1, objWS.Cells(objIdentifier.Value, Columns.Count).End(xlToLeft).Column)
'soll die Anzahl der Spalten in der Quelle identifizieren

For lngCol = 1 To lngLastCol
If objWS.Cells(1, lngCol) <> "" Then

varRes = Application.Match(objWS.Cells(objIdentifier.Value, lngCol), .Rows(1), 0)
'application.match ist ein Vergleich, heisst also es Vergleich Zielüberschrift mit Quelle
If IsNumeric(varRes) Then
lngLast = objWS.Cells(Rows.Count, lngCol).End(xlUp).Row
objWS.Range(objWS.Cells(objIdentifier.Value + 1, lngCol), objWS.Cells(lngLast, lngCol)). _
Copy
.Cells(3, varRes).PasteSpecial xlValues
'hier kopiert er dann die komplette spalte der gefundenen Überschrift aus der Quelle und fügt sie im Ziel ein
End If
End If
Next


  

Betrifft: Problem gelöst - Zeile und Spalte war vertauscht von: Stefan
Geschrieben am: 17.11.2009 14:59:08

trotzdem Danke für die Hilfe!!!


Beiträge aus den Excel-Beispielen zum Thema "VBA Daten einlesen mit var. Überschriftenzeile"