múltiples entradas de un archivo excel existente

múltiples entradas de un archivo excel existente

nuestro cliente nos proporciona un archivo de Excel que enumera los nombres de los conductores y la cantidad de boletos que obtienen para un sorteo gratuito, como "bill smith (siguiente columna) 17 boletos

¿Hay alguna manera de tomar eso y convertirlo en 17 entradas separadas para "bill Smith" para que podamos imprimir más de 5000 boletos en total para los 286 conductores? algunos obtienen 1, otros 5, otros más...

Actualmente repetimos manualmente el nombre de los controladores tantas veces como sea necesario.

Los imprimimos combinando correspondencia en una plantilla de etiqueta de 2x3 y luego los cortamos.

Respuesta1

  1. Modifique el archivo para que tenga las siguientes propiedades:
    • Columna A: el encabezado es "Nombre". Todas las celdas contienen los nombres de las personas a las que se les emitirán los boletos.
    • Columna B: el encabezado es "Número". Todas las celdas contienen la cantidad de boletos que se asignarán a la persona que figura en la misma fila en la columna A. No se incluye ningún otro texto.
    • No se incluyen otros datos en la hoja con información de "Nombre" y "Número".
  2. Con la hoja que contiene la información de "Nombre" y "Número" seleccionada, guarde el archivo como CSV (delimitado por comas). En este ejemplo, usaremos OrigCSV.csv como nombre de archivo.
  3. Abra una sesión de PowerShell y navegue hasta la carpeta que contiene el CSV que acaba de guardar.
  4. Ejecute el siguiente comando:
    • $x=ipcsv .\OrigCSV.csv;$x|%{for($y=1;$y-le$_.Number;$y++){$_.Name}}|Out-File NewCSV.csv
  5. Abra NewCSV.csv y verifique que los nombres aparezcan en la forma y el número que desee.

Si necesita algo más que duplicar el nombre, aún es posible con PowerShell, sólo que un poco más "interesante".

Aquí hay una versión ampliada y comentada de la línea de comando proporcionada anteriormente:

<#
    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

Respuesta2

Aquí hay una solución VBA. Primero, selecciona los datos que tienes en dos columnas. No seleccione los encabezados de columna si existen.

A continuación, coloque este código en un módulo y ejecútelo. (Para obtener instrucciones sobre cómo hacer esto, consulteesta publicación.)

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

Esto creará la lista de nombres de boletos en una nueva hoja llamada "Boletos de conductor".

información relacionada