Excel MS VBA,带循环和联合

Excel MS VBA,带循环和联合,excel,vba,for-loop,cell,union-all,Excel,Vba,For Loop,Cell,Union All,现在我的问题是for循环,它遍历命名范围“HousesRange” 假设HousesRange包含[2,5,9,10] 这里HousesRange是我的工作表中[1,2,3,4,5,6,7,8,9,10]行的子集 假设HousesRange是通过[9,10,5,2]的顺序建立的(通过与并集的第一个for循环) 现在,当我只使用RCELL(循环的第二个)穿过HousesRange时,我需要9、10、5然后2 但我想让它把我带到2号,5号,9号,然后10号 有人能解释一下吗 我一直认为命名范围总是从

现在我的问题是for循环,它遍历命名范围“HousesRange”


假设HousesRange包含[2,5,9,10]


这里HousesRange是我的工作表中[1,2,3,4,5,6,7,8,9,10]行的子集

假设HousesRange是通过[9,10,5,2]的顺序建立的(通过与并集的第一个for循环)

现在,当我只使用RCELL(循环的第二个)穿过HousesRange时,我需要9、10、5然后2

但我想让它把我带到2号,5号,9号,然后10号

有人能解释一下吗

我一直认为命名范围总是从左到右,然后从上到下遍历


提前非常感谢你

好的,这是一个漫长的过程,但它应该会起作用:

不要使用
Union
在dictionary对象中创建已找到房屋的列表。 然后使用
Bubblesort HouseRangeDic
您最终应该能够按照正确的顺序使用它:

Dim Counter As Integer
Dim Maxhouse As Integer
Dim FindHouse As Range
Dim RangeVar As Range
Dim HousesRange As Range

    For Counter = 1 To MaxHouse
        ActiveSheet.Cells(16, 2 + Counter).Select
        House = ActiveCell
        With Sheets("Sheet1").Range("C:KP")
            Set FindHouse = Cells.Find(What:=House, _
                After:=Cells(17, 1), _
                LookIn:=xlValues, _
                LookAt:=xlWhole, _
                SearchOrder:=xlByRows, _
                SearchDirection:=xlNext, _
                MatchCase:=False)
            If Not FindHouse Is Nothing Then
                If Counter = 1 Then
                    Set HousesRange = FindHouse
                Else
                    Set RangeVar = FindHouse
                    Set HousesRange = Union(HousesRange, RangeVar)
                End If
            End If
        End With
    Next Counter

    For Each RCell In HousesRange.Cells
        Application.Goto RCell, True
    Next RCell**

看看这是否适合你。请注意,我的“After:=”设置为范围的最后一个单元格,因此第一次查找从范围的开头开始

Dim Counter As Integer
Dim Maxhouse As Integer
Dim FindHouse As Range
Dim RangeVar As Range
Dim HousesRange As Range

'****** NEW **********
Dim foundHouseCount
foundHouseCount = 1
Dim HouseRangeDic
Set HouseRangeDic = CreateObject("Scripting.dictionary")
'*********************

    For Counter = 1 To Maxhouse
        ActiveSheet.Cells(16, 2 + Counter).Select
        House = ActiveCell
        With Sheets("Sheet1").Range("C:KP")
            Set FindHouse = Cells.Find(What:=House, _
                After:=Cells(17, 1), _
                LookIn:=xlValues, _
                LookAt:=xlWhole, _
                SearchOrder:=xlByRows, _
                SearchDirection:=xlNext, _
                MatchCase:=False)
            If Not FindHouse Is Nothing Then
                HouseRangeDic.Add foundHouseCount, RangeVar '**** NEW ***
                foundHouseCount = foundHouseCount + 1 '**** NEW ***
            End If
        End With
    Next Counter

    '**** NEW ***
    Bubblesort HouseRangeDic

    For i = 1 To HouseRangeDic.Count
       Application.Goto HouseRangeDic(i), True
    Next
    '************


Sub Bubblesort(ByRef rangeDic)
    Dim tempRange
    For i = 1 To rangeDic.Count - 1
        For j = i To rangeDic.Count
            If rangeDic(i).Address > rangeDic(j).Address Then
                Set tempRange = rangeDic(i)
                Set rangeDic(i) = rangeDic(j)
                Set rangeDic(j) = tempRange
            End If
        Next
    Next
End Sub
Sub-loopCells()
作为靶场的暗鳍房屋
昏暗的房屋范围
变暗rcell As范围
调光范围
像绳子一样暗淡
昏暗的房子一样长
设置r=床单(“床单1”)。范围($C$15:$K$20”)更改为适合
房子=11'换成适合的
带r
设置FindHouse=.Find(What:=House,After:=r(.Cells.Count),LookIn:=xlValues,LookAt:=xlWhole_
SearchOrder:=xlByRows,SearchDirection:=xlNext,MatchCase:=False)
如果找不到房子,那就什么都不是了
sAdd=金融房屋地址
做
如果HousesRange不算什么
Set HousesRange=FindHouse
其他的
Set HousesRange=Union(HousesRange,FindHouse)
如果结束
设置FindHouse=.FindNext(FindHouse)
非FindHouse时循环为Nothing,FindHouse.Address sAdd
如果结束
以
对于House Range中的每个rcell
应用程序。转到rcell
下一个rcell
端接头

此代码是否完整?能否在循环开始之前添加
HousesRange.address
结果的信息。否。这是部分代码。示例:Househouse包含单元格[1,2,3,4],但它按[3,4,2,1]的顺序遍历,假设这是形成联合体的顺序编辑代码以便您可以查看上下文我已选中不同的选项,如
区域
For i>。单元格(i)
,但没有任何功能如您所预期。我承认,目前我不知道如何快速排序。嗨,KazJaw,我假设VBA/Excel总是从左到右,然后从上到下遍历命名范围。。但事实并非如此。更多信息,请参见我对shreyansp的评论!工会只有一行。它是由同一区域的不同细胞组成的row@user3072955六羟甲基三聚氰胺六甲醚。。。也许我误解了这个问题。“先进先出”是什么意思。你能发布你的excel表格中的范围是什么样的吗?假设HousesRange包含[2,5,9,10]。假设HousesRange是通过[9,10,5,2]的顺序建立的(通过与并集的第一个for循环)。现在,当我只使用RCELL(我以前的代码)遍历HousesRange时,它会将我带到9、10、5然后2。但是我想让它把我带到2,5,9,然后10这里HousesRange是这一行的子集[1,2,3,4,5,6,7,8,9,10]@user3072955-我现在明白你的问题了。我已经在上面发布了一个新的解决方案。。同样的,我最终通过housesrange得到了精确的遍历模式,它是一个字符串变量,保存第一次查找的地址,这样您就可以知道何时返回到开始。为了好玩,在
Do
行下添加此-
FindHouse。选择
。这样你就可以看到你的射程是如何建造的。顺便说一句,你在第一行设置了什么范围?第一行是在“计数器=1”之后的那一行?我将其设置为找到的第一个地址。之后,我将以前找到的地址与新找到的地址合并。如果不是,你指的是Dave的“第一行”是什么?不,我说的是我的代码-如果你尝试过,你在这行中设置了什么地址:
set r=Sheets(“Sheet1”)。范围($C$15:$K$20)
。问题是,HousesRange被正确地填充了。我似乎无法正确地完成它。以这种速度,我将不得不编写一个min函数->从HousesRange中取出min单元格->重复,直到HousesRange不存在。。。。
Sub loopCells()
    Dim FindHouse As Range
    Dim HousesRange As Range
    Dim rcell As Range
    Dim r As Range
    Dim sAdd As String
    Dim House As Long

    Set r = Sheets("Sheet1").Range("$C$15:$K$20") 'change to suit

    House = 11'change to suit
    With r

        Set FindHouse = .Find(What:=House, After:=r(.Cells.Count), LookIn:=xlValues, LookAt:=xlWhole, _
            SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
        If Not FindHouse Is Nothing Then
            sAdd = FindHouse.Address
            Do
               If HousesRange Is Nothing Then
                    Set HousesRange = FindHouse
                Else
                    Set HousesRange = Union(HousesRange, FindHouse)
                End If
                Set FindHouse = .FindNext(FindHouse)
            Loop While Not FindHouse Is Nothing And FindHouse.Address <> sAdd
        End If
    End With

    For Each rcell In HousesRange
        Application.Goto rcell
    Next rcell

End Sub