Найти и заменить. Сделать макрос.

Автор spada, 16 октября 2014, 18:44

0 Пользователи и 1 гость просматривают эту тему.

spada

В первом столбце нормальные названия которые нужно получить
Во втором столбце названия которые нужно заменить. Эти названия находятся во всех листах файла(документа). Замену нужно произвести по всему документу соответствующими значениями с первой колонки.
Помогите напсать такой макрос. Желательно с построчными объяснениями.


Я пробовал использовать стандартно записанный макрос, но ничего не получилось. А для переделки не хватает серого вещества.
[spoiler]
sub naytiZamen
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")   ---- это курсор?

rem ----------------------------------------------------------------------
dim args1(17) as new com.sun.star.beans.PropertyValue   ---Что делает эта строка??? Дальше я понимаю что создаются условия поиска.
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = true
args1(4).Name = "SearchItem.Backward"
args1(4).Value = false
args1(5).Name = "SearchItem.Pattern"
args1(5).Value = false
args1(6).Name = "SearchItem.Content"
args1(6).Value = false
args1(7).Name = "SearchItem.AsianOptions"
args1(7).Value = false
args1(8).Name = "SearchItem.AlgorithmType"
args1(8).Value = 0
args1(9).Name = "SearchItem.SearchFlags"
args1(9).Value = 65536
args1(10).Name = "SearchItem.SearchString"
args1(10).Value = "Картошка"
args1(11).Name = "SearchItem.ReplaceString"
args1(11).Value = ""
args1(12).Name = "SearchItem.Locale"
args1(12).Value = 255
args1(13).Name = "SearchItem.ChangedChars"
args1(13).Value = 2
args1(14).Name = "SearchItem.DeletedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.InsertedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.TransliterateFlags"
args1(16).Value = 1280
args1(17).Name = "SearchItem.Command"
args1(17).Value = 1

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())  ---- Эта команда выполняет поиск и замену.

rem ----------------------------------------------------------------------
dim args2(17) as new com.sun.star.beans.PropertyValue
args2(0).Name = "SearchItem.StyleFamily"
args2(0).Value = 2
args2(1).Name = "SearchItem.CellType"
args2(1).Value = 0
args2(2).Name = "SearchItem.RowDirection"
args2(2).Value = true
args2(3).Name = "SearchItem.AllTables"
args2(3).Value = true
args2(4).Name = "SearchItem.Backward"
args2(4).Value = false
args2(5).Name = "SearchItem.Pattern"
args2(5).Value = false
args2(6).Name = "SearchItem.Content"
args2(6).Value = false
args2(7).Name = "SearchItem.AsianOptions"
args2(7).Value = false
args2(8).Name = "SearchItem.AlgorithmType"
args2(8).Value = 0
args2(9).Name = "SearchItem.SearchFlags"
args2(9).Value = 65536
args2(10).Name = "SearchItem.SearchString"
args2(10).Value = "Картошка"
args2(11).Name = "SearchItem.ReplaceString"
args2(11).Value = "Картошка круглая"
args2(12).Name = "SearchItem.Locale"
args2(12).Value = 255
args2(13).Name = "SearchItem.ChangedChars"
args2(13).Value = 2
args2(14).Name = "SearchItem.DeletedChars"
args2(14).Value = 2
args2(15).Name = "SearchItem.InsertedChars"
args2(15).Value = 2
args2(16).Name = "SearchItem.TransliterateFlags"
args2(16).Value = 1280
args2(17).Name = "SearchItem.Command"
args2(17).Value = 1

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(4) as new com.sun.star.beans.PropertyValue
args3(0).Name = "CharPreviewFontName.StyleName"
args3(0).Value = ""
args3(1).Name = "CharPreviewFontName.Pitch"
args3(1).Value = 2
args3(2).Name = "CharPreviewFontName.CharSet"
args3(2).Value = -1
args3(3).Name = "CharPreviewFontName.Family"
args3(3).Value = 5
args3(4).Name = "CharPreviewFontName.FamilyName"
args3(4).Value = "Arial"

