Автор: AndVGri
Дата сообщения: 26.04.2007 03:31
Gretrick
Несколько не оптимально, но на раз в день пойдёт
[more]
Код:
Private Const LastCol As Long = 8&
Private Const CategoryCol As Long = 3&
'Добавить, если надо символы, недопустимые в именах файлов
Private Function SuffixName(ByVal CategoryName As String) As String
CategoryName = VBA.Replace(CategoryName, ":", "_")
CategoryName = VBA.Replace(CategoryName, "/", "_")
CategoryName = VBA.Replace(CategoryName, "\", "_")
CategoryName = VBA.Replace(CategoryName, "*", "_")
CategoryName = VBA.Replace(CategoryName, "?", "_")
CategoryName = VBA.Replace(CategoryName, """", "_")
SuffixName = "_" & CategoryName & ".csv"
End Function
Public Sub SaveAsCsvByCategory()
Dim vLastRow As Long, i As Long
Dim vFirstRow As Long, sCategory As String
Dim pSource As Worksheet, pDestSheet As Worksheet
Dim pDestBook As Workbook, sPrefixName As String
If Not (TypeOf ActiveSheet Is Worksheet) Then
MsgBox "Макрос должен запускаться с рабочего листа", vbExclamation, "Ошибка"
Exit Sub
End If
'Получить путь и префикс csv-файлов категорий
sPrefixName = Application.GetSaveAsFilename("CsvCategory.csv", "CSV Files (*.csv),*.csv")
sCategory = LCase$(sPrefixName)
If (sCategory = "false") Or (sCategory = "ложь") Then Exit Sub
sPrefixName = Mid$(sPrefixName, 1&, Len(sPrefixName) - 4&)
Application.ScreenUpdating = False
'Если строка заголовков полная, то за комментируй строку ниже
Range("A3:H3").Value = Array("Id", "Code1", "Category", "Producer", "Name", "Code2", "Price1", "Price2")
'Сортируем по категриям
Range("A3").CurrentRegion.Sort Key1:=Range("C4"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
'Инициализация перед разбором по категориям
vLastRow = Range("A3").CurrentRegion.Rows.Count + 2&
sCategory = CStr(Cells(4&, CategoryCol).Value)
vFirstRow = 4&: Set pSource = ActiveSheet
For i = 4& To vLastRow 'собственно, цикл разбора
If CStr(Cells(i, CategoryCol).Value) <> sCategory Then
'Сохраняем данные категории
Set pDestBook = Workbooks.Add
Set pDestSheet = ActiveSheet 'В предположении, что не шаблона с активной диаграммой
pSource.Activate
Range("A3:H3").Copy pDestSheet.Range("A1")
Range(Cells(vFirstRow, 1&), Cells(i - 1&, LastCol)).Copy pDestSheet.Range("A2")
pDestBook.SaveAs Filename:=sPrefixName & SuffixName(sCategory), _
FileFormat:=xlCSV, CreateBackup:=False
pDestBook.Saved = True: pDestBook.Close SaveChanges:=False
vFirstRow = i: sCategory = CStr(Cells(i, CategoryCol).Value)
End If
Next i
'Сохраняем данные последней категории
Set pDestBook = Workbooks.Add
Set pDestSheet = ActiveSheet 'В предположении, что не шаблона с активной диаграммой
pSource.Activate
Range("A3:H3").Copy pDestSheet.Range("A1")
Range(Cells(vFirstRow, 1&), Cells(vLastRow, LastCol)).Copy pDestSheet.Range("A2")
pDestBook.SaveAs Filename:=sPrefixName & SuffixName(sCategory), _
FileFormat:=xlCSV, CreateBackup:=False
pDestBook.Saved = True: pDestBook.Close SaveChanges:=False
Application.ScreenUpdating = True
End Sub