наш клиент предоставляет нам файл Excel, в котором перечислены имена водителей и количество билетов, которые они получают для бесплатного розыгрыша, например, «Билл Смит (следующий столбец) 17 билетов»
есть ли способ сделать это и сделать 17 отдельных записей для «Билла Смита», чтобы мы могли распечатать в общей сложности более 5000 штрафов для всех 286 водителей? некоторые получают 1, некоторые 5, некоторые больше...
В настоящее время мы вручную повторяем имя водителя столько раз, сколько необходимо.
мы печатаем их, выполняя слияние с шаблоном этикетки Avery размером 2x3, а затем разрезаем их на части.
решение1
- Измените файл так, чтобы он имел следующие свойства:
- Столбец A: Заголовок «Имя». Все ячейки содержат имена людей, которым будут выданы билеты.
- Столбец B: Заголовок — «Число». Все ячейки содержат количество билетов, которые будут назначены человеку, указанному в той же строке в столбце A. Никакого другого текста не включено.
- Никаких других данных в листе с информацией «Имя» и «Номер» не указано.
- Выбрав лист, содержащий информацию "Имя" и "Номер", сохраните файл как CSV (с разделителями-запятыми). Для этого примера мы будем использовать OrigCSV.csv для имени файла.
- Откройте сеанс PowerShell и перейдите в папку, содержащую только что сохраненный CSV-файл.
- Выполните следующую команду:
$x=ipcsv .\OrigCSV.csv;$x|%{for($y=1;$y-le$_.Number;$y++){$_.Name}}|Out-File NewCSV.csv
- Откройте NewCSV.csv и убедитесь, что имена перечислены в нужном вам порядке и количестве.
Если вам нужно что-то большее, чем просто дублирование имени, это все еще возможно с помощью PowerShell — просто немного «интереснее».
Вот расширенная и прокомментированная версия командной строки, представленной выше:
<#
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
решение2
Вот решение VBA. Сначала выберите данные, которые у вас есть в двух столбцах. Не выбирайте заголовки столбцов, если они есть.
Затем поместите этот код в модуль и выполните его. (Инструкции по выполнению этого действия см. в разделеэта почта.)
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
Это создаст список имен для билетов на новом листе с названием «Билеты водителя».