Страницы: 1
RSS
Удаление лишних символов в массиве данных, Удаление пробелов, запятых по условиям
 
Добрый вечер уважаемые пользователи форума.

Ломал я голову, ломал - и просидевши часов 7 с интернетом так и не смог получить желаемый результат, а он очень нужен. Задача не совсем тривиальная, но и не совсем сложная. Поискав по форуму похожих проблем не нашёл у кого-то - если плохо искал - тыкните мордой)
Дано:
Есть массив фраз, которую хранит ячейка вида " Шампунь для волос, Крем,Маска, ,"
Задача:
Нужно привести данную ячейку к виду: "Шампунь для волос,Крем,Маска"
В чём сложность? Есть условия в виде:
  1. Нельзя допустить чтоб в самом начале содержалось неопределённое количество пробелов или запятых;
  2. Нельзя допустить никаких пробелов между фразами, строго запятые;
  3. При этом есть фраза "Шампунь для волос", которое должно содержать пробелы внутри себя, но не между самими фразами (п.2);
  4. В конце последняя фраза не должна содержать после себя никаких символов, включая запятые;
  5. В конце может быть неопредёлнное количество символов.
При этом с горем пополам я могу убрать лишние символы в начале, в полуручном режиме а так-же привести к виду, что в конце может попадаться либо пробел, либо запятая,либо и то и то в разной "очереди". То есть пункты 1,4,5 - если такое нельзя или труднореализуемо можно опустить, это я к слову.
Что было предпринято: использование связки формул = ЛЕВСИМВ (C6; ДЛСТР (C6) - (ПРАВСИМВ (C6) = ",")) и =СЖПРОБЕЛЫ(C37), но они работают не так как хотелось бы, но часть проблем решают, как минимум удаление запятых в конце. Но если в конце будет 2 запятые или пробел с запятой желаемый результат не получается.

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

В общем, подскажите - это решаемая задача или для этого нужно создавать целую программу под данный сценарий?
Работаю в гугл таблицах, если что, ексель не удобен - но в случае чего перейти не проблема.
Изменено: Владислав Гладыш - 16.11.2022 18:22:30
 
Пусть ваша фраза в ячейке А1, тогда после выполнения макроса результат в В1
Код
Sub iPhraza()
Dim arr
Dim i As Long
Dim cell As String
   arr = Split(Range("A1"), ",")
   For i = 0 To UBound(arr)
     If arr(i) <> " " And arr(i) <> "" Then
       cell = cell & Application.Trim(arr(i)) & ","
     End If
   Next
     Range("B1") = Left(cell, Len(cell) - 1)
End Sub
 
Владислав Гладыш, здравствуйте
Если макрос от Kuzmich не справится, то сделайте файл-пример с перечнем данных до и после, чтобы понять логику
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Добрый.
Если вышеуказанный макрос не подойдет, то, как уже предложили, давайте пример, и можно еще вот над чем подумать: фраза от фразы отделяется наличием в начале фразы Заглавной буквы.
И если набор символов поделить по этому признаку, а потом слить в единое целое, разделив запятыми, то это, на мой взгляд, будет нужный результат.
Но без примера на чем показывать? Только умозрительные догадки строить. :)
Кому решение нужно - тот пример и рисует.
 
Для начала отмечу, что в целом незнаком с VBA был до сегодняшнего дня - а тут оказывается целый новый мир, и отдельный язык программирования скрывается. Для меня целое событие будет, если я соединю пару функций в одной формуле и оно заработает, тем более работаю опять-же в Гугл таблицах а тут ошарашили прям)) Думал можно формулами это сделать. Ну что-ж, пришлось скачивать оригинальный эксель, искать как использовать макросы, как их подключить и т.д. Интересный опыт однако :)
Kuzmich, большое спасибо за скрипт, он заработал отлично, удаляет ненужные пробелы и делает все пункты на идеально при этом что круто - не оставляет после себя формул, что полезно при копирования "обработанного текста".

Пытаюсь понять как можно расширить скрипт на весь массив данных, то есть как его можно масштабировать, мучаюсь вот, пытаюсь перебирать варианты)
Пока что остановился на копирования куска кода но подставляя нужную ячейку с исходными данными и выводом в другую ячейку. Создания второго и последующих макросов под каждую отдельную ячейку (но это наверное первобытный вариант). И есть ещё вариант чтоб он как-то перебирал построчно - но там совсем мрак) Я совсем не кодер, но видимо придётся освоить азы) Как бы логика как это и что за чем может и есть - а вот с реализацией беда. Если намекнёте куда копать - буду очень счастлив.

А Jack Famous, и Пытливый, большое спасибо за предложенную помощь, не думал что такой быстрый отклик будет :D

Вот сам файл с не отфарматированными ячейками, то там то тут косяки вылазят - скрипт отлично работает. Поменял где B1 - на A26.
Но нашёл способ как избавиться в начале ячейки от запятых выгружая уже более менее удобоваримые данные.
 
Цитата
Владислав Гладыш: Вот сам файл с не отфарматированными ячейками
не хватает результата. Как должно выглядеть?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
И есть ещё вариант чтоб он как-то перебирал построчно
Для столбца А
Код
Sub iPhraza_1()
Dim arr
Dim i As Long
Dim n As Long
Dim cell As String
 For i = 2 To 24
  If Not IsEmpty(Cells(i, "A")) Then
   arr = Split(Cells(i, "A"), ",")
   For n = 0 To UBound(arr)
     If arr(n) <> " " And arr(n) <> "" Then
       cell = cell & Application.Trim(arr(n)) & ","
     End If
   Next
     Cells(i + 24, "A") = Left(cell, Len(cell) - 1)
   End If
   cell = ""
  Next
End Sub
 
Еще вариант для примера. С регулярками. В столбце А обрабатывает строки с 2 по последнюю заполненную (в случае, если в столбце А в строках данных нет разрыва), заменяет данные в ячейках.
Скрытый текст
Изменено: Пытливый - 17.11.2022 14:36:15
Кому решение нужно - тот пример и рисует.
Страницы: 1
Наверх