如何将 VBA 中的变量设置为等于工作簿的标题?我如何允许它根据它引用的单元格进行更改?

How do I set a variable in VBA to equal the title of a workbook? And how do I allow it change based on the cell it references?

我试图让一个单元格 (A37) 等于 VBA 中的一个变量,并让该变量根据单元格 A37 更改它引用的工作簿。在 A37 中我打算更改工作簿的名称以更改它从哪个工作簿中提取数据。

单元格 A37 将具有我要从中输出的工作簿的名称,单元格 A38 将具有我要从中输出的工作表的名称(在单元格 A37 的工作簿中)。

这是我编写的代码,但是当我将 OPEXsht 设置为等于一个单元格时,我一直收到错误消息。 (我是 VBA 编码的新手)

Sub CellName ()
Dim OPEXwbk As String
Dim OPEXsht As String

OPEXsht = Workbooks("VBA TRIAL.xlsb").Sheets("Sheet2").Range("A38")

OPEXwbk = Workbooks("VBA TRIAL.xlsb").Sheets("Sheet2").Range("A37")

Workbooks(OPEXwbk).Sheets(OPEXsht).Range("B22").Copy

Workbooks("VBA TRIAL.xlsb").Sheets("Sheet2").Range("A42").PasteSpecial Paste:=xlValues

End Sub

如有任何帮助,我们将不胜感激。

在流程的每个阶段添加一些错误检查。

Option Explicit

Sub CellName()

    ' This macro in VBA TRIAL.xlsb
    Dim wb As Workbook, ws As Worksheet
    Dim sOPEXwbk As String, sOPEXsht As String
    Dim msg As String, bOK As Boolean
   
    With ThisWorkbook.Sheets("Sheet2")
        sOPEXwbk = .Range("A37") ' book
        sOPEXsht = .Range("A38") ' sheet
    End With
   
    ' check not blank
    If Len(sOPEXwbk) = 0 Or Len(sOPEXsht) = 0 Then
        MsgBox "No workbook or worksheet configured on Sheet2 A37,A38", vbCritical
        Exit Sub
    End If
   
    ' check workbook open
    For Each wb In Workbooks
        msg = msg & vbCrLf & wb.Name
        If wb.Name = sOPEXwbk Then bOK = True
    Next
   
    ' workbook not open
    If bOK = False Then
        MsgBox "'" & sOPEXwbk & "' not in list" & msg, vbCritical, "Workbook not open"
        Exit Sub
    Else
        ' check worksheets
        msg = ""
        bOK = False
        For Each ws In Workbooks(sOPEXwbk).Sheets
            msg = msg & vbCrLf & ws.Name
            If ws.Name = sOPEXsht Then bOK = True
        Next
        
        ' worksheet not found
        If bOK = False Then
            MsgBox "'" & sOPEXsht & "' not in list" & msg, vbCritical, "Sheet Not Found"
            Exit Sub
        Else
            ' OK
            ThisWorkbook.Sheets("Sheet2").Range("A42") = Workbooks(sOPEXwbk).Sheets(sOPEXsht).Range("B22").Value
            MsgBox "Copied B22 from " & sOPEXwbk & " Sheet " & sOPEXsht, vbInformation
        End If
    End If

End Sub