Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1536to1540
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

Excel VBA, Bestimmte Zeilen auswählen etc.

Excel VBA, Bestimmte Zeilen auswählen etc.
30.01.2017 18:43:06
Chris
Hallo liebe Community,
ich habe als Projekt die "Digitale Weltkarte" bekommen.Mithilfe dieser Weltkarte, die in eine PowerPoint Präsentation gepackt wird, kann man schnell sehen, wenn etwa eine Naturkatastrophe gemeldet wird, ob Firmen, die an diesem möglichen Katastrophengebiet ihren Sitz haben gefährtdet werden könnten und, dass ich folglich für eine Zeit lang keine Teile bekomme.
Nun habe ich folgendes Problem. Ich habe eine Datei über 10.000 Zeilen. Diese hat 9 Spalten. In Spalte "F" und "H" stehen Orte von Ländern. In den anderen Spalten stehen z.B. Materialnummer, Lieferant etc. Hier möchte ich nun mit einer VBA-Programmierung und einer Schaltfläche auf dem Excelblatt, Orte herausfinden. Beispielsweise Dallas, Hsinchu, Kuala Lumpur etc. Nun meine Frage wie wähle ich diese Zeilen nach den Suchkriterien aus. Die einzelnen Zeilen, die immer zu einem Ort gehören speichere ich dann als eine Datei. Also es gibt eine Datei mit dem Namen Dallas, Hsinchu Kuala Lumpur etc. Diese Dateien möchte ich dann in einer PowerPoint- Präsentation einbetten.2 Fragen. Wie programmiere ich die Bedingungen in VBA und wähle gezielt die Orte aus und wie mache ich das am besten, dass die Dateien immer aktualisiert werden?

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excel VBA, Bestimmte Zeilen auswählen etc.
30.01.2017 21:28:18
fcs
Hallo Chris,
die Dateien der Städte kannst du mit folgendem Makro erstellen.
Die Dateien werden dabei im gleichen Verzeichnis erstellt wie die Datei mit allen Daten.
Das Einbinden der Datein in die PP-Präsentation ist dann nicht so einfach, wenn sich die Zeilenanzahl in den Dateien ändert. Wenn man die Datei als Objrkt einbinden, dann ist die Darstellung icht so doll und die Zahl der Zeilen pro PPP-Folie ist begrenzt.
Ich würde in der PPP für jede Stadt ein Rechteck einfügen und dem Rechteck einen Hyperlink auf die Excel-Datei zuweisen. Dann kann man die Exceldatei beim Absielen der Präsentation per Klick auf das jeweilige Rechteck öffnen.
LG
Franz

Sub CopyData_per_City()
Dim wkbAktiv As Workbook, wksData As Worksheet
Dim wksZiel As Worksheet, wkbZiel As Workbook
Dim Zeile As Long, Zeile_L As Long, Zeile_1 As Long
Dim arrData As Variant, arrNames As Variant
Dim colNames As New Collection
Dim strStadt As String, strLand As String, strDatei As String
On Error GoTo Fehler
'Datenquelle setzen
Set wkbAktiv = ActiveWorkbook
Set wksData = wkbAktiv.Worksheets(1)
Zeile_1 = 1 'Zeile mit Spalten-Überschriften
With wksData
'Autofilter anlegen wenn nicht vorhanden
If .AutoFilterMode = False Then
Zeile_L = .UsedRange.Row + .UsedRange.Rows.Count - 1
.Range(.Rows(1), .Rows(Zeile_L)).AutoFilter
Else
If .FilterMode = True Then .ShowAllData
Zeile_L = .UsedRange.Row + .UsedRange.Rows.Count - 1
End If
'Zellbereich mit Städten und Ländern in ein Daten-Array einlesen
arrData = .Range(.Cells(Zeile_1 + 1, 6), .Cells(Zeile_L, 8))
'Alle Städte/Länder in einen Collection-Objekt sammeln
For Zeile = LBound(arrData, 1) To UBound(arrData, 1)
colNames.Add Item:=arrData(Zeile, 1) & "|" & arrData(Zeile, 3), _
Key:=arrData(Zeile, 1) & "|" & arrData(Zeile, 3)
Next Zeile
'Städte/Länder abarbeiten
For Zeile = 1 To colNames.Count
'Stadt und Land aus Collection-Zeilen ermitteln
strStadt = Split(colNames(Zeile), "|")(0)
strLand = Split(colNames(Zeile), "|")(1)
'Dateiname für Stadt/Land-Datei
strDatei = wkbAktiv.Path & "\" & strStadt & "-" & strLand & ".xlsx"
'Prüfen, ob Datei schon vorhanden
If Dir(strDatei)  "" Then
'vorhandenen Datei öffnen
Set wkbZiel = Workbooks.Open(Filename:=strDatei)
Else
'Datei neu anlegen und speichern
wksData.Copy
Set wkbZiel = ActiveWorkbook
wkbZiel.SaveAs Filename:=strDatei, FileFormat:=51, addtomru:=False
End If
'Zieltabellenblatt setzen
Set wksZiel = wkbZiel.Worksheets(1)
'vorhandene Daten löschen
wksZiel.UsedRange.Clear
'Daten in Quellblatt filtern und ins Zielblatt kopieren
wksData.AutoFilter.Range.AutoFilter Field:=6, Criteria1:=strStadt
wksData.AutoFilter.Range.AutoFilter Field:=8, Criteria1:=strLand
wksData.AutoFilter.Range.Copy wksZiel.Cells(1, 1)
'Daten im zielblatt als Tabelle/Listobject definieren
With wksZiel
Zeile_L = .Cells(1, 6).End(xlDown).Row
.ListObjects.Add SourceType:=xlSrcRange, _
Source:=wksZiel.Range(.Cells(1, 1), .Cells(Zeile_L, 8)), _
xllistobjecthasheaders:=xlYes
.ListObjects(1).Name = "Tab_City"
End With
'Zieldatei speichern und schliessen
wkbZiel.Close savechanges:=True
'alle Daten anzeigen
.ShowAllData
Next
End With
Fehler:
With Err
Select Case .Number
Case 0 'alles OK
Case 457 'doppelter Wert in Collection
Resume Next
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
End Sub

