无法从 Cells excel VBA 中检索值

Posted

技术标签:

【中文标题】无法从 Cells excel VBA 中检索值【英文标题】:Unable to retrieve value from Cells excel VBA 【发布时间】:2017-04-18 09:13:08 【问题描述】:

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

我的代码:

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

Worksheets(tbValue).Activate

MsgBox Cells(7,1).Value


End Sub

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

【问题讨论】:

您在Textbox1 中输入的工作表名称是否真的以工作表的形式存在?如果它确实尝试用 TRIM 包装您的 Textbox1 值以消除末尾的任何额外空格:Trim(Worksheets("Home").TextBox1.Value) 是的,它存在,我什至尝试硬编码工作表名称而不是使用 tbValue 但它仍然是相同的错误,运行时错误 9,下标超出范围。 我不认为TextBox1 不能这样访问。它必须是工作表对象,例如 Sheet1.TextBox1Worksheets("Home").Shapes("TextBox1")... 错误出现在哪一行?我之前的评论会出现在工作表激活行上。 tbValue 是否从 TextBox1 正确获取值? 如果没有在MsgBox Cells(7,1).Value 中限定工作表,它将使用当前活动的工作表-您可能正在从错误的工作表中读取单元格值。 @Vityata 展示了如何确保它使用 With... End With 块查看正确的工作表(或者只是将工作表名称放在 Cells 之前)。 【参考方案1】:

下标超出范围,因为找不到工作表名称。这可能发生在两个Worksheet(...) 行代码中。

    Worksheets("Home") 可能会返回下标错误,因为您的活动工作簿可能不是您的主工作表所在的工作簿;

    Worksheets(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

您也可以将Worksheets("Home") 替换为VBA 为工作表分配的名称,可能是Sheet1(您可以在IDE 中检查此名称)。

【讨论】:

我通常将我的 wb 和 ws 硬编码设置为:Dim wb As Workbook Dim ws as Worksheet Set wb = Application.Workbooks("workbookname.xlsm") Set ws = wb.Worksheets("Sheetname") 然后你可以参考:Msgbox ws.Cells(7,1) 但是既然已经创建了对象,为什么还要创建一个新变量呢? ThisWorkbook 是之前定义的,不依赖文件名,可以改! 为了避免在打开多个工作簿时出现复杂情况。 wb=Workbook("somename") 怎么比ThisWorkbook 简单?【参考方案2】:

代码看起来可行,但是,尝试顶部的With/ End withOption Explicit,它可能会起作用。此外,可能是 .Cells(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

cmets 中Trim 的想法也不错。 更进一步,请使用TextBox1.Text。在这里查看更多 - Distinction between using .text and .value in VBA Access

【讨论】:

现在msgbox出现了,但是什么也没显示,好像是无法检索到工作表中单元格的值 里面有什么?这是 A7。 Option ExplictWith 如何解决超出范围的下标? @LS_dev - 好吧,至少它解决了一些问题,考虑到错误不再显示的事实。 但是您知道Option Explicit 是一个编译器和选项,With 只是语法糖。 Cells.Cells 有很大不同,这可能是解释。

以上是关于无法从 Cells excel VBA 中检索值的主要内容,如果未能解决你的问题,请参考以下文章

excel vba 运行速度慢

vba程序从excel表格读取数据(数据量=2000行),程序运行时特别慢,怎么解决?

从 VBA (Excel) 中的另一个函数调用一个函数

excel vba将公式转为数值

EXCEL VBA 读AS400数据中文乱码问题

excel如何用vba批量提取指定工作表?