【问题标题】:Storage of Range Values after .Find.Find 后存储范围值
【发布时间】: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”) 部分无效。

标签: excel vba find range


【解决方案1】:

除了稍微简化您的代码并使用xlValues 而不是xlFormulas 作为LookIn 参数之外,我没有什么可提供的

Sub Tester()

    Dim f As Range
    Dim WBModeloA1 As Worksheet
    Dim WBModeloA2 As Worksheet
    Dim wsData As Worksheet, rngSearch As Range

    'use "ThisWorkbook" if it's where your code lives
    Set WBModeloA1 = ThisWorkbook.Sheets("Cartera 1")
    Set WBModeloA2 = ThisWorkbook.Sheets("Cartera 3")
    Set wsData = ThisWorkbook.Sheets("Data") 'the sheet you're searching

    'define a range to search
    Set rngSearch = wsData.Range(wsData.Range("AJ1"), _
                                 wsData.Cells(Rows.Count, "AJ").End(xlUp))

    'if you have multiple of these following blocks you really need a loop

    Set f = rngSearch.Find(what:="WarrantyPrefA Total", LookIn:=xlValues, _
                           lookat:=xlWhole, MatchCase:=False)

    If Not f Is Nothing Then
        WBModeloA1.Range("E67") = f.Offset(0, -3).Value / 1000
        WBModeloA2.Range("H91") = f.Offset(0, -21).Value / 1000
    End If

    Set f = rngSearch.Find(what:="WarrantyPrefB Total", LookIn:=xlValues, _
                           lookat:=xlWhole, MatchCase:=False)

    If Not f Is Nothing Then
        WBModeloA1.Range("E65") = f.Offset(0, -3).Value / 1000
        WBModeloA2.Range("H90") = f.Offset(0, -21).Value / 1000
    End If

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2012-08-28
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多