Anzeige
AW: Excel VBA, Bestimmte Zeilen auswählen etc.
31.01.2017 22:23:55
Chris
Hallo Franz, vielen vielen Dank für deine VBA-Programmierung. Diese hat mir bei meinem Problem sehr weitergeholfen. Nun gibt es noch drei kleine Probleme. Erstens: Im Moment wird für jede Ort-Ort-Beziehung eine neue Datei erstellt. Ich möchte jedoch pro Ort nur eine Datei. Die Spalte "F" zeigt den normalen Produktionsort an. Die Spalte "H" zeigt den alternativen Produktionsort an, wenn eine Naturkatastrophe auftritt. Sagen wir, dass für ein Bauteil 1 der Produktionsort "Dallas" ist und der alternative Produktionsort ist "Hsinchu". Jetzt habe ich Bauteil 2. Hier ist der Produktionsort "Dallas" der alternative Produktionsort ist "Kuala Lumpur". Im Moment erhalte ich für jede Ort-Ort-Beziehung eine Datei. Also in Summe zwei. Ich möchte jedoch nur eine Datei für jeden Ort haben.
Problem zwei: Wenn ich eine Zeile bei den Stammdaten hinzufüge passt alles wunderbar. Es wird alles in die richtigen Dateien einsortiert. Wenn ich jedoch Zeilen in den Stammdaten löschen möchte, werden die betroffenen Zeilen in den Dateien nicht gelöscht. Ich möchte jedoch, dass diese Zeilen in den Dateien gelöscht werden und wenn keine Zeilen mehr in der Datei drin sind, dass die Datei ganz gelöscht wird.
Die letzte Frage betrifft die Darstellung in den Dateien. Wie stelle ich ein, dass die Schriftfarbe für alle Dateien schwarz ist und die Hintergrundfarbe der Zellen immer weiß.(In der Stammdatendatei ist das so, aber bei den ausgegeben Dateien nicht). Kann man sagen, dass das Layout so sein soll, wie das der Stammdatendatei?
Ich hoffe Franz, dass Du mir noch einmal weiterhelfen kannst. Deine VBA-Kenntnisse haben mich ehrlich gesagt sehr beeindruckt :)
Anzeige
AW: Excel VBA, Bestimmte Zeilen auswählen etc.
31.01.2017 23:45:36
fcs
Hallo Chris,
ich hab das Makro angepasst.
Problem 1:
Es wird jetzt für jede Stadt in Spalte F eine Datei erstellt. Nicht mehr für die Kombination aus Spalte F und H.
Problem 2:
Löschen und Einfügen von Zeilen in der Datenliste sollte jetzt korrekt beim Kopieren verarbeitte werden. Das nicht korrekte löschen von Daten hing wahrsceinlich mit dem eingefügten Tabellen/Listobjekt zusammen.
Für das Löschen von Dateien zu Städten, die in der Datenliste nicht mehr vorhanden sind, hab ich eine zusätzliche Do-Loop-Schleife eingefügt, die die im Verzeichis vorhandenen Dateien mit den Städten in der aktuellen Datenliste vergleicht. Fehlt die Stadt, dann wird die Datei gelöscht.
Damit dies korrekt funktioniert dürfen in dem Verzeichnis mit den Stadt-Dateien keine anderen xlsx-Dateien vorhanden sein!!! Diese werden erbarmungslos gekillt.
ggf. ein Unterverzeichnis für die Stadt-Dateien anlegen und im Makro den Pfad anpassen.
Problem 3:
Ich hatte in den Stadt-Dateien die kopierte Datenliste jeweils in eine Tabelle/Listobject umgewandelt, um ggf. besser eine Verknüpfung der Daten in die PP-Präsentation zu ermöglichen - funktionierte aber nicht. Hab dies wieder aus dem Makro rausgenommen. Jetzt ist in den Stadtdateien die Formatierung idenisch mit der Quelldatei.
LG
Franz
Sub CopyData_per_City()
Dim wkbAktiv As Workbook, wksData As Worksheet
Dim wksZiel As Worksheet, wkbZiel As Workbook
Dim Zeile As Long, Zeile_L As Long, Zeile_1 As Long
Dim arrData As Variant, arrNames As Variant
Dim colNames As New Collection
Dim strStadt As String, strDatei As String
Dim strPfad As String
Dim bolDelete As Boolean
Application.ScreenUpdating = False 'beschleunigt Makroausführung
On Error GoTo Fehler
'Datenquelle setzen
Set wkbAktiv = ActiveWorkbook
Set wksData = wkbAktiv.Worksheets(1)
Zeile_1 = 1 'Zeile mit Spalten-Überschriften
With wksData
.Activate
Range("A1").Select
ActiveWindow.ScrollRow = 2
'Autofilter anlegen wenn nicht vorhanden
If .AutoFilterMode = False Then
Zeile_L = .UsedRange.Row + .UsedRange.Rows.Count - 1
.Range(.Rows(1), .Rows(Zeile_L)).AutoFilter
Else
If .FilterMode = True Then .ShowAllData
Zeile_L = .UsedRange.Row + .UsedRange.Rows.Count - 1
End If
'Zellbereich mit Städten in ein Daten-Array einlesen
arrData = .Range(.Cells(Zeile_1 + 1, 6), .Cells(Zeile_L, 8))
'Alle Städte in einen Collection-Objekt sammeln
For Zeile = LBound(arrData, 1) To UBound(arrData, 1)
colNames.Add Item:=arrData(Zeile, 1), _
Key:=arrData(Zeile, 1)
Next Zeile
'Städte abarbeiten
strPfad = wkbAktiv.Path & "\" 'Verzeichnis mit den Stad-Dateien. _
Hier dürfen keine andern xlsx-Dateien gespeichert werden!!!!
'Dateien von Städten, die in Liste nicht mehr vorhanden sind löschen
strDatei = Dir(strPfad & "*.xlsx")
Do Until strDatei = ""
bolDelete = True
'Dateiname mit Stadtnamen vergleichen
For Zeile = 1 To colNames.Count
'Stadt  aus Collection-Zeilen ermitteln
strStadt = colNames(Zeile)
'Dateiname mit Stadt-Datei vergleichen
If LCase(strDatei) = LCase(strStadt & ".xlsx") Then
bolDelete = False
Exit For
End If
Next
If bolDelete = True Then
VBA.Kill strPfad & strDatei
End If
strDatei = Dir
Loop
'Dateien für Städte erstellen/aktualisieren
For Zeile = 1 To colNames.Count
'Stadt  aus Collection-Zeilen ermitteln
strStadt = Split(colNames(Zeile), "|")(0)
'Dateiname für Stadt-Datei
strDatei = strPfad & strStadt & ".xlsx"
'Prüfen, ob Datei schon vorhanden
If Dir(strDatei)  "" Then
'vorhandene Datei öffnen
Set wkbZiel = Workbooks.Open(Filename:=strDatei)
Else
'Datei neu anlegen und speichern
wksData.Copy
Set wkbZiel = ActiveWorkbook
wkbZiel.SaveAs Filename:=strDatei, FileFormat:=51, addtomru:=False
End If
'Zieltabellenblatt setzen
Set wksZiel = wkbZiel.Worksheets(1)
'vorhandene Daten löschen
wksZiel.UsedRange.Clear
'Daten in Quellblatt filtern und ins Zielblatt kopieren
wksData.AutoFilter.Range.AutoFilter Field:=6, Criteria1:=strStadt
wksData.AutoFilter.Range.Copy wksZiel.Cells(1, 1)
'Zieldatei speichern und schliessen
wkbZiel.Close savechanges:=True
'alle Daten anzeigen
.ShowAllData
Next
End With
Fehler:
With Err
Select Case .Number
Case 0 'alles OK
Case 457 'doppelter Wert in Collection
Resume Next
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
Application.ScreenUpdating = True
End Sub

