无法从 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.TextBox1
或 Worksheets("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 with
和Option 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 Explict
和 With
如何解决超出范围的下标?
@LS_dev - 好吧,至少它解决了一些问题,考虑到错误不再显示的事实。
但是您知道Option Explicit
是一个编译器和选项,With
只是语法糖。 Cells
与 .Cells
有很大不同,这可能是解释。以上是关于无法从 Cells excel VBA 中检索值的主要内容,如果未能解决你的问题,请参考以下文章