VBA 运行时错误 1004 - 变量有问题?



自从我上一个问题解决了,我想出了另一个问题!呜

对象"_Global"的方法"范围"失败。

在这里,我正在导入已搜索到我的变量(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

它在第一行出错"。细胞"已经。邓诺怎么了。

如果我理解正确,您将搜索地址写入单元格"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

顺便说一句:将数据从工作表读取到表单中也可以更容易:

With ThisWorkbook.Sheets("Data")
Packzettelinfo.KD_ID = PZ_RNG.Offset(0, 1)
(...)
End With

解释很简单,PZ_RNG已经是一个RangeOffset返回一个Range,该是特定数量的行和列(在本例中为下方 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-syntax,因此需要行和列,请声明 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前面放置一个.。每。单。时间。:

With ThisWorkbook.Sheets("Data")
.Cells(.Range(.Range("E1")).Row, .Range(.Range("E1")).Column + 1)

因此,工作表"数据"可能不是活动工作表,因此Range("E1")不是读取您存储的地址,而是随机读取(不是地址(,因此Range(.Range("E1"))必须失败。

最新更新