Anzeige
AW: Excel VBA, Bestimmte Zeilen auswählen etc.
01.02.2017 06:44:40
Chris
Hallo Franz,
nochmals vielen Dank für deine Mühen . Ich probiere es mal aus. Vielleicht brauche ich die Spalte "H" gar nicht und ich kann meine Tabelle minimal umgestalten. Danke für Deine Hilfe!
AW: Excel VBA, Bestimmte Zeilen auswählen etc.
01.02.2017 15:17:45
Chris
Hallo Franz,
ich habe die Formel heute in meine Datei eingegeben und es kam die Fehlermeldung "Fehler Nr. 13, Typen unverträglich". Was muss ich in der Formel umstellen?
Gruß
Chris
AW: Excel VBA, Bestimmte Zeilen auswählen etc.
02.02.2017 05:43:40
fcs
Hallo Chris,
der Fehler kann auftreten, wenn in Spalte F keine Ortsname eingetragen ist oder wenn UsedRange (benutzter Zelenbereich) am Ende der Liste leere Zeilen beinhaltet.
Ich hab das Makro angepasst, so das leere Zellen bei der Ermittlung der Ortsnamen übersprungen werden.
Zusätzlich wird die letzte Zeile mit Daten anders ermittelt.
LG
Franz
geänderte/neue Zeilen hab ich markiert.
Sub CopyData_per_City()
Dim wkbAktiv As Workbook, wksData As Worksheet
Dim wksZiel As Worksheet, wkbZiel As Workbook
Dim Zeile As Long, Zeile_L As Long, Zeile_1 As Long
Dim arrData As Variant, arrNames As Variant
Dim colNames As New Collection
Dim strStadt As String, strDatei As String
Dim strPfad As String
Dim bolDelete As Boolean
Application.ScreenUpdating = False 'beschleunigt Makroausführung
On Error GoTo Fehler
'Datenquelle setzen
Set wkbAktiv = ActiveWorkbook
Set wksData = wkbAktiv.Worksheets(1)
Zeile_1 = 1 'Zeile mit Spalten-Überschriften
With wksData
.Activate
Range("A1").Select
ActiveWindow.ScrollRow = 2
'Autofilter anlegen wenn nicht vorhanden
If .AutoFilterMode = False Then
'            Zeile_L = .UsedRange.Row + .UsedRange.Rows.Count - 1 '### deaktiviert fcs
'Letzte Zeile mit Inhalt in Spalte F (6)                    '### neu fcs
Zeile_L = .Cells(.Rows.Count, 6).End(xlUp).Row  '### neu fcs
.Range(.Rows(1), .Rows(Zeile_L)).AutoFilter
Else
If .FilterMode = True Then .ShowAllData
'            Zeile_L = .UsedRange.Row + .UsedRange.Rows.Count - 1 '### deaktiviert fcs
'Letzte Zeile mit Inhalt in Spalte F (6)                    '### neu fcs
Zeile_L = .Cells(.Rows.Count, 6).End(xlUp).Row  '### neu fcs
End If
'Zellbereich mit Städten in ein Daten-Array einlesen
arrData = .Range(.Cells(Zeile_1 + 1, 6), .Cells(Zeile_L, 8))
'Alle Städte in einen Collection-Objekt sammeln
For Zeile = LBound(arrData, 1) To UBound(arrData, 1)
colNames.Add Item:=arrData(Zeile, 1), _
Key:=arrData(Zeile, 1)
Next Zeile
'Städte abarbeiten
strPfad = wkbAktiv.Path & "\" 'Verzeichnis mit den Stad-Dateien. _
Hier dürfen keine andern xlsx-Dateien gespeichert werden!!!!
'Dateien von Städten, die in Liste nicht mehr vorhanden sind löschen
strDatei = Dir(strPfad & "*.xlsx")
Do Until strDatei = ""
bolDelete = True
'Dateiname mit Stadtnamen vergleichen
For Zeile = 1 To colNames.Count
'Stadt  aus Collection-Zeilen ermitteln
strStadt = colNames(Zeile)
'Dateiname mit Stadt-Datei vergleichen
If LCase(strDatei) = LCase(strStadt & ".xlsx") Then
bolDelete = False
Exit For
End If
Next
If bolDelete = True Then
VBA.Kill strPfad & strDatei
End If
strDatei = Dir
Loop
'Dateien für Städte erstellen/aktualisieren
For Zeile = 1 To colNames.Count
'Stadt  aus Collection-Zeilen ermitteln
strStadt = colNames(Zeile)                  '### geändert fcs
'Dateiname für Stadt-Datei
strDatei = strPfad & strStadt & ".xlsx"
'Prüfen, ob Datei schon vorhanden
If Dir(strDatei)  "" Then
'vorhandene Datei öffnen
Set wkbZiel = Workbooks.Open(Filename:=strDatei)
Else
'Datei neu anlegen und speichern
wksData.Copy
Set wkbZiel = ActiveWorkbook
wkbZiel.SaveAs Filename:=strDatei, FileFormat:=51, addtomru:=False
End If
'Zieltabellenblatt setzen
Set wksZiel = wkbZiel.Worksheets(1)
'vorhandene Daten löschen
wksZiel.UsedRange.Clear
'Daten in Quellblatt filtern und ins Zielblatt kopieren
wksData.AutoFilter.Range.AutoFilter Field:=6, Criteria1:=strStadt
wksData.AutoFilter.Range.Copy wksZiel.Cells(1, 1)
'Zieldatei speichern und schliessen
wkbZiel.Close savechanges:=True
'alle Daten anzeigen
.ShowAllData
Next
End With
Fehler:
With Err
Select Case .Number
Case 0 'alles OK
Case 13 'Typfehler, wenn leere Zelle in Spalte F (Ortsnamen) _
evtl. beinhaltet UsedRange auch leere Zeilen am Ende der Liste ### neu fcs
Resume Next                                    '### neu fcs
Case 457 'doppelter Wert in Collection
Resume Next
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
Application.ScreenUpdating = True
End Sub

Anzeige
AW: Excel VBA, Bestimmte Zeilen auswählen etc.
06.02.2017 17:17:38
Chris
Hallo Franz,
mein Problem ist Dank Deiner Hilfe nun endlich gelöst und das Projekt ist nun so gut wie fertig. Vielen, vielen Dank:-)
Gruß
Chris
AW: Excel VBA, Bestimmte Zeilen auswählen etc.
31.01.2017 22:24:39
Chris
Hallo Franz, vielen vielen Dank für deine VBA-Programmierung. Diese hat mir bei meinem Problem sehr weitergeholfen. Nun gibt es noch drei kleine Probleme. Erstens: Im Moment wird für jede Ort-Ort-Beziehung eine neue Datei erstellt. Ich möchte jedoch pro Ort nur eine Datei. Die Spalte "F" zeigt den normalen Produktionsort an. Die Spalte "H" zeigt den alternativen Produktionsort an, wenn eine Naturkatastrophe auftritt. Sagen wir, dass für ein Bauteil 1 der Produktionsort "Dallas" ist und der alternative Produktionsort ist "Hsinchu". Jetzt habe ich Bauteil 2. Hier ist der Produktionsort "Dallas" der alternative Produktionsort ist "Kuala Lumpur". Im Moment erhalte ich für jede Ort-Ort-Beziehung eine Datei. Also in Summe zwei. Ich möchte jedoch nur eine Datei für jeden Ort haben.
Problem zwei: Wenn ich eine Zeile bei den Stammdaten hinzufüge passt alles wunderbar. Es wird alles in die richtigen Dateien einsortiert. Wenn ich jedoch Zeilen in den Stammdaten löschen möchte, werden die betroffenen Zeilen in den Dateien nicht gelöscht. Ich möchte jedoch, dass diese Zeilen in den Dateien gelöscht werden und wenn keine Zeilen mehr in der Datei drin sind, dass die Datei ganz gelöscht wird.
Die letzte Frage betrifft die Darstellung in den Dateien. Wie stelle ich ein, dass die Schriftfarbe für alle Dateien schwarz ist und die Hintergrundfarbe der Zellen immer weiß.(In der Stammdatendatei ist das so, aber bei den ausgegeben Dateien nicht). Kann man sagen, dass das Layout so sein soll, wie das der Stammdatendatei?
Ich hoffe Franz, dass Du mir noch einmal weiterhelfen kannst. Deine VBA-Kenntnisse haben mich ehrlich gesagt sehr beeindruckt :)
Anzeige
AW: Excel VBA, Bestimmte Zeilen auswählen etc.
31.01.2017 22:33:25
Chris
Entschuldigung, dass ich es zwei Mal gesendet habe.

327 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige