我遇到了这个错误:
运行时错误 91 对象变量或 With 块变量未设置
当我尝试激活由 Set 语句打开的工作簿时。
代码可以正常打开指定的工作簿,但是当它达到我尝试激活或选择或编辑工作簿的程度时,就会出现错误。正在打开的文件之一是 csv,另一个是 xlsx,无论哪种方式,工作簿都不会激活并发送错误。我是否需要再次定义该变量?如果需要,如何定义?该名称是动态的,并且除了文件类型之外,打开的两个文件的名称相同。
Dim i As Integer
For i = 2 To .Range.Rows.Count
' Retrieve current row's values
active = Trim(.Range(i, 2).Value2)
reportName = Trim(.Range(i, 3).Value2)
If active Then
Dim wbSource As Workbook
Dim wbDest As Workbook
Set wbSource = OpenwbSource(reportName)
Set wbDest = OpenwbDest(reportName)
wbSource.Activate ' (Error 91)
wbDest.Activate ' (Error 91) (whichever is first causes the error)
' The code continues... from here I would copy data from csv to xlsx file and edit...
End If
Next i
End With
End Sub
Public Function OpenwbSource(reportName As String) As Workbook
Dim wbSource As Workbook
Set wbSource = Workbooks.Open(PathSource & reportName & ".csv")
Exit Function
End Function
Public Function OpenwbDest(reportName As String) As Workbook
Dim wbDest As Workbook
Set wbDest = Workbooks.Open(ThisWorkbook.Path & "\Templates\" & reportName & ".xlsx")
Exit Function
End Function
我尝试过使用另一个 With 语句。我尝试过重新定义工作簿。
仅关注您提出的直接问题,正如其他人指出的那样,问题是
OpenwbSource()
不返回工作簿。这是因为您将值Set
放入变量wbSource
中,但随后未使用该值(与OpenwbDest()
同样的问题)。因此,该函数将返回 Nothing
。
请注意,
wbSource
中的OpenwbSource()
是在本地声明的(即在函数内),因此,与您提供的代码中第一个过程中声明的wbSource
完全分开(缺少其声明)即它与 Sub 或 Function 的行)。
要从函数返回非
Nothing
值,您必须为函数分配一个值...对于两个函数:
Public Function OpenwbSource(reportName As String) As Workbook
Set OpenwbSource = Workbooks.Open(PathSource & reportName & ".csv")
End Function
Public Function OpenwbDest(reportName As String) As Workbook
Set OpenwbDest = Workbooks.Open(ThisWorkbook.Path & "\Templates\" & reportName & ".xlsx")
End Function
要了解有关函数的更多信息,请参阅函数语句。有关如何从它们返回值,请参阅以“要从函数返回值,请将值分配给函数名称...”开头的部分。
我认为您的代码可能存在其他问题...如果您遇到其他问题,请提出单独的问题。