Пропадает макрос

Автор kolob204, 7 декабря 2018, 10:39

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

kolob204

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

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

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

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

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

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

JohnSUN

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

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

mikekaganski

И какая версия офиса? На какой ОС?
С уважением,
Михаил Каганский

kolob204

#3

по пути 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 не созраняются макросы. потому что формат не родной....
божечьки мои...))))

JohnSUN

Цитата: kolob204 от  7 декабря 2018, 10:57
Формат сохранения файkа XLS
"Ты не поверишь, Билл, но мне действительно жаль, что твоя гнедая сломала ногу Боливару..." Макрос и не мог сохраниться в этом формате файла.
Не расстраивайся, просто
1. на будущее запомни, что макрос сохранится и будет работать только в родном формате - ODF, Open Document Format. Другими словами, в файлах, расширение которых начинается на .o - .ods, .ots, .odt и так далее. Есть исключения. В результате хитрых трюков макрос можно сохранить, например, в PDF и оставить его работоспособным. Но об этом поговорим позже, когда разберёмся с твоей текущей проблемой. А для этого
2. расскажи, что за макрос ваял - возможно, совместными усилиями сможем быстро его написать по-новой (или уговорить тебя, что для твоей задачи макрос не нужен - такое тоже может случиться  ;D )
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

kolob204

Цитата: JohnSUN от  7 декабря 2018, 11:09
расскажи, что за макрос ваял - возможно, совместными усилиями сможем быстро его написать по-новой (или уговорить тебя, что для твоей задачи макрос не нужен - такое тоже может случиться  ;D )

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

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

OOKapitan

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

JohnSUN

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

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

kolob204

Цитата: JohnSUN от  7 декабря 2018, 11:23
Так ведь в этом случае и бэкап файла бы не помог - макроса в нем всё равно не было бы.

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

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

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

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

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

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


kolob204

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

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

JohnSUN

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

Цитата: kolob204 от  7 декабря 2018, 12:19
Команда
Cells(ActiveCell.Row,1).Resize(k).EntireRow.Insert

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

С ActiveCell не сложно - поищи здесь, по форуму. Где-то есть функция, которая именно активную ячейку возвращает. Это всё-таки будет лучше, чем новый вариант
Цитата: kolob204 от  7 декабря 2018, 13:02
...
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
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне