Страницы: 1
RSS
Функция сцепить с помощью макроса
 
Добрый день!
Помогите решить задачку с функцией сцепить. Только начинаю первые шоги изучения макроса, но что-то не то делаю.
Смысл такой чтобы соединить 2 строки C и E и вставить в столбец D. Сцеплять начинает с 2 строки и вниз до последней строки где есть текст.
Пытался что-то написать, но пока не особо получается. То код молчит и 0 внимания, то excel виснет и только (ctrl+alt+delete) другое не помогает.

Сильно не ругайте :)
Вот сам код
Код
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Integer
    Application.ScreenUpdating = False
  For i = 2 To Worksheet
    Cells(i, 4).Value = Cells(i, 3) & " " & Cells(i, 5)
  Next i
Application.ScreenUpdating = False
End Sub
 
может так:
Код
Sub join_str()
  Dim i As Integer, lr as Long
    lr = Cells(rows.count,3).end(xlup).row ' определяем последнюю ячейку в третьем столбце
    Application.ScreenUpdating = False
  For i = 2 To lr
    Cells(i, 4).Value = Cells(i, 3) & " " & Cells(i, 5)
  Next i
Application.ScreenUpdating = True
End Sub
Изменено: artemkau88 - 27.11.2022 12:37:25
 
artemkau88,
Спасибо, работает.
Но к сожаленью после запуска и непонятно почему, если через Private Sub Worksheet_Change(ByVal Target As Range) excel виснет и только (ctrl+alt+delete)

Если просто через Sub Stepiti() тогда все нормально.

По количеству строк было 200
Комп нормальный оперативка 16гб, видео 2гб
 
Олег, код нужно запускать из обычного модуля (insert -> module) (исправил сообщение выше). Модуль  Worksheet_Change(ByVal Target As Range) - это обработчик событий изменений ячейки Target на листе. Можно использовать, например, если нужно по событию изменения определенной ячейки сделать что-то.
Изменено: artemkau88 - 27.11.2022 12:39:58
 
artemkau88,
Я неправильно выразился.
Не когда запускаю макрос а когда сам макрос начинает обрабатывать страницу.
Хотел на автомате и избавится от формул и не писать в 50000 строках формулы, так как файл потом весить десятки мегабайт из-зи формул.
Конечно можно и через кнопку, но рука чешется автоматизировать все это :)
Изменено: Олег м - 27.11.2022 13:14:59
 
Цитата
написал:
Не когда запускаю макрос а когда сам макрос начинает обрабатывать страницу.
я так и понял.
Олег, Вы бы файл приложили. Думаю, что на массивах будет быстрее, чем обрабатывать такой массив значений напрямую через ячейки. Спасибо!
 
Сам файл
 
Олег м,  отключайте отслеживание событий на время работы макроса.
 
Олег, вариант:
Код
Sub join_cells()
Dim arr, i As Long, res() As String, j As Long, lr As Long, app
On Error GoTo errorH ' в случае ошибки выходим из процедуры
With Worksheets("Лист3") ' Лист3 - поменять на Ваш лист с таблицей
    ' определяем последнюю заполненную ячейку на листе Лист3
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    ' загружаем всю таблицу в массив
    arr = .Range("A2:E" & lr): j = 2 ' j - это счетчик для массива res(). _
    диапазон начинается с А2, то есть без шапки
    For i = LBound(arr, 1) To UBound(arr, 1) ' цикл по массиву arr
        ReDim Preserve res(2 To j) ' меняем размерность массива до j
        res(j) = arr(i, 3) & " " & arr(i, 5) ' записываем значение в массив
        j = j + 1 ' увеливчивваем счетчик на 1
    Next i
    
' отключаем отслеживание событий
app = Application.EnableEvents
' выгрузка результата на лист в столбец D, начиная со 2-й строки
    For i = 2 To lr
        .Cells(i, 4) = res(i)
    Next i
' включаем отслеживание событий
Application.EnableEvents = app
End With
Exit Sub
errorH:
End Sub
Код в module_1
Изменено: artemkau88 - 27.11.2022 16:08:33
 
artemkau88,  спасибо
Только вызывает ошибку макрос.

Там ошибка в конце кода.
errorH
заменил на
ErrH
Изменено: Олег м - 27.11.2022 15:14:25
 
Цитата
написал:
Там ошибка в конце кода.
Да, прошу прощения, опечатался. Исправил сообщение выше и перезалил файл.
Спасибо!
Страницы: 1
Наверх