【问题标题】:Get specific item in a range获取范围内的特定项目
【发布时间】:2021-11-28 20:27:50
【问题描述】:

这是我的代码:

    Debug.Print "Full range: " & searchResult.Address
    Debug.Print "Size of range: " & searchResult.Count
    Dim cell As Range
    For Each cell In searchResult
        Debug.Print "from for each: " & cell.Address
    Next cell
    Debug.Print "from item 0: " & searchResult.item(0).Address
    Debug.Print "from item 1: " & searchResult.item(1).Address
    Debug.Print "from item 2: " & searchResult.item(2).Address

这是我的输出:

Full range: $M$125,$M$148,$M$161
Size of range: 3
from for each: $M$125
from for each: $M$148
from for each: $M$161
from item 0: $M$124
from item 1: $M$125
from item 2: $M$126

for each 给了我想要的结果,而“item”只给出了工作表中的下一个项目,而不是那个范围。 我只想获取该范围内特定项目的地址。假设像“searchResult(2).address = $M$161”(如果它是基于 0 的情况下)之类的话,就像您将访问数组中的项目一样。 我确定这很简单,但找不到我需要使用的属性的名称... 感谢您的帮助。

【问题讨论】:

  • 不连续范围不会返回连续数组!这样的范围有区域。你可以在searchResult.Address看到它的具体区域地址,像逗号分隔...
  • 供参考:Range.Item
  • @FaneDuru,好的,感谢您提供此信息。感谢您使用“searchResult.Areas.item(1).Address”的评论完成了这项工作,谢谢!
  • 如果您想在搜索结果中使用索引,那么您可能需要类似单元格集合而不是 Union'ed Range 对象。你在哪里/如何创建searchResult
  • @TimWilliams 搜索结果的创建方式类似于此答案/函数。它只是找到搜索字符串的单元格地址列表。 stackoverflow.com/questions/69901221/…

标签: excel vba


【解决方案1】:

不连续的范围不会返回连续的数组...

为了将其转换为一维数组(值和地址),请尝试下一个函数。它在所有范围区域和每个区域的所有单元格之间进行迭代:

Function DiscRangeToArray(rng As Range) As Variant
   Dim A As Range, c As Range, arrVal, arrAddress, i As Long
   ReDim arrVal(rng.cells.count - 1): ReDim arrAddress(rng.cells.count - 1)
   For Each A In rng.Areas
        For Each c In A.cells
            arrVal(i) = c.value: arrAddress(i) = c.Address: i = i + 1
        Next c
    Next A
    DiscRangeToArray = Array(arrVal, arrAddress)
End Function

你可以使用下一个测试Sub来测试它:

Sub testDiscRangeToArray()
   Dim rng As Range, jgArr
   Set rng = Range("$M$125,$M$148,$M$161")
   jgArr = DiscRangeToArray(rng)
   Debug.Print Join(jgArr(0), "|")
   Debug.Print Join(jgArr(1), "|")
   
   'For a range not having only one cell in an area:
   Set rng = Range("A2:A3,B4,C5:D6")
   jgArr = DiscRangeToArray(rng)
   Debug.Print Join(jgArr(0), "|")
   Debug.Print Join(jgArr(1), "|")
End Sub

请进行测试并发送一些反馈。

【讨论】:

    【解决方案2】:

    感谢 FaneDuru 的评论,我找到了解决方案。正在做:

    searchResult.Areas.item(1).Address
    

    在我的情况下完成了这项工作。

    【讨论】:

    • 您应该知道这种方式仅适用于您的特定情况。有时,一个区域可能有更多的细胞。在这种情况下,您的代码应该在每个区域单元格之间进行迭代。它只会在您的特定范围内正确返回..
    • 那你有什么建议?将地址存储在字符串数组中?
    • 嗯,这取决于你真正想要完成什么。实际上,您可以将属于不连续范围的所有单元格放在一个数组中。当然,如果这是你想要的。我可以向您展示一个这样做的功能。事实上,我将发布一个函数,返回一个包含单元格值及其地址的锯齿状数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多