Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
25.04.2024, 08:03:27

Войти
Хотите поблагодарить участника за дельный совет? Нажмите [Повысить]. Так вы заслуженно поднимите репутацию активному участнику.
33 243 Сообщений в 5 458 Тем от 6 761 Пользователей
Последний пользователь: Halfdoor
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Копировать из строки текста в ячейке части текста и вставить их в другие ячейки
Страниц: [1] 2  Все   Вниз
Печать
Автор Тема: Копировать из строки текста в ячейке части текста и вставить их в другие ячейки  (Прочитано 8111 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
stepan
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 11


Просмотр профиля
« : 27.12.2019, 14:48:40 »

Уважаемые коллеги,

Мне потребовалось из текста в ячейке типа FH1.B.G000.&.0UJA&&.JNG&&&.021.CA.0001.R выделить часть текста до сначала до точки, между точками и в конце после последней точки и вставить их в другие отдельные ячейки в других столбцах
Я использовал следующий макрос

Код: (vb)
Sub test()
  Dim i&, j&, i1&
  i1 = Range("L" & Cells.Rows.Count).End(xlUp).Row
    With CreateObject("vbscript.regexp")
              .Global = True
       For i = 1 To i1
          .Pattern = "[A-Z{3}\s+\d{2}+]+"
          '           .Pattern = "\.."
          '.Pattern = "\.\)"
            If .test(Range("L" & i)) Then
              Range("P" & i) = .Execute(Range("L" & i))(0).Value
           End If
       Next
       End With
      
       With CreateObject("vbscript.regexp")
              .Global = True
      
       For i = 1 To i1
         ' .Pattern = "[A-Z{3}\s+\d{2}+]+"
          '           .Pattern = "\.."
          '.Pattern = "\.\)"
                .Pattern = "\.."
            If .test(Range("L" & i)) Then
              Range("Q" & i) = .Execute(Range("L" & i))(0).Value
           End If
       Next
      
       End With
End Sub

Но он почему-то только копирует FH1 и .B, а необходимо все части текста между точками и без самих точек.
Не подскажите как изменить этот макрос?? заранее спасибо
« Последнее редактирование: 27.12.2019, 15:18:51 от vikttur » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #1 : 27.12.2019, 18:09:14 »

А почему именно макрос используете для этой задачи? Не подойдет команда с вкладки Данные -Текст по столбцам? По разделителю -Точка. И все само раскидается...
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
stepan
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 11


Просмотр профиля
« Ответ #2 : 16.02.2020, 12:51:26 »

Спасибо, у меня есть текст в ячейке "Заключение № 106-32/19 от 03.09.2019, с несоответствиями, в том числе существенными: 1 по ПНАЭ Г-7-008-89, 2 по ПНАЭ Г-7-025-90, 1 по НП-001-97."
Я использовал функцию
Код: (vb)
With CreateObject("vbscript.regexp")
.Global = True
  For i = 1 To i1
.Pattern = "[А-Яа-яЁё]+"
If .test(Range("F" & i)) Then
 Лист3.Range("Q" & i) = .Execute(vv.Worksheets(1).Range("F" & i))(0).Value
 End If
 Next
 End With

Но она считывает только первое слово. Не подскажите как ее изменить, чтобы она считывала все слова и цифры до запятой?
« Последнее редактирование: 16.02.2020, 13:38:56 от vikttur » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #3 : 16.02.2020, 13:38:44 »

1. Код необходимо заключать в теги VBCode. В правилах об этом сказано: п.п. 4.25 Правил форума. Постоянно за Вас подправлять это никто не будет.
2. Приложили бы пример файла с данными и что ожидаете увидеть в итоге.
считывает только первое слово
потому что: (0).Value
(0) - это и есть первый элемент из отобранных.

Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
stepan
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 11


Просмотр профиля
« Ответ #4 : 28.03.2020, 17:07:16 »

Нужно, чтобы считывался только этот текст "Заключение № 106-32/19 от 03.09.2019", то есть до запятой, и какие теги надо поставит , такте < >?
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #5 : 30.03.2020, 11:33:54 »

Нужно, чтобы

Приложили бы пример файла с данными и что ожидаете увидеть в итоге
Без этого разговор зайдет неизбежно в тупик.
Просто до запятой опять же макросы не нужны, справится и формула и тот же Текст по столбцам, но разделитель запятая. А формула такая:
=ПСТР(A1;1;ПОИСК(",";A1)-1)
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
boa
Старожил
****

Репутация: +22/-0
Офлайн Офлайн

Сообщений: 252


Доброта спасет мир...


Просмотр профиля WWW
« Ответ #6 : 31.03.2020, 17:37:15 »

Добрый день,
пользовательская функция(но массивная)
Код: (vb)
Function MeSplit(str As String, Optional delim As String = ".")
MeSplit = Split(str, delim)
End Function

Делит по точке ну или другому выбранному разделителю
Записан

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость...  Мигель Сервантес де Сааведра

stepan
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 11


Просмотр профиля
« Ответ #7 : 01.04.2020, 14:27:35 »

Вставил формулу по вашему примеру
<> Лист3.Range("Q" & i).Formula = "=ПСТР(A1;1;ПОИСК(",";A1)-1" < />
Выдает ошибку.
Я прикладываю файл. Что хотелось бы получить:  Из листа 2 надо взять столбец F номер заключения (строка до зяпятой) и вставит его в лист 2 в ячейку столбца В
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #8 : 01.04.2020, 15:11:28 »

1.
Лист3.Range("Q" & i).Formula = "=ПСТР(A1;1;ПОИСК(",";A1)-1"
это хорошо, что Вы просто взяли и вставили формулу листа в макрос  Улыбка Но если вставлять формулы макросом, то есть свои правила. Например, самый действенный способ это записать вставку в ячейку формулы макросом и посмотреть что получилось. Будет отличаться весьма.
2. В приложенном файле нет и намека хоть на какой-то макрос по определению, т.к. в книгах .xlsx они не сохраняются. Нужен формат .xlsm. И Лист3 там тоже нет.
3.
взять столбец F
почему тогда ничего не поменяли в формуле? Ведь там столбец А и Вы его не заменили на нужный Вам F. Номер строки тоже не поменяли.
В общем куча ошибок. Как-то так будет правильно
Код: (vb)
Sub InsertFormula()
    Dim i&
    i = 8
    Range("Q" & i).Formula = "=MID(F" & i & ",1,SEARCH("","",F" & i & ")-1)"
End Sub

естественно, если вставить в некий цикл.
Если использовать исходный макрос, то общий код должен быть такой:
Код: (vb)
Sub InsertFormula()
    Dim i&, i1&, s$, lp&
    i1 = Range("F" & Cells.Rows.Count).End(xlUp).Row
    For i = 1 To i1
        s = Range("F" & i).Value
        lp = InStr(1, s, ",", 1) - 1
        If lp > 0 Then
            Range("Q" & i).Value = Mid(s, 1, InStr(1, s, ",", 1))
        End If
    Next
End Sub
« Последнее редактирование: 01.04.2020, 15:17:14 от Дмитрий Щербаков(The_Prist) » Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
stepan
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 11


Просмотр профиля
« Ответ #9 : 05.04.2020, 14:09:08 »

Попробовал insertformula, но она также считывает верхние строки над необходимыми полями таблицы и вставляет их как пустые ячейки.
Я решил найти сначала ячейку с названием столбца по тексту "Номер и дата Заключения", а от нее сделать переход через offset  к первой ячейки.
Но эта процедура у меня не работает почему-то?
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #10 : 05.04.2020, 19:24:56 »

Вам бы основы VBA начать изучать  Улыбка Хотя бы в части циклов  Улыбка
считывает верхние строки над необходимыми полями таблицы
А как иначе, если Вы изначально цикл настроили с 1-ой строки?
For i = 1 To i1
вставьте нужную вместо 1 и будет не с первой.
По сути в Вашем последнем файле надо использовать только поиск(но правильный, а не тот, что у Вас). И в итоге если нашли - выполнять цикл по отбору значений:
Код: (vb)
Sub InsertFormula()
    Dim i&, i1&, s$, lp&
    Dim rF As Range
    Dim nstr As Long
   
    Set rF = Лист2.Range("F:F").Find("Номер и дата Заключения", , xlValues, xlPart, , xlNext, False, False, False)
    If Not rF Is Nothing Then
         i1 = Лист2.Range("F" & Cells.Rows.Count).End(xlUp).Row
         For i = rF.Row + 1 To i1
            s = Лист2.Range("F" & i).Value
            lp = InStr(1, s, ",", 1) - 1
            If lp > 0 Then
                'странно, что это на лист 3 записывается...
                'не знаю с какой должно быть строки, поэтому сами подправите
                Лист3.Range("Q" & (nstr + i)).Value = Mid(s, 1, lp)
            Else
            'а это не знаю зачем к чему и куда, поэтому закоментил
'            Лист3.Range("Q" & (nstr + i)).Value = vv1.Name
            End If
        Next
    End If
End Sub


P.S. Integer плохой тип для использования в качестве номеров строк. У него предел в 32767, а строк может быть больше миллиона...
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
stepan
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 11


Просмотр профиля
« Ответ #11 : 07.04.2020, 20:12:28 »

На самом деле у меня более 1 файла (например, лист 2 и 4 в приложении). Проблема в том, что считывать надо только ячейки внутри таблицы, без нижних строк.
Поэтому я попробовал сделать отступ, но почему-то для 2-го листа процедура insertformula не функционирует (приложение). В чем может быть проблема?
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #12 : 08.04.2020, 11:34:32 »

Проблема изначально в том, что Вы в VBA не понимаете, но упорно нам не описываете все нюансы задачи. Поэтому и получается, что надо переделывать, переделывать, переделывать.
Опишите нормально задачу, что где и по каким правилам искать и заполнять - тогда разговор будет конструктивным. А сейчас Вы только тратите наше и свое время на постоянное переписывание кодов только потому, что Вы не хотите расписать все полностью.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
stepan
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 11


Просмотр профиля
« Ответ #13 : 08.04.2020, 13:58:21 »

Я не претендую на полное знание VBA. Задача в том, что есть несколько файлов с отчетами (я их в приложенной книге указал на листах), из которых нужно считать данные в ячейках "Номер и дата Заключения", эти ячейки в файлах заполнены по-разному, но нужен только номер и дата. Эти данные нужно вставлять в сводную табличку (например лист 3). Также считывание сверху идет норм по отступу от ячейки с названием столбца "Номер и дата Заключения", а вот количество строк в файлах разное и отформатированы они по-разному (где-то есть объединенные ячейки) , поэтому просто отступить от нижней строки со словом "Составил" до нижней ячейки  сданными не получается. Где-то между "Составил" и последней строкой одна пустая строка, а где- то 2 или 3 и плюс не понятно как перейти от номера строки со словом "Составил", которое ищется во всем диапазоне А:H, а последнее значение должно считываться только из столбца F.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #14 : 08.04.2020, 15:14:48 »

Еще непонятнее стало. Файлы или листы? Что значит сводная табличка? Можете приложить нормальный файл, в котором показать: есть вот это, а получить надо вот это. И уже на основании такого файла расписать почему так и какие есть нюансы. Так дело быстрее пойдет. Возможно, решение нужно совершенно иное и не теми способами, которыми пытаетесь решить Вы.
идет норм по отступу от ячейки с названием столбца "Номер и дата Заключения", а вот количество строк в файлах разное и отформатированы они по-разному
как это влияет на текущую задачу? Вы не можете нормально определить последнюю заполненную ячейку? или что-то еще?
Не во всех листах, как я вижу, есть вообще написание данных с запятыми. На Лист1, например, нет таких данных. Что в этом случае?

P.S. Знания VBA от Вас и не требуют Улыбка Я и написал о том, что раз Вы плохо его знаете - то правильнее не пытаться адаптировать то, работу чего не понимаете, а описать исходную задачу и цель, а не кусками подкидывать нечто вроде "а у меня еще и вот так вот".
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Страниц: [1] 2  Все   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru