我有两列数据如下:
A1: A; A2: B; A3: C and B1: 1; B2:2; B3:3
VBA 中是否有一个简单的循环在列上将C
连接值设置为:
C1: A1; C2: A2; C3: A3; C4: B1; C5: B2; C6: B3;
ETC?
我会使用模算术来实现这一点。下面的子例程假设C
需要填充的列中的最后一行是lLastRow
(我将其设置=25
为用于测试):
Sub test()
Dim lLastRow As Long, ACnt As Long, BCnt As Long
ACnt = 1
' Last row of column C that needs to be filled with Data
lLastRow = 25
For BCnt = 1 To lLastRow
' Use modulo arithmetic to point to the right cell in column B
Cells(BCnt, 3) = Cells(ACnt, 1) & IIf(BCnt Mod 3 <> 0, BCnt Mod 3, 3)
' We should increment column A every three rows
ACnt = IIf((Cells(BCnt, 3).Row) Mod 3 = 0, ACnt + 1, ACnt)
' Reset column A pointer when we go beyond 3
ACnt = IIf(ACnt = 4, 1, ACnt)
Next BCnt
End Sub
B 列编号:
这个想法是(从第一行开始),modulo
每一行的3
将0,1,2
永远以这种方式回收。每当行号是 的倍数时3
,modulo
返回0
,因此我们需要3
在列上引用B
(即单元格 ( B3
)。否则,modulo
返回我们想要的(要么是要么1
)2
。
A列数字:
这更简单:3rd
我们切换行的每一行。所以当 时(Cells(BCnt, 3).Row) Mod 3 = 0
,我们增加列的指针A
。当然,当我们到达该4th
行时,我们需要返回该1st
行。
我希望这有帮助!!
我宁愿尽可能避免使用 VBA,所以给定这样的数据设置:
单元格 C1 中的公式并复制下来是:
=IF(ROW(A1)>COUNTA(A:B),"",INDEX(A:B,MOD(ROW(A1)-1,COUNTA(A:A))+1,1+(ROW(A1)>COUNTA(A:A))))
编辑
作为另一种解释,Ioannis 指出,给定这样的数据设置:
单元格 C1 中的公式并复制下来是:
=IF(ROW(A1)>COUNTA(A:A)*COUNTA(B:B),"",INDEX(A:A,INT((ROW(A1)-1)/COUNTA(B:B))+1)&INDEX(B:B,1+MOD(ROW(A1)-1,COUNTA(B:B))))
我看不到它比下面更简单
Sub concat()
Dim i As Integer
With ActiveSheet
For i = 1 To .UsedRange.Rows.Count
.Cells(i, 3) = .Cells(i, 1) & .Cells(i, 2)
Next i
End With
End Sub
或者也许有:
Sub concat2()
With ActiveSheet
.Range("C1") = "=CONCATENATE(RC[-2],RC[-1])"
.Range("C1").AutoFill Destination:=.Range("C1:C" & .UsedRange.Rows.Count)
End With
End Sub
这也将使非 vba 用户了解 C 列实际上是什么;)
你不能做这样的事情:
Dim i,j AS int
For i = 1 to 3
For j = 1 to 6
NewVal = C(j):A(i)
Next j
Next i
这是未经测试的,但会给你方向去哪里..