Выполнить поиск на странице макросом

Автор OOKapitan, 7 февраля 2018, 14:02

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

OOKapitan

#30
Цитата: Bigor от 28 февраля 2018, 09:43и зачем тебе 2 переменных s и  r  ?
Этот макрос - часть большего макроса.
Пробовал писать так: s=oFind.getRangeAddresses(0) - та же ошибка. Как всё-таки задать эту s?Получилось s=oFind.RangeAddresses(0).
Но теперь If oFind.getByIndex(s).getRows().IsVisible=False не работает. Как исправить?

bigor

Собрать из разных кусков макрос себе конечно можно, но почитать того же Питоньяка в любом случае надо.
Цитата: OOKapitan от 28 февраля 2018, 10:09не работает. Как исправить?
а до замены  RangeAddressesAsString на RangeAddresses работало ? Сомневаюсь
s=oFind.RangeAddresses(0) возвращает массив, а getByIndex(s) в качестве s хочет целое число, как индекс. Поэтому и ругается

А зачем ты вообще что-то ищешь, что бы потом поменять значение ячейки, так проще наверно replace использовать

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

OOKapitan

Цитата: Bigor от 28 февраля 2018, 10:45а до замены  RangeAddressesAsString на RangeAddresses работало ?
Да, работало.
Я не меняю значение ячейки. Я просто ищу нужное и работаю со строкой.
А как тогда исправит, чтобы если нашлось в скрытой строке - то не учитывалось?

OOKapitan

Цитата: Bigor от 28 февраля 2018, 10:45s=oFind.RangeAddresses(0) возвращает массив
А если нашло только один раз?

bigor

#34
Цитата: OOKapitan от 28 февраля 2018, 11:32Да, работало.
Не верю (с) :) RangeAddressesAsString возвращает строку, как ты ее вместо индекса мог использовать


Цитата: OOKapitan от 28 февраля 2018, 11:33А если нашло только один раз?
Даже если один раз, все равно возвращает массив.

В этой теме Rafic ссылку выкладывал на Питоньяка, найди поиском RangeAddresses и почитай, там несколько страниц всего


Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

OOKapitan

#35
Цитата: Bigor от 28 февраля 2018, 11:40RangeAddressesAsString возвращает строку
Если найдено только один раз - одно значение. Могу весь первоначальный код выложить - сам проверишь. Всё работало на ура, но только на текущем листе. А мне надо, чтобы на 6 листах искал. Как его изменить?

Sub Proverka_documentov
Dim desc, oFind, s, a, r, k, b, c, d
If a="" Then Exit Sub
oSheet=ThisComponent.CurrentController.ActiveSheet
desc=oSheet.createSearchDescriptor()
desc.SearchRegularExpression=false
desc.SearchString=a   'Что найти
desc.SearchWords=true      'Ячейку целиком
oFind=oSheet.findAll(desc)
If IsNull(oFind) Then
Print "Документ не найден"
Exit Sub
End If
s=oFind.RangeAddressesAsString
r=s.StartRow
k=s.StartColumn
If oFind.getByIndex(s).getRows().IsVisible=False then
Print "Документ не найден"
Exit Sub
End If
If oSheet.getCellByPosition (k+5, r).Value="Восстановлен" Then
Print "Документ уже восстанвлен"
Exit Sub
Else
   If oSheet.getCellByPosition (k+5, r).Value="" Then
      If MsgBox("Проверить реквизиты?", 4, "Параметры проверки")=7 Then
      d=InputBox("Введите статус", "Статус документа")
      If d="" Then Exit Sub
      oSheet.getCellByPosition (k+5, r).Value=d
      Exit Sub
      End If
   End If
