Имя: Пароль:
IT
Админ
Libre/OpenOffice таблица, автофильтр и нумерация
0 andrewks
 
22.12.11
15:56
исходные: есть таблица-список, в первой колонке № п/п, есть фильтры на колонках.
задаю значение фильтра  по некоторой колонке, получаю под-список.

вопрос: как добиться авто-нумерации в 1-й колонке для под-списка?

варианты "руками" и "скопипастить в другую вкладку и пронумеровать" не предлагать
1 filh
 
22.12.11
16:00
позвать специалиста? не?
:)
2 filh
 
22.12.11
16:00
пс не юзаю ни того, ни другова)
3 andrewks
 
22.12.11
16:00
(1) "я и есть специалист!" ©
:)
4 Ковычки
 
22.12.11
16:01
а разве в ООо существует автофильтр ?
5 andrewks
 
22.12.11
16:02
ещё заметил адский глюк: фильтр по колонке со строками типа "= НужнаяСтрока"  отрабатывает не как "=", а как "содержит"

хрень какая-то
6 andrewks
 
22.12.11
16:03
(4) ты не поверишь
7 Ковычки
 
22.12.11
16:03
(6) не поверю
8 andrewks
 
22.12.11
16:03
+(5) причём это проверено в разных версиях OO и LO ветки 3.х
9 andrewks
 
22.12.11
16:04
(7) Данные\Фильтр\Автофильтр
10 Ковычки
 
22.12.11
16:05
(9) и чо там ?
11 andrewks
 
22.12.11
16:06
не, в принципе, мне не сложно щас это ручками (в смысле - копипастами) сделать, интересно знать красивое решение
12 andrewks
 
22.12.11
16:07
(10) а чо там, на твой взгляд, должно быть?
13 filh
 
22.12.11
16:08
(12) картинку давай, не жми!
14 andrewks
 
22.12.11
16:10
15 filh
 
22.12.11
16:12
во, я даже понял что надо)))
16 filh
 
22.12.11
16:14
видимостью можно играться программно?
17 andrewks
 
22.12.11
16:17
(16) думаю, да. я, если честно, в скрипты опена ни разу не лез, я врайтером-то пользуюсь всего 2-3 раза на дню, а калком - и того реже. просто подумал, может, кто уже озадачивался таким, и есть что-то готовое. на будущее, так сказать
18 filh
 
22.12.11
16:19
добавь колонку спереди с №п/п и заполняй руками.
19 andrewks
 
22.12.11
16:22
(18) "протаскивание" нумерации не работает в этом случае так, как надо мне - нумеруются все строки, а не только видимые.
пока самый быстрый вариант - с копипастами под-списков на другой лист и нумерацией там "протаскиванием"
20 filh
 
22.12.11
16:25
(19) а протаскивание и не будет работать в таком случае.
21 filh
 
22.12.11
16:30
)) знаю как))
22 Ковычки
 
22.12.11
16:34
в ООо нет автофильтра
23 filh
 
22.12.11
16:36
+21 там формулы есть?
24 andrewks
 
22.12.11
16:43
(23) конечно есть
(22) пофиг, какие требования ты предъявляешь к автофильтру, главное, то, что называется автофильтром в опене, делает то, что надо
25 filh
 
22.12.11
16:45
(19) В общем, лови http://webfile.ru/5739544
26 filh
 
22.12.11
16:45
только это от мс
27 filh
 
22.12.11
16:47
(24) если D2 стереть, то фильтров не надо ставить.
28 andrewks
 
22.12.11
16:57
(25) идея прикольная, но нет универсализма (например, фильтр включили в нескольких колонках, или фильтр не по "=", а по ">=", или "содержит") + нужно ручное участие (вписать тек.значение фильтра в спец.ячейку).

в любом случае, спасибо за участие
29 filh
 
22.12.11
16:58
если по нескольким, сделай еще столбец для второго-третьего и скока там будет, а потом сворачивай по И. профит)
30 filh
 
22.12.11
17:00
а вот для больше/меньше надо думать еще)))
31 andrewks
 
