VBA水平读取联合范围

时间:2015-12-29 18:51:01

标签: excel vba excel-vba range union

我试图合并一系列细胞中的值。我创建了一个范围如下:

Dim rng As Range
Set rng = Application.Union(Range("A1:A3"), Range("C1:E2"))
For Each Address In rng
Debug.Print Address.Address
Next

我想以水平顺序读取单元格:A1,C1,D1,E1,A2,C2 ......等 但相反,他们正在阅读A1,A2,A3,C1,C2等等

如何水平阅读? 感谢

3 个答案:

答案 0 :(得分:4)

您必须处理使用Range.Areas创建的Range object内的Union method

Sub laterally()
    Dim r As Long, c As Long, a As Long
    Dim mnRW As Long, mxRW As Long, mnCL As Long, mxCL As Long
    Dim rng As Range

    With Worksheets("Sheet1")   '<~~ ALWAYS set the worksheet!
        Set rng = Union(.Range("A1:A3"), .Range("C1:E2"))
        Debug.Print rng.Address(0, 0)
        mnRW = Rows.Count: mxRW = 0
        mnCL = Columns.Count: mxCL = 0
        With rng
            For a = 1 To .Areas.Count
                With .Areas(a)
                    mnRW = Application.Min(mnRW, .Rows(1).Row)
                    mxRW = Application.Max(mxRW, .Rows(.Rows.Count).Row)
                    mnCL = Application.Min(mnCL, .Columns(1).Column)
                    mxCL = Application.Max(mxCL, .Columns(.Columns.Count).Column)
                End With
            Next a
            For r = mnRW To mxRW
                For c = mnCL To mxCL
                    If Not Intersect(.Cells, .Parent.Cells(r, c)) Is Nothing Then _
                        Debug.Print .Parent.Cells(r, c).Address(0, 0)
                Next c
            Next r
        End With
    End With
End Sub

收集联合范围的范围后,每个可能的单元格都会循环,Intersect method用于确定它是否属于并集。

答案 1 :(得分:2)

范围的并集并不关心添加单元格的顺序 - 无论是按行还是按列。所以你的原始循环统一范围很好。

如果您担心读取数据的顺序,只需按行或按行读取内部和外部循环。例如,在构建范围后,请执行以下操作:

function chooseMove(inboard) {
    console.log('chooseMove');
    // get the possible moves
    var moves = [];
    var scores = [];
    for (var i = 1; i < 10; i++) {
        var arr = PositionToCoords(i);
        if (inboard[arr[0]][arr[1]] === undefined) {
            moves.push(i);
            var tboard = inboard;
            tboard[arr[0]][arr[1]] = cSym;
            var gc = gameCheck(tboard);
            scores.push(gc);
            break;  // <<<<<<<<<<<< This break guarantees that the computer only makes one move
        }
    }
    //console.log(moves);    
    //console.log(scores);
    return moves[0]; // TEMPORARY
}

答案 2 :(得分:0)

想到这可能是Chris解决方案的有趣补充吗? (我稍微改变了范围以突出一些优点)

goBack()