Live-Forum - Die aktuellen Beiträge
Datum
Titel
15.07.2024 16:00:57
15.07.2024 15:41:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA -Wert suchen-Zeilen aus anderer Mappe einlesen

VBA -Wert suchen-Zeilen aus anderer Mappe einlesen
25.12.2014 10:56:13
Markus
Guten Morgen an das Herber Excel-Forum,
ich suche eine Möglichkeit aus einer geöffneten Mappe bestimmte Daten in meine Mappe zu importieren (VBA).
Der Suchwert in meiner Zieldatei steht in B3 (Zahl). Dieser soll in der Quelldatei in der Spalte A1:A5000 gesucht werden. Der Wert kann mehrmals vorkommen. Es sollen alle Zeilenwerte die dem Suchwert entsprechen (C:L) in meine Zieldatei C2:Lx) eingefügt werden.
Der erste Wert aus der Spalte B soll nach D3 eingelesen werden.
Mit einer SVerweis Formel geht das schonmal, aber da ich die importierten Daten noch teilweise bearbeiten muss ist der weg über VBA der bessere.
Kann mir da jemand weiter helfen?
Vielen Dank und frohe Weihnachtsfeiertage.

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA -Wert suchen-Zeilen aus anderer Mappe einlesen
29.12.2014 09:25:16
Mullit
Hallo,
Du könntest das z.B. ganz klassisch mit der Find-Methode angehen, oder Du versuchst Deine Formeln direkt in VBA zu verbraten...
Gruß,

AW: VBA -Wert suchen-Zeilen aus anderer Mappe einlesen
29.12.2014 18:40:13
Markus
Hallo Mullit,
vielen Dank für Deine Antwort.
Ich habe ein wenig gestöbert und für mich folgenden Ansatz gefunden.
Option Explicit
Private Sub CommandButton1_Click()
Dim rngZelle As Range
Dim strSuchwort As String
strSuchwort = ThisWorkbook.Sheets("Tabelle1").Range("B1")
For Each rngZelle In Workbooks("Test.xlsx").Worksheets("Tabelle1").Range("A2:A5000")
If rngZelle = strSuchwort Then
rngZelle.EntireRow.Copy Sheets("Tabelle1").Range("A" & Sheets("Tabelle1").Cells( _
Rows.Count, 1).End(xlUp).Row + 1)
End If
Next rngZelle
End Sub
was ich noch anpassen sollte:
1.) mit Entire.Row wird ja die ganze Zeile eingelesen. Es sollte aber nur der Bereich C bis L der jeweiligen Trefferzeile kopiert werden.
2.) kopiert werden sollten nur Werte
und 3. der Zielbereich sollte bei B8 anfangen
Kannst Du mir da einen Tipp geben.
Vielen Dank.

Anzeige
AW: VBA -Wert suchen-Zeilen aus anderer Mappe einlesen
29.12.2014 22:53:25
Mullit
Hallo Markus,
null problemo, ich mach sowas meistens mit der Find-Methode.
Alternativ könntest Du die Treffer auch in ein Array packen und das Öffnen der Datei bei Bedarf auch noch automatisieren...
Option Explicit

