我有两列数据如下:
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;
等?
答案 0 :(得分:1)
我会使用模运算来实现这一点。下面的子例程假设需要填充的列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
)。
列数:
这更简单:我们切换行的每个3rd
行。所以当(Cells(BCnt, 3).Row) Mod 3 = 0
时,我们递增列A
的指针。当然,当我们到达4th
行时,我们需要返回1st
行。
我希望这会有所帮助!!
答案 1 :(得分:1)
我希望尽可能避免使用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))))
答案 2 :(得分:0)
你不能做类似的事情:
Dim i,j AS int
For i = 1 to 3
For j = 1 to 6
NewVal = C(j):A(i)
Next j
Next i
这是未经测试的,但为您提供了去哪里的方向..
答案 3 :(得分:0)
我看不到它比下面的更简单
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列实际上是什么;)