Существует ли путь в 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?
Насколько я знаю, что существует не что иное как макрос что, собираясь разделять Вас данные и автоматически сохранять их на ряд файлов для Вас. 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
Эта рабочая книга содержит код и именованный диапазон. Код является частью листа 'Данных о сбыте'.
Хорошо, таким образом, вот первое сокращение 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
Если кто-то еще отвечает корректным способом сделать это, которое быстро, проигнорируйте этот ответ.
Я лично использую Excel и затем провести много времени (иногда часы) поиск сложного способа сделать что-то или по главному уравнению, которое сделает все, когда я никогда не буду использовать его снова..., и оказывается, что, если бы я просто сел и продолжил задачу вручную, она взяла бы часть времени.
Если у Вас только есть горстка людей, что я рекомендую сделать просто выделить все данные, перейдите к вкладке данных и нажмите кнопку вида.
Можно затем выбрать, какой столбец к виду, в случае Вы хотите использовать Repname, затем просто скопируйте и вставьте в отдельные файлы.
Я уверен, что с помощью VBA или других инструментов, можно предложить решение, но факт, Вы будете смотреть на часы на часы работы, когда просто продолжающий его при помощи вышеупомянутого метода должны будут сделать Вас очень скоро.
Кроме того, я думаю, что можно сделать этот вид вещи на sharepoint + сервисы Excel, но это - путь по главному решению для этого вида вещи.