|
|
MS Excel - Альтернативный метод экспорта данных
Автор: Кривцов Анатолий
Метод заключается в создании(изменении) рабочей книги при помощи библиотеки объектов Excel. Те, кто знает предмет, или кого устраивает вид рабочего листа при экспорте отчета с группировками - могут дальше не читать.
Преимущества:
Можно получить полностью оформленный документ;
Можно внести данные из разных источников на отдельные листы и даже на один лист рабочей книги;
Можно обновить данные в существующем файле в тех клетках, где они были внесены ранее.
ОБЯЗАТЕЛЬНО! должна быть установлена ссылка на Microsoft Excel X.X Object Library.
Желательно проверять корректность ссылки перед запуском процедуры. (Или обьявляйте все обьекты Excel As Object - пойдёт)
Приводится два примера. Оба рабочие и могут быть использованы за основу Ваших примочек.
Первый пример демонстрирует использование основных объектов, свойств и методов библиотеки Excel. В новом файле создается и форматируется простая табличка с формулами
Sub TestExcel_1()
On Error GoTo TestExcel_1_err
Dim ExlDb As New Excel.Application
Dim WrkBk As Workbook, WrkSht As Worksheet, _
rngActive As Range, rngInput As Range
ExlDb.Visible = True
Set WrkBk = ExlDb.Workbooks.Add
Set WrkSht = WrkBk.ActiveSheet
Set rngActive = WrkSht.Cells(1, 1)
rngActive.Activate
rngActive = "Остатки товара на складе."
rngActive.Font.Size = 12
rngActive.Font.Bold = True
With WrkSht.Range(rngActive, rngActive.Offset(0, 3))
.Merge
.HorizontalAlignment = xlHAlignCenter
.VerticalAlignment = xlVAlignCenter
.RowHeight = .RowHeight * 2
End With
Set rngActive = rngActive.Offset(1)
With rngActive
.Value = "Наименование товара"
.Offset(0, 1) = "Кол-во"
.Offset(0, 2) = "Цена"
.Offset(0, 3) = "Сумма"
End With
With WrkSht.Range(rngActive, rngActive.Offset(0, 3))
.Borders.LineStyle = xlContinuous
.HorizontalAlignment = xlHAlignCenter
.Interior.Color = RGB(220, 220, 220)
.Font.Bold = True
End With
Set rngActive = rngActive.Offset(1)
Set rngInput = WrkSht.Range(rngActive, rngActive.Offset(0, 3))
With rngActive
.Value = "Шило"
.Offset(0, 1) = "100"
.Offset(0, 2) = "5"
End With
Set rngActive = rngActive.Offset(1)
With rngActive
.Value = "Мыло"
.Offset(0, 1) = "200"
.Offset(0, 2) = "10"
End With
Set rngInput = rngInput.Resize(rngActive.row - _
rngInput.row + 1)
Set rngActive = WrkSht.Cells(rngInput.row, 4)
With rngActive
.Formula = _
"=" & .Offset(0, -2).Address(False, False) & "*" _
& .Offset(0, -1).Address(False, False)
.Copy rngInput.Columns(4)
End With
With rngInput
.Borders.LineStyle = xlContinuous
.Borders(xlEdgeBottom).wEight = xlThick
End With
With WrkSht
Set rngActive = .Cells(.UsedRange.Rows.Count, 3)
End With
rngActive = "Всего:"
rngActive.HorizontalAlignment = xlHAlignRight
rngActive.Font.Bold = True
Set rngActive = rngActive.Offset(0, 1)
rngActive.Formula = "=sum(" _
& rngInput.Columns(4).Address(False, False) & ")"
rngActive.Font.Bold = True
With WrkSht
.Columns(1).AutoFit
.Columns(2).AutoFit
.Columns(3).NumberFormat = "#,##0.00"
.Columns(3).AutoFit
.Columns(4).NumberFormat = "#,##0.00"
.Columns(4).AutoFit
End With
TestExcel_1_exit:
On Error Resume Next
Set rngInput = Nothing
Set rngActive = Nothing
Set WrkSht = Nothing
Set WrkBk = Nothing
Set ExlDb = Nothing
Exit Sub
TestExcel_1_err:
MsgBox Err & " - " & Err.Description, vbCritical
Resume TestExcel_1_exit
End Sub
Sub TestExcel_2()
On Error GoTo TestExcel_2_err
Dim ExlDb As New Excel.Application
Dim WrkBk As Workbook, WrkSht As Worksheet, _
rngActive As Range, rngFind As Range, rngNew As Range
Dim boolIsNewBook As Boolean, boolIsSheetName As Boolean
Const strSheetName = "DataAccess"
Const strPathFile = "C:\TestExcel_2.xls"
ExlDb.WindowState = xlMinimized
ExlDb.Visible = True
If strPathFile = "" Or Dir$(strPathFile) = "" Then
Set WrkBk = ExlDb.Workbooks.Add
Set WrkSht = WrkBk.ActiveSheet
WrkSht.Name = strSheetName
boolIsNewBook = True
Else
Set WrkBk = ExlDb.Workbooks.Open(strPathFile)
For Each WrkSht In WrkBk.Worksheets
If WrkSht.Name Like strSheetName Then
boolIsSheetName = True
WrkSht.Activate
Exit For
End If
Next WrkSht
If Not boolIsSheetName Then
MsgBox " В файле " & strPathFile & " отсутствует лист" _
& " с именем " & Chr(34) & strSheetName & Chr(34) _
& ", на которую вносятся данные для отчета.@@" _
& " Процедура прервана!", vbCritical
GoTo TestExcel_2_exit
End If
End If
With WrkSht
If boolIsNewBook Then
Set rngActive = .Cells(1, 1)
rngActive = "ID"
rngActive.Offset(0, 1) = "Наименование"
rngActive.Offset(0, 2) = "Сумма"
End If
Set rngActive = .Cells(2, 1)
rngActive.Offset(0, 2).Activate
If Not boolIsNewBook And .UsedRange.Rows.Count >= 2 Then
Set rngNew = .Cells(.UsedRange.row + _
.UsedRange.Rows.Count + 1, 1)
Set rngFind = .Range(rngActive, rngNew.Offset(-2, 0))
.Range(.Cells(2, 2), rngNew.Offset(0, .UsedRange.Column + _
.UsedRange.Columns.Count - 1)).Clear
Else
Set rngNew = rngActive
Set rngFind = Nothing
End If
End With
Set rngActive = Nothing
Const ID1 = 1
Const ID2 = 2
If Not rngFind Is Nothing Then
Set rngActive = rngFind.Find(ID1, , xlValues, _
xlWhole, xlByRows, xlNext)
End If
If rngActive Is Nothing Then
With rngNew
.Value = ID1
.Offset(0, 1) = "Шило"
.Offset(0, 2) = "100"
End With
Set rngNew = rngNew.Offset(1, 0)
Else
With rngActive
.Offset(0, 1) = "Шило"
.Offset(0, 2) = "100"
End With
Set rngActive = Nothing
End If
If Not rngFind Is Nothing Then
Set rngActive = rngFind.Find(ID2, , xlValues, _
xlWhole, xlByRows, xlNext)
End If
If rngActive Is Nothing Then
With rngNew
.Value = ID2
.Offset(0, 1) = "Мыло"
.Offset(0, 2) = "200"
End With
Set rngNew = rngNew.Offset(1, 0)
Else
With rngActive
.Offset(0, 1) = "Мыло"
.Offset(0, 2) = "200"
End With
Set rngActive = Nothing
End If
ExlDb.WindowState = xlMaximized
WrkBk.SaveAs strPathFile
TestExcel_2_exit:
On Error Resume Next
Set rngFind = Nothing
Set rngNew = Nothing
Set rngActive = Nothing
Set WrkSht = Nothing
Set WrkBk = Nothing
Set ExlDb = Nothing
Exit Sub
TestExcel_2_err:
Select Case Err
Case 1004
Case Else
MsgBox Err & " - " & Err.Description, vbCritical
End Select
Resume TestExcel_2_exit
End Sub
|
|