如何使用92个字符声明和设置92个对象:
如果“占用空间”是您关心的问题,并且您假设要显式设置5个过程级变量(w1..w5)为Set,以设置5个工作表(Sht1..Sht5),则可以使用以下代码:
示例#1:
DefObj W
Sub wSet1()
Dim w1, w2, w3, w4, w5
Set w1=[Sht1]:Set w2=[Sht2]:Set w3=[Sht3]:Set w4=[Sht4]:Set w5=[Sht5]
End Sub
...或者更加节省空间的是,如果你有92个工作表需要在92个声明变量中设置,那么:
示例2:
DefObj W
Sub wSet2():Dim wks(1To 92),x:For x=1To 92:Set wks(x)=Sheets("Sht"&x):Next x:End Sub
这是92个字符……不包括换行符!
说明:
在这两种缩短声明的方式中,我们使用了六个快捷方式。以下是每个快捷方式的摘要,请查看“更多信息”下面的链接以获取有关每个快捷方式的完整文档。
免责声明:我们不应该在编程中使用快捷方式的原因有很多。显而易见的是,代码压缩得越多,阅读和理解就越困难(特别是对于其他人),因此可能更难排除故障或扩展。如果您不知道“标准方法”是什么,请不要先学习快捷方式!无论看起来多么吸引人,都要先学习如何以“正确的方式”完成任务,然后再学习快捷方式。曾经有一段时间,我认为像缩进和注释以及完整的、正确的技术等整洁性并不重要。我错了;我必须通过艰苦的方式学习。如果你正在阅读这篇文章,你可能也需要通过艰苦的方式学习,但至少:
在发布问题时不要使用快捷方式示例代码在你的Stack Overflow问题中。(这不是
[MCVE]的方法!)
你可能会被嚷嚷!......并可能被贬低或忽视......
你已经被警告了!
✓ DefObj
(默认数据类型)
[Deftype statements][1] are a forgotten method of declaring default data types. Normally, the default data type is [`Variant`][2], so this:
Dim myVariable as Variant
"...与以下相同:"
Dim myVariable
...然而,在模块级别使用的DefObj W
语句表示:
在此模块中声明的所有变量以字母'W'开头,默认为类型Object
(除非另有规定)。请注意,必须在模块级别(在第一个Sub
之前)使用Deftypes语句。
整个列表:(更多信息)
DefBool DefByte DefCur DefDate DefDbl DefDec DefInt DefLng DefSng DefStr DefObj DefVar
✓ ,
(在“Dim”语句中的逗号)
使用Dim
声明变量时,可以在同一行上列出多个变量,用逗号分隔。因此,下面这个例子:
Sub mySub()
Dim myVariable1 as Currency
Dim myVariable2 as Currency
…
这句话的意思是:“……与此相同:(将示例与Deftypes结合起来)”。
DefCur m
Sub mySub()
Dim myVariable1, myVariable1
…
✓ Sheets
(工作表集合)
因此,在 VBA 中,如果一个工作簿有3 个工作表和 2 个图表工作表:
Sheets.Count
将返回 5
Worksheets.Count
将返回 3
警告:如果您同时拥有一个图表和一个工作表具有相同的名称(并且在引用其他文件中的工作表时也应避免使用),则使用
Sheets
可能会导致冲突。但对于仅包含工作表的简单单个文件,为了节省一些
Work
,请坚持使用
Sheets
。
✓ [ ]
(方括号引用快捷键)
在引用工作表、单元格范围和单个单元格时,可以使用方括号作为快捷方式。您可以使用A1
引用样式或命名范围作为范围属性的快捷方式。您不必键入“Range”一词或使用引号。
Worksheets("Sheet1").[A1:B5].ClearContents
[MyRange].Value = 30
这几乎没有记录,甚至更少的记录是,如果按照逻辑顺序使用,方括号可以用于引用工作表。
结合示例,所有这些语句将具有相同的结果:
Worksheets("Sheet1").Range("A1") = Now()
Sheets("Sheet1").Range("A1") = Now()
Worksheets("Sheet1").[A1] = Now()
Sheets("Sheet1").[A1] = Now()
[Sheet1].[A1] = Now()
✓ wks()
(变量数组)
如果您要声明大量相似的对象,则通常更容易(并且更有组织)将它们分组在数组中。 数组可以声明为任何类型,例如Object、Worksheet等。(……或者甚至是很少使用和奇怪的类型,如LongLong和IConverterApplicationPreferences。(显然,想出这个想法的人不喜欢捷径。)
✓ For..Set..Next
(循环设置变量数组)
当使用对象数组(任何变量集)时,下一个逻辑步骤是通过任何需要在整个对象组上执行的任务来减少代码。
其他注释:
示例#1本可以压缩成一行,但我希望答案易于阅读。如果我们的工作表名称是S1..S5
而不是如此冗长的Sht1..Sht5
,并且我们使用:
,我们可以在105个字符内完成同样的事情:
示例#1b:
DefObj W
Sub wSet():Dim w1,w2,w3,w4,w5:Set w1=[S1]:Set w2=[S2]:Set w3=[S3]:Set w4=[S4]:Set w5=[S5]:End Sub
数据类型快捷符号
另一组很少使用的数据类型快捷方式可以追溯到1974年:这些快捷方式是由Gary Kildall为CP/M操作系统选择的。
符号 数据类型 常量
% Integer vbInteger = 2
$ String vbString = 8
& Long vbLong = 3
@ Decimal vbDecimal = 6
! Single vbSingle = 4
今天在许多编程语言中仍然得到支持,例如,您可以交替使用它们:
Dim myVariable as String
Dim myVariable$
更多信息: