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

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

25 Май 2020, 10:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2   Вниз
  Печать  
Автор Тема: Помогите: нужно вытащить из столбца натуральные числа и сделать анализ  (Прочитано 1502 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Bigor
Мастер
*****
Offline Offline

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


« Ответ #15: 12 Апрель 2020, 15:43 »

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

Код:
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
« Последнее редактирование: 12 Апрель 2020, 21:20 от Bigor » Записан

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

Сообщений: 13


« Ответ #16: 12 Апрель 2020, 23:51 »

От души...
Большое спасибо!
Записан
zoldato55
Участник
**
Offline Offline

Сообщений: 13


« Ответ #17: 13 Апрель 2020, 02:00 »

Попытался дописать в макросе перед поиском пропущенных номеров, применение функции 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

* for_zold2.ods (14.48 Кб - загружено 5 раз.)
Записан
zoldato55
Участник
**
Offline Offline

Сообщений: 13


« Ответ #18: 13 Апрель 2020, 11:15 »

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

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

* for_zold3.ods (13.73 Кб - загружено 4 раз.)
Записан
Bigor
Мастер
*****
Offline Offline

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


« Ответ #19: 13 Апрель 2020, 12:18 »

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

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

Сообщений: 13


« Ответ #20: 13 Апрель 2020, 16:40 »

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

Да я новичок - практически в первый раз можно сказать правлю макрос Либре...
« Последнее редактирование: 13 Апрель 2020, 17:17 от zoldato55 » Записан
zoldato55
Участник
**
Offline Offline

Сообщений: 13


« Ответ #21: 13 Апрель 2020, 17:39 »

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

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

* for_zold5.ods (16.46 Кб - загружено 7 раз.)
« Последнее редактирование: 13 Апрель 2020, 17:41 от zoldato55 » Записан
Bigor
Мастер
*****
Offline Offline

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


« Ответ #22: 13 Апрель 2020, 18:00 »

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

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

Сообщений: 13


« Ответ #23: 26 Апрель 2020, 17:09 »

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

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

* for_zold5.ods (16.46 Кб - загружено 6 раз.)
« Последнее редактирование: 26 Апрель 2020, 17:11 от zoldato55 » Записан
Bigor
Мастер
*****
Offline Offline

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


« Ответ #24: 26 Апрель 2020, 20:31 »

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

« Последнее редактирование: 27 Апрель 2020, 07:49 от Bigor » Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
Страниц: « 1 2   Вверх
  Печать  
 
Перейти в:  

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