dispatcher.executeDispatch(document, ".uno:CharPreviewFontName", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(17) as new com.sun.star.beans.PropertyValue
args4(0).Name = "SearchItem.StyleFamily"
args4(0).Value = 2
args4(1).Name = "SearchItem.CellType"
args4(1).Value = 0
args4(2).Name = "SearchItem.RowDirection"
args4(2).Value = true
args4(3).Name = "SearchItem.AllTables"
args4(3).Value = true
args4(4).Name = "SearchItem.Backward"
args4(4).Value = false
args4(5).Name = "SearchItem.Pattern"
args4(5).Value = false
args4(6).Name = "SearchItem.Content"
args4(6).Value = false
args4(7).Name = "SearchItem.AsianOptions"
args4(7).Value = false
args4(8).Name = "SearchItem.AlgorithmType"
args4(8).Value = 0
args4(9).Name = "SearchItem.SearchFlags"
args4(9).Value = 65536
args4(10).Name = "SearchItem.SearchString"
args4(10).Value = "Картошка"
args4(11).Name = "SearchItem.ReplaceString"
args4(11).Value = "Картошка круглая"
args4(12).Name = "SearchItem.Locale"
args4(12).Value = 255
args4(13).Name = "SearchItem.ChangedChars"
args4(13).Value = 2
args4(14).Name = "SearchItem.DeletedChars"
args4(14).Value = 2
args4(15).Name = "SearchItem.InsertedChars"
args4(15).Value = 2
args4(16).Name = "SearchItem.TransliterateFlags"
args4(16).Value = 1280
args4(17).Name = "SearchItem.Command"
args4(17).Value = 3

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args4())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:SearchResultsDialog", "", 0, Array())


end sub
[/spoiler]
Тут повторяющиеся блоки. Как объяснить компьютеру что мне нужно шаг за шагом пройтись по ячейкам и произвести поис и замену на соседнюю ячейку?


JohnSUN

Ну да, действительно, как-то так это и делается...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

spada

Какая-то у меня проблема. Что это может быть. система - ubuntu 64 LO - Версія: 4.2.6.3  Код збірки: 420m0(Build:3)

Синтаксична помилка BASIC.
Очікується: ,.


JohnSUN

А скриншот приложить? Такой, чтобы было видно на какой строке затык произошел...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

#5
JohnSUN у меня твой вариант работает.
spada пишите подробней чей вариант не работает и почему. Может быть какие-то настройки не правильные.

spada

#6
Мне кажется дело не в макросе. У меня не работает даже стандартно записанный макрос на окрашивание ячейки.

JohnSUN

Не работает = выдаёт ту же ошибку?
Или Не работает = ничего не делает?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

spada

ничего не делало. Я обновил офис. Но оказалось этого не требуется. Нужно было убрать защиту от макросов в настройках. А я только поставил галочки на доп возможностях.  Макро сработал. Спасибо сейчас разбираюсь детально как он работает.

spada

Уважаемые форумчане можете дописать коментарии к этому макросу.
Sub FandRCond

Dim oSheet1, oSheet2, oCell, oRange1, oRange, oCellName1, oCellName2
Dim ca as Integer, cb as Integer, cc as Integer, c as Integer, r as Integer

oSheet1 = thisComponent.Sheets(0)
oSheet2 = thisComponent.Sheets(1)
oRange1 = oSheet1.getCellRangeByPosition(0,0,3,9)
oRange2 = oSheet2.getCellRangeByPosition(0,0,3,3)
FandR = oRange1.createReplaceDescriptor
FandR.SearchWords = true

ca = 0
cb = 1
cc = 2

for r = 0 to 3

oCell = oRange2.getCellByPosition(ca, r)

if oCell.Value = 1 then

oCellName1 = oRange2.getCellByPosition(cb, r)
oCellName2 = oRange2.getCellByPosition(cc, r)
fString = oCellName1.String
rString = oCellName2.String


FandR.setSearchString(fString)
FandR.SetReplaceString(rString)
oRange1.FindAll(FandR)

