如何在两个不同的列中连接所有字符串?

时间:2015-08-17 12:31:16

标签: excel vba excel-vba

如果没有开始乱用额外的列等,是否有更好的方法来连接两列中的字符串,而不是使用双重for-loop,如下面的代码所示?

Sub test(endra_celle As Range)
  Dim plass_i_årsakslister, c1 As Range, c2 As Range
  Dim i As Long, endra_rad As Long
  Dim ovnsnummer() As String

  endra_rad = endra_celle.Row

  Set plass_i_årsakslister = Range(Årsakslister.Range("C1"), _
                    Årsakslister.Range("XFD1").End(xlToLeft)).Find(What:= _
                    registrering.Range("C" & endra_rad).Value, _
                    LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)

  If Not plass_i_årsakslister Is Nothing Then
    With plass_i_årsakslister
      i = 0
      For Each c1 In Range(.Offset(2, 1), .Offset(1048575, 1).End(xlUp))
        For Each c2 In Range(.Offset(2, 3), .Offset(1048575, 3).End(xlUp))
          ReDim Preserve ovnsnummer(i)
          ovnsnummer(i) = CStr(c1) & CStr(c2)
          i = i + 1
        Next
      Next
    End With
  End If
End Sub

详细说明;第一列中的每个单元格应与第二列中的每个单元格组合,并且所有组合应存储在数组(或其他集合)中。

2 个答案:

答案 0 :(得分:0)

像这样:

Dim a
a = WorksheetFunction.Transpose(Evaluate("A1:A9&B1:B9"))

只需将A1:A9B1:B9替换为您的列范围。

这是有效的,因为Evaluate()正确地将其检测为数组公式并依次对每个单元格进行操作。但是,默认情况下,它将返回一个二维数组(列始终等于1)。 Transpose()交换行和列,以便始终为1,因此Excel可以返回1D数组。

答案 1 :(得分:0)

可能有另一种方法,测试它是否适用于行数......

  • 在每个范围上创建名称范围,例如A列上的FirstCol和B列上的SecondCol
  • 保存工作簿(在我的示例中,在c:\ temp中的Book1.xlsx)
  • 打开另一个工作簿,选择第一个工作表的单元格A1并选择"数据/来自其他来源/来自Microsoft Query
  • 选择"数据库/ Excel文件"作为数据来源
  • 选择您刚刚保存的图书
  • "查询向导/选择列"应显示并显示您的2个数据范围firstCol和secondCol。
  • 将它们放入查询中的"列中#34;通过选择每个并单击>按钮
  • 按下一步。将出现有关连接表的错误消息。只需忽略它并按OK即可。
  • 完成后,应该打开一个带有" Microsoft Query"的窗口。和一些数据。
  • 点击小按钮SQL,出现一个带有SQL查询的窗口
  • 在SQL语句中,用&替换2列之间的彗差。 (连接col1和col2的值)并添加WHERE条件,如之后的示例代码中所示。您可能需要根据命名列和范围的方式进行调整。

    SELECT FirstCol.Col1 & SecondCol.Col2
    FROM `C:\temp\Book1.xlsx`.FirstCol     FirstCol, 
         `C:\temp\Book1.xlsx`.SecondCol    SecondCol
    WHERE (FirstCol.Col1>'') AND (SecondCol.Col2>'')
    

通过在没有正确连接条件的情况下进行表的连接,您将执行SQL中已知的"笛卡尔积"该表的含义,意味着第一个表的每一行将与第二个表的每一行组合。如果你在FirstCol中有50行而在secondCol中有10行,你将在结果中完成500行......

当然,如果您有机会使用正确的数据库引擎,它可能会好得多,例如使用您在ORACLE DB中作为外部表加载的.csv文件 但是,这对我有用,但需要使用您的数据集进行测试,因为如果您有大量行,响应时间可能非常糟糕......

希望有所帮助

示例结果enter image description here