#excel #vba #object #vb6
#excel #vba #объект #vb6
Вопрос:
Прелюдия
Я начинаю новый проект, и в основном я использую Excel в качестве журнала для другой программы, которую я использую. С учетом сказанного, это смесь VBA (только при использовании объекта Excel) и VB6 (основного языка программирования «хост»). Вот почему оба языка помечены тегами, поскольку я ожидаю ненавистных комментариев от использования тегов; Я ищу решение на любом/ смеси обоих языков программирования!
Кроме того, я знаю, что некоторые активисты VBA скажут никогда не использовать ActiveSheet
. Меня это не беспокоит, и я хотел бы заранее сказать вам спасибо. У меня есть один лист в этой книге, поскольку его основная функция — служить журналом. ActiveSheet
Всегда будет один-единственный лист.
У меня есть следующий код, и я не слишком знаком с настройкой рабочей книги как object
, что, вероятно, является причиной получения Bad Index
ошибки.
Sub Test()
' Checking if Excel is open, if not, open it.
Dim xL As Object, wBook As Object, iCloseThings As Byte
On Error Resume Next
Set xL = GetObject(, "Excel.Application")
On Error GoTo 0
If xL Is Nothing Then
iCloseThings = 1 ' Set Excel to close only if it was never open
Set xL = CreateObject("Excel.Application")
End If
Set wBook = xL.Workbooks("C:Users<UserName>Documents<WorkBook>.xlsx").ActiveSheet
If iCloseThings = 1 Then xL.Quit
End sub
Мне нужна помощь в том, как мне правильно настроить этот объект так, чтобы он указывал на точную книгу, которая у меня есть в приведенном выше примере? Все, что я когда-либо умел делать, это что-то вроде Set wBook = XL.Workbooks("<WorkBook>.xlsx").ActiveSheet
потому что я знал, что такая книга уже будет открыта. Но с учетом возможности того, что он не будет открыт, мне нужно что-то более гибкое.
Спасибо за вашу помощь!
Ответ №1:
вам требуется несколько разных обращений, в основном в зависимости от того, открыта ли уже нужная книга или нет, если запущенный сеанс Excel будет «пойман»
возможно, вы захотите использовать некоторые специальные функции, чтобы не загромождать ваш основной код и быть более эффективными как при отладке, так и при поддержке вашего кода, например
Option Explicit
Sub Test()
' Checking if Excel is open, if not, open it.
Dim xL As Object, wBook As Object, wSheet As Object, iCloseThings As Byte
Set xL = GetExcel(iCloseThings)
Set wBook = GetExcelWorkbook(xL, "C:Users<UserName>Documents<WorkBook>.xlsx")
If wBook Is Nothing Then Exit Sub
Set wSheet = wBook.ActiveSheet
If iCloseThings = 1 Then xL.Quit
End Sub
Function GetExcel(iCloseThings As Byte) As Object
On Error Resume Next
Set GetExcel = GetObject(, "Excel.Application")
On Error GoTo 0
If GetExcel Is Nothing Then
iCloseThings = 1 ' Set Excel to close only if it was never open
Set GetExcel = CreateObject("Excel.Application")
End If
End Function
Function GetExcelWorkbook(xL As Object, wbFullName As String) As Object
Dim wbName As String
wbName = Right(wbFullName, Len(wbFullName) - InStrRev(wbFullName, ""))
On Error Resume Next
Set GetExcelWorkbook = xL.Workbooks(wbName)
On Error GoTo 0
If GetExcelWorkbook Is Nothing Then
Set GetExcelWorkbook = xL.Workbooks.Open(wbFullName)
Else
If GetExcelWorkbook.Path amp; "" amp; wbName <> wbFullName Then
MsgBox "A workbook with the wanted name '" amp; wbName amp; "' is already open but its path doesn't match the required one" _
amp; vbCrLf amp; vbCrLf amp; "Close the already open workbook and run this macro again", vbCritical vbInformation
Set GetExcelWorkbook = Nothing
Else
MsgBox "Wanted workbook is already open", vbInformation
End If
End If
End Function