Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

17 Август 2019, 18:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice  без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2 3 4 5 6 7 8 »   Вниз
  Печать  
Автор Тема: Выполнить поиск на странице макросом  (Прочитано 14969 раз)
0 Пользователей и 1 Гость смотрят эту тему.
OOKapitan
Форумчанин
***
Offline Offline

Сообщений: 461


« Ответ #30: 28 Февраль 2018, 12:09 »

и зачем тебе 2 переменных s и  r  ?
Этот макрос - часть большего макроса.
Пробовал писать так: s=oFind.getRangeAddresses(0) - та же ошибка. Как всё-таки задать эту s?Получилось s=oFind.RangeAddresses(0).
Но теперь
Код:
If oFind.getByIndex(s).getRows().IsVisible=False
не работает. Как исправить?
« Последнее редактирование: 28 Февраль 2018, 12:12 от OOKapitan » Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 630


« Ответ #31: 28 Февраль 2018, 12:45 »

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

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

Записан
OOKapitan
Форумчанин
***
Offline Offline

Сообщений: 461


« Ответ #32: 28 Февраль 2018, 13:32 »

а до замены  RangeAddressesAsString на RangeAddresses работало ?
Да, работало.
Я не меняю значение ячейки. Я просто ищу нужное и работаю со строкой.
А как тогда исправит, чтобы если нашлось в скрытой строке - то не учитывалось?
Записан
OOKapitan
Форумчанин
***
Offline Offline

Сообщений: 461


« Ответ #33: 28 Февраль 2018, 13:33 »

s=oFind.RangeAddresses(0) возвращает массив
А если нашло только один раз?
Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 630


« Ответ #34: 28 Февраль 2018, 13:40 »

Да, работало.
Не верю (с) Улыбка RangeAddressesAsString возвращает строку, как ты ее вместо индекса мог использовать


А если нашло только один раз?
Даже если один раз, все равно возвращает массив.

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


« Последнее редактирование: 28 Февраль 2018, 13:43 от Bigor » Записан
OOKapitan
Форумчанин
***
Offline Offline

Сообщений: 461


« Ответ #35: 28 Февраль 2018, 13:48 »

RangeAddressesAsString возвращает строку
Если найдено только один раз - одно значение. Могу весь первоначальный код выложить - сам проверишь. Всё работало на ура, но только на текущем листе. А мне надо, чтобы на 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
« Последнее редактирование: 28 Февраль 2018, 14:03 от OOKapitan » Записан
OOKapitan
Форумчанин
***
Offline Offline

Сообщений: 461


« Ответ #36: 28 Февраль 2018, 13:49 »

В этой теме Rafic ссылку выкладывал на Питоньяка, найди поиском RangeAddresses и почитай,
Почитаю.
Но макрос мне нужен срочно. Как сделать, чтобы работал?
Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 630


« Ответ #37: 28 Февраль 2018, 13:52 »

Если найдено только один раз - одно значение.
типа а1, сомневаюсь, что оно подойдет вместо индекса.


Как сделать, чтобы работал?

Выше уже писал
Код:
if oFound.getByIndex(i).getRows().IsVisible then
 показываем
end if
только в цикле от 0 до oFound.Count-1
« Последнее редактирование: 28 Февраль 2018, 14:11 от Bigor » Записан
OOKapitan
Форумчанин
***
Offline Offline

Сообщений: 461


« Ответ #38: 28 Февраль 2018, 14:23 »

типа а1, сомневаюсь, что оно подойдет вместо индекса
Но у меня же работало.
Выше уже писал
Большущее спасибо. Сча потестю.
Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 630


« Ответ #39: 28 Февраль 2018, 14:29 »

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

Код:
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, может он ее как-то привел к целочисленной, но сильно сомневаюсь что искал он именно там, где ты хотел. И даже если бы все это сработало как нужно, то в случае если что-то нашлось в скрытой строке, то процедура на этом прекращает работу. Дальше не смотрел
« Последнее редактирование: 28 Февраль 2018, 14:51 от Bigor » Записан
OOKapitan
Форумчанин
***
Offline Offline

Сообщений: 461


« Ответ #40: 28 Февраль 2018, 15:17 »

если что-то нашлось в скрытой строке, то процедура на этом прекращает работу. Дальше не смотрел
Ну, мне писало, как в If - "Документ не найден"
Записан
OOKapitan
Форумчанин
***
Offline Offline

Сообщений: 461


« Ответ #41: 28 Февраль 2018, 15:34 »

Ошибок код, который теперь выглядит так:
Код:
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
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 630


« Ответ #42: 28 Февраль 2018, 15:48 »

Код:
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 ячеек с параметром поиска, ты их по очереди просматриваешь, но  если первая из них в скрытой строке, то макрос пишет "Документ не найден" и выходит из процедуры, т.е. остальные результаты поиска тебе уже не интересны?
Записан
OOKapitan
Форумчанин
***
Offline Offline

Сообщений: 461


« Ответ #43: 28 Февраль 2018, 16:11 »

если что-то нашло, то зачем выходит из цикла?
иначе ругается на строку
Код:
oSheet = oDoc.Sheets(i)
, и чтобы не искал дальше.
остальные результаты поиска тебе уже не интересны?
Один документ может встречаться один раз - на любом листе, но только на одном один раз - вероятность дубля где-то 1%
Записан
Bigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 630


« Ответ #44: 28 Февраль 2018, 16:41 »

если что-то нашло, то зачем выходит из цикла?
иначе ругается на строку
Ругается скорее всего из-за этого:
Цитата:
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


« Последнее редактирование: 28 Февраль 2018, 16:43 от Bigor » Записан
Страниц: « 1 2 3 4 5 6 7 8 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!