#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. да, я ответил примерно в то же время и не видел комментарии при составлении ответа.