【问题标题】:Select method of Range class failed. A range address is found by msgBox, but won't ".Select"Range 类的 Select 方法失败。 msgBox 找到范围地址,但不会“.Select”
【发布时间】:2019-09-14 02:01:13
【问题描述】:

我正在使用命名范围(主要在工作表 2 中),并且正在创建一个名为“注册”的工作表中的摘要。我主要是剪切和粘贴在程序的其他部分工作的代码。由于某种原因,VBA 不会在工作表 2 中选择范围。

在下面的代码中,“SignupPairs”是工作表“Signups”中的一个范围,“NewMem”是“Sheet2”中的一个范围。

''''''''''
MsgBox "SignupPairs 2,1 " & Range("SignupPairs")(2, 1)
Range("SignupPairs")(2, 1).Select
MsgBox "NewMem 1,1 " & Range("NewMem")(1, 1)
'Sheets("Sheet2").Range("NewMem")(1, 1).Select  'Doesn't work.
Range("NewMem")(1, 1).Select
''''''''''

前四行已添加用于调试目的。最后一行是让我突然停下来的那一行。第四行试图具体说明我想使用的工作表;它没有用。 MsgBox 正确报告了“SignupPairs”和“NewMem”中单元格的内容,但我无法选择 NewMem(1,1) 来执行“Range(Selection, Selection.End(xlDown)).Rows.Count.

对于加分:是否有人有一个链接或参考,以获得关于 VBA 的良好入门或手册,这样我就可以自学而不必问这些简单的问题? VBA for Dummies 只会让我陷入困境。

附:在 VBA 编辑器中单击“选择”上的“F1”会将我转到“选择案例”页面,这似乎是一个死胡同。

【问题讨论】:

  • 阅读此stackoverflow.com/questions/10714251/… 您无法选择非活动工作表上的单元格,因此您必须先激活工作表或使用application.goto
  • 由于这些是命名范围,您还可以将它们的数据直接获取到 vba 中的数组中,例如 'ThisWorkbook.Names("SignupPairs)..RefersToRange.Value`
  • @jessi 这将是一个很棒的、值得投票的答案!
  • 我从我的评论中创建了一个答案。我希望它可以帮助运营商推进这个项目。感谢@MathieuGuindon 的鼓励

标签: excel vba


【解决方案1】:

由于您是 VBA 新手,我强烈建议您始终在代码中写下您打算作为 cmets 执行的操作。这将有助于帮助者和未来的你。

我不确定您要如何处理摘要表中的数据。我建议您创建对摘要表的引用,然后您可以使用命名范围中的数组。

这是一种方法,您可以将 Sign Up Pairs 和 New Mem 放入数组中,然后将 msg 框出您正在查看的内容(但我假设您想要匹配它们或做其他事情)

Sub doSomethingWithSignups()
    Dim ws As Worksheet, signUps As Variant, newMems As Variant
    ' these arrays will have whatever data you have identified in the Named Ranges
    signUps = ThisWorkbook.Names("SignupPairs").RefersToRange.Value2
    newMems = ThisWorkbook.Names("NewMems").RefersToRange.Value2

    ' you can do anything with these arrays now
    MsgBox("SignupPairs 2,1 " & signUps(2, 1))
    MsgBox("NewMem 1,1 " & newMems(1, 1))
End Sub

【讨论】:

  • 谢谢你,杰西。我需要回顾我的代码并弄清楚如何使用 signUps 而不是 Range("SignupPairs")。当我一直在处理这段代码时,我一直在使用有意义的范围名称来帮助跟踪我在做什么。使用 signUps 比使用 Range("SignupPairs") 简单得多,但它有助于了解为什么 signUps 在功能上更好。我的直觉反应是,多层次的抽象会带来更多意想不到的后果。我可以将注册移交给订阅者吗?如果我在 Sub 中重新调整 signUps,这将适用于调用例程和其他 Subs 吗?
  • 您可以更改您的子目录中命名范围的尺寸。它是否影响其他 subs 取决于何时调用 Subs 以及您赋予它的范围。除非你知道你有什么影响,否则我会犹豫改变命名范围的形状。您可以一开始就使范围变大,并让代码检查是否为空。或者,您可以在 sub 的开头动态命名范围。您绝对可以在 Subs 和 Functions 周围传递数组以进行更多工作。
  • 好的,感谢您的帮助。我想我开始看到问题的一部分:命名 rang 是工作表的属性,而 signUps 是 VBA 变量,在 VBA 环境中效果更好。
  • 是的!命名范围是引用一组单元格的简单方法。 signUps(在我的示例中)是一个不在工作表上的数组。你可以很快地用数组做很多事情。
  • .Value2 是什么意思?它与.Value 相同吗?有没有人建议我可以参考一下,这样我就不必花时间回答简单的问题了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 2022-10-17
  • 2013-05-17
  • 1970-01-01
  • 2014-09-04
相关资源
最近更新 更多