Страницы: 1
RSS
Смена порядка слов в ячейке
 
Добрый день! Подскажите, пожалуйста, может кто-то знает решение задачи?

Есть столбец с фразами, к примеру:
обои купить
обои заказать в москве
цена обои
Нужно определенные слова в ячейке переносить (автоматически или по нажатию клавиши) в начало фразы:

было "обои купить" - стало "купить обои". Здесь контрольное слово "купить". Находим его в в ячейке и переносим в начало.
И в конец фразы:
было "цена обои" - стало "обои цена". Здесь контрольное слово "цена". Находим его в в ячейке и переносим в конец фразы.

То есть, мы имеем столбец с фразами, над которым будем творить волшебство, и столбец с контрольными словами, которые будем искать в первом столбце. Файл с примером прилагается.  
Изменено: Mleur - 15.12.2017 15:53:34
 
Доброе время суток
Цитата
Mleur написал:
может кто-то знает решение задачи?
1. Считываем фразы в массив.
2. Считываем слова правил в словарь Dictionary, в качестве значения True, если слово в начало, False, если в конец.
3. Создаём равный массив вывода
4. Цикл по массиву фраз
5. Берём очередную фразу. Split по пробелам, получаем массив слов
6. По массиву слов. Проверяем - есть ли слово в словаре. Если есть, то меняем порядок по значению словаря и выходим из цикла слов.
7. Join для массива слов и запись в массив вывода.
8. По окончании цикла по массиву фраз выводим массив вывода на лист.
Так как-то.
Успехов.
 
Спасибо большое за ответ, но увы, программировать под excel я пока не умею, подумал, может у кого-то есть готовое решение.
Но когда возьмусь программировать, обязательно воспользуюсь вашим пояснением.  
 
ну вот например такая UDF
Код
Public Function WordsChange(St As String, Rule_s As Range, Rule_e As Range)
    Dim arrString() As String
    Dim j As Integer
    Dim ps As String, pe As String
    arrString = Split(St, " ")
    For j = LBound(arrString) To UBound(arrString)
        If Not IsError(Application.VLookup(arrString(j), Rule_s, 1, 0)) Then
            ps = ps & "" & arrString(j)
            arrString(j) = ""
        ElseIf Not IsError(Application.VLookup(arrString(j), Rule_e, 1, 0)) Then
            pe = pe & "" & arrString(j)
            arrString(j) = ""
        End If
    Next j
    WordsChange = WorksheetFunction.Trim(ps & " " & Join(arrString, " ") & " " & pe)
End Function
 
Код
Sub Переместить_слово_в_начало()

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False
    Application.DisplayStatusBar = False
    Application.DisplayAlerts = False

 Dim c, r, Lastrow As Long, Sl
 
Sl = " " & InputBox("Введите СЛОВОСОЧЕТАНИЕ!!! для переноса в начало фразы с учётом рЕгИсТрА!") & " "
  
  Lastrow = Cells(Rows.Count, 1).End(xlUp).Row

  
  c = 1
  r = 13
  Do
  If r > Lastrow Then
    Exit Do
  End If
  
If Cells(r, c).EntireRow.Hidden <> True Then
Cells(r, c).Select
Cells(r, c) = " " & Cells(r, c) & " "

Set k = Selection.Find(What:=Sl, LookIn:=xlValues, LookAt:=xlPart)
If k Is Nothing Then
Cells(r, c) = Application.Trim(Cells(r, c))
Else

'Cells(R, C).Value = " " & Cells(R, C).Value & " "
Old = Cells(r, c).Value
Cells(r, c).Value = Sl & Replace(Old, Sl, " ")
    Selection.Replace What:="!", Replacement:="! ", LookAt:=xlPart
    Selection.Replace What:=",", Replacement:=", ", LookAt:=xlPart
    Selection.Replace What:=".", Replacement:=". ", LookAt:=xlPart

Cells(r, c) = Application.Trim(Cells(r, c))

End If
End If
 r = r + 1
    Loop
    
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
   
    Application.DisplayStatusBar = True
    Application.DisplayAlerts = True
  

