Доброе утро! Помогите пожалуйста разобраться с кодом, который написа в Access. При нажатии на кнопку на форме Access, у меня открываетя книга excel, а вот потом все неработает, не могу понять почему....
[vba]
Code
Dim oXL As Object Dim sFullPath As String Set oXL = CreateObject("Excel.Application") On Error Resume Next oXL.UserControl = True On Error GoTo 0 On Error GoTo ErrHandle sFullPath = "C:\Documents and Settings\заявление.xls" With oXL .Visible = True .Workbooks.Open (sFullPath) .Workbooks("sFullPath").Activate .ThisWorkbook.Unprotect Password:="555" .Sheets("Лист1").Visible = False .Sheets("Лист2").Visible = False End With ErrExit: Set oXL = Nothing Exit Sub ErrHandle: oXL.Visible = False MsgBox Err.Description GoTo ErrExit End Sub
[/vba]
Доброе утро! Помогите пожалуйста разобраться с кодом, который написа в Access. При нажатии на кнопку на форме Access, у меня открываетя книга excel, а вот потом все неработает, не могу понять почему....
[vba]
Code
Dim oXL As Object Dim sFullPath As String Set oXL = CreateObject("Excel.Application") On Error Resume Next oXL.UserControl = True On Error GoTo 0 On Error GoTo ErrHandle sFullPath = "C:\Documents and Settings\заявление.xls" With oXL .Visible = True .Workbooks.Open (sFullPath) .Workbooks("sFullPath").Activate .ThisWorkbook.Unprotect Password:="555" .Sheets("Лист1").Visible = False .Sheets("Лист2").Visible = False End With ErrExit: Set oXL = Nothing Exit Sub ErrHandle: oXL.Visible = False MsgBox Err.Description GoTo ErrExit End Sub
Я наверное не совсем правильно выразился в постановке задачи. Мне хтелось бы, чтобы после пыполнения указанного кода, стал активен excel, т.е автоматически произошло переключение на активную книгу.
Я наверное не совсем правильно выразился в постановке задачи. Мне хтелось бы, чтобы после пыполнения указанного кода, стал активен excel, т.е автоматически произошло переключение на активную книгу.A_3485
Поскольку при помощи CreateObject("Excel.Application") создается новый экземпляр (сессия) Excel (в отличие от GetObject), то открываемая книга будет в нём единственная, а, значит, и активная. Поэтому дополнительно ее активировать не надо (тем более таким ошибочным оператором).
Поскольку при помощи CreateObject("Excel.Application") создается новый экземпляр (сессия) Excel (в отличие от GetObject), то открываемая книга будет в нём единственная, а, значит, и активная. Поэтому дополнительно ее активировать не надо (тем более таким ошибочным оператором). Gustav
По мне так вот такой код вполне может открыть нужный файл на первом листе [vba]
Code
Dim oXL As Object Set oXL = CreateObject("Excel.Application") With oXL .Workbooks.Open "C:\Documents and Settings\заявление.xls" .Visible = True End With Set oXL = Nothing
[/vba]
По мне так вот такой код вполне может открыть нужный файл на первом листе [vba]
Code
Dim oXL As Object Set oXL = CreateObject("Excel.Application") With oXL .Workbooks.Open "C:\Documents and Settings\заявление.xls" .Visible = True End With Set oXL = Nothing
Все бы ничего если бы.....открывался именно файл "заявление" не как файл для чтения(при сохранения пишет замеить существующий), а сам по себе и при открытии можно было снять пароли, отобразить Листы, и сделать книгу активной.
Все бы ничего если бы.....открывался именно файл "заявление" не как файл для чтения(при сохранения пишет замеить существующий), а сам по себе и при открытии можно было снять пароли, отобразить Листы, и сделать книгу активной.A_3485
Вероятно файл уже открыт в другом экземпляре Экселя - поэтому все остальные экземпляры открывают для чтения. Есть способ открыть в уже открытом экселе, или если его нет - тогда открыть в новом. Вот например - скрипт vbs (в соответствии с темой ), но синтаксис в общем одинаков: [vba]
Code
Option Explicit Dim objFSO, objExcel, ExcelPath, wb
ActivateExcel
Set objFSO = CreateObject("Scripting.FileSystemObject") ExcelPath = objFSO.GetParentFolderName(WScript.ScriptFullName) Set wb = objExcel.Workbooks.Open (ExcelPath & "\test.xls") Set objExcel = Nothing
Private Function ActivateExcel() On Error resume next Set objExcel = GetObject(, "Excel.Application") If objExcel Is Nothing Then Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True End If End Function
[/vba]
Вероятно файл уже открыт в другом экземпляре Экселя - поэтому все остальные экземпляры открывают для чтения. Есть способ открыть в уже открытом экселе, или если его нет - тогда открыть в новом. Вот например - скрипт vbs (в соответствии с темой ), но синтаксис в общем одинаков: [vba]
Code
Option Explicit Dim objFSO, objExcel, ExcelPath, wb
ActivateExcel
Set objFSO = CreateObject("Scripting.FileSystemObject") ExcelPath = objFSO.GetParentFolderName(WScript.ScriptFullName) Set wb = objExcel.Workbooks.Open (ExcelPath & "\test.xls") Set objExcel = Nothing
Private Function ActivateExcel() On Error resume next Set objExcel = GetObject(, "Excel.Application") If objExcel Is Nothing Then Set objExcel = CreateObject("Excel.Application") objExcel.Visible = True End If End Function
Спасибо всем что откликнулись на мою просьбу! У меня теперь стоит задача, чтобы в коде VBA который пишется в Access, можно было снять защиту с листа "1111" и книги "1111" и активировать "Лист1"?
Спасибо всем что откликнулись на мою просьбу! У меня теперь стоит задача, чтобы в коде VBA который пишется в Access, можно было снять защиту с листа "1111" и книги "1111" и активировать "Лист1"?A_3485
Я в макросах не специалист, но можно попробовать, например, так [vba]
Code
Dim oXL As Object Set oXL = CreateObject("Excel.Application") With oXL .Workbooks.Open "C:\Documents and Settings\1111.xls" .Visible = True .Sheets("1111").Unprotect Password:="555" .Sheets("Лист1").Activate .ActiveWorkbook.Unprotect Password:="555" End With Set oXL = Nothing
[/vba]
Я в макросах не специалист, но можно попробовать, например, так [vba]
Code
Dim oXL As Object Set oXL = CreateObject("Excel.Application") With oXL .Workbooks.Open "C:\Documents and Settings\1111.xls" .Visible = True .Sheets("1111").Unprotect Password:="555" .Sheets("Лист1").Activate .ActiveWorkbook.Unprotect Password:="555" End With Set oXL = Nothing
В принципе, объект можно и не удалять — он будет удален автоматически после того, как последняя объектная переменная, которая на него ссылается, уйдет за область видимости (обычно это значит, что закончит работу процедура, в которой он используется). Однако явное удаление объектов — это "правило хорошего тона", которое позволит вам при создании серьезных приложений избежать конфликтов имен и перерасхода ресурсов.
В принципе, объект можно и не удалять — он будет удален автоматически после того, как последняя объектная переменная, которая на него ссылается, уйдет за область видимости (обычно это значит, что закончит работу процедура, в которой он используется). Однако явное удаление объектов — это "правило хорошего тона", которое позволит вам при создании серьезных приложений избежать конфликтов имен и перерасхода ресурсов.