Страницы: 1 2 След.
RSS
Как GetObject заставить открывать в Excel файлы с не стандартным расширением?
 
Как GetObject заставить открывать в Excel файлы с не стандартным расширением?
Код
        Dim objCloseBook As Object
        Set objCloseBook = GetObject("C:\Base\base.ottb")

Это файл с макросами но расширение было изменено в целях безопасности использования.
Нужно что бы макрос открывал в фоне файл base.ottb ( он же base.xlsm) через GetObject и брал с него данные.
При стандартном расширении все работает, а если его изменить - нет.
Переименовывать файл перед открытием нет смысла.
Изменено: fejdraus - 11.04.2017 14:49:36
 
Workbook.Open("C:\Base\base.ottb") ??
F1 творит чудеса
 
Максим Зеленский,
тогда файл откроется, а нужно что бы он был в фоне, не видимый как это в GetObject.
Или это вообще не возможно с помощью GetObject сделать?
Изменено: fejdraus - 11.04.2017 14:57:41
 
Цитата
fejdraus написал:  нужно что бы он был в фоне, не видимый
Код
Application.ScreenUpdating = False
 
Код
Sub Test()
    Workbooks.Open Filename:="C:\Temp\BOOK1.xls"
    ActiveWindow.Visible = False
End Sub
F1 творит чудеса
 
Максим, надежнее так:
Код
Sub Test()
    Dim wb as workbook
    set wb = Workbooks.Open(Filename:="C:\Temp\BOOK1.xls")
    wb.Windows(1).Visible = False
End Sub
а то вдруг окно у открываемого файла уже скрыто - тогда будет скрыто не то, что надо :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Доброе время суток.
Как вариант, сделать новую копию приложения Excel в нём и открывать (по-умолчанию само приложение не видимо, но на всякий случай скрываем в коде).
Код
Public Sub test()
    Dim pApp As Object
    Dim pBook As Object
    Set pApp = CreateObject("Excel.Application")
    pApp.Visible = False
    Set pBook = pApp.Workbooks.Open("d:\path\filename.ottx")
    Debug.Print pBook.FullName
    pBook.Close False
    pApp.Quit
    Set pApp = Nothing
End Sub

Успехов.
P. S.
Цитата
но расширение было изменено в целях безопасности использования
Не поделитесь, чем это может помочь?
Изменено: Андрей VG - 11.04.2017 17:09:16
 
еще вариант копировать файл, заменяя расширение:
Код
Sub ttt()
    Dim sFileName As String, sNewFileName As String
 
    sFileName = "C:\Users\Дмитрий\Desktop\DB.ottb"    'имя исходного файла
    sNewFileName = "C:\Users\Дмитрий\Desktop\DB.xlsm"    'имя файла для переименования
    If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
 
    FileCopy sFileName, sNewFileName 'переименовываем файл
    Dim wb As Workbook
    Set wb = Workbooks.Open(sNewFileName)
    wb.Windows(1).Visible = False
    'работает с файлом
    '....
    wb.Sheets(1).Range("A1").Value = "ttt"
    'закрываем и удаляем
    wb.Close 1
    'при необходимости можно заменить исходный файл измененным
    FileCopy sNewFileName, sFileName 'заменяем файл
    Kill sNewFileName
End Sub
муторно, но работать будет
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, переименование не подходит.
Dima S, отключение обновления экрана у меня и так применено
 
Максим Зеленский, The_Prist, Андрей VG,  открытие файла таким образом я знаю, но интересует именно через getobject можно ли это сделать

Сложность состоит в том что я запускают файл через vbs скрипт который excel открывает игнорируя настройки безопасности макроса, включая их, при этом окно excel скрыто но видно открывающиеся формы в excel. При открытии файла зпускается макрос, который запускает ещше макросы с модулей других, импортируя базу из другого файла и используя базу производит пересчет в таблицах макросами, так же делает проверку базы на ошибки. Потом когда все выполнено файл переименовывает файл с донорной базой а сам берёт его имя в той папке где лежит файл донор. После всего этого vbs файл удаляет файл который это все делал. Vbs скрипт и файл excel скомпилированы в exe файл. Все работает с файлами стандартного расширения, но если сделать его не стандартным, типа ottb то GetObject работать откпзщывпется. По причине такой работы и скрпытости работы именно такой метод подходит, а workbook.open не совсем подходит
 