End Sub
Изменено: Sobes - 15.12.2017 18:49:10
 
Код
Sub Переместить_слово_в_конец()

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False
    Application.DisplayStatusBar = False
    Application.DisplayAlerts = False

 Dim c, r, Lastrow As Long, Sl
 
Sl = " " & InputBox("Введите СЛОВОСОЧЕТАНИЕ!!! для переноса в Конец фразы!") & " "
  
  Lastrow = Cells(Rows.Count, 1).End(xlUp).Row

  c = 1 
  r = 13 
  Do
  If r > Lastrow Then
    Exit Do
  End If
  
If Cells(r, c).EntireRow.Hidden <> True Then
Cells(r, c).Select
Cells(r, c) = " " & Cells(r, c) & " "

Set k = Selection.Find(What:=Sl, LookIn:=xlValues, LookAt:=xlPart)
If k Is Nothing Then
Cells(r, c) = Application.Trim(Cells(r, c))
Else

Old = Cells(r, c).Value
Cells(r, c).Value = Replace(Old, Sl, " ") & Sl
    Selection.Replace What:="!", Replacement:="! ", LookAt:=xlPart
    Selection.Replace What:=",", Replacement:=", ", LookAt:=xlPart
    Selection.Replace What:=".", Replacement:=". ", LookAt:=xlPart

Cells(r, c) = Application.Trim(Cells(r, c))
End If
End If

 r = r + 1
    Loop
    
    
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.DisplayStatusBar = True
    Application.DisplayAlerts = True


End Sub
Изменено: Sobes - 15.12.2017 19:10:23
 
Sobes, зачем два сообщения?
 
Спасибо большое!

Только одну ошибку нашел, или это я сам что-то не так делаю, но если в ячейке 2 слова из столбца "Правило 1", то после обработки они пишутся слитно.

Пример ячейки: купить заказать обои, "купить" и "заказать" добавил в столбец Правило 1, в итоге результат: купитьзаказать обои

Впрочем это пожалуй можно уже править руками.
Изменено: Mleur - 15.12.2017 20:12:15
 
Mleur, да, вы правы - недоглядел. надо строку
ps = ps & "" & arrString(j) заменить на ps = ps & " " & arrString(j)
ну и pe=... аналогично
 
Спасибо большое :)  
 
Формула:
=СЖПРОБЕЛЫ(ЕСЛИ(ЕЧИСЛО(ПОИСК(F2;СЖПРОБЕЛЫ(ЕСЛИ(ЕЧИСЛО(ПОИСК(E2;C2));E2&" "&ПОДСТАВИТЬ(C2;E2;"");C2))));ПОДСТАВИТЬ(СЖПРОБЕЛЫ(ЕСЛИ(ЕЧИСЛО(ПОИСК(E2;C2));E2&" "&ПОДСТАВИТЬ(C2;E2;"");C2));F2;"")&" "&F2;СЖПРОБЕЛЫ(ЕСЛИ(ЕЧИСЛО(ПОИСК(E2;C2));E2&" "&ПОДСТАВИТЬ(C2;E2;"");C2))))
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Bema, спасибо)) но возник вопрос - а как в случае с формулой быть, если в ячейке Е2 нет слова "купить" ? переместил слово в Е3, а в Е2 написал "заказать", в D2 слово "купить" осталось в середине фразы.  
 
Т.е. нужно проверять все слова из правил?
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Bema, Конечно, каждое слово в в столбце Правило 1 переносится в начало фразы, а в Правило 2 -  в конце фразы.
 
А во фразе может быть только одно слово из каждого правила?
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Bema, нет, в редких случаях бывает что и два слова из правила 1 или 2. И достаточно часто когда по одному слову из каждого правила (1 и 2)
 
Проверяйте.
Скрытый текст

Если воспользоваться доп. столбцом, формулы даже суммарно будут намного короче и понятней.
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Bema, большое спасибо за помощь :)  
Страницы: 1
Наверх