mat*_*123 8 excel vba excel-vba
我有关于设定范围的问题.有些东西我正在尝试而且它不起作用.假设我有范围r,例如我写道:
set r = range("a1")
Run Code Online (Sandbox Code Playgroud)
但是这个范围对于活动工作表是有效的,例如,如果我在工作表1上并且我写了r.value = 1那么它将更改活动工作表上该单元格的值.现在我想在另一个工作表上更改该特定范围的值.所以我写
worksheets("specificworksheet").r.value =1
Run Code Online (Sandbox Code Playgroud)
但是当我写这篇文章时,它说Object不支持这种属性或方法.这是为什么?如何为另一个工作表分配范围(已设置)?在这种情况下写作
worksheets("specificworksheet").range("a1").value=1
Run Code Online (Sandbox Code Playgroud)
会解决我的问题,然而,有些时候我有更复杂的范围,例如,如果我将一个单元格连接到r,我使用了cells.find(...).感谢任何帮助,谢谢!
当你这样做时:
Set r = Range("A1")
Run Code Online (Sandbox Code Playgroud)
你真正在做的是:
Dim r As Variant
Set r = Application.ActiveSheet.Range("A1")
Run Code Online (Sandbox Code Playgroud)
因此,声明所有变量,并始终Option Explicit在每个模块的顶部指定- 这样VBA将拒绝编译使用未声明变量(或拼写错误)的代码.并使用显式类型声明变量:
Dim r As Range
Run Code Online (Sandbox Code Playgroud)
一个Range对象知道它Parent,它是它所属的工作表; 这就是为什么,正如您所指出的,此范围对于活动工作表是有效的.即使你激活另一张纸(它仍然不需要在99.999%的时间内完成),它仍保留在该纸张上.
这就是你不能这样做的原因:
Worksheets("Sheet42").r.Value = 1
Run Code Online (Sandbox Code Playgroud)
因为r它不是Worksheet对象的成员- 它是一个本地对象变量,指向非常特定的工作表上的特定地址.现在,当你这样做时Worksheets("Sheet42"),你真正访问了Worksheets集合类的默认属性,它的Item属性是:
Dim sheet As Worksheet
Set sheet = Worksheets.Item("Sheet42")
Run Code Online (Sandbox Code Playgroud)
并且Worksheets集合的Item属性返回一个Object,这意味着您在之后添加的任何成员调用将在运行时进行后期绑定/解析:
Dim obj As Object
Set obj = Worksheets.Item("Sheet42")
obj.AnythingYouWantHereWillCompileAnyway
Run Code Online (Sandbox Code Playgroud)
在运行时,VBA查询对象的接口以查找AnythingYouWantHereWillCompileAnyway,并且找不到该成员 - 这就是如何获得运行时错误438 - "对象不支持此属性或方法".
您可以通过使用早期绑定调用将该类型安全性移回编译时(而不是运行时),即使用Worksheet接口/类而不是Object:
Dim obj As Worksheet
Set obj = Worksheets.Item("Sheet42")
obj.AnythingYouWantHereWillCompileAnyway 'nope. that won't compile anymore.
Run Code Online (Sandbox Code Playgroud)
当您询问我如何为另一个工作表分配范围(已设置)?,你假设一个Range对象只不过是一个地址 - 而这个假设是错误的.
一个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)
Run Code Online (Sandbox Code Playgroud)
你可以使用地址:
worksheets("specificworksheet").range(r.Address).value=1
Run Code Online (Sandbox Code Playgroud)