Так вроде ответ очевиден, если не получается? GetObject открывает файлы через программы, назначенные для типов файлов по умолчанию.
Поэтому как вариант - назначить формату "ottb" программой по умолчанию Excel. Но в чем тогда будет преимущество перед родным расширением - неясно. Хотя мне это и так не совсем понятно.
В целях безопасности куда эффективнее назначить пароль для открытия файла и открывать как обычно со скрытием окна.  
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Андрей VG, переименование расширение нужно по той причине что vbs скрипт запакованый в exe запускает excel файл, а что бы работники по ошибке не запустили сам excel файл. Просто на работе есть люди которые не знают что такое макросы, и им я год не могу вдолбить что нужно их включить, а они все от меня за сотни километров я не могу им включить, а ,vbs скрипт запускает им файл excel с включенными макросами независимо от настроек безопасности в excel

The_Prist, вариант с паролем очень хороший, я и не подумал про это сразу. В таком случаи можно оставить стандартное расширение файла с базой данных, а открывать файл с помощу vbs скрипта в котором будет командла запуска с использованием пароля скомпилированым в exe файл
 
По идее, должно работать что-то типа
Код
Set GetXL = GetObject("C:\1\r1.bbbb", "Excel.Workbook")
но там надо что-то сделать с ошибкой 429 :)
F1 творит чудеса
 
А можно открыть файл с применением пароля с помощу CreateObject в скрипте vba?
 
Цитата
fejdraus написал:
я год не могу вдолбить что нужно их включить
Как запустить файл с включенными макросами?

Там есть вариант без скриптов - с листом-инструкцией. У меня было много заказчиков, у которых схожие проблемы с сотрудниками, но так же был запрет на запуск сторонних скриптов и exe. И такой вариант прокатывал на ура.

Цитата
fejdraus написал:
А можно открыть файл с применением пароля с помощу CreateObject
Нет. Потому что CreateObject не имеет таких параметров и он не обращается сразу к конкретной программе. Это а-ля Shell. Открывает файл, если расширение файла сопоставлено хоть какой-то программе. И открывает именно в этой программе. Поэтому CreateObject не знает наперед, какие можно применить параметры.
Изменено: The_Prist - 11.04.2017 18:28:22
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Максим Зеленский,
Пробовал так же но с excel.application, та же ошибка, так и не смог её побороть.
Теоретические должно работать, судя по документации, но не работает
Изменено: fejdraus - 11.04.2017 18:27:51
 
Цитата
fejdraus написал:
Теоретические должно работать, судя по документации
Даже судя по документации - нет. Ибо расширение "ottb" не сопоставлено приложению, с помощью которого хотите открыть. Сопоставьте расширение с Excel - и все будет работать. Но смысл смены расширения тогда становится сомнительной затеей. И опять же - это придется делать на всех ПК, где будет использовать код, что вообще ни разу не удобно будет.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist,
Все эти три способа делаю, и страница с инструкцией, и скрпытие всех листов, и видео записывал - не помогает, им просто лень читать и смотреть, просто лень и не как не заставить их
У менея больше 300 строк только защиты от дураков, опечаток, лишних пробелов, запятых. Правда, ужас просто, потому так и изголяюсь
Изменено: fejdraus - 11.04.2017 18:33:48
 
Цитата
fejdraus написал: ... я запускают файл через vbs скрипт который excel открывает игнорируя настройки безопасности макроса, включая их, при этом окно excel скрыто но видно открывающиеся формы в excel. При открытии файла зпускается макрос...
Андрей и показал Вам код, который это, в принципе, делает.
CreateObject("Excel.Application").Workbooks.Open("C:\Base\base.ottb") откроет файл с работающими макросами при любом уровне безопасности.
Чтобы убедиться в этом установите в Excel в параметрах макросов 'Отключить все макросы без уведомления', закройте Excel и проверьте вот такой vbs крипт, который откроет файл в невидимом приложении с запуском его макроса Auto_Open:
Код
With CreateObject("Excel.Application")
  .Workbooks.Open("C:\Base\base.ottb")
  .Run "Auto_Open"
  MsgBox "Press OK to Quit Excel"   
  .Quit
