Excel VBA宏使用列标题ID名称连接两列

时间:2017-11-05 05:49:30

标签: excel vba excel-vba

我是通过VBA编写Excel宏的新手。我想在Excel工作表中连接两列。我在A,B和A列中有数据。 C和我想连接B& C列到D列。这是我写的代码:

Sub FINAL()
'
' FINAL Macro
'    
'    
Columns("D:D").Select
Selection.Insert Shift:=xlToRight
Range("D2").Select
ActiveCell.FormulaR1C1 = "SO::LI"
Range("D3").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=RC[-2]&""::""&RC[-1]"
Range("D3").Select

     Dim lastRow As Long
    lastRow = Range("C" & Rows.Count).End(xlUp).Row
    Range("D3").AutoFill Destination:=Range("D3:D" & lastRow)
End Sub

这很好用。但这只适用于我的数据在A,B和B列中。 C。 当数据在不同的列中时,例如E,F& G,这不起作用。

所以我想要的是使用列标题名称找到列并连接数据。

Style   S/O     L/I   
392389  265146   40
558570  300285   10
558570  300285   20

连接后:

Style   S/O    L/I       SO::LI
392389  265146  40  265146::40
558570  300285  10  300285::10
558570  300285  20  300285::20

3 个答案:

答案 0 :(得分:1)

你可以使用VBA中的工作表MATCH函数找到列标题,在这里我将它放入一个名为c1的变量

c1 = Application.WorksheetFunction.Match("S/O", Range("1:1"), 0)

最好将此标识包装在潜在的错误处理程序中,因为如果没有匹配则会出现运行时错误

If Application.WorksheetFunction.CountIf(Range("1:1"), "S/O") > 0 Then
    c1 = Application.WorksheetFunction.Match("S/O", Range("1:1"), 0)
Else
    MsgBox ("Couldn't find ""S/O"" header!")
    Exit Sub
End If

这里使用工作表函数COUNTIF确保至少有一个“S / O”实例 - 如果没有则子程序结束。

之后,您已经识别了S / O列,因此可以像往常一样继续使用其余代码 - 如果您假设列始终是连续的,那么您可以使用c1 + 1来表示“ L / I“列和c1 + 2表示CONCAT列

以下是代码的完整版本:

Private Sub CommandButton1_Click()

Dim c1 As Long
Dim lastRow As Long

' If instance of "S/O" exists then find the column number else show error message and end
If Application.WorksheetFunction.CountIf(Range("1:1"), "S/O") > 0 Then
    c1 = Application.WorksheetFunction.Match("S/O", Range("1:1"), 0)
Else
    MsgBox ("Couldn't find ""S/O"" header!")
    Exit Sub
End If

' Get last row for formula based on the "S/O" column header in c1
lastRow = Cells(Rows.Count, c1).End(xlUp).Row

' add 2 to c1 to make the c1 variable contain column number for SO::LI
c1 = c1 + 2

' use FormulaR1C1 as usual to flood the whole column from row 2 to lastRow
Range(Cells(2, c1).Address, Cells(lastRow, c1).Address).FormulaR1C1 = "=RC[-2]&""::""&RC[-1]"

End Sub

答案 1 :(得分:0)

使用FormulaR1C1非常有用

Sub mergeColumn()
    Dim col As Integer
    Dim tr As Long
    Application.ScreenUpdating = False

        On Error Resume Next
        col = Rows(1).Find(What:="S/O").Column
        On Error GoTo 0

        If col <> 0 Then ' if not found, it goes to 0
            tr = Cells(Rows.Count, col).End(xlUp).Row
            Range(Cells(1, col + 2), Cells(tr, col + 2)).Value = "=RC[-2] & ""::"" & RC[-1]"
        End If

    Application.ScreenUpdating = True
End Sub

答案 2 :(得分:0)

你可以尝试一下......

代码将在row2中找到标题并连接列。

Sub Final()
Dim FirstCell As Range, SecondCell As Range
Dim lr As Long, r As Long, c As Long

Application.ScreenUpdating = False

'Assuming that the Row2 is the Header Row, if not change it.
Set FirstCell = Rows(2).Find("S/O")
If FirstCell Is Nothing Then
    MsgBox "A column with the header S/O was not found.", vbExclamation
    Exit Sub
End If

Set SecondCell = Rows(2).Find("L/I")
If SecondCell Is Nothing Then
    MsgBox "A column with the header L/I was not found.", vbExclamation
    Exit Sub
End If

r = FirstCell.Row + 1
c = SecondCell.Column + 1

Set FirstCell = FirstCell.Offset(1)
Set SecondCell = SecondCell.Offset(1)


lr = Cells(Rows.Count, SecondCell.Column).End(xlUp).Row

Columns(c).Insert

Range(Cells(r, c), Cells(lr, c)).Formula = "=" & FirstCell.Address(0, 0) & "&""::""&" & SecondCell.Address(0, 0) & ""
Application.ScreenUpdating = True
End Sub