无法从excel VBA单元格中检索值

无法从excel VBA单元格中检索值,vba,excel,Vba,Excel,我试图从另一个工作表激活一个工作表,并在excel的消息框中显示单元格值,但每当我运行它时,都会出现下标错误,表示下标超出范围 我的代码: Sub Home() Dim tbValue As String tbValue = Worksheets("Home").TextBox1.Value Worksheets(tbValue).Activate MsgBox Cells(7,1).Value End Sub 有人知道为什么下标超出范围吗?谢谢代码看起来是可行的,但是,请尝试顶部带有

我试图从另一个工作表激活一个工作表,并在excel的消息框中显示单元格值,但每当我运行它时,都会出现下标错误,表示下标超出范围

我的代码:

Sub Home()
Dim tbValue As String
tbValue = Worksheets("Home").TextBox1.Value

Worksheets(tbValue).Activate

MsgBox Cells(7,1).Value


End Sub

有人知道为什么下标超出范围吗?谢谢

代码看起来是可行的,但是,请尝试顶部带有/End With的
选项Explicit
,它可能会起作用。此外,它可以是。单元格(7,1)是一个错误或什么的。无论如何,请重试:

Option Explicit

Sub Home()
    Dim tbValue As String
    tbValue = trim(Worksheets("Home").TextBox1.text)

    with worksheets(tbValue)
        MsgBox .Cells(7,1)
    end with

End Sub
注释中的
Trim
也是一个好主意。
更进一步,请使用
TextBox1.Text
。请参阅此处的详细信息-

由于找不到工作表名称,下标超出范围。这可能发生在
工作表(…)
行代码中

  • 工作表(“主工作表”)
    可能返回下标错误,因为您的活动工作簿可能不是主工作表中的工作簿

  • 工作表(tbValue)
    可能由于相同的第一个原因失败,并且tbValue可能与确切的工作表名称不匹配

  • 第一种解决方案可能是确保激活了正确的图书:

    Sub Home()
       Dim tbValue As String
       Workbooks("your_workbook_name.xlsm").Activate
       tbValue = ThisWorkbook.Worksheets("Home").TextBox1.Value
       Worksheets(tbValue).Activate
       MsgBox Cells(7,1).Value
    End Sub
    
    更好的解决方案是避免工作表和书籍激活,并使用完全限定的对象。如果宏与主工作表在同一本书中:

    Sub Home()
        Dim tbValue As String
        tbValue = ThisWorkbook.Worksheets("Home").TextBox1.Value
        MsgBox ThisWorkbook.Worksheets(tbValue).Cells(7,1)
    End Sub
    

    您还可以使用VBA为工作表指定的名称替换
    工作表(“主页”)
    ,可能是
    Sheet1
    (您可以在IDE中检查此名称)。

    您在
    Textbox1
    中输入的工作表名称是否实际作为工作表存在?如果它确实尝试用
    TRIM
    包装您的Textbox1值,以消除末尾的多余空格:
    TRIM(Worksheets(“Home”).Textbox1.value)
    是的,它存在,我甚至尝试硬编码工作表名称而不是使用tbValue,但仍然是相同的错误,运行时错误9,下标超出范围。我不认为不能像那样访问
    TextBox1
    。它必须是图纸对象,如
    Sheet1.TextBox1
    工作表(“主页”).Shapes(“TextBox1”)…
    错误发生在哪一行?我之前的评论会出现在工作表激活行上。
    tbValue
    是否从
    TextBox1
    正确获取值?如果不在
    MsgBox单元格(7,1)中限定工作表,value
    将使用当前活动的工作表-您可能从错误的工作表中读取了单元格值@Vityata展示了如何使用
    和。。。以
    block结束(或只是将工作表名称放在单元格前面)。现在msgbox出现,但它什么也不显示,似乎无法检索工作表中单元格的值。其中有什么?这是A7。
    Option Explicit
    With
    如何解决下标超出范围的问题?@LS\u dev-考虑到错误不再显示的事实,至少它解决了一些问题。但是您知道
    Option Explicit
    是一个编译器和选项,
    With
    只是语法上的suggar<代码>单元格
    有很大不同。单元格
    可能就是这样解释的。我通常将我的wb和ws硬编码设置为:
    将wb设置为工作簿将wb设置为工作簿将ws设置为工作表集wb=Application.Workbooks(“workbookname.xlsm”)将ws=wb.Worksheets(“Sheetname”)
    然后你可以像这样引用:
    Msgbox ws.Cells(7,1)
    但是既然已经创建了对象,为什么还要创建新变量呢
    此工作簿
    是以前定义的,不依赖于文件名,您可以更改文件名!为了避免打开多个工作簿时出现复杂情况。
    wb=Workbook(“somename”)
    如何比
    ThisWorkbook
    更简单?