End With

Не забудьте только по завершению закрыть скрытое приложение через Quit, иначе Excel останется в памяти.
Изменено: ZVI - 11.04.2017 22:35:05
 
Всем спасибо!
Решил переписать код под Workbooks.Open.
Теперь смог еще и поставить пароль на открытие файла, который ледит в vbs скрипте, а скрипт запакован в exe.
Изменено: fejdraus - 12.04.2017 14:23:49
 
ZVI,
Подскажите, а можно ли с vbs запустить при открытии файла определенный макрос а не тот что в "Эта книга"?
Точнее, что бы vbs при определенном событии открывал файл и запускал определенный макрос.
Изменено: fejdraus - 12.04.2017 14:28:23
 
fejdraus, поместите код в стандартный модуль и используйте метод Application.Run
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist,
А можно передать значение переменной из vbs в переменную макроса excel, и что бы макрос уже подхватил его и выполнял дальше excel?
на подобии
Код
CloseWorkBook.temp = ActiveWorkBook.temp
Нужно передать значение полного пути в котором работает vbs скрипт. Путь знаю, но как передать его напрямую в макрос Excel?

P.S.: Сам файл excel при этом находится не в одной папке с vbs скриптом.
Изменено: fejdraus - 12.04.2017 17:31:54
 
Цитата
fejdraus написал: можно ли с vbs запустить при открытии файла определенный макрос а не тот что в "Эта книга"?
У меня в примере как раз макрос "Auto_Open" в стандартном модуле. Имя макроса может быть любым.
Передать в макрос параметр позволяет метод Run
Предположим, что в C:\Base\base.ottb в стандартном модуле есть такой макрос:
Код
Sub MyMacro(x)
  MsgBox "Parameter = " & x
End Sub

А этим vbs кодом загрузим книгу, вызовем макрос и передадим ему единичку:
Код
With CreateObject("Excel.Application")
  .Workbooks.Open("C:\Base\base.ottb")
  .Run "MyMacro", "1"  ' <-- Вместо "1" запишите, что угодно, например, WScript.ScriptFullName
  MsgBox "Press OK to Quit Excel"   
  .Quit
End With
Изменено: ZVI - 12.04.2017 17:33:31
 
Владимир, спасибо за прекрасные примеры.
F1 творит чудеса
 
Добрый вечер, Максим! На форуме тоже нахожу много интересных примеров и Ваших, в том числе, надеюсь со временем поизучать их подробнее :)
 
ZVI, но в Excel же нужно указать имя модуля где находится макрос, как его вписать?
И вопрос по коду который в "Эта книга", он запуститься при таком выполнении? Если да, то мжно как то не дать запуститься ему если выполняется макрос запущенный Вашим vbs скриптом?
Изменено: fejdraus - 18.04.2017 08:54:37
 
Цитата
fejdraus написал:
нужно указать имя модуля где находится макрос
кто это сказал? Если код расположен в стандартном модуле - главное, чтобы имя процедуры было уникальным. Тогда никаких имен модулей указывать не придется.
Цитата
fejdraus написал:
мжно как то не дать запуститься
Если речь про Workbook_Open, то Application.EnableEvents = False поставить перед открытием книги. Потом(после открытия книги) желательно вернуть, если надо отслеживать события в книге.
Это не сработает, если код записан в процедуре Auto_Open.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist,
К сожалению когда я запускаю без указания названия модуля, у меня пишет что не может найти макрос такой
 
The_Prist,
Вот мой vbs

Код
Set WshShell = CreateObject("WScript.Shell")
filebase = WshShell.CurrentDirectory & "\base.ottb"
fileOTA = "D:\WorkDrive\Квартальный отчет\2016\Макрос отчет 2 квартал\Testfile\ota110.ottb"
With  CreateObject("Excel.Application")
  .Visible = True
  .Workbooks.Open fileOTA,,,,"Passw0rd"
  .Run "ImportBase", filebase
End With
Изменено: fejdraus - 13.04.2017 11:08:42
Страницы: 1 2 След.
Читают тему
Наверх