Доброго дня. Столкнулся с проблемой. Есть необходимость сцепить ячейки с сохранением форматирования, а именно подстрочных букв. Формула сцепить, как понял, для этого бесполезна. Прошу помочь решить задачу. В макросах не очень разбираюсь. Спасибо.
Доброго дня. Столкнулся с проблемой. Есть необходимость сцепить ячейки с сохранением форматирования, а именно подстрочных букв. Формула сцепить, как понял, для этого бесполезна. Прошу помочь решить задачу. В макросах не очень разбираюсь. Спасибо.NIC
Макрос сделан для файла из поста 1 - результат вставляется в столбец G. Если данных много, то макрос будет медленно работать, т.к. в ячейках, в которых есть подстрочные символы, анализируется каждый символ, а это очень медленно. [vba]
Код
Sub Макрос()
Dim arrSrc() Dim lr As Long, i As Long, j As Long, charSrc As Long, charRes As Long
Application.ScreenUpdating = False
lr = Columns("G").Find(What:="*", LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False _ , SearchFormat:=False).Row If lr > 1 Then Range("G2:G" & lr).Value = Empty End If
For i = 2 To UBound(arrSrc) charRes = 0 Cells(i, "G").Value = arrSrc(i, 1) & arrSrc(i, 2) & arrSrc(i, 3) & arrSrc(i, 4) For j = 1 To 4 If IsNull(Cells(i, j).Font.Subscript) = True Then For charSrc = 1 To Cells(i, j).Characters.Count charRes = charRes + 1 If Cells(i, j).Characters(charSrc, 1).Font.Subscript = True Then Cells(i, "G").Characters(charRes, 1).Font.Subscript = True End If Next Else charRes = charRes + Cells(i, j).Characters.Count End If Next Next
Application.ScreenUpdating = True
MsgBox "Готово!", vbInformation
End Sub
[/vba]
Макрос сделан для файла из поста 1 - результат вставляется в столбец G. Если данных много, то макрос будет медленно работать, т.к. в ячейках, в которых есть подстрочные символы, анализируется каждый символ, а это очень медленно. [vba]
Код
Sub Макрос()
Dim arrSrc() Dim lr As Long, i As Long, j As Long, charSrc As Long, charRes As Long
Application.ScreenUpdating = False
lr = Columns("G").Find(What:="*", LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False _ , SearchFormat:=False).Row If lr > 1 Then Range("G2:G" & lr).Value = Empty End If
For i = 2 To UBound(arrSrc) charRes = 0 Cells(i, "G").Value = arrSrc(i, 1) & arrSrc(i, 2) & arrSrc(i, 3) & arrSrc(i, 4) For j = 1 To 4 If IsNull(Cells(i, j).Font.Subscript) = True Then For charSrc = 1 To Cells(i, j).Characters.Count charRes = charRes + 1 If Cells(i, j).Characters(charSrc, 1).Font.Subscript = True Then Cells(i, "G").Characters(charRes, 1).Font.Subscript = True End If Next Else charRes = charRes + Cells(i, j).Characters.Count End If Next Next
Karataev, Что то не работает, вставил в исходный текст макрос и ни чего не происходит, не силен в макросах, может что то не так делаю. А соединять должен автоматом при заполнении ячеек?
Karataev, Что то не работает, вставил в исходный текст макрос и ни чего не происходит, не силен в макросах, может что то не так делаю. А соединять должен автоматом при заполнении ячеек?NIC
Karataev, спасибо, работает, наверное надо было сразу спросить, а что нужно добавить в макрос, чтобы были пробелы между содержимым ячеек, а то каша получается? СПАСИБО
Karataev, спасибо, работает, наверное надо было сразу спросить, а что нужно добавить в макрос, чтобы были пробелы между содержимым ячеек, а то каша получается? СПАСИБОNIC
Dim arrSrc() Dim lr As Long, i As Long, j As Long, charSrc As Long, charRes As Long
Application.ScreenUpdating = False
lr = Columns("G").Find(What:="*", LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False _ , SearchFormat:=False).Row If lr > 1 Then Range("G2:G" & lr).Value = Empty End If
For i = 2 To UBound(arrSrc) charRes = 0 Cells(i, "G").Value = arrSrc(i, 1) & " " & arrSrc(i, 2) & " " & arrSrc(i, 3) & " " & arrSrc(i, 4) For j = 1 To 4 If IsNull(Cells(i, j).Font.Subscript) = True Then For charSrc = 1 To Cells(i, j).Characters.Count charRes = charRes + 1 If Cells(i, j).Characters(charSrc, 1).Font.Subscript = True Then Cells(i, "G").Characters(charRes, 1).Font.Subscript = True End If Next charRes = charRes + 1 Else charRes = charRes + Cells(i, j).Characters.Count + 1 End If Next Next
Application.ScreenUpdating = True
MsgBox "Готово!", vbInformation
End Sub
[/vba]
[vba]
Код
Sub Соединить()
Dim arrSrc() Dim lr As Long, i As Long, j As Long, charSrc As Long, charRes As Long
Application.ScreenUpdating = False
lr = Columns("G").Find(What:="*", LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False _ , SearchFormat:=False).Row If lr > 1 Then Range("G2:G" & lr).Value = Empty End If
For i = 2 To UBound(arrSrc) charRes = 0 Cells(i, "G").Value = arrSrc(i, 1) & " " & arrSrc(i, 2) & " " & arrSrc(i, 3) & " " & arrSrc(i, 4) For j = 1 To 4 If IsNull(Cells(i, j).Font.Subscript) = True Then For charSrc = 1 To Cells(i, j).Characters.Count charRes = charRes + 1 If Cells(i, j).Characters(charSrc, 1).Font.Subscript = True Then Cells(i, "G").Characters(charRes, 1).Font.Subscript = True End If Next charRes = charRes + 1 Else charRes = charRes + Cells(i, j).Characters.Count + 1 End If Next Next
Karataev, Спасибо, ещё вопрос. А что нужно в этом коде заменить, если мне нужно будет соеденить ячейки из 5 или 6 и более столбцов. Сам сижу ковыряю, никак не получается. СПАСИБО
Karataev, Спасибо, ещё вопрос. А что нужно в этом коде заменить, если мне нужно будет соеденить ячейки из 5 или 6 и более столбцов. Сам сижу ковыряю, никак не получается. СПАСИБОNIC
Результат нужно обязательно выводить справа от данных? Или можно создать новый пустой лист и вставить результат в столбец A? Если вставлять справа, то нужно как-то понять, является ли последний столбец данными или результатом от предыдущего запуска макроса. Можно в этом случае по заголовку ориентироваться - макрос будет вставлять какой-нибудь заголовок.
Результат нужно обязательно выводить справа от данных? Или можно создать новый пустой лист и вставить результат в столбец A? Если вставлять справа, то нужно как-то понять, является ли последний столбец данными или результатом от предыдущего запуска макроса. Можно в этом случае по заголовку ориентироваться - макрос будет вставлять какой-нибудь заголовок.Karataev
Karataev, результат можно выводить на другой лист в книге, но главное чтобы была возможность добавлять столбы и соединять их в одну ячейку, я так понимаю можно сделать лист, в котором будет соединена вся строка, из ячеек содержащий текст!?
Karataev, результат можно выводить на другой лист в книге, но главное чтобы была возможность добавлять столбы и соединять их в одну ячейку, я так понимаю можно сделать лист, в котором будет соединена вся строка, из ячеек содержащий текст!?NIC
Т.к. данные нужно объединять не из всех столбцов (в файле примере в конце два столбца, не участвующих в объединении), то тогда такой вариант - после запуска макроса укажите количество столбцов, начиная со столбца "A", которые надо объединить. [vba]
Код
Sub Соединить()
Dim shSrc As Worksheet, arrSrc(), shRes As Worksheet, arrRes() Dim lr As Long, lc, var Dim i As Long, j As Long, charSrc As Long, charRes As Long
lc = InputBox("Укажите количество столбцов, которые надо объединить:") If lc = "" Then Exit Sub End If lc = CLng(lc)
Application.ScreenUpdating = False
Set shSrc = ActiveSheet Set shRes = Worksheets.Add(After:=shSrc)
For i = 2 To UBound(arrSrc) charRes = 0 var = Empty For j = 1 To UBound(arrSrc, 2) var = var & arrSrc(i, j) Next shRes.Cells(i, "A").Value = var For j = 1 To UBound(arrSrc, 2) If IsNull(shSrc.Cells(i, j).Font.Subscript) = True Then For charSrc = 1 To shSrc.Cells(i, j).Characters.Count charRes = charRes + 1 If shSrc.Cells(i, j).Characters(charSrc, 1).Font.Subscript = True Then shRes.Cells(i, "A").Characters(charRes, 1).Font.Subscript = True End If Next Else charRes = charRes + shSrc.Cells(i, j).Characters.Count End If Next Next
Т.к. данные нужно объединять не из всех столбцов (в файле примере в конце два столбца, не участвующих в объединении), то тогда такой вариант - после запуска макроса укажите количество столбцов, начиная со столбца "A", которые надо объединить. [vba]
Код
Sub Соединить()
Dim shSrc As Worksheet, arrSrc(), shRes As Worksheet, arrRes() Dim lr As Long, lc, var Dim i As Long, j As Long, charSrc As Long, charRes As Long
lc = InputBox("Укажите количество столбцов, которые надо объединить:") If lc = "" Then Exit Sub End If lc = CLng(lc)
Application.ScreenUpdating = False
Set shSrc = ActiveSheet Set shRes = Worksheets.Add(After:=shSrc)
For i = 2 To UBound(arrSrc) charRes = 0 var = Empty For j = 1 To UBound(arrSrc, 2) var = var & arrSrc(i, j) Next shRes.Cells(i, "A").Value = var For j = 1 To UBound(arrSrc, 2) If IsNull(shSrc.Cells(i, j).Font.Subscript) = True Then For charSrc = 1 To shSrc.Cells(i, j).Characters.Count charRes = charRes + 1 If shSrc.Cells(i, j).Characters(charSrc, 1).Font.Subscript = True Then shRes.Cells(i, "A").Characters(charRes, 1).Font.Subscript = True End If Next Else charRes = charRes + shSrc.Cells(i, j).Characters.Count End If Next Next
Указывать нужно только столбцы, которые участвуют в объединении, Вы наверное указали еще и столбцы с числами, которые находятся в файле примере в конце. Ошибка возникает, если в ячейке находится нетекст.
Указывать нужно только столбцы, которые участвуют в объединении, Вы наверное указали еще и столбцы с числами, которые находятся в файле примере в конце. Ошибка возникает, если в ячейке находится нетекст.Karataev
Все столбцы надо сцепливать или какие-то не надо? Например, изначально в Вашем задании надо было сцепить из шести столбцов только первые четыре.
Все столбцы надо сцепливать или какие-то не надо? Например, изначально в Вашем задании надо было сцепить из шести столбцов только первые четыре.Karataev
Dim shSrc As Worksheet, arrSrc(), shRes As Worksheet, arrRes() Dim lr As Long, lc As Long, var Dim i As Long, j As Long, charSrc As Long, charRes As Long
Application.ScreenUpdating = False
Set shSrc = ActiveSheet Set shRes = Worksheets.Add(After:=shSrc)
For j = 1 To UBound(arrSrc, 2) If arrSrc(i, j) <> Empty Then var = var & arrSrc(i, j) & " " End If Next var = Left(var, Len(var) - 1) shRes.Cells(i, "A").Value = var
For j = 1 To UBound(arrSrc, 2) If arrSrc(i, j) <> Empty Then If IsNull(shSrc.Cells(i, j).Font.Subscript) = True Then For charSrc = 1 To shSrc.Cells(i, j).Characters.Count charRes = charRes + 1 If shSrc.Cells(i, j).Characters(charSrc, 1).Font.Subscript = True Then shRes.Cells(i, "A").Characters(charRes, 1).Font.Subscript = True End If Next Else charRes = charRes + Len(CStr(shSrc.Cells(i, j).Value)) + 1 End If End If Next Next
Dim shSrc As Worksheet, arrSrc(), shRes As Worksheet, arrRes() Dim lr As Long, lc As Long, var Dim i As Long, j As Long, charSrc As Long, charRes As Long
Application.ScreenUpdating = False
Set shSrc = ActiveSheet Set shRes = Worksheets.Add(After:=shSrc)
For j = 1 To UBound(arrSrc, 2) If arrSrc(i, j) <> Empty Then var = var & arrSrc(i, j) & " " End If Next var = Left(var, Len(var) - 1) shRes.Cells(i, "A").Value = var
For j = 1 To UBound(arrSrc, 2) If arrSrc(i, j) <> Empty Then If IsNull(shSrc.Cells(i, j).Font.Subscript) = True Then For charSrc = 1 To shSrc.Cells(i, j).Characters.Count charRes = charRes + 1 If shSrc.Cells(i, j).Characters(charSrc, 1).Font.Subscript = True Then shRes.Cells(i, "A").Characters(charRes, 1).Font.Subscript = True End If Next Else charRes = charRes + Len(CStr(shSrc.Cells(i, j).Value)) + 1 End If End If Next Next