Excel-VBA通过字符串concat

时间:2016-12-19 16:14:54

标签: excel-vba vba excel

所以我有几列数字,它的变量让我们说3只是例如

Column B  Column C   Column D
**520**   600        **550**

基于其他过程,我们可以说列A和列C都是粗体。我想将它们连接成一个单元格并保持粗体格式,如下所示:

Column A
**520**,600,**550** 

这将在可变数量的行上重复,一些列有两个粗体,一些粗体,一些没有。

任何人都可以通过简单的方式获得大胆的格式吗?我得到了字符串cat并写入新单元格,但我不知道如何将格式添加到新的连接单元格。下面的代码只是内部循环,为了简单起见,我使用2作为单行而不是变量。

下面是我对内循环的看法,粗体没有贯彻:

Sub OneCell()

Dim i as Integer         'column number
Dim str1 as String       'String storage

i = 2                    'initialize col num
str1 = Cells(2, i).value 'initialize str1

'Outer loop
Do
    '....code for outer loop iterating rows

    'Inner loop to concatenate values into one string
    Do
        str1 = str1 & "," & Cells(2,i+1).Value
        i = i + 1
    Loop until Cells(2,i+1).Value = ""

    'Put concatenated string in cell(2,1)
    Cells(2,1).Value = str1

Loop Until 'some condition of rows is met

End Sub

3 个答案:

答案 0 :(得分:1)

我之前只是张贴过这个,因为我刚开始这么做,然后被牵制了。

Sub OneCell()

Dim i As Integer         'column number
Dim str1 As String       'String storage
Dim v(1 To 100, 1 To 3)  'the 100 limit is arbitrary
Dim j As Long

i = 2                    'initialize col num
str1 = Cells(2, i).Value 'initialize str1

Do
    If Cells(2, i + 1).Font.Bold Then
        j = j + 1
        v(j, 1) = 1
        v(j, 2) = Len(str1) + 2
        v(j, 3) = Len(Cells(2, i + 1))
    Else
        j = j + 1
        v(j, 1) = 0
    End If
    str1 = str1 & "," & Cells(2, i + 1).Value
    i = i + 1
Loop Until Cells(2, i + 1).Value = ""

With Cells(2, 1)
    .NumberFormat = "@"
    .font.bold=false
    .Value = str1
End With

For i = 1 To j
    If v(i, 1) = 1 Then
         Range("A2").Characters(v(i, 2), v(i, 3)).Font.Bold = True
    End If
Next i

End Sub

答案 1 :(得分:0)

这实际上比我想象的要复杂一些,但我确实找到了一种让它工作的方法(换句话说,我测试了代码)。可能有一种更有效的方法,但这种方法适用于3单元格范围选择。您需要修改范围以适合您的程序。

Sub ConcatWithBold()

Dim str1 As String

'first build string and identify bolded cells with *
Dim c As Range
For Each c In Selection

    If c.Font.Bold = True Then

        str1 = str1 & "," & "*" & c.Value

    Else

        str1 = str1 & "," & c.Value

    End If

Next

str1 = Mid(str1, 2) 'to remove first comma

Dim iCnt As Integer
For iCnt = 1 To Len(str1)

    If Mid(str1, iCnt, 1) = "*" Then

        'it's a bolded cell so make next 3 characters bold
        With Selection.Cells(1, 1).Offset(1)
            .Characters(iCnt, 3).Caption = Mid(str1, iCnt + 1, 3) 'set characters (add 1 to iCnt to skip asterik marking bold)
            .Characters(iCnt - 1, 3).Font.Bold = True 'make bold (-1 to include first character)
            iCnt = iCnt + 3 'jump to next comma
        End With

    Else

        With Selection.Cells(1, 1).Offset(1)
            .Characters(iCnt, 1).Caption = Mid(str1, iCnt, 1)
            .Characters(iCnt - 1, 1).Font.Bold = False '(-1 to include character just set
        End With

    End If


Next

End Sub

答案 2 :(得分:0)

所以我的评论不再出现在你的答案之下,@ SRJ。所以生病添加在这里(我知道我不应该,但似乎所有那些工作此刻,我道歉)。我通过一些调整得到了它。

在开始时将i初始化为1(如果你没有,则会移动粗体)

然后在With块语句之前添加一个Mid属性 STR1 =中(str1,2)

我之所以这样做,是因为我发现第一个单元格是否是粗体,它不会加粗第一组字符(但它现在就是doea)。现在我遇到了另一个问题。我需要能够在一个可变范围内循环设置整个事物,因为这将发生在5-15次的任何地方,具体取决于我有多少行。我尝试使用cells属性作为范围引用,我之前总是先工作但由于某种原因它给对象_global的"方法范围失败"该行上的错误...有时候没有,但它仍然无法正确地加粗字符串。