2016-12-19 2 views
0

Так у меня есть несколько столбцов чисел, его переменной так что позволяет сказать 3 только для примераExcel-VBA перевод формат шрифта между ячейками через строки CONCAT

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 
+0

Я думаю, вам нужно будет использовать свойство Characters и вести запись того, что смело, когда вы идете (например, в массиве), поместить текст в ячейку, а затем пройти через массив, чтобы смелить соответствующие биты. – SJR

+0

Эй, спасибо. Как ни странно, у меня уже есть эти числа, хранящиеся как свойства в массиве пользовательских объектов (на самом деле есть два дополнительных свойства, связанных с каждым из этих значений) ... плохо вглядитесь в него. – Dan

+0

Мне также не хватает того, как первая ячейка, если полужирный, переносится. Скажем, ячейка B2 выделена жирным шрифтом, логика начинается с ячейки C2 и пропускается, но если я отрегулирую значение инициализации от i до 1, он устанавливает логику для начала в ячейке B2, а затем вставляет запятую перед ней в str1 ... так затем я повторно вставляю функцию MID перед форматированием, а затем первый символ первой ячейки при переносе не выделяется жирным шрифтом. Жаль, что с ним больше. – Dan

ответ

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 
+0

Dang. Множество вариантов. – Dan

+0

Я попытался принять оба ответа, потому что он выглядит lile, оба являются действительными решениями, но это только позволяет мне проверить thebforst. – Dan

+0

Никогда не видел переменную, объявленную таким образом, и не мог найти что-либо на ней. Что это? Диапазон? Что означает синтаксис? – Dan

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 
+0

Спасибо!Я тоже попробую это – Dan

+0

Я действительно подумал, что, возможно, был лучший способ сделать это с объектом Range, но по какой-то причине мне было легче создать собственный объект. Объект Range никогда не работает для меня ... или, по крайней мере, так, как я его понимаю. – Dan

+0

Я дал вам всплеск, но я не был достаточно долго, чтобы он мог рассчитывать. Вскоре, тогда плохой вернулся. – Dan

0

Так что мои комментарии arent появляются больше под вашим ответом @SJR. Так что, пожалуйста, добавьте сюда (я знаю, что я не предполагал, но, похоже, все это работает в данный момент, я извиняюсь). Я получил его для работы с небольшой настройкой.

Initialize я к 1 в начале (вскипание сдвигается, если вы не)

Затем добавить обратно в собственность Мид до С блока заявлений str1 = Mid (str1,2)

I сделал это, потому что я обнаружил, что первая ячейка была выделена жирным шрифтом, она не смела бы первыми наборами символов (но теперь это doea). Теперь у меня возникает другая проблема. Мне нужно иметь возможность установить все это в цикле в диапазоне переменных, потому что это произойдет где угодно от 5-15 раз в зависимости от того, сколько строк у меня есть. Я попытался использовать свойство cells в качестве ссылки на диапазон, к которой я всегда работал, но по какой-то причине он выдал ошибку «диапазон методов объекта object_global» в этой строке ... а иногда нет, но он все равно не сможет выделить строку соответственно.

Смежные вопросы