首页 > 解决方案 > 如何在 VBA 中将变量设置为等于工作簿的标题?以及如何允许它根据它引用的单元格进行更改?

问题描述

我试图让一个单元格(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

任何帮助将不胜感激。

标签: excelvbavariablescopy-paste

解决方案


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

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

推荐阅读