Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1872to1876
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Einen aus einem bestimmte Bereich etwas

Einen aus einem bestimmte Bereich etwas
17.03.2022 18:43:46
Backbert
Ich möchte gerne aus einer Tabelle automatisch einen bestimmten Bereich der einen bestimmten wert enthält per VBA in eine neue Datei Kopieren.
Ein Skript welches den Bereich Automatisch bestimmt habe ich schon gefunden und verwende es.
es ist folgendes.

Dim lngLetzte As Long
lngLetzte = IIf(IsEmpty(Cells(Rows.Count, 6)), Cells(Rows.Count, 6).End(xlUp).Row, Rows.Count)
Range("A2:I" & lngLetzte).Copy
Das Kopie Skript habe ich auch gefunden dank dem Forum.

Dim wkbName As String, wkbNeu As String, wksName As String
wkbName = ThisWorkbook.Name
wksName = ActiveSheet.Name
Workbooks.Add
wkbNeu = ActiveWorkbook.Name
Workbooks(wkbName).Sheets(wksName).Range("A2:I2000").Copy Workbooks(wkbNeu).Sheets(1).Range("A2")
Dim pfad As String, DateiName As String
'pfad = Workbooks(wkbName).Sheets(wksName).Range("D9")
pfad = Workbooks(wkbName).Sheets("Einstellungen").Range("D9")
DateiName = Workbooks(wkbName).Sheets(wksName).Range("N34")
'Workbooks(wkbNeu).SaveAs Filename:=pfad & "H:\HOLZTool\03 Holzlisten\01 aus Rechenhilfe\" & DateiName & ".xlsx"
Workbooks(wkbNeu).SaveAs Filename:=pfad & DateiName & ".xlsx"
ActiveWorkbook.Close
'Löschen des Datei Namens
Range("N34:P34").ClearContents
Range("I3").Select
Nun möchte ich das in der Tabelle im Bereich I3:I2000 nach dem Kürzel BSH gesucht wird
und die Zeilen aus dem Bereich A3:I2000 in eine Neue Datei welche definiert ist kopiert wird.
Aber irgendwie bekomme ich die beiden Skripte nicht zusammen und das mit dem suchen nach dem Kürzel nicht hin. Könnte mir jemand helfen?

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Einen aus einem bestimmte Bereich etwas
17.03.2022 20:23:17
Yal
Hallo auch,
Je nach dem wie gut ich deine Erklärung verstanden habe, ergibt sich folgende Code:

Sub kopieren()
Dim wsZiel As Worksheet
Dim wsQuelle As Worksheet
Dim Pfad As String
Dim DateiName As String
Dim ZeilenListe
Dim i
'Daten in der Quelle suchen und sammlen (es werden nur die Zeilennummer gesammelt)
Set wsQuelle = ActiveSheet 'setzt voraus, dass man sich in der richtige Datenblatt befindet, wenn das Makro angestossen wird
ZeilenListe = Array() 'Dummy-Initialisierung (ergibt Ubound(..) = -1)
ZeilenListe = Daten_sammeln(wsQuelle, "I3:I2000", "BSH")
If UBound(ZeilenListe) = -1 Then
MsgBox "Es wurde keinen Treffer gefunden.", vbInformation, "Abbruch"
Exit Sub
End If
'neue Arbeitsmappe erzeugen
Workbooks.Add
Set wbZiel = ActiveWorkbook.Worksheets(1)
'Daten übertragen
Application.ScreenUpdating = False
For Each i In ZeilenListe
wsQuelle.Range("A" & i & ":I" & i).Copy wsZiel.Range("A99999").End(xlUp).Offset(1, 0)
Next
Application.ScreenUpdating = True
'Speichername und Pfad finden
Pfad = Trim(ThisWorkbook.Sheets("Einstellungen").Range("D9"))
If Right(Pfad, 1)  "\" Then Pfad = Pfad & "\"
DateiName = Trim(wsQuelle.Range("N34"))
'Speichern und schliessen
wsZiel.Parent.SaveAs Filename:=Pfad & DateiName & ".xlsx"
wsZiel.Close
'Löschen des Dateinamens
wsQuelle.Range("N34:P34").ClearContents
wsQuelle.Range("I3").Select
End Sub
Private Function Daten_sammeln(ByVal Sh As Worksheet, Suchbereich As String, SuchString)
Dim Z As Range
Dim erg()
Dim ersteTreffer As String
'Dummy-Init. Damit ergibt UBound(erg) = -1 und das Increment Redim Preserve kann stattfinden
erg = Array()
'erste Suche. Könnte ins leer gehen
Set Z = Sh.Range(Suchbereich).Find(SuchString, LookAt:=xlPart, MachtCase:=False)
If Not Z Is Nothing Then
ersteTreffer = Z.Address
'alle Treffer finden
Do
ReDim Preserve erg(UBound(erg) + 1)
erg(UBound(erg)) = Z.Row
Set Z = Sh.Range(Suchbereich).Find
Loop While Z.Address  ersteTreffer
End If
'Ergebnisse übergeben
Daten_sammeln = erg
End Function
Es wird mit den Objekt selbst (Set wsQuell = ...) anstatt mit einem dessen Eigenschaften ( Worksheets(wksName) ). Es mach das Coding leichter.
Da Du keine Datei mitgeliefert hast, könnte ich das "Werk" nicht testen. Es steckt sicher viele Fehler drin.
Wegen deine begrenzte VBA-Kompetenz gehe ich nicht davon aus, dass die eventuell notwendige Korrekturen selber hinbekommst. Ich habe viele Kommentare hinzugefügt, falls irgendjemand irgendwann eine ähnliche Frage hat.
VG
Yal
Anzeige
"V"ehler entdeckt
17.03.2022 21:20:30
Yal
nicht

'neue Arbeitsmappe erzeugen
Workbooks.Add
Set wbZiel = ActiveWorkbook.Worksheets(1)
sondern

'neue Arbeitsmappe erzeugen
Workbooks.Add
Set wsZiel = ActiveWorkbook.Worksheets(1)
VG
Yal
AW: "V"ehler entdeckt
21.03.2022 15:56:27
Backbert
Hallo Yal,
vielen Dank für deine Hilfe.
Ich habe es gerade einmal probiert und es hängt sich immer bei "wsZiel.Close" auf. Er meldet: Fehler beim Kompilieren: Methode oder Datenobjekt nicht gefunden
Wenn ich diese Funktion mit ' ausklammere kommt folgendes das gleich für "machtCase:=False" in der PrivateFunktion.
Dann bin ich irgendwie aktuell nicht weiter gekommen.
Anzeige
AW: "V"ehler entdeckt
21.03.2022 18:14:55
Yal
Hallo B.,
ein gewisse Forschungsdrang sollte man schon haben, wenn man mit einer Programmiersprache umgehen möchte.
Bei meiner letzten Korrektur bist Du darauf aufmerksam gemacht, dass es ein wsZiel und ein wbZiel gibt. Welche Bedeutung hat diese Buchstabe-Unterschied? Was kann man schliessen? Ein workbook oder ein Worksheet?
Dito für "MachtCase". Mit ein Bischen Neugierigkeit entdeckt man schnell, dass dei Funktion "Find" ein Paramter "MatchCase" annimmt (Berücksichtigung Gross-/Kleinschreibung) aber keine MachtCase.
Programmieren ist Drachen-Reiten. Macht spass, aber das Ding muss man "domptieren". Was der passende Willen voraussetzt (freundliches Anstupsen ;-)
VG
Yal
Anzeige
AW: "V"ehler entdeckt
22.03.2022 17:20:42
Backbert
Hallo Yal,
ich habe es natürlich wie von dir beschrieben geändert. Und auch schon versucht herauszufinden was die einzelnen Befehle bedeuten und bewirken bin aber leider nicht weiter gekommen.
Er bleibt immer noch on den folgenden fett markierten stellen hängen:

Sub BSHspeichern()
Dim wsZiel As Worksheet
Dim wsQuelle As Worksheet
Dim Pfad As String
Dim DateiName As String
Dim ZeilenListe
Dim i
'Daten in der Quelle suchen und sammlen (es werden nur die Zeilennummer gesammelt)
Set wsQuelle = ActiveSheet 'setzt voraus, dass man sich in der richtige Datenblatt befindet, wenn das Makro angestossen wird
ZeilenListe = Array() 'Dummy-Initialisierung (ergibt Ubound(..) = -1)
ZeilenListe = Daten_sammeln(wsQuelle, "I3:I2000", "BSH")
If UBound(ZeilenListe) = -1 Then
MsgBox "Es wurde keinen Treffer gefunden.", vbInformation, "Abbruch"
Exit Sub
End If
'neue Arbeitsmappe erzeugen
Workbooks.Add
Set wsZiel = ActiveWorkbook.Worksheets(1)
'Daten übertragen
Application.ScreenUpdating = False
For Each i In ZeilenListe
wsQuelle.Range("A" & i & ":I" & i).Copy wsZiel.Range("A99999").End(xlUp).Offset(1, 0)
Next
Application.ScreenUpdating = True
'Speichername und Pfad finden
Pfad = Trim(ThisWorkbook.Sheets("Einstellungen").Range("D9"))
If Right(Pfad, 1)  "\" Then Pfad = Pfad & "\"
DateiName = Trim(wsQuelle.Range("N34"))
'Speichern und schliessen
wsZiel.Parent.SaveAs Filename:=Pfad & DateiName & ".xlsx"
wsZiel.Close
'Löschen des Dateinamens
wsQuelle.Range("N34:P34").ClearContents
wsQuelle.Range("I3").Select
End Sub
Private Function Daten_sammeln(ByVal Sh As Worksheet, Suchbereich As String, SuchString)
Dim Z As Range
Dim erg()
Dim ersteTreffer As String
'Dummy-Init. Damit ergibt UBound(erg) = -1 und das Increment Redim Preserve kann stattfinden
erg = Array()
'erste Suche. Könnte ins leer gehen
Set Z = Sh.Range(Suchbereich).Find(SuchString, LookAt:=xlPart, MachtCase:=False)
If Not Z Is Nothing Then
ersteTreffer = Z.Address
'alle Treffer finden
Do
ReDim Preserve erg(UBound(erg) + 1)
erg(UBound(erg)) = Z.Row
Set Z = Sh.Range(Suchbereich).Find
Loop While Z.Address  ersteTreffer
End If
'Ergebnisse übergeben
Daten_sammeln = erg
End Function

Anzeige
AW: "V"ehler entdeckt
22.03.2022 18:38:31
Yal
ändere
wsZiel.Close
in
wsZiel.Parent.Close
(Ähnlich wie Zeile davor. Ich lag falsch, es gibt kein wbZiel. ws wird allgemein für Worksheet-Variablen, wb für Workbook)
ändere
machtCase
in matchcase
VG
Yal

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige