Excel VBA инициализирует рабочую книгу путем очистки таблиц

#excel #vba

#excel #vba

Вопрос:

У меня есть некоторый код VBA, который я использую в другой рабочей книге, чтобы изменить размер таблицы на 1 строку и удалить содержимое таблицы данных для инициализации рабочей книги. Затем открывается файловое приглашение с просьбой к пользователю выбрать соответствующий файл для обработки. По какой-то причине я получаю

«Ошибка времени выполнения ’91’: переменная объекта или переменная блока не установлена»

Код скопирован и вставлен из другой рабочей книги, и я скорректировал имена переменных, рабочих книг, листов и имен таблиц.

рабочая книга называется «IMD Processing.xlsm» с двумя листами, озаглавленными «IMD» и «Raw». На листе «Raw» есть таблица с именем «tbl_raw», а на листе «IMD» есть таблица с именем «tbl_imd».

Любые рекомендации были бы высоко оценены.

 Option Explicit

Sub IMDAutomation()

Dim fileName As String 'Filename string

Dim wb_macro As Workbook 'Macro workbook
Dim ws_macro_imd As Worksheet 'Macro worksheet
Dim ws_macro_raw As Worksheet 'Macro raw worksheet

Dim wb_imd As Workbook 'IMD Workbook for processing
Dim ws_imd As Worksheet 'IMD Worksheet for processing

Dim objTable As ListObject 'Table of raw data

Dim tbl_raw As ListObject 'Raw table in macro workbook
Dim tbl_imd As ListObject 'IMD table in macro workbook

Dim vals As Variant 'Array to store values

Dim lrow As Long 'Variable used to determine number of rows in data table

Set wb_macro = ThisWorkbook
Set ws_macro_imd = Sheets("IMD")
Set ws_macro_raw = Sheets("Raw")

'============ Initialize macro workbook - clearing data ============'
'Clear the raw data in the macro workbook
Set tbl_raw = ws_macro_raw.ListObjects("tbl_raw")
    With tbl_raw.DataBodyRange
           If .Rows.Count > 1 Then
            .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Rows.Delete
        End If
    End With
tbl_raw.DataBodyRange.Rows(1).ClearContents

'Clear the IMD data in the macro workbook
Set tbl_imd = ws_macro_imd.ListObjects("tbl_imd")
    With tbl_imd.DataBodyRange
        If .Rows.Count > 1 Then
            .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Rows.Delete
        End If
    End With

'============ Locate Raw Data File ============'
'Open file dialog to locate the Workforce Review raw data workbook exported from system
With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = False
    .Title = "Select the IMD file"
    .Filters.Clear
    .Filters.Add "Custom Excel Files", "*.xlsx, *xls, *csv"
    .Show
    fileName = .SelectedItems.Item(1)
End With
If InStr(fileName, ".xlsx") = 0 Then
Exit Sub
End If
Workbooks.Open fileName
'Set the Workforce Review raw workbook
Set wb_imd = ActiveWorkbook
'Set the worksheet
Set ws_imd = wb_imd.ActiveSheet


lrow = ws_imd.Cells(ws_imd.Rows.Count, 2).End(xlUp).Row
vals = ws_imd.Range("A2:CU" amp; lrow)

Application.CutCopyMode = False
Application.CutCopyMode = True

End Sub
  

УДПАТИРОВАТЬ РЕШЕНИЕМ
Спасибо @Variatus за решение.
В моей таблице не было строки данных, поэтому я создал одну, и теперь она работает.
Это должно сработать для обработки случаев, когда в таблице нет строки. If tbl_raw.DataBodyRange Is Nothing Then InsertRowRange Else (Code to clear the table)

Комментарии:

1. В какой строке вы получаете эту ошибку?

2. Когда я использую пошаговый ввод, это происходит, когда горит желтая стрелка If .Rows.Count > 1 Then . Как только я снова нажимаю step-into, ошибка срабатывает. Я не уверен, означает ли это, что она находится в этой строке или в следующей строке.

3. DataBodyRange не существует. Должна быть хотя бы одна строка. Я полагаю, вы можете проверить это с помощью If Tbl_raw.DataBodyRange Is Nothing . И наоборот, таблица InsertRowRange существует только тогда, когда DataBodyRange равен Nothing .

4. Ах, я думал, что у меня там всего одна строка данных! Это объясняет это. Итак, вы бы сказали, что решением было бы: If tbl_raw.DataBodyRange Is Nothing Then InsertRowRange Else (Code to clear the table) ? Кроме того, могу ли я использовать ‘Is Nothing’ или вы говорили это как логику?

5. Is Nothing является допустимым.

Ответ №1:

Вероятно, объект, который ищется с помощью Set tbl_raw = ws_macro_raw.ListObjects("tbl_raw") , не существует в новой рабочей книге и, следовательно, обращение через With tbl_raw возвращает эту ошибку

Комментарии:

1. @Variatus был прав в том, что DataBodyRange не существовал. Я добавил одну строку данных, и теперь она работает!

2. да, я ответил примерно в то же время и не видел комментарии при составлении ответа.