Импорт данных из файла (адаптация макроса)

Автор Lanister, 30 августа 2018, 16:21

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

Lanister

Добрый день! Помогите адаптировать макрос из MS Excel в LO Calc. LO Calc только начал осваивать, перечитал половину форума, но чего-то близкого пока не могу найти.

Что делает макрос:
1. При активации открывает окно выбора файла (название и местоположение может быть произвольным, поэтому сделано так).
2. Если файл выбран, он открывается как вторая книга. Если нет, выскакивает соответствующее сообщение и макрос завершает работу.
3. Проверяется контрольное значение во второй книге, если все правильно выдается соответствующее сообщение. Если нет, макрос завершает работу. Вторая книга остается открытой.
4. Копируются значения диапазона ячеек из второй открытой книги в первую.
5. Закрывается вторая книга без сохранения.
6. В первой книге курсор устанавливается на первую ячейку.
7. Макрос завершает работу.

Вот небольшой кусок макроса для MS Excel:

Sub ПриемОтчета()
'
' ПриемОтчета Макрос
' Прием отчета о работе
'

'
    IName = ActiveSheet.Name
    iOpenFile = Application.Dialogs(xlDialogOpen).Show _
            (Arg1:="C:\", Arg2:=False)

If iOpenFile = True Then
   MsgBox "Прием отчета " & ActiveWorkbook.Name
Else
   MsgBox "Отчет не принят. Файл отчета не выбран."
   GoTo exitmacros
End If
   
If Workbooks(2).Sheets("Оглавление").Range("C26").Value = "Отчет заполнен правильно!" Then
   MsgBox "Проверка отчета завершена. Отчет заполнен правильно"
Else
   MsgBox "Проверка отчета завершена. Отчет заполнен неверно. Данные не перенесены."
   GoTo exitmacros
End If
    Workbooks(1).Sheets(IName).Range("A5:A200").Value = Workbooks(2).Sheets("Отчет").Range("A5:A200").Value
    Workbooks(2).Activate
    Application.CutCopyMode = False
    ActiveWorkbook.Close (False)
    Workbooks(1).Activate
    Range("A1").Select
exitmacros:
End Sub

JohnSUN

#1
Добро пожаловать на форум!
Цитата: Lanister от 30 августа 2018, 16:21
перечитал половину форума, но чего-то близкого пока не могу найти.
Возможно, не ту половину читал  ;D

Цитата: Lanister от 30 августа 2018, 16:21
Вот небольшой кусок макроса для MS Excel:
...
(В следующий раз заключай код в теги "Код" - значок с решеткой над полем для ввода сообщения)

А вот точно такой же кусок для LO:
Sub getReport()
' Прием отчета о работе
GlobalScope.BasicLibraries.LoadLibrary("Tools")
oCurrentController = ThisComponent.getCurrentController()
oActiveSheet = oCurrentController.getActiveSheet()
oFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
oFileDialog.SetDisplayDirectory(ConvertToUrl("C:\"))

iOpenFile = oFileDialog.Execute()
If iOpenFile = 0 Then
MsgBox "Отчет не принят. Файл отчета не выбран."
Exit Sub
End If

On Error GoTo exitmacros
oDoc = OpenDocument(oFileDialog.Files(0), Array())
oSheets = oDoc.getSheets()
oSheet = oSheets.getByName("Оглавление")

If GetStringOfCellByName(oSheet, "C26") = "Отчет заполнен правильно!" Then
MsgBox "Проверка отчета завершена. Отчет заполнен правильно"
Else
MsgBox "Проверка отчета завершена. Отчет заполнен неверно. Данные не перенесены."
Exit Sub
End If
oSheet = oSheets.getByName("Отчет")
oActiveSheet.getCellRangeByName("A5:A200").setDataArray(oSheet.getCellRangeByName("A5:A200").getDataArray())
oDoc.Close (True)
oCurrentController.select(oActiveSheet.getCellRangeByName("A1"))
oCurrentController.select(Nothing)
Exit Sub
exitmacros:
MsgBox "Возникла непредвиденная ошибка. Данные не перенесены."
End Sub
Разница совсем небольшая - при желании этот язык освоишь быстро

(Хотел подписаться "Таргариен", но решил, что хватит и "Валар Моргулис"  ;D )
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Lanister

JohnSUN, Валар Дохаэрис. Большое спасибо за помощь! Общие моменты уяснил, переписал весь код под LO, всё работает как часы. С остальными макросами теперь мне будет проще справиться. :-)

ali_vlad

oFileDialog.SetDisplayDirectory(ConvertToUrl("C:\"))
А как должна выглядеть ссылка на раздел \home в линуксе?

sokol92

Так, как в соответствующей операционной системе:

oFileDialog.SetDisplayDirectory(ConvertToUrl("\home"))
Владимир.

ali_vlad

#5
Цитата: sokol92 от  9 февраля 2022, 19:12
Так, как в соответствующей операционной системе:

oFileDialog.SetDisplayDirectory(ConvertToUrl("\home"))
Спасибо. И ещё вопрос: файл не закрывается после импорта или в случае ошибки, как его закрыть программно?

sokol92

Попробуйте то же командой, что и в макросе. Добавьте ее после выдачи сообщения об ошибке.
Владимир.

sokol92

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