VBA: Экспорт Доступ в Excel -> Выбрать все ячейки -> Формат таблицы - PullRequest
0 голосов
/ 04 июля 2018

Прошу прощения за заголовок заранее. Что я хочу сделать, это экспортировать данные доступа Microsoft в электронную таблицу Excel, выбрать все ячейки и отформатировать их в виде таблицы.

Проблема: данные в электронной таблице Excel не форматируются в таблице, как указано в последних 5 строках кода.

код:

Private Sub button3_Click()
Dim tbl As ListObject
Dim rng As Range

Dim XL As Object
Dim Page As Object
Dim xlrngCell As Object
Dim rs As DAO.Recordset
Dim intF As Integer


On Error Resume Next
Set XL = GetObject(, "Excel.Application")
If XL Is Nothing Then
    Set XL = CreateObject("Excel.Application")
    If XL Is Nothing Then
        MsgBox "Can't find Excel!", vbCritical
        Exit Sub
    End If
    XL.Visible = True
    XL.UserControl = True
End If

Set xlrngCell = XL.Workbooks.Add.Worksheets(1).Range("A1")
Set rs = Me.subformMain.Form.RecordsetClone
For intF = 0 To rs.Fields.Count - 1
    xlrngCell(, intF + 1) = rs.Fields(intF).Name
Next intF
rs.MoveFirst
xlrngCell.Offset(1).CopyFromRecordset rs

xlrngCell.Worksheet.Parent.Saved = True
Set Page = XL.Worksheets("Sheet1").Range("A1:I1")
Page.Font.Bold = True
Page.Font.Size = 16
xlrngCell.Worksheet.Cells.EntireColumn.AutoFit


Set rng = Range(Range("A1"), Range("A1").SpecialCells(xlLastCell))
Set tbl = ActiveSheet.ListObjects.Add(xlSrcRange, rng, , xlYes)
tbl.TableStyle = "TableStyleDark10"
xlrngCell.Worksheet.Parent.Saved = True
XL.Work

End Sub

Последние 5 строк кода - это то, что должно выбрать все размещенные данные, а затем выбрать все ячейки и отформатировать их. Любые советы / рекомендации будут с благодарностью.

ПРИМЕЧАНИЕ. Я понимаю, что должен модулировать этот код в отдельные функции и вызывать их как методы.

1 Ответ

0 голосов
/ 04 июля 2018

Ваш код молча терпит неудачу, On Error Resume Next не позволяет вам узнать, в чем проблема. Никогда используйте On Error Resume Next, чтобы подсунуть ошибки под ковер таким образом.

Если предположить, что на библиотеку типов Excel нет ссылок (тогда вы не будете связываться поздно, не так ли?), Range, вероятно, является неопределенным идентификатором. Предполагая, что Option Explicit не указан (если бы код не компилировался / не выполнялся), эти неквалифицированные Range идентификаторы «объявляются» на месте, как и любая другая опечатка, как неназначенный Variant/Empty переменная, которая не может быть объектом для вызова членов.

Итак, я готов поспорить, что полученная вами фактическая ошибка - "Требуется объект" в этой строке:

Set rng = Range(Range("A1"), Range("A1").SpecialCells(xlLastCell))

Вы знаете, что должно быть Worksheet:

Set Page = XL.Worksheets("Sheet1").Range("A1:I1")

Объявите переменную для него:

Dim ws As Object
Set ws = XL.Worksheets("Sheet1")

Теперь используйте этот Worksheet объект (я бы объявил его выше этого, и использовал бы его везде, где необходимо ссылаться на лист), чтобы квалифицировать эти Range вызовы:

Set rng = ws.Range(ws.Range("A1"), ws.Range("A1").SpecialCells(xlLastCell))

... что можно упростить до:

Set rng = ws.Range("A1").SpecialCells(xlLastCell)

... кроме xlLastCell также является идентификатором, который не существует.

В библиотеке типов Excel правильный идентификатор - xlCellTypeLastCell - но, поскольку вы не ссылаетесь на эту библиотеку, VBA не может знать, что это означает.

xlCellTypeLastCell определяется в перечислении со значением 11.

Чтобы вы могли объявить это так:

Const xlCellTypeLastCell = 11

А затем используйте его в своем коде:

Set rng = ws.Range("A1").SpecialCells(xlCellTypeLastCell)

Редактировать - я пропустил эти два:

Dim tbl As ListObject
Dim rng As Range

Если вы ссылаетесь на библиотеку типов Excel , то вы значительно усложняете свою жизнь, объявляя все о Excel As Object. Используйте типы, если они у вас есть!

...