기존 Excel 파일의 여러 항목

기존 Excel 파일의 여러 항목

우리 고객은 "bill smith (다음 열) 17 ticket"과 같이 운전자 이름과 무료 추첨을 위해 받는 티켓 수를 나열하는 Excel 파일을 제공합니다.

286명의 운전자 모두에 대해 총 5000장의 티켓을 인쇄할 수 있도록 "bill Smith"에 대해 17개의 개별 항목을 만들 수 있는 방법이 있습니까? 일부는 1개, 일부는 5개, 일부는 그 이상...

현재는 필요한 만큼 드라이버 이름을 수동으로 반복하고 있습니다.

2x3 에이버리 라벨 템플릿에 메일 병합을 수행한 다음 잘라서 인쇄합니다.

답변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 솔루션입니다. 먼저 두 열에 있는 데이터를 선택합니다. 열 머리글이 있는 경우 선택하지 마십시오.

다음으로 이 코드를 모듈에 배치하고 실행합니다. (이 작업에 대한 지침은 다음을 참조하세요.이 게시물.)

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

이렇게 하면 "Driver Tickets"라는 새 시트에 티켓 이름 목록이 생성됩니다.

관련 정보