Unser Kunde stellt uns eine Excel-Datei mit den Namen der Fahrer und der Anzahl der Tickets zur Verfügung, die sie für eine kostenlose Ziehung erhalten, z. B. „Bill Smith (nächste Spalte) 17 Tickets
gibt es eine Möglichkeit, daraus 17 separate Einträge für „Bill Smith“ zu machen, sodass wir insgesamt über 5.000 Strafzettel für alle 286 Fahrer ausdrucken können? Manche bekommen 1, manche 5, manche mehr …
Derzeit wiederholen wir den Fahrernamen manuell so oft wie nötig.
Wir drucken sie per Seriendruck auf eine 2x3-Avery-Etikettenvorlage und schneiden sie dann auseinander.
Antwort1
- Ändern Sie die Datei so, dass sie die folgenden Eigenschaften hat:
- Spalte A: Überschrift ist „Name“. Alle Zellen enthalten die Namen der Personen, denen Tickets ausgestellt werden sollen.
- Spalte B: Die Überschrift lautet „Anzahl“. Alle Zellen enthalten die Anzahl der Tickets, die der in der gleichen Zeile in Spalte A aufgeführten Person zugewiesen werden sollen. Es ist kein anderer Text enthalten.
- Auf dem Blatt mit den Angaben „Name“ und „Nummer“ sind keine weiteren Daten enthalten.
- Wählen Sie das Blatt mit den Informationen „Name“ und „Nummer“ aus und speichern Sie die Datei als CSV (mit Kommas getrennt). Für dieses Beispiel verwenden wir OrigCSV.csv als Dateinamen.
- Öffnen Sie eine PowerShell-Sitzung und navigieren Sie zu dem Ordner, der die gerade gespeicherte CSV-Datei enthält.
- Führen Sie den folgenden Befehl aus:
$x=ipcsv .\OrigCSV.csv;$x|%{for($y=1;$y-le$_.Number;$y++){$_.Name}}|Out-File NewCSV.csv
- Öffnen Sie NewCSV.csv und überprüfen Sie, ob die Namen in der gewünschten Weise und Anzahl aufgelistet sind.
Wenn Sie mehr als nur die Duplizierung des Namens benötigen, ist dies mit PowerShell immer noch möglich – nur etwas „interessanter“.
Hier ist eine erweiterte und kommentierte Version der oben angegebenen Befehlszeile:
<#
First set $x so that it contains everything in OrigCSV.csv.
Each line of the CSV will be an array element within $x, with "Name" and "Number" properties according to their entry in the CSV.
ipcsv is a built-in alias for Import-Csv
#>
$x=ipcsv .\OrigCSV.csv;
<#
Next step is to put all the objects in $x through a ForEach-Object loop.
% is a built-in alias for ForEach-Object.
#>
$x|%{
<#
Within ForEach-Object, we're starting a For loop.
The loop definition starts with setting a counter, $y, to 1.
Then, if $y is less than or equal to the current line item's "Number" property, the script block will execute.
After the script block executes, it will increment $y by 1 and check the loop condition again.
Once $y becomes greater than the current line item's "Number" property, the For loop will exit.
#>
for($y=1;$y-le$_.Number;$y++)
{
# This next line simply outputs the "Name" property of the current line item.
$_.Name
# After the For loop exits, the script will return to the ForEach-Object loop and proceed to put the next item into the For loop.
}
# After ForEach-Object is done with its work, we pipe all of the output to Out-File so that the list gets written to a new CSV file.
}|Out-File NewCSV.csv
Antwort2
Hier ist eine VBA-Lösung. Wählen Sie zunächst die Daten aus, die Sie in zwei Spalten haben. Wählen Sie die Spaltenüberschriften nicht aus, falls diese vorhanden sind.
Als nächstes platzieren Sie diesen Code in einem Modul und führen ihn aus. (Anweisungen hierzu finden Sie unterdieser Beitrag.)
Sub TicketList()
'Two columns of drivers and ticket counts should be selected (no headers) before running this Sub.
Dim drivers() As Variant, output() As Variant, shtOut As Worksheet
Dim i As Long, j As Long, k As Long, scount As Integer
drivers = Selection.Value
'Set size of output array to match total number of tickets
ReDim output(1 To Application.WorksheetFunction.Sum(Selection), 1 To 1) As Variant
For i = LBound(drivers, 1) To UBound(drivers, 1)
For j = 1 To drivers(i, 2)
k = k + 1
output(k, 1) = drivers(i, 1)
Next j
Next i
'Place tickets on new sheet named "Driver Tickets #"
For Each sht In ThisWorkbook.Sheets
If InStr(sht.Name, "Driver Tickets") > 0 Then scount = scount + 1
Next sht
Set shtOut = Sheets.Add
If scount = 0 Then
shtOut.Name = "Driver Tickets"
Else
shtOut.Name = "Driver Tickets " & CStr(scount + 1)
End If
'Print output on the new sheet
shtOut.Range("A1").Resize(UBound(output, 1), 1).Value = output
End Sub
Dadurch wird die Namensliste für die Tickets auf einem neuen Blatt mit dem Namen „Fahrertickets“ erstellt.