EXCEL - Separar un listado en varios archivos según una columna

  • luispindola
  • Avatar de luispindola Autor del tema
  • Ausente
  • Administrador
  • Administrador
Más
1 año 4 meses antes - 1 año 4 meses antes #49 por luispindola
Excel no se considera una base de datos, pero para formatear nuestros datos es muy buena herramienta.

Si tenemos un listado en un archivo y queremos dividirlo en varios archivos hay varias herramientas, algunas de paga, y otras gratuitas, como www.extendoffice.com/product/kutools-for-excel.html o exceldashboardschool.com/free-excel-add-ins-tools/DataXL . pero en ocasiones nos dan problemas de compatibilidad con las diferentes versiones de Excel.

Aquí se explica una opción sin necesidad de instalar nada.

  1. 1. Abrimos el archivo con nuestro listado: (en este caso ejemplo.xlsx)

  2. 2. Con Alt + F11 abrimos Visual Basic para Aplicaciones y damos doble click en el nombre de la hoja de calculo que queremos dividir.

  3. 3. Copiamos el siguiente código y presionamos F5 para ejecutarlo:
    Sub Splitdatabycol()
    'updateby Extendoffice
    Dim lr As Long
    Dim ws As Worksheet
    Dim vcol, i As Integer
    Dim icol As Long
    Dim myarr As Variant
    Dim title As String
    Dim titlerow As Integer
    Dim xTRg As Range
    Dim xVRg As Range
    Dim xWSTRg As Worksheet
    Dim xWS As Worksheet
    On Error Resume Next
    Set xTRg = Application.InputBox("Please select the header rows:", "Kutools for Excel", "", Type:=8)
    If TypeName(xTRg) = "Nothing" Then Exit Sub
    Set xVRg = Application.InputBox("Please select the column you want to split data based on:", "Kutools for Excel", "", Type:=8)
    If TypeName(xVRg) = "Nothing" Then Exit Sub
    vcol = xVRg.Column
    Set ws = xTRg.Worksheet
    lr = ws.Cells(ws.Rows.Count, vcol).End(xlUp).Row
    title = xTRg.AddressLocal
    titlerow = xTRg.Cells(1).Row
    icol = ws.Columns.Count
    ws.Cells(1, icol) = "Unique"
    Application.DisplayAlerts = False
    If Not Evaluate("=ISREF('xTRgWs_Sheet!A1')") Then
    Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "xTRgWs_Sheet"
    Else
    Sheets("xTRgWs_Sheet").Delete
    Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "xTRgWs_Sheet"
    End If
    Set xWSTRg = Sheets("xTRgWs_Sheet")
    xTRg.Copy
    xWSTRg.Paste Destination:=xWSTRg.Range("A1")
    ws.Activate
    For i = (titlerow + xTRg.Rows.Count) To lr
    On Error Resume Next
    If ws.Cells(i, vcol) <> "" And Application.WorksheetFunction.Match(ws.Cells(i, vcol), ws.Columns(icol), 0) = 0 Then
    ws.Cells(ws.Rows.Count, icol).End(xlUp).Offset(1) = ws.Cells(i, vcol)
    End If
    Next
    myarr = Application.WorksheetFunction.Transpose(ws.Columns(icol).SpecialCells(xlCellTypeConstants))
    ws.Columns(icol).Clear
    For i = 2 To UBound(myarr)
    ws.Range(title).AutoFilter field:=vcol, Criteria1:=myarr(i) & ""
    If Not Evaluate("=ISREF('" & myarr(i) & "'!A1)") Then
    Set xWS = Sheets.Add(after:=Worksheets(Worksheets.Count))
    xWS.Name = myarr(i) & ""
    Else
    xWS.Move after:=Worksheets(Worksheets.Count)
    End If
    xWSTRg.Range(title).Copy
    xWS.Paste Destination:=xWS.Range("A1")
    ws.Range("A" & (titlerow + xTRg.Rows.Count) & ":A" & lr).EntireRow.Copy xWS.Range("A" & (titlerow + xTRg.Rows.Count))
    Sheets(myarr(i) & "").Columns.AutoFit
    Next
    xWSTRg.Delete
    ws.AutoFilterMode = False
    ws.Activate
    Application.DisplayAlerts = True
    End Sub

  4. 4. Nos pedirá seleccionar el renglón de encabezados:


    Y la columna con respecto a la que se dividirá el archivo

  5. 5. Presionamos Aceptar y se crearán las hojas de calculo separadas:

  6. 6. Para crear un archivo por cada hoja de calculo presionamos nuevamente Alt+F11 y en donde habiamos pegado el código lo borramos y ahora pegamos el siguiente:
    Sub Splitbook()
    'Updateby20140612
    Dim xPath As String
    xPath = Application.ActiveWorkbook.Path
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    For Each xWS In ThisWorkbook.Sheets
        xWS.Copy
        Application.ActiveWorkbook.SaveAs Filename:=xPath & "\" & xWS.Name & ".xlsx"
        Application.ActiveWorkbook.Close False
    Next
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    End Sub
    Y presionamos F5.
    Esto Tardará un poco (según la cantidad de hojas de calculo) y en la misma carpeta donde está el archivo creará un archivo por cada hoja de calculo:

Adjuntos:
Última Edición: 1 año 4 meses antes por luispindola.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

Tiempo de carga de la página: 0.094 segundos