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

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

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

bigor

А вот еще интересный момент
d=InputBox("Введите статус", "Статус документа")
      If d="" Then Exit Sub
человек случайно ничего не ввел, и все - процедура прекращается, в независимости от того, что до этого она там в ячейки что-то понаписала, и скорее всего уже повторный запуск будет некорректным.

но тут то хоть сразу проверяет  и выходит, а здесь
a=InputBox("Введите номер", "Параметры поиска")
For i=1 To 6
oSheet = oDoc.Sheets(i)
If a="" Then Exit Sub
сперва ввод, потом запуск цикла, инициализация переменной и только потом смотрим, а ввели ли мы чего и, если нет, все закрываем :)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

OOKapitan

Цитата: Bigor от 28 февраля 2018, 14:41у тебя нет 7-го листа. сделай цикл от 0 до 5
у меня 7 листов. На первом - огромная кнопища к которой привязан данный макрос.

OOKapitan

Цитата: Bigor от 28 февраля 2018, 14:50что до этого она там в ячейки что-то понаписала
До этого она в ячейки ничего не писала.

OOKapitan

Цитата: Bigor от 28 февраля 2018, 14:41оставь
Поправил - код ошибок не выдаёт, но и вообще ничего не делает.

bigor

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

OOKapitan

Цитата: Bigor от 28 февраля 2018, 15:29выложи правленный
вот:
Sub Proverka_documentov
Dim desc, oFind, s, a, r, k, b, c, d
oDoc=ThisComponent
a=InputBox("Введите номер", "Параметры поиска")
If a="" Then Exit Sub
For i=1 To 6
oSheet = oDoc.Sheets(i)
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
If oFind.getByIndex(0).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
Next i
End Sub


OOKapitan

Код запускается кнопкой с первого листа и должен искать по остальным.

bigor

в общем у тебя почти везде чтение из ячейки через  value, сомневаюсь, что оно правильно текст возвращает, меняй на string
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

OOKapitan

#53
Цитата: Bigor от 28 февраля 2018, 15:44в общем у тебя почти везде чтение из ячейки через  value, сомневаюсь, что оно правильно текст возвращает, меняй на string
Ну ок. Но до последнего исправления, мне MsgBoxы нужное возвращали. А сейчас - вообще тишина.
:o Сейчас исправил на String - и заработало. Но ведь в первом коде для текущего листа работало и с Value. Почему же в коде для любого листа не стало работать?

bigor

Цитата: OOKapitan от  1 марта 2018, 08:53Но до последнего исправления, мне MsgBoxы нужное возвращали
В msgbox у тебя везде string и стоит  :) , а вот в условиях value и как они обрабатывались неизвестно
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

OOKapitan

Цитата: Bigor от  1 марта 2018, 09:41а вот в условиях value и как они обрабатывались неизвестно
Цитата: OOKapitan от  1 марта 2018, 08:53Но ведь в первом коде для текущего листа работало и с Value. Почему же в коде для любого листа не стало работать?
Весь код работал, а не только MsgBox. Почему?

OOKapitan

Появилась новая проблема - код ищет только на первом листе (по счёту исходя из интервала For). Как это исправить?

bigor

Я тебе вчера несколько раз указывал, что Exit Sub ты натыкал недумая, типа иаслом кашу не испортишь :)
 
Цитата: OOKapitan от 28 февраля 2018, 15:40If Not IsNull(oFind) Then
Exit For
Else
Print "Документ не найден"
Exit Sub
End If

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

OOKapitan

Цитата: Bigor от  1 марта 2018, 12:01смотри свое условие, не нашел он ничего, что делать будет?
Я это уже увидел. Тогда как сделать следующее: макро ищет значение, указанное в первом InputBoxе на всех листах , указанных в цикле For, если ни на одном листе не находит - пишет "Документ не найден" и выходит из процедуры?

bigor

Первое, что в голову пришло введи переменную, допустим Flag_1 :) и присвой ей True, если когда-нибудь что-нибудь найдется, то сделай ее False. А в конце процедуры условие if Flag_1 then msgbox "Ничего не нашел"
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут