既存の Excel ファイルからの複数のエントリ

既存の Excel ファイルからの複数のエントリ

顧客は、ドライバーの名前と無料抽選で獲得したチケットの数をリストしたExcelファイルを提供します。たとえば、「ビル・スミス(次の列)17枚のチケット」などです。

これを取得して、「bill Smith」のエントリを 17 個に分割し、286 人のドライバー全員に対して合計 5000 枚以上のチケットを印刷する方法はありますか? 1 枚を受け取るドライバーもいれば、5 枚を受け取るドライバーもいます。さらに、それ以上のドライバーもいます...

現在、ドライバー名を必要な回数だけ手動で繰り返します。

2x3 の Avery ラベル テンプレートに差し込み印刷して、切り離して印刷します。

答え1

  1. 次のプロパティを持つようにファイルを変更します。
    • 列 A: ヘッダーは「名前」です。すべてのセルには、チケットを発行する人の名前が含まれています。
    • 列 B: ヘッダーは「番号」です。すべてのセルには、列 A の同じ行にリストされている人物に割り当てられるチケットの数が含まれます。その他のテキストは含まれません。
    • 「名前」と「番号」の情報を含むシートには、他のデータは含まれません。
  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

答え2

これは VBA ソリューションです。まず、2 つの列にあるデータを選択します。列ヘッダーが存在する場合は選択しないでください。

次に、このコードをモジュールに配置して実行します。(これを行う手順については、この郵便受け

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

これにより、「ドライバー チケット」という名前の新しいシートにチケットの名前のリストが作成されます。

関連情報