Excel宏用于使用分隔符连接可变长度的行

时间:2015-10-26 17:16:36

标签: excel vba excel-vba concatenation

我正在开发用户可以填写的工作表,以生成可以上传到SAP的文件。

工作表将生成单个条目的批量上传。将要求用户为他们请求的每个行项目提供属性,这可以根据所做的选择而变化(即,一行可以具有5个属性,而下一行可以具有7个属性)。

我想编写一个宏,它将从顶部开始查看每一行,并且只连接非空白的属性列(由每个实例中的两个其他列分隔)并在每个字段之间使用分隔符。

我已经能够使用我通过Microsoft找到的一些代码来完成循环(见下文),但我无法弄清楚如何在列空白时停止连接移到下一行。

Sub Submit()
Range("C2").Activate
Do While ActiveCell <> ""  

ActiveCell.Offset(0, 21).FormulaR1C1 = _
ActiveCell.Offset(0, 0) & "-" & ActiveCell.Offset(0, 3) & "-" & 

ActiveCell.Offset(0, 6) & "-" & ActiveCell.Offset(0, 9) & "-" & ActiveCell.Offset(0, 12) & "-" & ActiveCell.Offset(0, 15) & "-" & ActiveCell.Offset(0, 18)

ActiveCell.Offset(1, 0).Select

Loop
End Sub

现在,这段代码将采用五个属性输入并留下&#34; 1-2-3-4-5 - &#34;,当我真的希望它显示为&#34 ; 1-2-3-4-5&#34;

关于如何做到这一点的任何想法?最终,我希望能够存储这些字符串并将它们填充到新工作簿中,并从原始工作簿中复制其他一些信息。

2 个答案:

答案 0 :(得分:1)

未测试:

Sub Submit()

Dim c As Range, c2 As Range, v as String


Set c = Range("C2")
Do While c.Value <> ""  

    Set c2 = c
    v = ""
    Do While c2.value <> ""
        v = v & IIf(v <> "", "-", "") & c2.value
        Set c2 = c2.offset(0, 3)
    Loop
    c.offset(0, 21).Value = v

    Set c = c.Offset(1, 0) 

Loop
End Sub

答案 1 :(得分:0)

这是一个快速的答案,所以可能没有您之后的所有内容:

Public Function Submit(Target As Range) As String

    Dim sFinalOutput As String
    Dim rCell As Range

    'Cylce through each cell in your range.
    For Each rCell In Target

        'Look at the column number divided by 3 - if it's 0 then carry on.
        If rCell.Column Mod 3 = 0 Then
            If rCell.Value2 <> "" Then
                'Grab the value from the cell and add it to the final output.
                sFinalOutput = sFinalOutput & "-" & rCell.Value2
            End If
        End If
    Next rCell

    Submit = sFinalOutput

End Function

在公式中使用它,例如:=submit(C4:L4)