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

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

23 Сентябрь 2021, 14:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Сообщений: 41


« Стартовое сообщение: 16 Июль 2012, 14:20 »

Здравствуйте, подскажите пожалуйста как можно макросом удалить содержимое листа по его имени? Или хотя бы просто содержимое активного листа
« Последнее редактирование: 16 Июль 2012, 15:07 от Nikem79 » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #1: 16 Июль 2012, 16:29 »

Добро пожаловать на форум!
Есть несколько способов.
Самый простой и надежный - удалить лист по имени (если он был) и создать новый с таким же именем.
Код:
Sub reCreateSheet(SName As String)
Dim oSheets As Variant
  oSheets = ThisComponent.getSheets()
  If oSheets.hasByName(SName) Then oSheets.removeByName(SName)
  oSheets.insertByName(SName, 0)
End Sub
Чуть сложнее - выбрать лист, вычислить область, в которой есть данные, и для этого диапазона выполнить метод .clearContents. Зато в этом случае можно, например, удалить только данные, а всё форматирование оставить на месте...
Записан

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

Сообщений: 41


« Ответ #2: 16 Июль 2012, 16:38 »

спасибо за помощь, однако

Ругается на If oSheets.hasByName(SName) Then oSheets.removeByName(SName)
выдаёт
ошибку времени выполнения Basic
Аргумент является обязательным

я на либре офисе, должен подойти этот макрос?..
« Последнее редактирование: 16 Июль 2012, 16:58 от Nikem79 » Записан
Nikem79
Участник
**
Offline Offline

Сообщений: 41


« Ответ #3: 16 Июль 2012, 16:43 »

и кстати вообще эту команду не воспринимает oSheets.removeByName(SName)
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #4: 16 Июль 2012, 17:37 »

Ты, наверное, просто пытаешься этот макрос выполнить. А ему нужен параметр - имя листа. Допиши процедуру:
Код:
Sub testClear
   reCreateSheet("Лист2") ' или какое-то другое имя листа
End Sub
и уже этот макрос запускай на выполнение
Записан

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

Сообщений: 41


« Ответ #5: 16 Июль 2012, 17:44 »

Долгим методом подбора наковырял работоспособный код:

Код:
Sub sequencialFiles
Dim oDoc as Object
oDoc = ThisComponent

   If oDoc.Sheets.hasByName("SName") Then
     oDoc.Sheets.removeByName("SName")
   EndIf
  
 oSheet = oDoc.createInstance ("com.sun.star.sheet.Spreadsheet")
 oDoc.Sheets.insertByName ("SName", oSheet)

End Sub


Спасибо JohnSUN!
Записан
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #6: 16 Июль 2012, 18:15 »

Что-то вас, ребята, заносит не туда!
Всё же очень просто:

Код:
Sub Main ' запускать этот макрос!
SName="Лист1"
reCreateSheet(SName)
End Sub

Sub reCreateSheet(SName As String)
Dim oSheets As Variant
  oSheets = ThisComponent.getSheets()
  If oSheets.hasByName(SName) Then oSheets.removeByName(SName)
  oSheets.insertNewByName(SName, 0) ' 0 (в начале списка листов) - положение нового листа в книге
End Sub
Записан
Nikem79
Участник
**
Offline Offline

Сообщений: 41


« Ответ #7: 17 Июль 2012, 08:45 »

Hasim, спасибо за вариант!

Вообще, честно говоря, я расчитывал что есть какая-нибудь команда очистить лист, очистить ячейку, очистить документ, строку столбец и тд) Очень странно что нельзя сделать этого одной командой, а приходится через удаление листа и восстановления его снова.
« Последнее редактирование: 17 Июль 2012, 08:50 от Nikem79 » Записан
Nikem79
Участник
**
Offline Offline

Сообщений: 41


« Ответ #8: 17 Июль 2012, 08:48 »

Подскажите ещё пожалуйста как присвоить переменной имя текущего листа?

То есть мне нужно проверить на каком листе выделяются ячейки, и в зависимости от имени листа раскидывать выделенные данные по нужным ячейкам на новом листе.
Записан
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #9: 17 Июль 2012, 11:07 »

Вообще, честно говоря, я расчитывал что есть какая-нибудь команда очистить лист, очистить ячейку, очистить документ, строку столбец и тд) Очень странно что нельзя сделать этого одной командой, а приходится через удаление листа и восстановления его снова.

Почему нельзя, очень даже можно. См. ответы JohnSUN.

Есть несколько способов.
Самый простой и надежный - удалить лист по имени (если он был) и создать новый с таким же именем.
...
Чуть сложнее - выбрать лист, вычислить область, в которой есть данные, и для этого диапазона выполнить метод .clearContents. Зато в этом случае можно, например, удалить только данные, а всё форматирование оставить на месте...
Вот этот второй метод и нужен.
Правда, JohnSUN почему-то пожадничал и не стал его описывать. Но если его попросить хорошенько, он опишет очень даже подробно.

Записан
Nikem79
Участник
**
Offline Offline

Сообщений: 41


« Ответ #10: 17 Июль 2012, 11:19 »

Для этого понадобится как-то выделять данные, а запись макроса не поддерживает выделения мышью. Удалось выделять только курсором для записи макроса, однако код убойной длины получился. На выделение каждой ячейки штук 6 строк и цикл применить у меня не получилось... Не разобрался. В любом случае слишком долго он выполняется, как-то криво тоже.

Но это опять же нужно выделять область, а я говорил про возможность очистки всего листа...
Записан
Nikem79
Участник
**
Offline Offline

Сообщений: 41


« Ответ #11: 17 Июль 2012, 13:14 »

Таки, оказалось принципиально не удаление всего листа и создание заново, а именно стирание содержимого, так как при удалении и создании нового листа теряются ссылки ведущие на него с других листов!..

Актуально очистка данных всего листа

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

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


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


WWW
« Ответ #12: 17 Июль 2012, 13:42 »

А запись с помощью макрорекордера последовательности нажатий клавиш Ctrl+A (выделить весь лист) - BackSpace (окно чистки) не сработала?
У меня получилось такое:
Код:
sub clearCurrentSheet
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:SelectAll", "", 0, Array())
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Flags"
args1(0).Value = "A"
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args1())
end sub
Если выделить несколько листов и запустить макрос - почистит все выделенные...
Записан

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

Сообщений: 41


« Ответ #13: 17 Июль 2012, 14:18 »

Странно, когда я выделял CTRL+A и удалял содержимое, он мне создал макрос с удалением листа и созданием его заново... Щас попробую ваш макрос, благодарю!
« Последнее редактирование: 17 Июль 2012, 14:23 от Nikem79 » Записан
Nikem79
Участник
**
Offline Offline

Сообщений: 41


« Ответ #14: 17 Июль 2012, 15:14 »

Новая проблема возникла, мой макрос должен копировать выделенные строчки из одного листа в другой, так вот когда лист очищается, снимается выделение с исходного листа и выделяется диапазон на новом листе для удаления. И далее по коду после очистки он пытается скопировать всё сам в себя)))

Теперь думаю как это обойти...
Записан
Страниц: 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!