oRange1.ReplaceAll(FandR)

end if

next r

End Sub

Особенно что значит эта строчка if oCell.Value = 1 then

spada

Появился вопрос    For i = LBound(oDataArray)+1 To UBound(oDataArray)
            oReplaceDscr = oSheet.createSearchDescriptor()   ' Создаем поисковый дескриптор для этого диста
            oReplaceDscr.setSearchString(oDataArray(i)(6))   ' Что искать - вторая колонка массива
            oReplaceDscr.setReplaceString(oDataArray(i)(5))   ' На что менять - первая колонка массива
            nRepl = nRepl + oSheet.replaceAll(oReplaceDscr)   ' Заменили (на этом листе!) и сосчитали
         Next i   ' Перейти к следующей строке замен

Как компьютер понимает предел массива. Ведь по идее NExt i  должно гнать масив до бесконечности.  аа эта строчка говорит чтоб обработал 1 строку так?  i = LBound(oDataArray)+1 To UBound(oDataArray)    А конкретнее что значит LBound to UBound ???

JohnSUN

Цитата: spada от 16 октября 2014, 21:49
Уважаемые форумчане можете дописать коментарии к этому макросу.
Расписывать этот... э-э-э... код подробными комментариями - скучно. Но если в двух словах, то суть такова:
На первом листе в прямоугольнике A1:D10 (координаты .getCellRangeByPosition(0,0,3,9) обозначают именно это) есть какие-то данные, которые будут заменятся макросом. На втором листе четыре строки замен - в первой колонке или цифра 1 или что-то другое, во второй колонке - что меняем, в третьей - на что меняем. Четвёртая колонка ни разу в коде не используется. Поэтому oSheet2.getCellRangeByPosition(0,0,3,3) можно было бы переписать как oSheet2.getCellRangeByPosition(0,0,2,3) - ничего бы не изменилось.
Ну, потом перебираются строки в этом втором листе, все четыре. Если в ячейке первой колонки для этой строки стоит 1, то в поисковый дескриптор вписываются строки из второй и третьей колонки, зачем-то выполняется поиск и потом выполняется замена...
Цитата: spada от 16 октября 2014, 21:49
Особенно что значит эта строчка if oCell.Value = 1 then
Ну, видимо предполагалось, что замену нужно будет делать не по всему словарю замен, а только по строкам, отмеченным единичкой в первой ячейке...
Цитата: spada от 16 октября 2014, 22:00
А конкретнее что значит LBound to UBound ???
А что говорит кнопка F1 если курсор стоит на любом из этих слов?

Будь добр, если уж меняешь индексы массивов, то и комментарии тоже меняй. А то
oReplaceDscr.setSearchString(oDataArray(i)(6)) ' Что искать - вторая колонка массива
oReplaceDscr.setReplaceString(oDataArray(i)(5)) ' На что менять - первая колонка массива
выглядит нелепо. На самом деле там получается "седьмая" и "шестая" колонки соответственно
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

Цитата: JohnSUN от 16 октября 2014, 21:27Будь добр, если уж меняешь индексы массивов, то и комментарии тоже меняй. А то
Код:
oReplaceDscr.setSearchString(oDataArray(i)(6))   ' Что искать - вторая колонка массива
oReplaceDscr.setReplaceString(oDataArray(i)(5))   ' На что менять - первая колонка массива
выглядит нелепо. На самом деле там получается "седьмая" и "шестая" колонки соответственно
Не только выглядит нелепо, но и ошибочно, так как в массиве oDataArray есть только две колонки, а не семь.

JohnSUN

Цитата: rami от 16 октября 2014, 22:50
Не только выглядит нелепо, но и ошибочно, так как в массиве oDataArray есть только две колонки, а не семь.
Ну, в первоначальном варианте так и было... Но потом spada начал перекраивать код под реальные данные, которые нам постеснялся показывать. А в реальных данных у него строки замен, видимо, отодвинуты вправо... Так что код, возможно, и безошибочный
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне