Excel-Daten nach Spaltenwert filtern und Spalten in einzelne Dateien speichern

558
Cody S.

Vor vielen Jahren mussten wir eine Lösung finden, um die Ergebnisse zu ermitteln, die wir über CSV erhalten haben. Damals erhielten wir Daten, bei denen die erste Spalte E-Mails war und die nachfolgenden Spalten 1 oder Null waren, um das Interesse an einer Organisation zu signalisieren. Wir haben versucht, eine Lösung zu finden, die NACH der E-Mail-Spalte durch jede Spalte ging, und in separaten Arbeitsmappen eine Liste der E-Mails für jede Spalte mit einer 1 speichern, damit wir sie an diese Organisationen senden können.

Unsere Daten (vereinfacht) sahen so aus:

enter image description here

Wobei das Endergebnis 4 neue .xlsx-Dateien (club1.xlsx, club2.xlsx, club3.xlsx usw.) bereitstellen würde, die jeweils die "E-Mails" enthalten, die in ihrer jeweiligen Spalte 1-Nummern enthalten. (In obigem Beispiel würden für Club1.xlsx Email1, Email3, Email7 aufgelistet.)

Zu dieser Zeit war die StackExchange-Community äußerst hilfreich, um uns beim Finden einer Lösung zu helfen, indem sie den folgenden VBA-Code zum Ausführen eines Makros bereitstellt:

Option Explicit  Sub FilterData() Dim Responses As Worksheet Dim Column As Long  Set Responses = ThisWorkbook.Worksheets("Responses") Column = 2  Do While Responses.Cells(1, Column).Value <> "" With Workbooks.Add(xlWBATWorksheet) With .Worksheets(1) Responses.Cells.Copy .Cells .Columns(Column).AutoFilter Field:=1, Criteria1:="<>1" .Rows(2).Resize(.Rows.Count - 1).Delete Shift:=xlUp .Columns(2).Resize(, .Columns.Count - 1).Delete Shift:=xlShiftToLeft End With  .Close SaveChanges:=True, Filename:=ThisWorkbook.Path & "\" & Responses.Cells(1, Column).Value End With  Column = Column + 1 Loop End Sub 

Unser Layout hat sich jedoch seitdem geändert, und wir können nicht herausfinden, wie wir den Code so ändern können, dass er mehr Spalten enthält. Anstatt nur die "E-Mail" -Spalte zu verwenden, haben wir jetzt zusätzliche Spalten für "Bevorzugter Name", "Vorname", "Nachname" und "Pronomen". Unsere Versuche, den obigen Code zu ändern, haben nur dazu gedient, das Makro entweder vollständig zu unterbrechen oder nur eine einzelne Zeile zu speichern.

Hätte irgendjemand einen Rat dazu, wie wir entweder neuen Code schreiben oder den vorhandenen Code ändern können, um alle Spalten in unseren Exporten zu berücksichtigen (Club1.xlsx würde jetzt Spalten- / Zeilendaten für referenzierte Namen, Vornamen, Nachnamen) haben? Pronomen und E-Mails für jede Spalte mit einer "1").

Hier ist unser neuer Datensatz: enter image description here

Irgendwelche Gedanken? Ich bin verblüfft

1

2 Antworten auf die Frage

1
VHalpenny

Ohne Quelldaten zum Ausprobieren wäre dies meine Gastfamilie

Ich habe ein Verfahren erstellt, das zur Eingabe der Quelldatei auffordert, dann ein Ausgabe-Arbeitsbuch erstellt und für jeden Club ein Blatt hinzufügt, in dem die Details der betroffenen Parteien für diesen Club aufgeführt sind.

Es wird davon ausgegangen, dass es sich bei der Quelldatei um eine Excel-Datei mit der Erweiterung "xlsx" handelt. Außerdem wird davon ausgegangen, dass sich die Quelldaten auf einem Blatt mit der Bezeichnung "Antwort" befinden.

Es schließt die Quelldatei, aber nicht die generierte Arbeitsmappe.

