Excel VBA: поиск по определенному признаку и склеивание строк.

Автор Salsaz, 07 мая 2016, 09:01

Salsaz

Здравствуйте уважаемые форумчане. У меня такой вопрос.

Имеется 2 строки:
1)  79.5.
2)  Хандогина Ксения Николаевна  000  0000  000
Таких строк во всём файле неопределенное количество. Их нужно найти и склеить. Я думал организовать поиск по определенному признаку. Только не знаю как это сделать. Число всегда на строку выше текста.

Должно выглядеть так:
1) 79.5.Хандогина Ксения Николаевна  000  0000  000

Заранее большое спасибо.



Администратор

Нужны два файла-примеры (или можно сделать на двух листах в одном файле):
первый файл-пример - это как файл выглядит изначально;
второй файл-пример - как файл выглядит после работы макроса.

В файле можете оставить небольшое кол-во строк: столько, чтобы можно было сделать макрос.
Структура файлов должна быть реальной, т.к. в дальнейшем вы может быть не сможете самостоятельно изменить макрос под свой реальный файл, т.к. вам может не хватить программистического опыта.

Salsaz

Вот 2 примера.

[вложение удалено администратором]

Администратор

Напишите, как вы открываете csv-файл в экселе. Есть разные способы и в этих способах разный результат.
Или чтобы не обсуждать csv-файлы, выложите на форуме файлы в эксель-формате.

Salsaz

Если честно, я даже не задумывался о нескольких способах открытия. Я просто двойным кликом по иконке файла и всё. Автоматически в Excel открывается.

[вложение удалено администратором]

Администратор

Макрос
Sub Макрос1()

    Dim rng_empty As Range, ar As Range, lr As Long
   
   
    '1. Отключение монитора.
    Application.ScreenUpdating = False
   
    '2. Vba-именование строк, у которых пусто в столбце F.
    lr = Columns("F").Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
    Set rng_empty = Range("F1:F" & lr).SpecialCells(xlCellTypeBlanks).EntireRow
   
    ' Цикл по пустым строкам.
    For Each ar In rng_empty.Areas
        '3. Копирование номера из пустой строки в нижнюю строку.
        ar.Cells(2, 1).Value = ar.Cells(1, 1).Value & ar.Cells(2, 1).Value
        '4. Удаление пустой строки.
        ar.Delete
    Next ar

    '5. Включение монитора.
    Application.ScreenUpdating = True
   
    '6. Сообщение.
    MsgBox "Готово.", vbInformation

End Sub
[свернуть]

По поводу csv-файлов. Csv-файл в экселе можно открыть тремя способами. И в каждом способе есть свои особенности, влияющие на то, как будет отображаться csv-файл в экселе.

Salsaz

Огромное спасибо. Вы меня спасли. Буду изучать.

Salsaz

У меня возник еще вопрос.
А можно ли сделать исключения?
К примеру, если вначале строки стоит "какая-нибудь буква, а не цифра", то её пропустить и приступить к следующей.
Просто я не подумал, когда скидывал файл. В данной таблице еще присутствуют заголовки. И при проверке столбца F на наличие пустых ячеек, значений он не находит и удаляет заголовки.

Администратор

Лучше выложите файл-пример, где есть заголовок.
Для написания макроса нужно оставлять в файле столько данных, сколько необходимо для написания макроса.

Salsaz

Прошу прощения. Вот пример с заголовками.

[вложение удалено администратором]

Администратор

Могу предложить только полуавтоматический макрос. Вы запускаете макрос, появляется диалоговое окно. В этом окне есть поле, где отображаются данные из ячейки столбца A. Вы принимаете решение, нужно подставить номер из этой строки вниз и удалить эту строку или нет. Если да, то щёлкаете кнопку, макрос копирует номер вниз, удаляет строку и переходит к следующей строке, у которой в столбце F пусто.

Полностью сделать автоматически я не знаю, как, т.к. предполагаю, что возможны разные ситуации и все ситуации я не могу предсказать.

Salsaz

Идея очень интересная. Я согласен. Заранее спасибо.

Администратор

Или такой вариант. Перед запуском макроса, вы проходитесь по всему листу и в пустых строках, которые не надо обрабатывать макросу, в столбце F ставите пробел или какой-нибудь другой символ. Затем запускаете макрос.

Salsaz

Спасибо за помощь, буду использовать второй вариант.