Очистить столбец КОЛИЧЕСТВО от нулей

Автор OOKapitan, 29 января 2018, 16:59

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

OOKapitan

     Здравствуйте.
     Возникла следующая проблема.
     Изначально столбец "КОЛИЧЕСТВО" не всегда в столбце J. Но в процессе работы с файлом нужно сделать так, чтобы он оказался в столбце J. Делается это легко - удаляется нужное количество столбцов перед ним - и проблема не в этом. Проблема в том, что незаполненные количеством ячейки не всегда пусты. Иногда в них красуется цифра "ноль" (см. пример в приложении). И тогда файл довольно серьёзно подтупливает в процессе работы. Пожалуйста, может можно написать шустрый макрос, который убирал из столбца "КОЛИЧЕСТВО" нули. Но цифры, отличные от нуля, должны оставаться на месте. Помогите, пожалуйста.

JohnSUN

Погоди! Что значит "удаляется нужное количество столбцов перед ним"? Зачем? Давай просто макрос будет ориентироваться на ТЕКУЩУЮ колонку. То есть, поставил курсор в любую ячейку проверяемой колонки, выполнил макрос...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

OOKapitan

Цитата: JohnSUN от 29 января 2018, 15:04Давай просто макрос будет ориентироваться на ТЕКУЩУЮ колонку
Да давайте.
Про удаление - это я пояснил.
Просто в итоге мне нужно, чтобы столбец "КОЛИЧЕСТВО" был в столбце J. Но удалить нули нужно перед этим. Отлично, чтобы я выделил ячейку столбца, и выполнил макрос.
Только сам код я не в силах написать. Помогите, пожалуйста.

bigor

Так тебе нужно обязательно, что бы "Количество" было в J или можно что бы оно было в любом столбце, и макрос считал по этому столбцу, который ты выделишь укажешь мышкой?
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

OOKapitan

Цитата: Bigor от 29 января 2018, 15:31или можно что бы оно было в любом столбце, и макрос считал по этому столбцу, который ты выделишь укажешь мышкой?
В любом. В J я его ПОСЛЕ выполнения этого макроса переведу. До - файл тупит. После открытия файла первое что нужно - удалить нули. Я укажу мышкой столбец, запущу макрос, и он удалит нули. Я про это с первого поста пишу. Про перемещение в столбец J я написал, чтобы не было вопросов в стиле: "А почему при написании макроса про автоматическую фильтрацию в предыдущей теме этого не сказал? Мы бы сделали макрос не по конкретному столбцу".

JohnSUN

#5
Да, кстати! А почему при написании макроса про автоматическую фильтрацию в предыдущей теме этого не сказал? Мы бы сделали макрос не по конкретному столбцу  ;D  ;D  ;D

А может не будем их чистить? Просто спрячем да и дело с концом?
Sub qickFltrWithZero
Dim oSheet As Variant, i As Long
Dim oSelection As Variant, oActiveCell As Variant, oColumn As Variant
Dim oSearchDescr As Variant, oFound As Variant
oSelection = ThisComponent.getCurrentSelection()
oSpreadsheet = oSelection.getSpreadsheet()
oActiveCell = oSelection.getCellByPosition(0, 0)
oColumn = oSpreadsheet.getColumns().getByIndex(oActiveCell.getCellAddress().Column)
oSearchDescr = oColumn.createSearchDescriptor()
oSearchDescr.setSearchString("^0$")
oSearchDescr.SearchRegularExpression = True
oFound = oColumn.findAll(oSearchDescr)
For i = oFound.getCount()-1 To 0 Step -1
oFound.getByIndex(i).getRows().IsVisible = False
Next i
oFound = oColumn.queryEmptyCells()
For i = oFound.getCount()-1 To 0 Step -1
oFound.getByIndex(i).getRows().IsVisible = False
Next i
End Sub


Впрочем, если хочешь действительно очистить нули, то это не сложно - просто первый из циклов будет таким:
For i = oFound.getCount()-1 To 0 Step -1
oFound.getByIndex(i).clearContents(23)
Next i
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

bigor

#6
Лепота!
Ну и что бы ему еще не надо было самому столбцы удалять, добавлю :)
if oActiveCell.RangeAddress.StartColumn > 9 Then
   For i = oActiveCell.RangeAddress.StartColumn -1 To 9 Step -1   
      oSpreadsheet.Columns.removeByIndex(i, 1)
   Next
   endif

так быстрее
if oActiveCell.RangeAddress.StartColumn > 9 Then
  i = oActiveCell.RangeAddress.StartColumn-9
    oSpreadsheet.Columns.removeByIndex(oActiveCell.RangeAddress.StartColumn-i, i)
      endif

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

economist

#7
Зачем макросы там, где они не нужны?

Выбрать мышью столбец J:J
Ctrl+H
Ввести 0
флаг Ячейка целиком
нажать Заменить все

Итого 4 секунды на решение задачи. Сейчас, конечно, посыпятся предположения что ТС хотел не того.

PS Очищение нулей не ускорит файл. А вот очистка форматов или тупо удаление (1048576-2500)*1024=1 миллиарда ячеек - вполне.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

OOKapitan

#8
Цитата: economist от 30 января 2018, 07:30Выбрать мышью столбец J:J
Ctrl+H
Ввести 0
флаг Ячейка целиком
нажать Заменить все
Это будет доолго с учётом тупления файла. Но спасибо за подсказку. Про флаг "Ячейка целиком" я не знал. Упс, - а отнюдь не долго. Тогда макросы действительно не нужны.

Цитата: economist от 30 января 2018, 07:30Очищение нулей не ускорит файл
Отнюдь. Как я уже сказал, у меня бывает два типа файлов, отличающихся друг от друга только наличием нулей. Так вот файл БЕЗ нулей - ЛЕТАЕТ, а с нулями - ПОДТУПЛИВАЕТ.

OOKapitan

Цитата: Bigor от 29 января 2018, 18:36так быстрее
Отлично.
А чем будет отличатся то этого кода код, который должен отменять действие этого кода (возвращать удалённые столбцы)?

bigor

Отменять действие не знаю, а вставляет новые столбцы
oSpreadsheet.Columns.removeByIndexinsertByIndex(куда, сколько)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

OOKapitan

Цитата: Bigor от 30 января 2018, 10:08а вставляет новые столбцы
Большущее спасибо.
Но новые столбцы вставятся пустые. А мне нужно иметь возможность быстро вернуть удалённые столбцы со всеми данными в них. Помогите, пожалуйста.

JohnSUN

"Элементарно, Ватсон!"
ЦитироватьПерезагрузить
Замена текущего документа на его последнюю сохраненную версию.
Любые изменения, внесенные после последнего сохранения документа, будут потеряны.

Доступ к этой команде Выберите Файл - Перезагрузить
Догадываешься откуда цитата?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

bigor

Ты лучше расскажи что тебе от этого файла в итоге надо, может подскажут более простой вариант этого добиться
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

OOKapitan

      Народ, а что в конце кода написать, чтобы было так: когда столбцы удалены выскакивает окошко с сообщением "Продолжить?" (без кавычек), - если я нажимаю да, то выполняется другой макрос (название я сам подставлю, все макросы лежат у меня в Мои макросы - Standart - Module1)?