-1

我有两列数据如下:

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?

4

4 回答 4

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每一行的30,1,2永远以这种方式回收。每当行号是 的倍数时3modulo返回0,因此我们需要3在列上引用B(即单元格 ( B3)。否则,modulo返回我们想要的(要么是要么12

A列数字: 这更简单:3rd我们切换行的每一行。所以当 时(Cells(BCnt, 3).Row) Mod 3 = 0,我们增加列的指针A。当然,当我们到达该4th行时,我们需要返回该1st行。

我希望这有帮助!!

于 2013-09-08T20:15:05.403 回答
1

我宁愿尽可能避免使用 VBA,所以给定这样的数据设置:

用户的tigeravatar公式解决方案2759430

单元格 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 指出,给定这样的数据设置:

Tigeravatar user2759430 v2的公式解决方案

单元格 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))))
于 2013-09-09T14:43:26.003 回答
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 列实际上是什么;)

于 2013-09-09T13:30:06.340 回答
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

这是未经测试的,但会给你方向去哪里..

于 2013-09-08T18:34:38.513 回答