Во многих макросах, связанных с обработкой документов связывание двух файлов является ключевой функцией, т.к. подстановка данных из одно файла в другой является самой часто используемой операцией.
Обработка двух и более файлов может быть проведена как с использованием диалогового окна открытия файла в котором пользователь сам выбирает какой файл нужно открыть, как и в автоматическом режиме.
В первом случае для открытия файла используется функция AddFile (следующий код). Она сохраняется любом модуле Basic и вызывается как подфункция, когда это необходимо.
Sub AddFile
dim dlgFile as object, oFiles as object
dim sFile as string
dlgFile = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker")
with dlgFile
.SetMultiselectionMode (False)
.Title = "Select a file"
end with
if dlgFile.Execute () = 1 then
sFile = dlgFile.Files (0)
sFile2 = ConvertFromURL (sFile)
end if
oSvc = createUnoService("com.sun.star.system.SystemShellExecute")
oSvc.execute (sFile2, "", 0)
End Sub
После вызова этой функции обычно пишут строчку пустого цикла, что пользователь успевал открыть нужный файл до выполнения последующих строчек кода
For i = 1 To 5000000 : Next
После этого в открываемый документ обычно вставляется новый лист куда и копируются данные из прошлого файла для подстановки. Вставленному диапазону присваивают имя для обращения.
Рассмотрим пример кода для случаев взаимодействия:
Sub Obrabot
............................
............................
'Более ранний код.......
'Скопировали нужное содержимое первого документа
Coping
'Вызываем функцию открытия файла
AddFile ()
'Включаем функцию ожидания
For i = 1 To 3000000 : Next
'Проверяем - тот ли документ открыт
oCelles = ThisComponent.Sheets(0).getCellRangeByName("A1")
If oCelles.String <> "Номер документа" Then
MsgBox " Данный файл не является Реестр документов" & Chr$(13) & ", либо имеет поврежденную структуру" & Chr$(13) & "",16, "Учет Производства"
Exit Sub
End If
'Вставляем новый лист
oSheet = ThisComponent.createInstance ("com.sun.star.sheet.Spreadsheet")
ThisComponent.Sheets.insertByName ("Подстановка", oSheet)
'Выделяем крайнюю верхнюю левую ячейку
oCell = ThisComponent.Sheets (1).getCellByPosition(0, 0)
ThisComponent.CurrentController.Select(oCell)
'Вставляем скопированное содержимое
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
' Даем имя вставленному диапазону
'В данном случае мы вставили диапазон A1:B65535 на лист 2 и дали ему имя "подстановка1"
oDoc = ThisComponent
oSheet = ThisComponent.getSheets().getByIndex(1)
oAddr = oSheet.getCellRangeByName("A1:B65535").getRangeAddress()
oDoc.DatabaseRanges.addNewByName("подстановка1", oAddr)
oRange = oDoc.DatabaseRanges.getByName("подстановка1")
'Последующий код....
...................
...................
End Sub
Обычно имена дают для последующего вывоза функции VLOOKUP. Если вы использовать ее не собираетесь - диапазон именовать не обязательно.
Задание: Удалите программно в файле Рецепты все столбцы кроме Код и Цех, выделите и скопируйте оставшийся диапазон. Сделайте функцию для открытия файла Реестр товарных позиций по МХ, так чтобы в этом файл вставлялся новый лист, на него вставлялся скопированный диапазон. Ему присваивается произвольное имя, затем, через рассмотренный ранее макрос множественной ставки формулы подставьте данные с помощью функции VLOOKUP к данным реестра, чтобы узнать какая позиция является рецептом, какая нет.
Обработка двух и более файлов может быть проведена как с использованием диалогового окна открытия файла в котором пользователь сам выбирает какой файл нужно открыть, как и в автоматическом режиме.
В первом случае для открытия файла используется функция AddFile (следующий код). Она сохраняется любом модуле Basic и вызывается как подфункция, когда это необходимо.
Sub AddFile
dim dlgFile as object, oFiles as object
dim sFile as string
dlgFile = CreateUnoService ("com.sun.star.ui.dialogs.FilePicker")
with dlgFile
.SetMultiselectionMode (False)
.Title = "Select a file"
end with
if dlgFile.Execute () = 1 then
sFile = dlgFile.Files (0)
sFile2 = ConvertFromURL (sFile)
end if
oSvc = createUnoService("com.sun.star.system.SystemShellExecute")
oSvc.execute (sFile2, "", 0)
End Sub
После вызова этой функции обычно пишут строчку пустого цикла, что пользователь успевал открыть нужный файл до выполнения последующих строчек кода
For i = 1 To 5000000 : Next
После этого в открываемый документ обычно вставляется новый лист куда и копируются данные из прошлого файла для подстановки. Вставленному диапазону присваивают имя для обращения.
Рассмотрим пример кода для случаев взаимодействия:
Sub Obrabot
............................
............................
'Более ранний код.......
'Скопировали нужное содержимое первого документа
Coping
'Вызываем функцию открытия файла
AddFile ()
'Включаем функцию ожидания
For i = 1 To 3000000 : Next
'Проверяем - тот ли документ открыт
oCelles = ThisComponent.Sheets(0).getCellRangeByName("A1")
If oCelles.String <> "Номер документа" Then
MsgBox " Данный файл не является Реестр документов" & Chr$(13) & ", либо имеет поврежденную структуру" & Chr$(13) & "",16, "Учет Производства"
Exit Sub
End If
'Вставляем новый лист
oSheet = ThisComponent.createInstance ("com.sun.star.sheet.Spreadsheet")
ThisComponent.Sheets.insertByName ("Подстановка", oSheet)
'Выделяем крайнюю верхнюю левую ячейку
oCell = ThisComponent.Sheets (1).getCellByPosition(0, 0)
ThisComponent.CurrentController.Select(oCell)
'Вставляем скопированное содержимое
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
' Даем имя вставленному диапазону
'В данном случае мы вставили диапазон A1:B65535 на лист 2 и дали ему имя "подстановка1"
oDoc = ThisComponent
oSheet = ThisComponent.getSheets().getByIndex(1)
oAddr = oSheet.getCellRangeByName("A1:B65535").getRangeAddress()
oDoc.DatabaseRanges.addNewByName("подстановка1", oAddr)
oRange = oDoc.DatabaseRanges.getByName("подстановка1")
'Последующий код....
...................
...................
End Sub
Обычно имена дают для последующего вывоза функции VLOOKUP. Если вы использовать ее не собираетесь - диапазон именовать не обязательно.
Задание: Удалите программно в файле Рецепты все столбцы кроме Код и Цех, выделите и скопируйте оставшийся диапазон. Сделайте функцию для открытия файла Реестр товарных позиций по МХ, так чтобы в этом файл вставлялся новый лист, на него вставлялся скопированный диапазон. Ему присваивается произвольное имя, затем, через рассмотренный ранее макрос множественной ставки формулы подставьте данные с помощью функции VLOOKUP к данным реестра, чтобы узнать какая позиция является рецептом, какая нет.
Комментариев нет:
Отправить комментарий