Ich habe den Code kommentiert, um zu erklären, wie er funktioniert.

 Sub FilterData()  '------------- Define the Variables ----------------- 'Define workbooks and worksheets Dim wbkSource As Workbook, shtSource As Worksheet '. Source Date Dim wbkList As Workbook, shtList As Worksheet '..... Final workbook with separate sheets  'Define Index looping variables and last positions Dim idxRows As Double, idxCols As Double Dim lastRow As Double, lastCol As Double  'Define the identifier holders Dim fileName As String '................... Holds the selected source file name Dim clubName As String '................... Holds the current Club name Dim cntRows As Double '.................... Flags is there is a club entry or not and tracks the club entry position  '----------------- Assign the startup values 'Open the source file and assign it as wbkSource, when the user has not cancelled fileName = Application.GetOpenFilename("Excel File (*.xlsx),*.xlsx, All Files (*.*), (*.*)",, "Please select the source file") If fileName <> "False" Then  'Assign the workbook source to the opened file Set wbkSource = Workbooks.Open(fileName)  'Assign the source worksheet Set shtSource = wbkSource.Worksheets("Responses")  'Create the output workbook and assign it to the wbkList Workbooks.Add Set wbkList = Workbooks(Workbooks.Count)  'Define the last row and column positions lastRow = shtSource.Cells.SpecialCells(xlCellTypeLastCell).Row lastCol = shtSource.Cells.SpecialCells(xlCellTypeLastCell).Column  '-------------------------------------- Loop through each possible club For idxCols = 6 To lastCol 'Get the next club name and reset the flag clubName = shtSource.Cells(1, idxCols) cntRows = 0  '----------------------------------- Loop for each row For idxRows = 2 To lastRow  'When we have an interest for this contact for this club If shtSource.Cells(idxRows, idxCols) = 1 Then 'Increment the row count cntRows = cntRows + 1  'If this is the first time create the worksheet for this club If cntRows = 1 Then wbkList.Worksheets.Add Set shtList = wbkList.Worksheets.Add shtList.Name = clubName  'Create the Title row shtList.Cells(1, 1) = "Preferred" shtList.Cells(1, 2) = "First" shtList.Cells(1, 3) = "Last" shtList.Cells(1, 4) = "Pronouns" shtList.Cells(1, 5) = "Emails"  'Increment the row count to allow for the title cntRows = cntRows + 1  End If  'Add the data to the club sheet shtList.Cells(cntRows, 1) = shtSource.Cells(idxRows, 1) shtList.Cells(cntRows, 2) = shtSource.Cells(idxRows, 2) shtList.Cells(cntRows, 3) = shtSource.Cells(idxRows, 3) shtList.Cells(cntRows, 4) = shtSource.Cells(idxRows, 4) shtList.Cells(cntRows, 5) = shtSource.Cells(idxRows, 5)   End If 'Interested for this club  Next idxRows '----------------------------------- each row  Next idxCols '------------------------------------ Each Club  'Turn off warning termporarily and close the source file Application.DisplayAlerts = False wbkSource.Close Application.DisplayAlerts = True   Else 'Notify the user of the cancelling of the macro MsgBox "Error: Canncelled by user, closing marco.", vbCritical, "User cancelled!" End If   End Sub 

Hoffe, es hilft, V.

Vielen Dank dafür - Sie haben einen SUPER Deep Dive gemacht. Ich bin auf einem Mac (kann aber auf einen PC umziehen), daher entfernte ich die XLSX-Dateifilterattribute, da beim Öffnen eines Dialogfelds das Makro beschädigt wurde. Soweit funktionierte es. So'ne Art! Es erstellte ein einzelnes neues Dokument mit Arbeitsmappen für jeden "Club" (und einige leere Blätter dazwischen). Wir suchen nach einer Datei pro Organisation (anstatt einer Arbeitsmappe), damit wir die Listen einzeln versenden können - aber ich scheine nicht herauszufinden, wie sie jede Datei einzeln speichern soll (club1.xlsx, club2.xlsx) , usw) Cody S. vor 5 Jahren 0
What you need to do is move the "Create the output workbook and assign it to wbklist" code down to just above "wbklist.worksheets.add" and sandwiched between put wbklist.saveas " VHalpenny vor 5 Jahren 1
0
Zhongjie Shen

Zu dieser Zeit war die StackExchange-Community äußerst hilfreich, um uns beim Finden einer Lösung zu helfen, indem sie den folgenden VBA-Code zum Ausführen eines Makros bereitstellt:

Muss dies in einer Art automatisierten Prozess erfolgen? Wenn nicht, können Sie einfach die gesamte Tabelle anhand der Werte in der Spalte " club1", "club2", "club3" filtern und das Ergebnis in separate Dateien kopieren. Wenn Sie nur weniger als 10 "Clubs" haben, ist dies möglicherweise schneller als das Schreiben von VBA.

Unser Gesamtdatensatz besteht aus mehr als 200 "Organisationen" / Spalten und fast 2000 Zeilen. Um einen manuellen Prozess durchzuführen, würde dies viel Zeit in Anspruch nehmen. Deshalb suchen wir nach einem automatisierten Prozess. Cody S. vor 5 Jahren 0