我试图合并一系列细胞中的值。我创建了一个范围如下:
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等等
如何水平阅读? 感谢
答案 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()