Если я вас правильно понял, вы пишете адрес поиска в ячейку «E1», а потом хотите что-то записать в эту ячейку. Все это происходит, пока активна пользовательская форма.
Мне не нравится эта попытка, пока форма активна, достаточно определить переменную диапазона PZ_RNG
как глобальную переменную внутри формы . В этом случае вы можете использовать что-то вроде
With ThisWorkbook.Sheets("Data")
PZ_RNG.Offset(0, 1) = Packzettelinfo.KD_ID
PZ_RNG.Offset(0, 2) = Packzettelinfo.Customer_Combination
(...)
End With
btw: Чтение данных из листа в форму также можно сделать намного проще:
With ThisWorkbook.Sheets("Data")
Packzettelinfo.KD_ID = PZ_RNG.Offset(0, 1)
(...)
End With
объяснение простое, PZ_RNG - это уже a Range
и Offset
возвращает Range
, что является определенным c количеством строк и столбцов (в данном случае 0 строк ниже и 1 или 2 столбца справа).
Тем не менее, возвращаясь к вашему вопросу, давайте представим, что вы хотите придерживаться своего текущего решения. Первое, что нужно сделать, это разбить эти операторы-монстры на более мелкие части, чтобы облегчить отладку. Первый шаг - прочитать ячейку, содержащую ваш адрес, и создать его диапазон:
With ThisWorkbook.Sheets("Data")
Dim adr as String, PZ_RNG as Range
adr = .range(E1)
set PZ_RNG = .range(adr)
Если это дает ошибку во время выполнения, у вас, вероятно, нет правильного адреса, что можно легко проверить, проверив содержимое переменной adr
. Если ошибки не возникает, вы можете продолжить синтаксис, предложенный выше, но даже если по какой-либо причине вы хотите придерживаться попытки использования .Cells
-синтаксиса и, следовательно, нуждаетесь в строке и столбце, объявите 2 переменные и используйте их:
dim destRow as Long, destCol as Long
destRow = PZ_RNG.row
destCol = PZ_RNG.column
.Cells(destRow, destCol+1) = Packzettelinfo.KD_ID
(...)
Теперь, если что-то не получается, найти проблему намного проще (научитесь пользоваться отладчиком !!!). И нет, объявление и использование некоторых дополнительных переменных не замедляет выполнение.
А теперь, в конце этого довольно длинного ответа, то, что (вероятно) вызвало вашу ошибку выполнения. В SO полно таких случаев, потому что это не так очевидно: вы используете With
-запись (хорошо), но даже если вы это делаете, так называемые неквалифицированные термины вроде Range
относятся к активный лист, а не лист With
-пункта. А также не листа, к которому вы обращаетесь с заявлением Cells
. Если вы хотите прочитать диапазон из рабочего листа, который вы указываете в предложении With
, вы должны поставить .
перед Range
. Каждый. Не замужем. Time.:
With ThisWorkbook.Sheets("Data")
.Cells(.Range(.Range("E1")).Row, .Range(.Range("E1")).Column + 1)
Таким образом, вероятно, лист «Данные» не был активным листом, поэтому Range("E1")
читал не адрес, который вы сохранили, а что-то случайное (которое не было адресом), поэтому Range(.Range("E1"))
пришлось провалить.