Получение ActiveX Automation: Сообщение об ошибке неверного индекса

#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