Переменная объекта или переменная блока не задана - поиск и замена макроса - несколько итераций поиска - PullRequest
0 голосов
/ 10 июня 2019

При запуске макроса я получаю сообщение об ошибке «Переменная объекта или переменная блока не установлена».Я не уверен, какая переменная не установлена ​​правильно, теперь, как это выяснить.

Я прошел и попытался убедиться, что все мои переменные были установлены правильно, но я почти уверен, что что-то упустил.

Sub NewMonth_Setup()

'
'Find and Replace
'
Dim sht As Worksheet
Dim fnd1 As Variant
Dim rplc1 As Variant
Dim fnd2 As Variant
Dim rplc2 As Variant
Dim fndList As Variant
Dim rplcList As Variant
'Activates currently selected sheet
    Sheets(ActiveSheet.Name).Select
'
'Replaces old table name with new
    fnd1 = InputBox("Old Table Name: _MMYYWS")
    rplc1 = InputBox("New Table: _MMYYWS")
    fnd2 = InputBox("Old Table Name: _MMYY")
    rplc2 = InputBox("New Table: _MMYY")
'
    fndList = Array(fnd1, fnd2)
    rplcList = Array(rplc1, rplc2)
'
' Perform Find/Replace All
    sht.Cells.Replace What:=fndList(x), Replacement:=rplcList(x), _
        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
        SearchFormat:=False, ReplaceFormat:=False
'
MsgBox "I have completed my search and made replacements"
'


End Sub

Ожидаемые результаты будут принимать пользовательский ввод для двух переменных и заменять их соответственно.Он заменяет входы, но все равно возвращается с ошибкой и не выводит MsgBox

1 Ответ

2 голосов
/ 10 июня 2019

Вы не можете сделать членский звонок против Nothing.Вы объявили здесь переменную объекта:

Dim sht As Worksheet

Это резервирует место в памяти, где может храниться ссылка на объект, и пока эта ссылка не будет Set, VBA понимает, что это пространство памяти равно Nothing - в других языках это может быть null или что-то подобное: суть в том, что по этому адресу нет действительной ссылки на объект, поэтому VBA выдает ошибку 91 при попытке доступа к нему ... здесь:

sht.Cells.Replace ...

Это не нужно делать:

Sheets(ActiveSheet.Name).Select

Вместо этого Set ссылка на объект sht:

Set sht = ActiveSheet ' or, get a worksheet reference from the Workbook.Worksheets collection

И это должно исправить это ..при условии, что x дано значение где-то .Предположительно, поиск предназначен для запуска в цикле?Для этого вам понадобится конструкция цикла:

For x = LBound(fndList) To UBound(fndList)
    sht.Cells.Replace ...
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...