Помогите: нужно вытащить из столбца натуральные числа и сделать анализ

Автор zoldato55, 11 апреля 2020, 17:49

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

bigor

Ну и макрос, неоптимизированный, просто перебор ячеек, но зато список отсортирован :)

Sub Main
oSheet = ThisComponent.Sheets(0)
i=1
k=""
While oSheet.getCellbyPosition(2,i).getstring() <> ""
If oSheet.getCellbyPosition(2,i).getvalue() - oSheet.getCellbyPosition(2,i-1).getvalue() > 1 Then

For j=oSheet.getCellbyPosition(2,i-1).getvalue()+1 To oSheet.getCellbyPosition(2,i).getvalue()-1
k= k  & j & ","
next
End If
oSheet.getCellbyPosition(3,1).setstring(k)
i=i+1
wend
End Sub
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут


zoldato55

Попытался дописать в макросе перед поиском пропущенных номеров, применение функции VALUE(MID(A1;14;5)) - которая преобразует кусок вырезаемой строчки в число, но что-то не выходит - подскажете? Таблица с макросом во вложении.

Sub Main
oSheet = ThisComponent.Sheets(0)
i=0
k=""
cus=createUnoService("com.sun.star.sheet.FunctionAccess")   'доступ к функциям
While oSheet.getCellbyPosition(0,i).getstring() <> "" 'пробегаемся по нулевому столбцу
   arg = array(oSheet.getCellbyPosition(0,i).getstring(), 14, 5 ) 'список аргументов для применения функции MID (для вырезания из строки нулевого столбца кусочек)
   arg1 = array(cus.callFunction("MID",arg)) 'список аргументов (1 аргумент) для применения функции VALUE (для преобразования кусочка строки в число)
   oSheet.getCellbyPosition(1,i).setstring(oSheet.getCellbyPosition(0,i).getvalue(cus.callFunction("VALUE",arg1))) 'записываем в первый столбец натуральное число
   i=i+1
wend

i=1
While oSheet.getCellbyPosition(1,i).getstring() <> ""
   If oSheet.getCellbyPosition(1,i).getvalue() - oSheet.getCellbyPosition(1,i-1).getvalue() > 1 Then
      
      For j=oSheet.getCellbyPosition(1,i-1).getvalue()+1 To oSheet.getCellbyPosition(1,i).getvalue()-1
         k= k  & j & ","
      next
   End If
oSheet.getCellbyPosition(2,1).setstring(k)   
i=i+1
wend
End Sub

zoldato55

Все - сам понял где не правильно:
Так работает норм:

Sub Main
oSheet = ThisComponent.Sheets(0)
i=0
k=""
cus=createUnoService("com.sun.star.sheet.FunctionAccess")   'доступ к функциям
While oSheet.getCellbyPosition(0,i).getstring() <> "" 'пробегаемся по нулевому столбцу
   arg = array(oSheet.getCellbyPosition(0,i).getstring(), 14, 5 ) 'список аргументов для применения функции MID (для вырезания из строки нулевого столбца кусочек)
   arg1 = array(cus.callFunction("MID",arg)) 'список аргументов (1 аргумент) для применения функции VALUE (для преобразования кусочка строки в число)
   oSheet.getCellbyPosition(1,i).setvalue(cus.callFunction("VALUE",arg1)) 'записываем в первый столбец натуральное число
   i=i+1
wend

i=1
While oSheet.getCellbyPosition(1,i).getstring() <> ""
   If oSheet.getCellbyPosition(1,i).getvalue() - oSheet.getCellbyPosition(1,i-1).getvalue() > 1 Then
      
      For j=oSheet.getCellbyPosition(1,i-1).getvalue()+1 To oSheet.getCellbyPosition(1,i).getvalue()-1
         k= k  & j & ","
      next
   End If
oSheet.getCellbyPosition(2,1).setstring(k)   
i=i+1
wend
End Sub

bigor

А чего не формулой :) А по макросу, StarBasik может сам строки резать InStr(), и в числа переводить. И ради интереса, если таблица большая сравните время обработки макросом и формулами
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

zoldato55

Цитата: Bigor от 13 апреля 2020, 12:18
А чего не формулой :) А по макросу, StarBasik может сам строки резать InStr(), и в числа переводить. И ради интереса, если таблица большая сравните время обработки макросом и формулами

Да я новичок - практически в первый раз можно сказать правлю макрос Либре...

zoldato55

Вот написал - во вложении.

Еще вопрос возник: можно сделать, чтобы макрос ругался (выскакивало сообщение) в двух случаях:
1) Если числа идут в списке не по порядку (например 1, 2, 3, 10, 4, 11)
2) Если в списке есть одинаковые числа - "дубли".

bigor

А зачем текст макроса в таблице :)
В общем первый вопрос легко решается, добавляем еще одно условие
If oSheet.getCellbyPosition(1,i).getvalue() - oSheet.getCellbyPosition(1,i-1).getvalue() < 0 Then print "Числа не по порядку"
Для второго нужно еще цикл организовывать или сортировать столбец
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

zoldato55

Помогите пожалуйста доработать скрипт.
Во вложении файлик со скриптом - скрипт в итоге записывает в желтую ячейку список пропущенных номеров.
Нужно чтобы в списке пропущенных номеров, если встречаются разрывы в нумерации больше чем на 1, то в желтую ячейку записывались разрывы через тире, например: 4,12-17,19-20,55.
(т.е. пропущенные номера 4, с 12-го номера по 17-й, с 19-го по 20-й, 55).

Для примера в файлике список пропущенных должен быть таким: 4-9,12,14.

bigor

Цитата: zoldato55 от 26 апреля 2020, 17:09Во вложении файлик со скриптом
нет во вложенном файле скрипта, то что в
таблице по ячейкам раскидано - не скрипт. Поэтому  на словах:
после/вместо If oSheet.getCellbyPosition(1,i).getvalue() - oSheet.getCellbyPosition(1,i-1).getvalue() > 1 Then
добавляете 2 условия
1. если разница =2, то находим пропущенное значение и добавляем его  в вывод
2. если разница > 2, то находим первое и последнее пропущенное значение и добавляем их  в вывод через дефис.

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