Ошибка выполнения VBA 1004 - Проблемы с переменными? - PullRequest
0 голосов
/ 28 мая 2020

с тех пор, как была решена моя последняя проблема, я придумал еще одну! Woooo

Ошибка метода «Диапазон» для объекта '_Global'.

Здесь я импортирую данные, которые не были найдены в моей переменной a (PZ_RNG / strSearch)

Private Sub Search_Click()

Dim PZ_RNG As Range
Dim strSearch As String

strSearch = Packzettelinfo.PZ_ID

Set PZ_RNG = ThisWorkbook.Sheets("Data").Range("B:B").Find(strSearch, , xlValues, xlWhole)
If Not PZ_RNG Is Nothing Then

Packzettelinfo.KD_ID = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 1)
Packzettelinfo.Customer_Combination = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 2)
Packzettelinfo.Ship_ID = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 3)
Packzettelinfo.Author_ID = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 4)
Packzettelinfo.Art_Lager = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 5)
Packzettelinfo.Art_Bestell = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 6)
Packzettelinfo.DTPicker1 = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 7)
Packzettelinfo.Calc_Time = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 8)
Packzettelinfo.Time1 = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 10)
Packzettelinfo.Time2 = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 11)
Packzettelinfo.Time3 = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 12)
Packzettelinfo.Time_Special = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 13)
Packzettelinfo.Time_Total = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 14)
Packzettelinfo.Notes_Buero = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 15)
Packzettelinfo.Notes_Lager = ThisWorkbook.Sheets("Data").Cells(PZ_RNG.Row, PZ_RNG.Column + 16)

ThisWorkbook.Sheets("Data").Range("E1") = PZ_RNG.Address 'save data

Else
    MsgBox "Packzettel Nr. " & strSearch & " konnte nicht gefunden werden (Fehler #001)", vbOKOnly
    Packzettelinfo.PZ_ID.SetFocus
    Exit Sub
End If

Теперь: я хочу сохранить содержимое при нажатии кнопки:

With ThisWorkbook.Sheets("Data")
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 1) = Packzettelinfo.KD_ID
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 2) = Packzettelinfo.Customer_Combination
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 3) = Packzettelinfo.Ship_ID
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 4) = Packzettelinfo.Author_ID
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 5) = Packzettelinfo.Art_Lager
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 6) = Packzettelinfo.Art_Bestell
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 7) = Packzettelinfo.DTPicker1
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 8) = Packzettelinfo.Calc_Time
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 10) = Packzettelinfo.Time1
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 11) = Packzettelinfo.Time2
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 12) = Packzettelinfo.Time3
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 13) = Packzettelinfo.Time_Special
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 14) = Packzettelinfo.Time_Total
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 15) = Packzettelinfo.Notes_Buero
.Cells(Range(Range("E1")).Row, Range(Range("E1")).Column + 16) = Packzettelinfo.Notes_Lager
End With
MsgBox "Packzettel " & Packzettelinfo.PZ_ID & " wurde gespeichert!", vbOKOnly
Unload Me
End Sub

Ошибка уже в первой строке ".Cells". Не знаю, что случилось.

1 Ответ

1 голос
/ 28 мая 2020

Если я вас правильно понял, вы пишете адрес поиска в ячейку «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")) пришлось провалить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...