22.12.11
17:03
(30) ладно, забей :)  будем считать, что это задачка для скрипта. только времени нет сейчас для изучения скриптов опена. вот когда прижмёт невмоготу, тогда, может, и засяду за изучение.
32 filh
 
22.12.11
17:06
(31) ок
:)
33 Ковычки
 
22.12.11
17:23
В простейшем разе, если нумератор слева (не обязательно первая колонка)

sub xxxx
   [Док] = ThisComponent
   [Листы]=[Док].getSheets()
   [Лист]=[Листы].getByIndex(0)
   [Курсор]=[Лист].createCursor()
   [Курсор].gotoStartOfUsedArea(0)
   [Курсор].gotoEndOfUsedArea(-1)
   [Адреса]=[Курсор].getRangeAddress()
   [Диапазон]=[Лист].getCellRangeByPosition([Адреса].StartColumn,[Адреса].StartRow,[Адреса].EndColumn,[Адреса].EndRow)
   [Поиск]=[Диапазон].createSearchDescriptor()
   [Поиск].SearchRegularExpression = -1
   [Поиск].SearchString = ".+"
   [Рез]=[Диапазон].findAll([Поиск])
   [Всего]=[Рез].getCount()
   [Начало]=[Рез].getByIndex(0).getRangeAddress()
   [Конец]=[Рез].getByIndex([Всего]-1).getRangeAddress()
   [Диапазон]=[Диапазон].getSpreadsheet().getCellRangeByPosition([Начало].StartColumn, [Начало].StartRow,[Конец].EndColumn,[Конец].EndRow)
   if [Док].DatabaseRanges.hasByName("XXX") then [Док].DatabaseRanges.removeByName("XXX")
   [Док].DatabaseRanges.addNewByName("XXX", [Диапазон].getRangeAddress())
   [ДиапазонДанных]=[Док].DatabaseRanges.getByName("XXX")
   [ДиапазонДанных].UseFilterCriteriaSource = False
   [ДиапазонДанных].AutoFilter = True
   [Фильтр] = [ДиапазонДанных].getFilterDescriptor()
   [Поля] = createUnoStruct("com.sun.star.sheet.TableFilterField")
   With [Поля]
       .Connection = com.sun.star.sheet.FilterConnection.OR
       .Field = 0
       .Operator = com.sun.star.sheet.FilterOperator.GREATER_EQUAL
       .isNumeric = True
       .NumericValue = 3
'        .StringValue = "Вася"
   End With
   [Фильтр].setFilterFields(Array([Поля]))
   [ДиапазонДанных].refresh()
   [ВидимыйДиапазон]=[Диапазон].queryVisibleCells()
   [Перечисление]=[ВидимыйДиапазон].createEnumeration()
   [Перечисление].nextElement()
   do while [Перечисление].hasMoreElements()
       [ПодДиапазон] = [Перечисление].nextElement()
       [Массив]() = [ПодДиапазон].getDataArray()
       for [Сч] = lBound([Массив]) to uBound([Массив])
           [Массив]([Сч])(0)=[Сч]+1
       next
       [ПодДиапазон].setDataArray([Массив])
   loop    
end sub
34 Ковычки
 
22.12.11
17:24
На деле, тебе надо только эту часть

   [ВидимыйДиапазон]=[Диапазон].queryVisibleCells()
   [Перечисление]=[ВидимыйДиапазон].createEnumeration()
   [Перечисление].nextElement()
   do while [Перечисление].hasMoreElements()
       [ПодДиапазон] = [Перечисление].nextElement()
       [Массив]() = [ПодДиапазон].getDataArray()
       for [Сч] = lBound([Массив]) to uBound([Массив])
           [Массив]([Сч])(0)=[Сч]+1
       next
       [ПодДиапазон].setDataArray([Массив])
   loop
35 filh
 
22.12.11
17:25
(33) красава))))
36 andrewks
 
22.12.11
17:32
(33) о, спасибо большое! вечерком гляну, щас убегаю