Public Sub prcSuch()
Const SOURCE_NAME As String = "Test.xlsx" 'Quelldatei 
Dim objRange As Range, objUnion As Range
Dim strFirstAddress As String, strName As String
Dim wksSource As Worksheet
Dim lngIndex As Long
With Application
   .ScreenUpdating = False
    On Error Resume Next
    strName = Workbooks(SOURCE_NAME).Name
    If Err Then
      On Error GoTo 0
      MsgBox "Die Datei '" & SOURCE_NAME & "' ist noch nicht geöffnet!", _
         vbExclamation, "Bitte Datei öffnen"
    Else
      On Error GoTo 0
      Set wksSource = Workbooks(SOURCE_NAME).Worksheets("Tabelle1")
      With ThisWorkbook.Worksheets("Tabelle1") 'Zieldatei 
          .Cells(2, .UsedRange.Columns(1).Column).Resize(.UsedRange.Rows.Count - 1, _
            .UsedRange.Columns.Count - 1).ClearContents
          With wksSource.Cells(2, 1).Resize(4999, 1)
              Set objRange = .Find(What:=ThisWorkbook.Worksheets("Tabelle1").Cells(1, 2), _
                 LookIn:=xlValues, LookAt:=xlWhole)
              If Not objRange Is Nothing Then
                  strFirstAddress = objRange.Address
                  Do
                     With wksSource.Cells(objRange.Row, 3)
                         If Not objUnion Is Nothing Then
                           Set objUnion = Union(objUnion, .Resize(1, 10))
                         Else
                           Set objUnion = .Resize(1, 10)
                         End If
                     End With
                     Set objRange = .FindNext(After:=objRange)
                  Loop While Not objRange Is Nothing And objRange.Address <> strFirstAddress
              End If
          End With
          For lngIndex = 1 To objUnion.Areas.Count
             objUnion.Areas(lngIndex).Copy
             .Cells(7 + lngIndex, 2).PasteSpecial xlPasteValues
          Next
      End With
      .CutCopyMode = False
      Set objRange = Nothing
      Set objUnion = Nothing
      Set wksSource = Nothing
    End If
    .ScreenUpdating = True
End With
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 12

Gruß, Mullit

Anzeige
AW: VBA -Wert suchen-Zeilen aus anderer Mappe einlesen
30.12.2014 00:06:42
Mullit
Hallo Markus,
der ganze Union-Crap kann übrigens noch raus...
Option Explicit

Private Sub CommandButton1_Click()
 Call prcSuch
End Sub

Private Sub prcSuch()
Const SOURCE_NAME As String = "Test.xlsx"
Dim objRange As Range
Dim wksSource As Worksheet, wksTarget As Worksheet
Dim strFirstAddress As String, strName As String
Dim lngIndex As Long
With Application
   .ScreenUpdating = False
    On Error Resume Next
    strName = Workbooks(SOURCE_NAME).Name
    If Err Then
      On Error GoTo 0
      MsgBox "Die Datei '" & SOURCE_NAME & "' ist noch nicht geöffnet!", _
        vbExclamation, "Bitte Datei öffnen"
    Else
      On Error GoTo 0
      Set wksSource = Workbooks(SOURCE_NAME).Worksheets("Tabelle1") 'Quelldatei 
      Set wksTarget = ThisWorkbook.Worksheets("Tabelle1") 'Zieldatei 
      With wksTarget
          .Cells(2, .UsedRange.Columns(1).Column).Resize(.UsedRange.Rows.Count - 1, _
            .UsedRange.Columns.Count - 1).ClearContents
      End With
      With wksSource.Cells(2, 1).Resize(4999, 1)
          Set objRange = .Find(What:=wksTarget.Cells(1, 2), LookIn:=xlValues, LookAt:=xlWhole)
          If Not objRange Is Nothing Then
              strFirstAddress = objRange.Address
              Do
                 lngIndex = lngIndex + 1
                 wksSource.Cells(objRange.Row, 3).Resize(1, 10).Copy
                 wksTarget.Cells(7 + lngIndex, 2).PasteSpecial xlPasteValues
                 Set objRange = .FindNext(After:=objRange)
              Loop While Not objRange Is Nothing And objRange.Address <> strFirstAddress
          End If
      End With
      .CutCopyMode = False
      Set objRange = Nothing
      Set wksSource = Nothing
      Set wksTarget = Nothing
    End If
    .ScreenUpdating = True
End With
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 12

Gruß, Mullit

Anzeige
AW: VBA -Wert suchen-Zeilen aus anderer Mappe einlesen
30.12.2014 07:27:05
Markus
Guten Morgen Mullit,
vielen Dank. Hatte es gestern noch mit dem ersten code versucht. Da wurden aber nicht alle Datensätze gefunden. Der jetztige liefert das richtige ergebnis.
Ich teste heute nochmals.
Danke schonmal.

AW: VBA -Wert suchen-Zeilen aus anderer Mappe einlesen
30.12.2014 11:25:48
Mullit
Hallo Markus,
prima, die Codes sollten eigentlich das gleiche Ergebnis liefern, hab' Dir mal in vorgelagerter Silvesterstimmung noch das Öffnen miteingebaut...
Option Explicit

Private Sub CommandButton1_Click()
 Call prcSuch
End Sub

Private Sub prcSuch()
Const SOURCE_NAME As String = "Test.xlsx"
Dim objRange As Range
Dim wksSource As Worksheet, wksTarget As Worksheet
Dim strFirstAddress As String, strName As String
Dim lngIndex As Long
With Application
   .ScreenUpdating = False
    On Error Resume Next
    strName = Workbooks(SOURCE_NAME).Name
    If Err Then
      On Error GoTo 0
      With ThisWorkbook
          Workbooks.Open .Path & "\" & SOURCE_NAME
          .Activate
      End With
    Else: On Error GoTo 0
    End If
    Set wksSource = Workbooks(SOURCE_NAME).Worksheets("Tabelle1") 'Quelldatei 
    Set wksTarget = ThisWorkbook.Worksheets("Tabelle1") 'Zieldatei 
    With wksTarget
        .Cells(2, .UsedRange.Columns(1).Column).Resize(.UsedRange.Rows.Count - 1, _
          .UsedRange.Columns.Count - 1).ClearContents
    End With
    With wksSource.Cells(2, 1).Resize(4999, 1)
        Set objRange = .Find(What:=wksTarget.Cells(1, 2), LookIn:=xlValues, LookAt:=xlWhole)
        If Not objRange Is Nothing Then
            strFirstAddress = objRange.Address
            Do
               lngIndex = lngIndex + 1
               wksSource.Cells(objRange.Row, 3).Resize(1, 10).Copy
               wksTarget.Cells(7 + lngIndex, 2).PasteSpecial xlPasteValues
               Set objRange = .FindNext(After:=objRange)
            Loop While Not objRange Is Nothing And objRange.Address <> strFirstAddress
        End If
    End With
    .CutCopyMode = False
    .ScreenUpdating = True
End With
Set objRange = Nothing
Set wksSource = Nothing
Set wksTarget = Nothing
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 12

Gruß, Mullit

Anzeige
AW: VBA -Wert suchen-Zeilen aus anderer Mappe einlesen
30.12.2014 12:15:53
Mullit
Hallo Markus,
für noch mehr Speed kannst Du Dir das Kopieren eigentlich gleich ganz sparen...
Option Explicit

Private Sub CommandButton1_Click()
 Call prcSuch
End Sub

Private Sub prcSuch()
Const SOURCE_NAME As String = "Test.xlsx"
Dim objRange As Range
Dim wksSource As Worksheet, wksTarget As Worksheet
Dim strFirstAddress As String, strName As String
Dim lngIndex As Long
With Application
   .ScreenUpdating = False
    On Error Resume Next
    strName = Workbooks(SOURCE_NAME).Name
    If Err Then
      On Error GoTo 0
      With ThisWorkbook
          Workbooks.Open .Path & "\" & SOURCE_NAME
          .Activate
      End With
    Else: On Error GoTo 0
    End If
    Set wksSource = Workbooks(SOURCE_NAME).Worksheets("Tabelle1") 'Quelldatei 
    Set wksTarget = ThisWorkbook.Worksheets("Tabelle1") 'Zieldatei 
    With wksTarget
        .Cells(2, .UsedRange.Columns(1).Column).Resize(.UsedRange.Rows.Count - 1, _
          .UsedRange.Columns.Count - 1).ClearContents
    End With
    With wksSource.Cells(2, 1).Resize(4999, 1)
        Set objRange = .Find(What:=wksTarget.Cells(1, 2), LookIn:=xlValues, LookAt:=xlWhole)
        If Not objRange Is Nothing Then
            strFirstAddress = objRange.Address
            Do
               lngIndex = lngIndex + 1
                 wksTarget.Cells(7 + lngIndex, 2).Resize(1, 10).Value = _
                    wksSource.Cells(objRange.Row, 3).Resize(1, 10).Value
               Set objRange = .FindNext(After:=objRange)
            Loop While Not objRange Is Nothing And objRange.Address <> strFirstAddress
        End If
    End With
    .ScreenUpdating = True
End With
Set objRange = Nothing
Set wksSource = Nothing
Set wksTarget = Nothing
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 12

Gruß, Mullit
Anzeige

339 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige