【发布时间】:2019-12-10 22:50:54
【问题描述】:
这是一个更大的代码的一部分,它根据输入文本进行过滤,然后根据与保修子类型相关的值创建小计,这适用于多个不同的工作表并且一切正常。
可能有许多不同的保修子类型。
我单独检查每一个,首先是“WarrantyPrefA Total”的完全匹配案例(这应该在 AJ 列上)。
如果存在,我想将该范围值存储在一个变量 (GaRangeID) 中,因此我可以应用该范围的偏移量来获取其他列中存在的两个数值并将其粘贴到另一个工作簿上。
如果不存在,我想终止该查找,并查找另一个完全匹配的情况。
我的猜测是我弄乱了 .Find 内部语法来搜索正确的范围。
Dim GaRangeID As Range
Dim WBModeloA1 As Worksheet
Dim WBModeloA2 As Worksheet
Set WBModeloA1 = Workbooks("ModeloAnalisis.xlsm").Sheets("Cartera 1")
Set WBModeloA2 = Workbooks("ModeloAnalisis.xlsm").Sheets("Cartera 3")
'GPB
Dim strSearch As String
Dim lastrow As Long
strSearch = "WarrantyPrefA Total"
lastrow = WBevoDeuM.Range("AJ" & Rows.Count).End(xlUp).Row
Set GaRangeID = WBevoDeuM.Range("AJ1", "AJ" & lastrow).Find(What:=strSearch, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False)
If Not GaRangeID Is Nothing Then
WBModeloA1.Range("E67") = GaRangeID.Offset(0, -3).Range("A1")
WBModeloA1.Range("E67").Value = WBModeloA1.Range("E67").Value / 1000
WBModeloA2.Range("H91") = GaRangeID.Offset(0, -21).Range("A1")
WBModeloA2.Range("H91").Value = WBModeloA2.Range("H91").Value / 1000
Else
End If
'GPA
Set GaRangeID = Cells.Find(What:="WarrantyPrefB Total", After:=ActiveCell, LookIn _
:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False)
If Not GaRangeID Is Nothing Then
WBModeloA1.Range("E65") = GaRangeID.Offset(0, -3).Range("A1")
WBModeloA1.Range("E65").Value = WBModeloA1.Range("E65").Value / 1000
WBModeloA2.Range("H90") = GaRangeID.Offset(0, -21).Range("A1")
WBModeloA2.Range("H90").Value = WBModeloA2.Range("H90").Value / 1000
Else
End If
我展示它的原因是重复了相同的结构,但之后又进行了一次查找,因为我曾经以另一种方式定义了“查找”部分。
以下方式正确地将小计粘贴到另一个工作簿上,但我放弃了它,因为它总是将 GaRangeID 设置为活动单元格,当搜索没有得到任何结果时,活动单元格仍然是旧的找到小计,所以它只是将 WarrantyA 的值粘贴到 B 上。
Cells.Find(What:="WarrantyPrefB Total", After:=ActiveCell, LookIn _
:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False).Activate
Set GaRangeID = ActiveCell
【问题讨论】:
-
Cells.Find()没有工作表限定符将默认为 ActiveSheet - 这可能会导致问题,因此第一步是更新您的代码以在引用任何范围/单元格时始终使用特定的工作表/范围。在这种情况下worksheetReference.Range("AJ:AJ").find() -
首先,感谢您的回复,我继续尝试解决它,我确实找到了相同的解决方案,我添加了
Dim WBevoDeuM As Worksheet定义它和Set GaRangeID = WBevoDeuM.Range("AJ:AJ11000").Find[...]但仍然没有结果。跨度> -
我添加了一个
If GaRangeID Is Nothing Then MsgBox "No Value Found in Cell " & vbCrLf并有效地证明了它尽管在那里却找不到价值。如果相关信息,AJ 上的信息在第 1 行有一个 Header。 -
你能用你修改过的代码更新这个问题吗?如果您没有找到该值,那么单元格中值的搜索值一定有问题。如果您将代码中的值复制/粘贴到单元格中,它会被找到吗?
-
如果您确实发现值
GaRangeID.Offset(0, -21).Range("A1")不是有效的范围地址。Range(“A1”)部分无效。