【问题标题】:VBA concatenate two rangesVBA 连接两个范围
【发布时间】:2018-12-18 03:02:18
【问题描述】:

我正在尝试使用 VBA 连接 excel 中的两个范围,因此 range1 中的每个单元格连接 range2 中的所有单元格,直到单元格 A 为空。请看下面:

Range1(column A): Range2(column B):
50703, 50702      52797, 52848

Concatenate(column C):
50703-52797, 50703-52848, 50702-52797, 50702-52848

【问题讨论】:

  • 您是否打算展示自己的解决方案?
  • 您似乎正在尝试使用 A 列单元格值作为结果的第一部分来查找两个单元格范围的所有排列。 A 列和 B 列中使用的单元格总数是多少?
  • 得到结果后,您打算将 C 列的值用于什么用途?
  • jsheeran - 我在 A 列中有 54 个值的列表,在 B 列中有 59 个值的列表,这需要一段时间才能手动连接(3186 个值)。数据将被加载到不同的系统中。
  • 吉普车 - 我还没有为此编写任何代码。在网上做了一些研究,但除了连接两个范围(逐行)不是我在这里想要做的之外,找不到任何东西。我想要的是 range1 中的每个单元格与 range2 中的所有单元格连接,然后移动到下一个单元格,直到 range1 中的单元格为空。

标签: excel vba


【解决方案1】:

这会将 A 列和 B 列中值的所有组合插入到 C 列中,并用连字符连接它们:

Sub combinations()

    Dim i As Long, j As Long, n As Long
    Dim valsColA As Variant, valsColB As Variant

    With ThisWorkbook.Sheets("Combinations") ' change sheet name, if necessary

        valsColA = .Range(.Cells(1, 1), .Range("A1").End(xlDown)).Value
        valsColB = .Range(.Cells(1, 2), .Range("B1").End(xlDown)).Value

        For i = LBound(valsColA) To UBound(valsColA)
            For j = LBound(valsColB) To UBound(valsColB)
                n = n + 1
                .Cells(n, 3).Value = valsColA(i, 1) & "-" & valsColB(j, 1)
            Next j
        Next i

    End With
End Sub

【讨论】:

    【解决方案2】:

    这是我想出的,虽然@Miqi180 最先到达那里:

    Sub ABPerm()
    
    Dim Acol As Integer
    Dim Bcol As Integer
    Dim RowNumA As Integer
    Dim RowNumB As Integer
    Dim RowNumC As Integer
    
    Acol = Range("A" & Rows.Count).End(xlUp).Row
    Bcol = Range("B" & Rows.Count).End(xlUp).Row
    
    RowNumA = 1
    RowNumB = 1
    RowNumC = 1
    
    For a = 1 To Acol
    
        For b = 1 To Bcol
            Range("C" & RowNumC).Value = Range("A" & RowNumA).Value & "-" & Range("B" & RowNumB).Value
            RowNumB = RowNumB + 1
            RowNumC = RowNumC + 1
        Next b
    
        RowNumB = 1
        RowNumA = RowNumA + 1
    
    Next a
    
    End Sub
    

    【讨论】:

    • @5202456 这些是组合,而不是排列,因此您的过程名称 ABPerm 并没有多大意义。
    【解决方案3】:

    试试这个代码

    Sub Test()
    Dim rng         As Range
    
    Set rng = Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
    rng.Offset(, 2).Value = Evaluate("If(Row(1:" & rng.Rows.Count & ")," & rng.Address(, , , True) & " & " & "-" & rng.Offset(, 1).Address(, , , True) & ")")
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2013-03-31
      • 1970-01-01
      • 2018-12-19
      • 2012-12-15
      • 2022-07-20
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多