Excel 如何创建具有动态范围的textjoin工作表函数

Excel 如何创建具有动态范围的textjoin工作表函数,excel,vba,Excel,Vba,我有很多列标题的数据。其中一个标题为“文本”,另一个标题为“生效日期”。我希望将这些列之间的每一行中包含的值合并到另一列的行中 问题是这两个标题之间的列数不是恒定的。它随我导出的每个新分类账而变化。因此,我希望我的代码是动态的,它将标识“Text”列,然后标识“Value Date”列,并在另一列中按行组合所有内容 这就是我用代码实现的地方,但我不知道为什么它不起作用。我已经试了三天了,结果一无所获。当我运行这段代码时,得到的结果是“TextColumnNo:ValueColumnNo” 你需

我有很多列标题的数据。其中一个标题为“文本”,另一个标题为“生效日期”。我希望将这些列之间的每一行中包含的值合并到另一列的行中

问题是这两个标题之间的列数不是恒定的。它随我导出的每个新分类账而变化。因此,我希望我的代码是动态的,它将标识“Text”列,然后标识“Value Date”列,并在另一列中按行组合所有内容

这就是我用代码实现的地方,但我不知道为什么它不起作用。我已经试了三天了,结果一无所获。当我运行这段代码时,得到的结果是“TextColumnNo:ValueColumnNo”


你需要2个循环来完成这个。一个循环遍历所有行,一个循环遍历列以合并每行的文本

请注意,您需要在此处调整一些内容,如图纸名称和输出列

Option Explicit

Public Sub TextJoin()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1") 'define a worksheet

    'find start
    Dim FindStart As Range
    Set FindStart = ws.Rows(1).Find("Text")
    If FindStart Is Nothing Then
        MsgBox "start not found"
        Exit Sub
    End If

    'find end
    Dim FindEnd As Range
    Set FindEnd = ws.Rows(1).Find("Value Date")
    If FindEnd Is Nothing Then
        MsgBox "start not found"
        Exit Sub
    End If

    'find last used row in column A
    Dim lRow As Long
    lRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row


    Dim iRow As Long
    For iRow = 2 To lRow 'loop through all rows (2 to last used row)
        Dim CombinedText As String
        CombinedText = vbNullString 'initialize/reset variable

        Dim iCol As Long 'loop through columns for each row (from start to end column)
        For iCol = FindStart.Column To FindEnd.Column
            CombinedText = CombinedText & ":" & ws.Cells(iRow, iCol).Text 'combine values
        Next iCol

        ws.Range("Z" & iRow) = CombinedText 'write values in column Z
    Next iRow
End Sub

我建议你阅读:这对初学者非常有帮助。我读过。谢谢你的推荐。将来我会尽量避免任何选择或活动的,以使我的代码更有效。嗨,佩赫!你的代码工作得很完美。我对你的代码做了一个修改,使它非常适合我使用<代码>设置FindEnd=ws.Rows(1).Find(“值日期”).Offset(0,-1)。我在这行中添加了
Offset(0,-1)
,因为我想合并“值日期”之前的列的值。我还有一件事要问,这将彻底解决我的问题。目前,列“Z”是硬编码的,用于显示CombinedText值,但我希望CombinedText应显示在紧靠“ValueDate”的列中,因为列Z在不同的表格中可能包含不同的值。非常感谢您的帮助。@Mayank但如果找不到“生效日期”,您的版本将抛出异常。最好将该
行保持原样,并在此处将iCol=FindStart.Column的
更改为FindEnd.Column-1
您可以将
ws.Range(“Z”&iRow)=
更改为
ws.Cells(iRow,FindEnd.Column-1)=
以在“ValueDate”之前写入列中。@Peh谢谢。现在它工作得很好。通过理解您的代码,我学到了很多。@Mayank然后请将此答案标记为解决方案。所以每个人都知道这已经解决了。@Peh抱歉!我不知道这个选择。
Sub TextJoin()


Dim ColRefText As Long
Dim ColRefValueDate As Long
Const firstcol = "Text"
Const secondcol = "Value Date"
Dim r As Range
Set r = Rows(1).Cells.Find(firstcol)
If Not r Is Nothing Then
  ColRefText = r.Column
    Set r = Rows(1).Cells.Find(secondcol)
    If Not r Is Nothing Then
         ColRefValueDate = r.Column
    End If
End If
If ColRefValueDate + ColRefText > 0 Then
With Cells(2, Worksheets(1).Columns.Count).End(xlToLeft).Offset(0, 1)
    .Formula = Replace("=" & Cells(2, ColRefText).AddressLocal & "&" & Cells(2, ColRefValueDate).AddressLocal, "$", "")
    .Copy Range(.Address, Cells(ActiveSheet.UsedRange.Rows.Count, .Column).Address)
End With
End If
End Sub
Option Explicit

Public Sub TextJoin()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1") 'define a worksheet

    'find start
    Dim FindStart As Range
    Set FindStart = ws.Rows(1).Find("Text")
    If FindStart Is Nothing Then
        MsgBox "start not found"
        Exit Sub
    End If

    'find end
    Dim FindEnd As Range
    Set FindEnd = ws.Rows(1).Find("Value Date")
    If FindEnd Is Nothing Then
        MsgBox "start not found"
        Exit Sub
    End If

    'find last used row in column A
    Dim lRow As Long
    lRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row


    Dim iRow As Long
    For iRow = 2 To lRow 'loop through all rows (2 to last used row)
        Dim CombinedText As String
        CombinedText = vbNullString 'initialize/reset variable

        Dim iCol As Long 'loop through columns for each row (from start to end column)
        For iCol = FindStart.Column To FindEnd.Column
            CombinedText = CombinedText & ":" & ws.Cells(iRow, iCol).Text 'combine values
        Next iCol

        ws.Range("Z" & iRow) = CombinedText 'write values in column Z
    Next iRow
End Sub