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

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

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

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Удаление строк с нулевыми значениями в одном столбце  (Прочитано 4021 раз)
0 Пользователей и 1 Гость смотрят эту тему.
nivalenov
Участник
**
Offline Offline

Сообщений: 7


« Стартовое сообщение: 6 Май 2015, 06:18 »

Здравствуйте! Вроде простая задача, но не получается. Необходимо перебрать строки с 10 по 713 и удалить те в которых в столбце D значения=0
Код взял в одной из тем, немного поменял. не работает вообщем.

Код:
oSheet = oDoc1.CurrentController.getActiveSheet()
myrows=oSheet.getrows
 
textnd = osheet.getcellbyposition(3,i).string

for i=713 to 10 step -1
If textnd = "0" Then
myrows.removebyindex(i,3)
end if
next i

Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 727


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #1: 6 Май 2015, 06:55 »

Как насчёт перенести чтение ноля (вычисление textnd) на строчку ниже, внутрь цикла?
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
rami
Гуру
*******
Online Online

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #2: 6 Май 2015, 07:02 »

Код:
Sub main
oSheet = ThisComponent.CurrentController.getActiveSheet()
myrows=oSheet.getrows
for i=713 to 10 step -1     'цикл в обратном порядке, от конца к началу
textnd = osheet.getcellbyposition(3,i).String  'эта строка должна быть внутри цикла
If textnd = "0" Then        'условие ищет "0", но не пустую ячейку
myrows.removebyindex(i,1)   'i — это номер строки, а второй параметр количество удаляемых строк
end if
next i
End Sub
Записан

nivalenov
Участник
**
Offline Offline

Сообщений: 7


« Ответ #3: 6 Май 2015, 07:04 »

Спасибо,се верно. сделал так, заработало. Но только долго для 700 строк... Может есть другие способы?

Код:
odoc=thiscomponent
 oSheet = oDoc.CurrentController.getActiveSheet()
 myrows=oSheet.getrows
 
 rowmax=712
 rowmin=9
 
 For i=rowmax To rowmin step -1
 textnd = osheet.getcellbyposition(3,i).string
    If textnd = "0" Then
      myrows.removebyindex(i,1)
    End if  
 Next i
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 727


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #4: 6 Май 2015, 07:43 »

Но только долго для 700 строк... Может есть другие способы?
https://youtu.be/inxTQ2vkQTI
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Андрей2014
Участник
**
Offline Offline

Сообщений: 38


« Ответ #5: 6 Май 2015, 17:41 »

Разве нельзя автофильтром выделить все строки "не 0", потом их выделить, скопировать...
Записан
rami
Гуру
*******
Online Online

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #6: 6 Май 2015, 17:57 »

Разве нельзя автофильтром выделить все строки "не 0", потом их выделить, скопировать...
Можно, но не автофильтром, а обычным, и результат сохранить на новый лист. Но вопрос не об этом , а об удалении строк.
Записан

JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 727


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #7: 6 Май 2015, 18:07 »

+1

Можно, конечно... Но, как всегда, основной контраргумент - "Это слишком много нажатий кнопок, а операция повторяется довольно часто - нужно это сделать максимум одним нажатием..." Поэтому и пишутся такие макросы.
Вообще-то, если переформулировать задачу, нужно подтянуть наверх, к 10-ой строке, все строки до 713-ой, для которых в четвертой колонке указан не ноль.
Самый простой способ, но медленный - действительно поудалять такие строки, остальные сами подтянутся наверх.
Быстрый способ - одним оператором считать в массив все значения из A10:D173, пересортировать этот массив и, опять-таки одним оператором, записать на старое место.
Но поскольку неизвестно, о каких данных идёт речь (образца таблицы не было), то этот вариант макроса и не предлагался.
Дело в том, что если в этом диапазоне только значения (строки-числа-даты), то этим "одним оператором" будет oRange.getDataArray(), а если там попадаются формулы, то oRange.getFormulaArray(). В случае формул при сортировке нужно позаботиться об изменении адресов (если они в формулах встречаются)... В общем, задача не тривиальная. Хотя вполне решаемая...
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
rami
Гуру
*******
Online Online

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #8: 6 Май 2015, 18:32 »

Но поскольку неизвестно, о каких данных идёт речь (образца таблицы не было)
Было здесь: http://forumooo.ru/index.php/topic,4891.0.html
Есть простой и быстрый способ вручную выделить диапазон D10:D713, найти все 0 и не снимая выделение удалить строки
Если через макрос, то так:
Код:
Sub Main1   Dim oDoc, oDisp, oRange, oSDescr, oFound, args1(0) As New com.sun.star.beans.PropertyValue
oDoc=ThisComponent.CurrentController.Frame
oDisp=createUnoService("com.sun.star.frame.DispatchHelper")
oRange=ThisComponent.CurrentController.ActiveSheet.getCellRangeByPosition(3,9,3,712)
oSDescr=oRange.createSearchDescriptor()
oSDescr.SearchWords=true
oSDescr.SearchString="0"
oFound=oRange.findAll(oSDescr)
ThisComponent.getCurrentController().Select(oFound)
args1(0).Name="Flags"
args1(0).Value="R"
oDisp.executeDispatch(oDoc, ".uno:DeleteCell", "", 0, args1())
End Sub
но при этом ломаются ссылки в столбце A
Лучше всего результат фильтрации в новый лист.
В общем, задача не тривиальная. Хотя вполне решаемая...
Если задача туманная, то и решение будет "как бы"
Записан

JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 727


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #9: 6 Май 2015, 20:33 »

Было здесь: ...
Ага, вижу...
но при этом ломаются ссылки в столбце A
Если бы только там - можно было бы исхитриться... Например, добавить еще два именованных диапазона - что-то вроде НачалоРаздела с формулой IF($D11>0;1;0) и СледующийНомер с формулой IF($D12>0;$A11+1;$A11+0). Тогда во всей колонке A было бы только =НачалоРаздела и =СледующийНомер, а эти формулы не поломались бы.
Но там ещё формулы с суммарными итогами и т.п. Их тоже нужно защитить от разрушения...
Если задача туманная, то и решение будет "как бы"
И опять +1
« Последнее редактирование: 6 Май 2015, 20:39 от JohnSUN » Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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