【问题标题】:Merging text in two columns合并两列中的文本
【发布时间】:2016-09-01 07:31:33
【问题描述】:

如何在我的电子表格的两列中查找和合并文本并删除第二列?

第一个标题为 Postnr,第二个标题为 Postort。我想将这些列中的文本与原始文本之间的两个空格合并。

示例

| Postnr | Postort    |
| 752 65 | Gothenburg |

我运行代码后的结果:

Postaddress
752 65  Gothenburg

我的代码来查找和选择Postnr

Dim rngPostnr As Range
Set rngPostnr = Range("A1:Z1").Find("Postnr")
Range(rngPostnr, rngPostnr.End(xlDown)).Select

我知道如何在工作表中执行此操作,但我想要一个宏,因为我每天要执行很多次。

我不想手动定位和标记这些列,因为我的工作表有很多列。

我需要一个宏来定位列并将它们连接并删除它们并使用连接值创建一个新列,最好使用标题 Postaddress。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    我知道您不知道该列的位置(但它在第一行)。

    第一行的第一次迭代将为您找到列,然后迭代每个找到的列号的值,构建新字符串并将其写入第 10 列(或任何其他列)。您可以根据需要添加更多逻辑,例如,何时停止迭代(当一个 lastRow 大于另一个时,等等......)

    这是您以后可以扩展的基本工作代码:

    Sub findAndConcat()
    
    'last column with data
    lColumn = Cells(1, Columns.Count).End(xlToLeft).Column
    
    'find Postnr and Postort columns
    For i = 1 To lColumn
        If Cells(1, i) = "Postnr" Then
            PostnrColumn = i
            'Convert from column number to column letter
            PostnrColumnName = Split(Cells(, PostnrColumn).Address, "$")(1)
        End If
        If Cells(1, i) = "Postort" Then
            PostortColumn = i
            PostortColumnName = Split(Cells(, PostortColumn).Address, "$")(1)
        End If
    Next i
    
    Dim PostnrValue As String
    Dim PostortValue As String
    Dim newString As String
    
    'last row with data per column
    PostnrLastRow = ActiveSheet.Cells(Rows.Count, PostnrColumnName).End(xlUp).Row
    PostortLastRow = ActiveSheet.Cells(Rows.Count, PostortColumnName).End(xlUp).Row
    
    'Iterating the columns rows and building the new concatinated string 
    For i = 2 To PostnrLastRow
        PostnrValue = Cells(i, PostnrColumn).Value
        PostortValue = Cells(i, PostortColumn).Value
        newString = PostnrValue & "  " & PostortValue
        ActiveSheet.Cells(i, 10).Value = newString
    Next i
    
    End Sub
    

    结果如下:

    【讨论】:

    • @Heresh 不客气,如果它解决了您的问题,请接受答案(为此,以及未来的答案;))。
    • 我收到此错误 1004:应用程序定义或对象定义错误,关于行 PostnrLastRow = ActiveSheet.Cells(Rows.Count, PostnrColumnName).End(xlUp).Row
    • @Heresh 需要在数据所在的工作表中(代码中使用ActiveSheet),然后运行代码。如果您希望它从任何工作表运行,只需定义和设置工作表并使用它而不是 ActiveSheet。现在,只需选择具有 PostrPostort 相关列的工作表,然后运行代码。
    • 我将包含代码的模块从我的 personal.xlsb 复制到 actvie 工作表,但仍然出现相同的错误。
    • 它现在运行没有错误,但我没有找到结果列,我正在寻找我错过的更多内容。 :-)
    【解决方案2】:

    如果您想在工作表内执行此操作,则应在配方谷仓中使用如下所示的连接:=CONCATENATE(A2;" ";B2)

    如果你想在 vba 中实现这一点,你必须使用类似以下的东西:

    ActiveCell.Offset(0, 3).Value = ActiveCell.Value & " " & ActiveCell.Offset(0, 1).Value
    

    其中 activecell (Postnr) 是第一个单元格,下一个单元格(偏移量 0,1|Postort)是您要连接的第二部分,结果将进一步向下插入到新列中。

    编辑:这是理解给出的示例的结果:

    编辑2:因为你的问题不够清楚,我会添加另一种方式。也许您想将第二列“添加”到第一列(将列合并为一个)。 您只能使用 vba 来做到这一点。

    你必须这样做:

    ActiveCell.Value = ActiveCell.Value & " " & ActiveCell.Offset(0, 1).Value
    

    【讨论】:

      【解决方案3】:

      我知道如何在工作表中执行此操作,但我希望有一个宏来执行此操作,因为我每天要执行很多次。

      我也了解您的 vba,但要使其正常工作,我需要标记单元格,或者它是否自行定位 postnr 和 postadress 列。我不想自己定位和标记这些列,因为这很耗时,因为我的工作表有很多列。你明白我的意思吗?

      我需要一个宏来定位列并将它们连接并删除它们并使用连接值创建一个新列,最好使用标题 Postaddress

      【讨论】:

      • 请看我的回答,它会自行定位您的列,无需标记任何内容。此外,您发布的文本应作为对问题或问题本身的评论添加,它不是答案,不应作为答案发布。
      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 2013-10-23
      相关资源
      最近更新 更多