Forma rápida de exportar dados para diferentes arquivos Excel baseados em Coluna

2

Existem alguns dados como este (com mais de 500.000 entradas)

Name    |    State
----         -----
Billy        Utah
Sue          California
Joe          Utah
Sally        California
John         Michigan

O que estou tentando fazer é exportar para uma nova planilha com os dados de cada estado (para criar arquivos como California.csv e Utah.csv etc.

Existe uma maneira rápida e automatizada de fazer algo assim?

    
por Talon 21.08.2013 / 20:30

3 respostas

1

Assumindo 'Nome' na coluna A e 'Estado' na coluna B:

Na coluna C, use a fórmula ="echo """&A1&""" >>"&B1&".csv" .

Isto irá acrescentar (daí a >> ) cada linha ao arquivo (estado) .csv.

Copie o conteúdo da coluna C para a área de transferência e cole em uma janela de prompt de comando (lembrando-se de cd para o diretório correto primeiro).

(Nota - não testado - verifique o resultado parece sensato primeiro.)

    
por 17.09.2013 / 11:24
0

Isso é remendado, mas funciona para mim. Altere o destino e o cabeçalho "Estado", se necessário. Você também pode alterar o filtro se sua planilha for mais complicada do que apenas duas colunas.

Option Explicit

Sub CreateCSVfromWS()
Dim ws As Worksheet
    Application.ScreenUpdating = False

    Call Filter
    Call MakeMonthSheets

        For Each ws In ActiveWorkbook.Worksheets
            ws.SaveAs "C:\Destination\" & ws.Name & ".csv", xlCSV
        Next

    Application.ScreenUpdating = True
End Sub

Sub Filter()
Columns("A:B").Select
    Selection.AutoFilter
    ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _
        ("B:B"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Sub MakeMonthSheets()

    Dim rngState As Range
    Dim rngCell As Range
    Dim sh As Worksheet
    Dim shDest As Worksheet
    Dim rngNext As Range

    Const sLNHEADER As String = "State"

    Set sh = ThisWorkbook.Sheets("Sheet1")
    Set rngState = sh.UsedRange.Find(sLNHEADER, , xlValues, xlWhole)

    'Make sure you found something
    If Not rngState Is Nothing Then
        'Go through each cell in the column
        For Each rngCell In Intersect(rngState.EntireColumn, sh.UsedRange).Cells
            'skip the header and empty cells
            If Not IsEmpty(rngCell.Value) And rngCell.Address <> rngState.Address Then
                'see if a sheet already exists
                On Error Resume Next
                    Set shDest = sh.Parent.Sheets(rngCell.Value)
                On Error GoTo 0

                'if it doesn't exist, make it
                If shDest Is Nothing Then
                    Set shDest = sh.Parent.Worksheets.Add
                    shDest.Name = rngCell.Value
                End If

                'Find the next available row
                Set rngNext = shDest.Cells(shDest.Rows.Count, 1).End(xlUp).Offset(1, 0)

                'Copy and paste
                Intersect(rngCell.EntireRow, sh.UsedRange).Copy rngNext

                'reset the destination sheet
                Set shDest = Nothing
            End If
        Next rngCell
    End If

End Sub
    
por 17.09.2013 / 16:55
0

Aqui está uma maneira simples, mas um tanto tediosa, de fazer isso. É tedioso configurar, mas simples de executar. Existem algumas mudanças simples que não correspondem à pergunta (mas estão próximas) e são mais fáceis de fazer.

  1. Configure a pasta de trabalho mestre como o exemplo na pergunta
  2. Configure uma pasta de trabalho para o primeiro estado (você queria arquivos diferentes) com o nome do estado em A1 e um condicional simples = IF ([master.xlsx] Sheet1! $ B2 = $ A $ 1, [master.xlsx ] Folha1! $ A2, "") em A2, copie para o comprimento da lista de nomes. Note que a linha não é absoluta, então você obterá espaços em branco e os nomes para o estado em A1.
  3. Configure uma macro para copiar os valores da guia 1 para a guia 2 e classificar, para que os espaços em branco caiam no final.
  4. Copie a primeira pasta de trabalho de estado para formar os estados restantes; alterando o nome do estado

Seria mais fácil configurar uma guia por estado e fazer isso em uma pasta de trabalho. você poderia nomear a guia por estado e usar o nome da guia na fórmula condicional. Provavelmente há uma maneira de fazer isso em uma etapa com fórmulas de matriz, mas não me lembro como agora.

    
por 17.09.2013 / 17:26