End If
b=MsgBox(oSheet.getCellByPosition (k+1, r).String, 4, "Проверьте дату!")
c=MsgBox(oSheet.getCellByPosition (k+4, r).String, 4, "Проверьте сумму!")
If b=7 or c=7 Then
   If MsgBox(oSheet.getCellByPosition (k+5, r).String, 4, "Проверьте статус!")=7 Then
      If oSheet.getCellByPosition (k+5, r).Value<>"" Then
      Print "Неправильно заполнены реквизиты документа!"
      Exit Sub
      End If
   d=InputBox("Введите статус", "Статус документа")
   If d="" Then Exit Sub
   oSheet.getCellByPosition (k+5, r).Value=d
      If MsgBox ("Изменить дату?", 4, "Параметры восстановления")=7 Then
      Exit Sub
      Else
      oSheet.getCellByPosition (k+6, r).Value=Now
      End If
   Else
   Exit Sub
   End If
Else
   oSheet.getCellByPosition (k+5, r).Value="Восстановлен"
   oSheet.getCellByPosition (k+6, r).Value=Now
End If
End Sub

OOKapitan

Цитата: Bigor от 28 февраля 2018, 11:40В этой теме Rafic ссылку выкладывал на Питоньяка, найди поиском RangeAddresses и почитай,
Почитаю.
Но макрос мне нужен срочно. Как сделать, чтобы работал?

bigor

#37
Цитата: OOKapitan от 28 февраля 2018, 11:48Если найдено только один раз - одно значение.
типа а1, сомневаюсь, что оно подойдет вместо индекса.


Цитата: OOKapitan от 28 февраля 2018, 11:49Как сделать, чтобы работал?

Выше уже писал
if oFound.getByIndex(i).getRows().IsVisible then
показываем
end if
только в цикле от 0 до oFound.Count-1
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

OOKapitan

Цитата: Bigor от 28 февраля 2018, 11:52типа а1, сомневаюсь, что оно подойдет вместо индекса
Но у меня же работало.
Цитата: Bigor от 28 февраля 2018, 11:52Выше уже писал
Большущее спасибо. Сча потестю.

bigor

#39
ЦитироватьВсё работало на ура
Не верю, что и на одном листе работало как надо

Dim desc, oFind, s, a, r, k, b, c, d
If a="" Then Exit Sub
....
desc.SearchString=a

???
If oFind.getByIndex(s).getRows().IsVisible=False then
Print "Документ не найден"
Exit Sub
End If

я уже согласен поверить, что starbasic не ругнулся на текстовую переменную s, может он ее как-то привел к целочисленной, но сильно сомневаюсь что искал он именно там, где ты хотел. И даже если бы все это сработало как нужно, то в случае если что-то нашлось в скрытой строке, то процедура на этом прекращает работу. Дальше не смотрел
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

OOKapitan

Цитата: Bigor от 28 февраля 2018, 12:29если что-то нашлось в скрытой строке, то процедура на этом прекращает работу. Дальше не смотрел
Ну, мне писало, как в If - "Документ не найден"

OOKapitan

Ошибок код, который теперь выглядит так:
Sub Proverka_documentov
Dim desc, oFind, s, a, r, k, b, c, d
oDoc=ThisComponent

a=InputBox("Введите номер", "Параметры поиска")
For i=1 To 6
oSheet = oDoc.Sheets(i)
If a="" Then Exit Sub
desc=oSheet.createSearchDescriptor()
desc.SearchRegularExpression=false
desc.SearchString=a   'Что найти
desc.SearchWords=true      'Ячейку целиком
oFind=oSheet.findAll(desc)
If Not IsNull(oFind) Then
Exit For
Else
Print "Документ не найден"
Exit Sub
End If
s=oFind.RangeAddresses(0)
r=s.StartRow
k=s.StartColumn
For j=0 to oFind.Count-1
If oFind.getByIndex(j).getRows().IsVisible=False then
Print "Документ не найден"
Exit Sub
End If
Next j
If oSheet.getCellByPosition (k+5, r).Value="Восстановлен" Then
Print "Документ уже восстанвлен"
Exit Sub
Else
   If oSheet.getCellByPosition (k+5, r).Value="" Then
      If MsgBox("Проверить реквизиты?", 4, "Параметры проверки")=7 Then
      d=InputBox("Введите статус", "Статус документа")
      If d="" Then Exit Sub
      oSheet.getCellByPosition (k+5, r).Value=d
      Exit Sub
      End If
   End If
