наш клиент предоставляет нам файл Excel, в котором перечислены имена водителей и количество билетов, которые они получают за бесплатный розыгрыш, например, «Билл Смит» (следующий столбец) 17 билетов

Есть ли способ взять это и сделать 17 отдельных записей для "Билла Смита", чтобы мы могли распечатать свыше 5000 билетов для всех 286 водителей? некоторые получают 1, некоторые 5, некоторые больше ...

В настоящее время мы вручную повторяем имена драйверов столько раз, сколько требуется.

мы печатаем их, выполняя слияние по почте с шаблоном 2x3 avery label, а затем разрезаем их на части.

2 ответа2

0

Вот решение 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

Это создаст список имен для билетов на новом листе с названием "Билеты водителя".

0
  1. Измените файл так, чтобы он имел следующие свойства:
    • Колонка A: Заголовок "Имя". Все ячейки содержат имена людей, которым будут выданы билеты.
    • Колонка B: Заголовок "Число". Все ячейки содержат количество билетов, которые должны быть назначены лицу, указанному в той же строке в столбце А. Никакой другой текст не включен.
    • На листе отсутствуют другие данные с информацией "Имя" и "Номер".
  2. Выбрав лист с информацией "Имя" и "Номер", сохраните файл как CSV (через запятую). В этом примере мы будем использовать OrigCSV.csv для имени файла.
  3. Откройте сеанс PowerShell и перейдите к папке, содержащей только что сохраненный CSV.
  4. Запустите следующую команду:
    • $x=ipcsv .\OrigCSV.csv;$x|%{for($y=1;$y-le$_.Number;$y++){$_.Name}}|Out-File NewCSV.csv
  5. Откройте 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .