Удалить содержимое листа макросом

Автор Nikem79, 16 июля 2012, 15:20

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

Nikem79

Здравствуйте, подскажите пожалуйста как можно макросом удалить содержимое листа по его имени? Или хотя бы просто содержимое активного листа

JohnSUN

Добро пожаловать на форум!
Есть несколько способов.
Самый простой и надежный - удалить лист по имени (если он был) и создать новый с таким же именем.
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

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

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

я на либре офисе, должен подойти этот макрос?..

Nikem79

и кстати вообще эту команду не воспринимает oSheets.removeByName(SName)

JohnSUN

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

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

Nikem79

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

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

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

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

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

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

Nikem79

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

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

Hasim

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

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

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


Nikem79

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

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

Nikem79

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

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

помогите пожалуйста

JohnSUN

А запись с помощью макрорекордера последовательности нажатий клавиш 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

#13
Странно, когда я выделял CTRL+A и удалял содержимое, он мне создал макрос с удалением листа и созданием его заново... Щас попробую ваш макрос, благодарю!

Nikem79

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

Теперь думаю как это обойти...