Excel宏中定义单元格变量
有没有这样一个变量?定义myCells为一小块单元格(多行多列)。定义后,myCells可以像工作表里的单元格一样,拥有Columns、Rows等属性。我希望能定义这样一...
有没有这样一个变量?
定义myCells为一小块单元格(多行多列)。定义后,myCells可以像工作表里的单元格一样,拥有Columns、Rows等属性。
我希望能定义这样一块单元格,对其进行一定的值、格式处理后直接复制到工作表的单元格里。而本身myCell不属于任何一个工作表。 展开
定义myCells为一小块单元格(多行多列)。定义后,myCells可以像工作表里的单元格一样,拥有Columns、Rows等属性。
我希望能定义这样一块单元格,对其进行一定的值、格式处理后直接复制到工作表的单元格里。而本身myCell不属于任何一个工作表。 展开
3个回答
展开全部
举例说明吧,下面这个 myCell 变量就是单元格变量了。
Sub Macro1()
Dim myCell As Range
Set myCell = Range("A2") '为单元格变量赋值
myCell.Formula = "=Today()" '为单元格变量所代表的单元格填写内容
myCell.Offset(1, 0).Value = "测试"
myCell.Select '选中单元格变量所代表的单元格
End Sub
--------------------------------------------------------
所定义的 Range 对象,与工作表里的单元格当然一样,因为它们是同一个Range类的对象嘛,所有的属性与方法都相同呀。
Sub Macro1()
Dim myCell As Range
Set myCell = Union(Range("A2", "C4"), Range("A6", "C7")) '为单元格变量赋值
myCell.Formula = "=row() & Column()" '为单元格变量所代表的单元格填写内容
myCell.Copy
myCell.Range("A1").Offset(7, 3).Select
ActiveSheet.Paste
MsgBox myCell.Range("A1").Text 'myCell对象中的第1行第1列值
MsgBox myCell.Cells(3, 2).Text 'myCell对象中的第3行第2列值
MsgBox myCell.Columns.Count 'myCell对象的列数统计
End Sub
但是“本身myCell不属于任何一个工作表”这个恐怕不是那么容易做到的,因为简单的这样两行代码:
Dim myCell As Range
Set myCell = Union(Range("A2", "C4"), Range("A6", "C7")) '为单元格变量赋值
所定义的变量 myCell 它只是一个地址引用,并没有在系统的内存中开辟出一个区域来(复制)存放 Union(Range("A2", "C4"), Range("A6", "C7")) 这些单元格的内容,当使用 myCell 时,实际还是依赖于 myCell 所指向的工作表单元格。
比如:
Sub Macro2()
Dim myCell As Range
Range("A1") = 1
Set myCell = Range("A1")
Range("A1") = 5
MsgBox myCell
End Sub
这里 Range("A1") = 5 改变了值,MsgBox myCell 也显示 5,就是说,这个对象实际是一个对象指针(引用)。
有疑问,请Hi我或给我发百度消息
GoodLuck!
Sub Macro1()
Dim myCell As Range
Set myCell = Range("A2") '为单元格变量赋值
myCell.Formula = "=Today()" '为单元格变量所代表的单元格填写内容
myCell.Offset(1, 0).Value = "测试"
myCell.Select '选中单元格变量所代表的单元格
End Sub
--------------------------------------------------------
所定义的 Range 对象,与工作表里的单元格当然一样,因为它们是同一个Range类的对象嘛,所有的属性与方法都相同呀。
Sub Macro1()
Dim myCell As Range
Set myCell = Union(Range("A2", "C4"), Range("A6", "C7")) '为单元格变量赋值
myCell.Formula = "=row() & Column()" '为单元格变量所代表的单元格填写内容
myCell.Copy
myCell.Range("A1").Offset(7, 3).Select
ActiveSheet.Paste
MsgBox myCell.Range("A1").Text 'myCell对象中的第1行第1列值
MsgBox myCell.Cells(3, 2).Text 'myCell对象中的第3行第2列值
MsgBox myCell.Columns.Count 'myCell对象的列数统计
End Sub
但是“本身myCell不属于任何一个工作表”这个恐怕不是那么容易做到的,因为简单的这样两行代码:
Dim myCell As Range
Set myCell = Union(Range("A2", "C4"), Range("A6", "C7")) '为单元格变量赋值
所定义的变量 myCell 它只是一个地址引用,并没有在系统的内存中开辟出一个区域来(复制)存放 Union(Range("A2", "C4"), Range("A6", "C7")) 这些单元格的内容,当使用 myCell 时,实际还是依赖于 myCell 所指向的工作表单元格。
比如:
Sub Macro2()
Dim myCell As Range
Range("A1") = 1
Set myCell = Range("A1")
Range("A1") = 5
MsgBox myCell
End Sub
这里 Range("A1") = 5 改变了值,MsgBox myCell 也显示 5,就是说,这个对象实际是一个对象指针(引用)。
有疑问,请Hi我或给我发百度消息
GoodLuck!
追问
对,我要的就是一个虚拟单元格。或者说,我要的是建一个对象,而不是一个指针。开始学习宏的时候看到一篇文章,说宏大量修改单元格内容实际上非常慢,因为修改单元格的内容实际上需要用API之类访问EXCEL,因此那篇文章建议dim一个虚拟单元格,直接在内存中修改单元格,完毕后整体粘贴到目标位置,还有示例。当时没有存档,现在无论如何都找不回那篇文章了,后悔莫及啊。文章内容是VBS基础。
追答
这个问题要看楼主的目的是什么了。
如果是为了解决现有的实际问题,倒可以采用简单实用的办法,这样出问题时解决起来容易。
如果是为了研究技术,那的确值得研究!
但我看要自己建立Excel单元格一样的对象,绝非易事!很可能也就是在内存中开一个或几数组,存放一下单元格的内容,以及其他附加信息。
另,“宏大量修改单元格内容实际上非常慢”这个除了电脑硬件关系之外,与宏代码的写法也有很大关系,相同的处理过程,不同的代码,即使程序算法都一样,运行的时间可能会相差百倍!
楼主可以研究一下这几个设置,在大量数据处理时,它们的设置对处理时间的影响非常巨大:
Application.ScreenUpdating
Application.Calculation
ActiveSheet.DisplayPageBreaks
Application.DisplayStatusBar
Application.EnableEvents
希望能有所帮助!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询