Я могу разделить электронную таблицу на несколько файлов на основе столбца в Excel 2007?

Существует ли путь в Excel для разделения большого файла на серию меньших, на основе содержания отдельного столбца?

например: у Меня есть файл данных о сбыте для всех торговых представителей. Я должен отправить им файл, чтобы сделать исправления и передать обратно, но я не хочу отправлять каждому из них целый файл (потому что я не хочу их изменяющий данные друг друга). Файл выглядит примерно так:

salesdata.xls

RepName          Customer        ContactEmail
Adam             Cust1           admin@cust1.com
Adam             Cust2           admin@cust2.com
Bob              Cust3           blah@cust3.com
etc...

из этого мне нужно:

salesdata_Adam.xls

RepName          Customer        ContactEmail
Adam             Cust1           admin@cust1.com
Adam             Cust2           admin@cust2.com

и salesdata_Bob.xls

Bob              Cust3           blah@cust3.com

Действительно ли там что-нибудь встроено к Excel 2007, чтобы сделать это автоматически, или я должен вспыхнуть VBA?

9
задан 19.10.2009, 06:49

3 ответа

Насколько я знаю, что существует не что иное как макрос что, собираясь разделять Вас данные и автоматически сохранять их на ряд файлов для Вас. VBA, вероятно, легче.

Обновление я реализовал свое предложение. Это циклично выполняет через все имена, определенные в именованном диапазоне 'RepList'. Именованный диапазон является динамическим именованным диапазоном формы =OFFSET (Имена! 2,0,0$A$, COUNTA (Имена! $A: $A)-1,1)

модуль следует.

Option Explicit

'Split sales data into separate columns baed on the names defined in
'a Sales Rep List on the 'Names' sheet.
Sub SplitSalesData()
    Dim wb As Workbook
    Dim p As Range

    Application.ScreenUpdating = False

    For Each p In Sheets("Names").Range("RepList")
        Workbooks.Add
        Set wb = ActiveWorkbook
        ThisWorkbook.Activate

        WritePersonToWorkbook wb, p.Value

        wb.SaveAs ThisWorkbook.Path & "\salesdata_" & p.Value
        wb.Close
    Next p
    Application.ScreenUpdating = True
    Set wb = Nothing
End Sub

'Writes all the sales data rows belonging to a Person
'to the first sheet in the named SalesWB.
Sub WritePersonToWorkbook(ByVal SalesWB As Workbook, _
                          ByVal Person As String)
    Dim rw As Range
    Dim personRows As Range     'Stores all of the rows found
                                'containing Person in column 1
    For Each rw In UsedRange.Rows
        If Person = rw.Cells(1, 1) Then
            If personRows Is Nothing Then
                Set personRows = rw
            Else
                Set personRows = Union(personRows, rw)
            End If
        End If
    Next rw

    personRows.Copy SalesWB.Sheets(1).Cells(1, 1)
    Ser personRows = Nothing
End Sub

Эта рабочая книга содержит код и именованный диапазон. Код является частью листа 'Данных о сбыте'.

6
ответ дан 07.12.2019, 13:19

Хорошо, таким образом, вот первое сокращение VBA. Вы называете его как это:

SplitIntoFiles Range("A1:N1"), Range("A2:N2"), Range("B2"), "Split File - "

Где A1:N1 является Вашей строкой (строками) заголовка, A2:N2 является первой строкой Ваших данных, B2 является первой ячейкой в Вашем предварительно отсортированном столбце ключа. Последним аргументом является префикс имени файла. Ключ будет добавлен к этому перед сохранением.

Отказ от ответственности: этот код противен.

Option Explicit
Public Sub SplitIntoFiles(headerRange As Range, startRange As Range, keyCell As Range, filenameBase As String)

    ' assume the keyCell column is already sorted


    ' start a new workbook
    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = Application.Workbooks.Add
    Set ws = wb.ActiveSheet

    Dim destRange As Range
    Set destRange = ws.Range("A1")

    ' copy header
    headerRange.Copy destRange
    Set destRange = destRange.Offset(headerRange.Rows.Count)

    Dim keyValue As Variant
    keyValue = ""

    While keyCell.Value <> ""

        ' if we've got a new key, save the file and start a new one
        If (keyValue <> keyCell.Value) Then
        If keyValue <> "" Then
            'TODO: remove non-filename chars from keyValue
            wb.SaveAs filenameBase & CStr(keyValue)
            wb.Close False
            Set wb = Application.Workbooks.Add
            Set ws = wb.ActiveSheet
            Set destRange = ws.Range("A1")

            ' copy header
            headerRange.Copy destRange
            Set destRange = destRange.Offset(headerRange.Rows.Count)

            End If
        End If

        keyValue = keyCell.Value

        ' copy the contents of this row to the new sheet
        startRange.Copy destRange

        Set keyCell = keyCell.Offset(1)
        Set destRange = destRange.Offset(1)
        Set startRange = startRange.Offset(1)
    Wend

    ' save residual
    'TODO: remove non-filename chars from keyValue
    wb.SaveAs filenameBase & CStr(keyValue)
    wb.Close

End Sub
1
ответ дан 07.12.2019, 13:19

Если кто-то еще отвечает корректным способом сделать это, которое быстро, проигнорируйте этот ответ.

Я лично использую Excel и затем провести много времени (иногда часы) поиск сложного способа сделать что-то или по главному уравнению, которое сделает все, когда я никогда не буду использовать его снова..., и оказывается, что, если бы я просто сел и продолжил задачу вручную, она взяла бы часть времени.


Если у Вас только есть горстка людей, что я рекомендую сделать просто выделить все данные, перейдите к вкладке данных и нажмите кнопку вида.

alt text

Можно затем выбрать, какой столбец к виду, в случае Вы хотите использовать Repname, затем просто скопируйте и вставьте в отдельные файлы.

Я уверен, что с помощью VBA или других инструментов, можно предложить решение, но факт, Вы будете смотреть на часы на часы работы, когда просто продолжающий его при помощи вышеупомянутого метода должны будут сделать Вас очень скоро.

Кроме того, я думаю, что можно сделать этот вид вещи на sharepoint + сервисы Excel, но это - путь по главному решению для этого вида вещи.

2
ответ дан 07.12.2019, 13:19

Теги

Похожие вопросы