End If
b=MsgBox(oSheet.getCellByPosition (k+1, r).String, 4, "Проверьте дату!")
c=MsgBox(oSheet.getCellByPosition (k+4, r).String, 4, "Проверьте сумму!")
If b=7 or c=7 Then
   If MsgBox(oSheet.getCellByPosition (k+5, r).String, 4, "Проверьте статус!")=7 Then
      If oSheet.getCellByPosition (k+5, r).Value<>"" Then
      Print "Неправильно заполнены реквизиты документа!"
      Exit Sub
      End If
   d=InputBox("Введите статус", "Статус документа")
   If d="" Then Exit Sub
   oSheet.getCellByPosition (k+5, r).Value=d
      If MsgBox ("Изменить дату?", 4, "Параметры восстановления")=7 Then
      Exit Sub
      Else
      oSheet.getCellByPosition (k+6, r).Value=Now
      End If
   Else
   Exit Sub
   End If
Else
   oSheet.getCellByPosition (k+5, r).Value="Восстановлен"
   oSheet.getCellByPosition (k+6, r).Value=Now
End If
Next i
End Sub

не выдаёт, но вот эта проверка:
If oSheet.getCellByPosition (k+5, r).Value="Восстановлен" Then
Print "Документ уже восстанвлен"
Exit Sub
Else
   If oSheet.getCellByPosition (k+5, r).Value="" Then
      If MsgBox("Проверить реквизиты?", 4, "Параметры проверки")=7 Then
      d=InputBox("Введите статус", "Статус документа")
      If d="" Then Exit Sub
      oSheet.getCellByPosition (k+5, r).Value=d
      Exit Sub
      End If
    End If
End If

по факту не работает. Как это исправить?

bigor

For i=1 To 6
в ООо все считается с 0, или ты первый лист специально пропускаешь

для чего это задумывалось:
If Not IsNull(oFind) Then
Exit For
Else
Print "Документ не найден"
Exit Sub
End If

если что-то нашло, то зачем выходит из цикла?

для тех, кто в танке
For j=0 to oFind.Count-1
If oFind.getByIndex(j).getRows().IsVisible=False then
Print "Документ не найден"
Exit Sub
End If
Next j

у тебя нашлось count ячеек с параметром поиска, ты их по очереди просматриваешь, но  если первая из них в скрытой строке, то макрос пишет "Документ не найден" и выходит из процедуры, т.е. остальные результаты поиска тебе уже не интересны?
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

OOKapitan

Цитата: Bigor от 28 февраля 2018, 13:48если что-то нашло, то зачем выходит из цикла?
иначе ругается на строку oSheet = oDoc.Sheets(i), и чтобы не искал дальше.
Цитата: Bigor от 28 февраля 2018, 13:48остальные результаты поиска тебе уже не интересны?
Один документ может встречаться один раз - на любом листе, но только на одном один раз - вероятность дубля где-то 1%

bigor

#44
Цитата: OOKapitan от 28 февраля 2018, 14:11если что-то нашло, то зачем выходит из цикла?
иначе ругается на строку
Ругается скорее всего из-за этого:
Цитировать
For i=1 To 6
в ООо все считается с 0, или ты первый лист специально пропускаешь
у тебя нет 7-го листа. сделай цикл от 0 до 5

Цитироватьвероятность дубля где-то 1%
ну если так, и тебе важна только первая найденная ячейка, цикл здесь не нужен
For j=0 to oFind.Count-1
If oFind.getByIndex(j).getRows().IsVisible=False then
Print "Документ не найден"
Exit Sub
End If
Next j

оставьIf oFind.getByIndex(0).getRows().IsVisible=False then
Print "Документ не найден"
Exit Sub
End If



Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут