2

Есть такие данные (более 500 000 записей)

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

То, что я пытаюсь сделать, это экспортировать в новую электронную таблицу с данными для каждого штата (поэтому он будет создавать файлы, такие как California.csv Utah.csv т.д.).

Есть ли быстрый автоматизированный способ сделать что-то подобное?

3 ответа3

1

Предполагая «Имя» в столбце А и «Состояние» в столбце Б:

В столбце C используйте формулу ="echo """&A1&""" >>"&B1&".csv" .

Это добавит (следовательно, >>) каждую строку в файл (состояние) .csv.

Скопируйте содержимое столбца C в буфер обмена и вставьте в окно командной строки (сначала запомните cd в правильный каталог).

(Примечание - не проверено - сначала проверьте, что результат выглядит разумным.)

0

Это сковано, но это работает для меня. Измените пункт назначения и заголовок "State", если это необходимо. Вы также можете изменить фильтр, если ваша таблица сложнее, чем просто два столбца.

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
0

Вот простой, но несколько утомительный способ сделать это. Это утомительно, но просто выполнить. Есть несколько простых изменений, которые не совсем соответствуют вопросу (но близки) и которые проще сделать.

  1. Настройте основную рабочую книгу в качестве примера в вопросе
  2. Настройте рабочую книгу для первого состояния (вам нужны разные файлы) с именем состояния в A1 и простым условным = IF ([master.xlsx] Sheet1!$ B2 = $ A $ 1, [master.xlsx] Лист1!$ A2, "") в A2, затем скопируйте длину списка имен. Обратите внимание, что строка не является абсолютной, поэтому вы получите пробелы и имена состояний в A1.
  3. Настройте макрос для копирования значений вкладки 1 на вкладку 2 и сортировки, чтобы пропуски не попадали в конец.
  4. Скопируйте первую книгу состояний, чтобы сформировать остальные состояния; изменение названия штата

Было бы проще настроить вкладку для каждого состояния и сделать это в одной книге; Вы можете назвать вкладку в соответствии с состоянием и использовать имя вкладки в условной формуле. Вероятно, есть способ сделать это за один шаг с формулами массива, но я не могу вспомнить, как сейчас.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .