连接字符串的 VBA 问题

Posted

技术标签:

【中文标题】连接字符串的 VBA 问题【英文标题】:VBA Problems with Concatenating String 【发布时间】:2017-02-07 10:30:19 【问题描述】:

我正在尝试分配您在此处ws4 的 E 和 F 列中看到的每个 ID...

...分别在我的wsOutput 的 K 列和 L 列中的相应 ID。

我的代码在没有错误的情况下运行,但没有任何反应。这是我的第一个项目之一,所以如果这是直截了当的问题,我深表歉意。

我也上网查了一下,发现:

http://answers.microsoft.com/en-us/msoffice/forum/msoffice_excel-mso_windows8/how-to-concatenate-multiple-rows-by-the-condition/fdd048ba-5405-4e53-b463-125f9cde2c0c?auth=1

http://www.eileenslounge.com/viewtopic.php?f=27&t=12298

但是,我无法让他们的方法奏效。

非常感谢任何帮助!

'Previous Code
'wsOutput -> Filter Sheet - Worksheet (TARGET) ; ws4 = Search Skills - Worksheet (SOURCE)
Dim separator As String, PreviousResultCG As String, NewResultCG As String, PreviousResultCategory As String, NewResultCategory As String

If separator = "" Then separator = " , "

'lRowInput = ws4.Range("A" & Rows.Count).End(xlUp).row - from above
lRowOutput = wsOutput.Range("A4:A" & Rows.Count).End(xlDown).row


With ws4

    'For each ID on the Source-Worksheet
    For Each ID In .Range("A2:A" & lRowInput)

        'Find the respective ID on Target-Worksheet
        Set FindID = wsOutput.Range("A4:A" & lRowOutput).Find(what:=ID, LookIn:=xlValues, lookat:=xlWhole)

        'Get all CG ID's for the supplier and add them to previously found ID's of that supplier
        If FindID = ID Then

            PreviousResultCG = wsOutput.Range("K" & FindID.row).value

            NewResultCG = PreviousResultCG & separator & .Range("E" & ID.row)

            wsOutput.Range("K" & ID.row).value = NewResultCG


            PreviousResultCategory = wsOutput.Range("L" & FindID.row).value

            NewResultCategory = PreviousResultCategory & separator & .Range("F" & ID.row)

            wsOutput.Range("L" & FindID.row).value = NewResultCategory

        End If

    Next ID

End With

【问题讨论】:

我敢打赌这是 XL?为什么不直接使用 VLOOKUP? 感谢您的回答。这是Excel,是的。我不知道 vlookup 将如何解决我的问题。但是,正如我上面所暗示的,我是 VBA 的初学者。 VLOOKUP 是 Excel 中的内置函数,可让您执行上述操作。除非你有其他要求,我建议你先试试内置功能。 “其他要求”是什么意思?我唯一的问题是输入工作表不是固定的,而是在单击按钮时重新填充。另外:每次输入的数量都会有所不同。这就是我尝试将其自动化的原因。 哦,VLOOKUP 不会将所有不同的 ID 放入一个单元格中,对吧? 【参考方案1】:

将源数据放在名为“source”的工作表中,然后创建另一个工作表,您要在其中从名为“target”的源数据中查找值。保留图片中显示的列。

将下面提到的代码粘贴到模块中。

Sub look_values()

Dim id, source_id As Range
Dim data_row_num, id_row_num As Long
Dim source_sheet, target_sheet As Worksheet
Dim cg, cat As String

Set source_sheet = ThisWorkbook.Sheets("source")
Set target_sheet = ThisWorkbook.Sheets("target")
Set id = target_sheet.Range("A2")

Do Until id.Value = ""

    source_sheet.Activate
    Range("A1").Activate
    Set source_id = Range("A:A").Find(what:=id.Value, LookIn:=xlValues, lookat:=xlWhole)
    On Error Resume Next
    cg = Cells(source_id.Row, 5).Value
    On Error Resume Next
    cat = Cells(source_id.Row, 6).Value
    target_sheet.Activate
    Cells(id.Row, 11).Value = cg
    Cells(id.Row, 12).Value = cat
    Set id = id.Offset(1, 0)
Loop

End Sub

在运行宏之前,请确保两个工作表上 ID 列的格式相同。将建议您首先清理和修剪 ID 列。因为在图像中可以看到目标工作表中的 ID 列有无法识别的字符。

【讨论】:

以上是关于连接字符串的 VBA 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 VBA 更新 Excel 工作簿 Web 查询连接字符串?

将变量连接成字符串以设置为 VBA 中的范围

VBA中字符串连接/字符串拼接中“&”和“+”的区别

连接 VBA SQL 语句中的字段时出现错误 424

在 MS Access/VBA 中使用 ADO 连接对话框

通过 Excel VBA 的 DB2 ODBC 连接