gpt4 book ai didi

VBA for Excel - 设置范围

转载 作者:行者123 更新时间:2023-12-04 10:16:01 25 4
gpt4 key购买 nike

我有一个关于设定范围的问题。我正在尝试一些事情,但它不起作用。假设我有范围 r,例如我写道:

set r = range("a1")

但是这个范围对事件工作表有效,例如,如果我在 worksheet1 上并且我写 r.value = 1 那么它将更改事件工作表上该单元格的值。现在我想在另一个工作表上更改该特定范围的值。所以我写
worksheets("specificworksheet").r.value =1

但是当我写这个时,它说 Object 不支持这个属性或方法。这是为什么?如何为另一个工作表分配一个范围(已经设置)?在这种情况下写作
worksheets("specificworksheet").range("a1").value=1 

可以解决我的问题,但是,有时我的范围更复杂,例如,如果我将一个单元格分配给 r,我在其中使用了 cells.find(...)。
感谢任何帮助,谢谢!

最佳答案

当你这样做时:

Set r = Range("A1")

你真正在做的是:
Dim r As Variant
Set r = Application.ActiveSheet.Range("A1")

所以声明所有变量, 总是 指定 Option Explicit在每个模块的顶部 - 这样 VBA 将拒绝编译使用未声明变量(或拼写错误)的代码。并使用显式类型声明变量:
Dim r As Range

一个 Range对象知道它的 Parent ,这是它所属的工作表;这就是为什么,正如您所指出的,此范围对事件工作表有效。即使您激活另一个工作表,它也会保留在该工作表上(无论如何,您在 99.999% 的时间都不需要这样做)。

这就是为什么你不能这样做:
Worksheets("Sheet42").r.Value = 1

因为 r不是 Worksheet 的成员object - 它是一个本地对象变量,指向一个非常具体的工作表上的一个非常具体的地址。现在,当你这样做 Worksheets("Sheet42") ,您实际上是在访问 Worksheets 的默认属性集合类,即它的 Item属性(property):
Dim sheet As Worksheet
Set sheet = Worksheets.Item("Sheet42")

Worksheets收藏的 Item属性返回 Object ,这意味着您在此之后添加的任何成员调用都将在运行时被后期绑定(bind)/解析:
Dim obj As Object
Set obj = Worksheets.Item("Sheet42")
obj.AnythingYouWantHereWillCompileAnyway

在运行时,VBA 查询对象的接口(interface)以查找 AnythingYouWantHereWillCompileAnyway ,并且没有找到该成员 - 这就是你得到运行时错误 438 的方式 - “对象不支持此属性或方法”。

您可以通过使用早期绑定(bind)调用将类型安全移回编译时(而不是运行时),即使用 Worksheet接口(interface)/类而不是 Object :
Dim obj As Worksheet
Set obj = Worksheets.Item("Sheet42")
obj.AnythingYouWantHereWillCompileAnyway 'nope. that won't compile anymore.

当您询问如何为另一个工作表分配范围(已设置)时,您假设 Range object 只不过是一个地址——这个假设是错误的。

一个 Range不仅仅是一个地址。如果它只是一个地址,那么它将是一个字符串文字,而不是一个对象。

如果你想要一个代表地址的变量,你可以使用 String多变的:
Dim a As String
a = "A1"

Dim r1 As Range
Set r1 = Sheet1.Range(a)

Dim r2 As Range
Set r2 = Sheet2.Range(a)

关于VBA for Excel - 设置范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42812454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com