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

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

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

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Пропадает макрос  (Прочитано 624 раз)
0 Пользователей и 1 Гость смотрят эту тему.
kolob204
Участник
**
Offline Offline

Сообщений: 19


« Стартовое сообщение: 7 Декабрь 2018, 10:39 »

Здравствуйте.

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

Однажды Открыв файл - я обнаружил что макроса не существует.

Писать во второй раз мне, как человеку который вообщем то "занимается этим не часто" - очередная мУка Улыбка

Профиль Windows системы тот же, файл тот же(по тому же пути), сбоев при работе с файлом не было...
может кто то знает волшебную комбинацию по спасению макроса в таких случаях?

PS
он уже не первый раз так пропадает, но первый раз макрос пропадал тогда, когда ещё был частично написан, и я, вздохнув,  писал его заново.
Надо было бэкап кода сделать  Грустный
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #1: 7 Декабрь 2018, 10:47 »

...или бэкап файла... Кстати, может быть, ещё не всё потеряно - возможно офис самостоятельно бэкап создал.
Глянь в Сервис-Параметры-Пути соответствующий пункт и пойди туда с помощью обычного проводника. Если повезёт, то что-то полезное там найдешь.

Между прочим, в каком формате (с каким расширением) файл сохранял?
Записан

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

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 368


« Ответ #2: 7 Декабрь 2018, 10:55 »

И какая версия офиса? На какой ОС?
Записан

С уважением,
Михаил Каганский
kolob204
Участник
**
Offline Offline

Сообщений: 19


« Ответ #3: 7 Декабрь 2018, 10:57 »


по пути C:\Users\user\AppData\Roaming\LibreOffice\4\user\backup - нужного мне файла нет

ОС Windows 8.1 x64 (ru)

LibreOffice
Версия: 5.0.4.2
ID сборки: 2b9802c1994aa0b7dc6079e128979269cf95bc78
Локаль: ru-RU (ru_RU)

Формат сохранения файkа XLS


PS
Погуглил ещё... говорят в файлах , с форматом XLS не созраняются макросы. потому что формат не родной....
божечьки мои...))))
« Последнее редактирование: 7 Декабрь 2018, 11:05 от kolob204 » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #4: 7 Декабрь 2018, 11:09 »

Формат сохранения файkа XLS
"Ты не поверишь, Билл, но мне действительно жаль, что твоя гнедая сломала ногу Боливару..." Макрос и не мог сохраниться в этом формате файла.
Не расстраивайся, просто
1. на будущее запомни, что макрос сохранится и будет работать только в родном формате - ODF, Open Document Format. Другими словами, в файлах, расширение которых начинается на .o - .ods, .ots, .odt и так далее. Есть исключения. В результате хитрых трюков макрос можно сохранить, например, в PDF и оставить его работоспособным. Но об этом поговорим позже, когда разберёмся с твоей текущей проблемой. А для этого
2. расскажи, что за макрос ваял - возможно, совместными усилиями сможем быстро его написать по-новой (или уговорить тебя, что для твоей задачи макрос не нужен - такое тоже может случиться  Смеющийся )
Записан

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

Сообщений: 19


« Ответ #5: 7 Декабрь 2018, 11:15 »

расскажи, что за макрос ваял - возможно, совместными усилиями сможем быстро его написать по-новой (или уговорить тебя, что для твоей задачи макрос не нужен - такое тоже может случиться  Смеющийся )

Благодарю за участие. Напишу самостоятельно.. главное теперь знаю, как НЕ НАДО ДЕЛАТЬ :-D

PS
Божечьки, какой раз повторяю себе цитату : "Компьютерщики делятся на две категории: те, кто НЕ делает бэкапы и тех, - кто УЖЕ делает." и всё равно не помогает))) Сколько не учись и не познавай , всё равно чувствуешь себя дЭбилом)))
Записан
OOKapitan
Форумчанин
***
Offline Offline

Сообщений: 453


« Ответ #6: 7 Декабрь 2018, 11:20 »

Добавлю, что ещё макросы можно сохранять не в файле, а по пути "Мои Макросы". Но следует иметь в виду, что при обновлении чего-то у офиса они тоже могут слететь и исчезнуть. Потому лучше сохранять их в Module2 - тогда макросы слетают, но не исчезают. Всё что потом требуется - это пройти в папку basic, скопировать и затем вставить Module2 (на предложение о перезаписи файла соглашаться), - и всё макросы снова рабочие... до следующего обновления в офисе, после чего повторить описанное в начале этого предложения.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #7: 7 Декабрь 2018, 11:23 »

Так ведь в этом случае и бэкап файла бы не помог - макроса в нем всё равно не было бы.

Ты бы все-таки про суть макроса намекнул бы. Поможем, подскажем... И ведь действительно можешь не догадываться о способе решения задачи без макроса - какой-нибудь приём, который будет работать и в LibreOffice, и в Эксель (ты ведь именно на такое решение нацелился, да?)
Записан

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

Сообщений: 19


« Ответ #8: 7 Декабрь 2018, 12:19 »

Так ведь в этом случае и бэкап файла бы не помог - макроса в нем всё равно не было бы.

Ты бы все-таки про суть макроса намекнул бы. Поможем, подскажем... И ведь действительно можешь не догадываться о способе решения задачи без макроса - какой-нибудь приём, который будет работать и в LibreOffice, и в Эксель (ты ведь именно на такое решение нацелился, да?)

Да, хотел чтобы и там и там работало.
Потому что на разных компьютерах будет файл использоваться.

Необходимо вставить строку в соседнюю относительно той, на которой сейчас фокус.
А затем скопировать данные из той соседней ячейки, на которой стоял фокус вначале.
(потом я это привяжу к кнопке)

суть то не сложная, но вот сейчас пишу и натыкаюсь опять на проблемы какие то:

Команда
Cells(ActiveCell.Row,1).Resize(k).EntireRow.Insert

не проходит, пишет мне "Переменная типа Object не установлена"

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

Сообщений: 19


« Ответ #9: 7 Декабрь 2018, 13:02 »

Написал...франкенштейна своего... может не очень, но работает )))

Код:
REM  *****  BASIC  *****

Sub  InsertRows()
  
rem Dim i As Long, nRow As Long, k As Long  
rem Dim x As Long  

Dim RangeAddress(0) As New com.sun.star.table.CellRangeAddress
 
oDoc = ThisComponent
oSheet = oDoc.getCurrentController().ActiveSheet
oCellRange    = ThisComponent.getCurrentSelection()
rowIndex = oCellRange.getCellByPosition(0,0).getCellAddress().Row

rem ВСТАВКА новой пустой строки
oSheet.Rows.insertByIndex(rowIndex+1,1)
 
REM определяем диапазоны для вставки
RangeAddress(0).Sheet = 0
RangeAddress(0).StartColumn = 4
RangeAddress(0).StartRow = rowIndex
RangeAddress(0).EndColumn = 50
RangeAddress(0).EndRow = rowIndex

REM синтаксис
rem oSheet.CopyRange(destination,source)

destination = oSheet.getCellByPosition(4, rowIndex+1).getCellAddress()

oSheet.CopyRange(destination, RangeAddress(0))

End Sub
« Последнее редактирование: 7 Декабрь 2018, 13:04 от kolob204 » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #10: 7 Декабрь 2018, 14:45 »

Ну, почему сразу "франкенштейн"? Очень пристойный код, с пониманием написан, не просто цитаты из инета, слепленные кое-как.

Команда
Cells(ActiveCell.Row,1).Resize(k).EntireRow.Insert

не проходит, пишет мне "Переменная типа Object не установлена"
А зачем ты ограничиваешь длину строки k? Почему не оставить всю строку, .EntireRow? Или у тебя правее таблицы что-то ещё есть?

С ActiveCell не сложно - поищи здесь, по форуму. Где-то есть функция, которая именно активную ячейку возвращает. Это всё-таки будет лучше, чем новый вариант
Код:
...
oCellRange    = ThisComponent.getCurrentSelection()
rowIndex = oCellRange.getCellByPosition(0,0).getCellAddress().Row
...
В принципе, всё верно, в большинстве случаев сработает именно так, как задумано. "Грабли" возникнут если запустить макрос при множественном выделении - с зажатой Ctrl выдели несколько ячеек и попробуй выполнить код. В этом случае .getCurrentSelection() вернёт не диапазон, у которого действительно можно взять первую, левую верхнюю ячейку, а целый набор диапазонов.

"Ну, а теперь о главном..." (с) старый театральный анекдот
Чтобы эта байда работала и в Эксель, и в LiO есть несколько путей.
Я бы сделал два макроса. Очень похожих, но заточенных отдельно под Calc и Excel. И сохранил бы их в библиотеках офиса: для LiO - в Мои Макросы, для Экселя - в персональной книге макросов. И кнопку (или горячую клавишу) вешал бы именно на них, но сохранял бы не в текущей книге, а в офисе целиком.
Другой путь - сотворить это вот и сохранить в книге Эксель. И сотворять именно средствами Экселя. В этом случае LiO очень постарается макрос выполнить. И если макрос будет без особых наворотов, то у Calc'а это получится.
Например, для первого способа Экселевский макрос мог бы быть таким:
Код:
Sub copyRow()
Dim aRange As Range ' Рабочий диапазон
    Set aRange = ActiveCell.EntireRow   ' Вся строка с активной ячейкой
    aRange.Copy ' Чтобы при вставке новой строки одновременно вставить и контент
    aRange.Offset(1, 0).Insert Shift:=xlDown    ' Полная копия строки готова
    Application.CutCopyMode = False ' Снять выделение
    aRange.Offset(1, 0).Range("A1:D1").ClearContents    ' Очистить первые ячейки
' (в aRange всего одна строка - поэтому и ссылаемся на ячейки "первой" строки)
    aRange.Offset(1, 0).Resize(1, 1).Select  '  Передвинуться на первую ячейку строки на одну ниже
End Sub
В Экселе работает хорошо, а в Calc'е начнет ругаться на "нехорошие слова".
Чтобы заставить код работать и там, и там, придётся несколько раз открывать книгу в разных офисах, экспериментировать.
В результате получится что-то вроде такого:
Код:
Sub insRow()
Dim aRange As Range
    Set aRange = ActiveCell.Offset(0, -ActiveCell.Column + 1).Resize(1, 50)
    aRange.Select
    Selection.Copy
    aRange.Offset(1, 0).Select
    Selection.Insert Shift:=xlDown
    Application.CutCopyMode = False
    aRange.Offset(1, 0).Resize(1, 4).ClearContents
    aRange.Offset(1, 0).Resize(1, 1).Select
End Sub
Другими словами, всячески избегать .Parent, .EntireRow и других прибамбасов, которые с точки зрения LiO не должны существовать в электронной книге  Подмигивающий
Записан

Владислав Орлов 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!