2

I want to open and refer to a workbook via the function below. Only the function produces the run-time error '91': object variable or with block variable not set just before jumping back into the main code. When I put the exact code (just not as function) into my main code it works perfectly. But I don't want to have the whole function in my main code because I think it's unnecessary and ugly. Maybe someone can help me make my code nicer and better comprehensible! Thank you already!

This is the relevant part of my main sub:

Sub main_sub()
    Dim WBtest As Workbook
    Dim WBpath As String

    WBpath = ThisWorkbook.Sheets("Control").Range("A6").Value    'read path
    WBtest = openfile(WBpath) 'I call my function here
End Sub

This is the function that produces the error The function is supposed to return the (newly) opened workbook

Public Function openfile(path As String) As Workbook    'path is fullpath
    Dim wb As Workbook
    Dim alreadyopen As Boolean

    For Each wb In Workbooks     'loop over all Workbooks
        If wb.FullName = path Then 'check if file is already open
            alreadyopen = True
            Set openfile = wb
        End If
    Next wb
    If alreadyopen = False Then
        'file not yet opened --> open it
        Set openfile = Workbooks.Open(path)
    End If
    'MsgBox openfile.name 'this returns the right name
End Function

When I write all of it in my main sub it works (but is ugly, so I don't want it there!) This works:

Sub main_sub()
    Dim WBtest As Workbook
    Dim WBpath As String
    Dim wb As Workbook 'for loop
    Dim alreadyopen As Boolean

    WBpath = ThisWorkbook.Sheets("Control").Range("A6").Value    'read path

    For Each wb In Workbooks     'loop over all Workbooks
        If wb.FullName = WBpath Then
            alreadyopen = True
            Set WBtest = wb
        End If
    Next wb
    If alreadyopen = False Then
        'file not yet opened --> open it
        Set WBtest = Workbooks.Open(WBpath)
    End If
 End Sub

I have a similar problem later in my code, where I want to have a function return a workbook, too. So this seems to be the problem. How does a function return a workbook? I have found similar functions returnins worksheets. Those work. Why not with workbooks?

Thank you so much for your help!

4

1 回答 1

2

The different between both approaches is that, in the first one, you are forgetting the Set bit. Thus, solution:

Set WBtest = openfile(WBpath) 'I call my function here
于 2013-07-29T08:43:01.480 回答