关于Dim和Set Worksheet的一些疑问

时间:2018-02-25 07:06:18

标签: excel vba

通常,Dim应该先完成,然后Set应该在vba代码中完成,如下面的代码。

Dim xWs1 As Worksheet
Dim xWs2 As Worksheet
.
.
.
Dim xWsN As Worksheet
Set xWs1 = Worksheets("A")
Set xWs2 = Worksheets("B")
.
.
.
Set xWsN = Worksheets("NNN")

如果我需要Dim和Set 5工作表,则需要10行代码。当我需要Dim并设置超过5个工作表时,代码似乎太长了。

我发现如果我只使用Set,vba代码也可以正常运行。我想问一下如果我不使用Dim会导致任何问题吗?

Set xWs1 = Worksheets("A")
Set xWs2 = Worksheets("B")
.
.
.
Set xWsN = Worksheets("NNN")

谢谢!

3 个答案:

答案 0 :(得分:2)

如果不使用dim语句,变量将自动创建为Variant类型。

Variant类型可以是整数,字符串,工作簿或任何其他类型的变量,它可以随着变量的变化而变化,有时它可以是一个字符串,然后它可以更改为工作簿

使用Dim

enter image description here

不使用Dim

enter image description here

不使用Dim主要有两个问题,

  1. 变体类型使用更多的计算机内存,因此它会使您的代码变慢,尤其是在使用循环时。
  2. 很难找到错误(在您的情况下,您可以为变量XWs1分配任何内容,例如数字,名称等,如果使用暗淡则可以避免)

答案 1 :(得分:2)

如何使用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>声明的变量 < <{>> < / STRONG>?然后:

示例#2:

Set

(那是92个字符......不包括换行!)

说明:

在这两种缩短声明的方式之间,我们使用了六种捷径。以下是每个的摘要,并参阅&#34;更多信息&#34;有关每个文件的完整文档。

  

免责声明:我们不应该在编程中使用快捷方式。显而易见的是,压缩代码的次数越多,阅读和理解的难度就越大(特别是其他人),因此可能更难以进行故障排除或扩展。

     

如果您不知道&#34;标准方法&#34;是的,不要先学习快捷方式!学习如何做事&#34;正确的方式&#34;在学习捷径之前,无论它看起来多么吸引人。曾经有一段时间我认为像缩进和评论这样的整洁,以及完整的,正确的技巧,并不重要。我错了;不得不学习那种艰难的方式。如果您正在阅读本文,那么您可能也必须学习这一点,但至少:

     

在Stack Overflow问题中发布示例代码时,请不要使用快捷方式。 (这是不是 [MCVE]的一种方法!)你可能会被大吼大叫! ......并且可能让你有问题投票或被忽略.. 。 你被警告了!

DefObj W Sub wSet2():Dim wks(1To 92),x:For x=1To 92:Set wks(x)=Sheets("Sht"&x):Next x:End Sub (默认数据类型)

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 语句(在模块级别使用)说:

  

此模块中声明的所有变量 以字母开头&#39; W&#39; 默认为DefObj W类型(除非另有说明) 。请注意, Deftypes 语句必须在模块级别使用(在您的第一个Object之前)。

     

整个清单:(More Info

     

Sub

DefBool DefByte DefCur DefDate DefDbl DefDec DefInt DefLng DefSng DefStr DefObj DefVar (逗号&#39; Dim&#39;陈述)

使用,声明变量时,可以在同一行上列出多个变量,用逗号分隔。因此:

Dim

...与此相同:(将示例与 Deftypes 相结合)

Sub mySub()
    Dim myVariable1 as Currency  
    Dim myVariable2 as Currency  
    …

DefCur m Sub mySub() Dim myVariable1, myVariable1 … (&#39;表格&#39;集合)

  • Sheets对象是指指定或有效工作簿中所有工作表对象的集合。

  • WorkSheets Object`指的是指定或活动工作簿中**所有 Chart 对象的集合。

    • 但** Charts对象Sheets工作表refers to ***both*** the图表集合。

因此,如果工作簿具有 3个工作表和2个图表工作表,则在VBA中:

  • *and*将返回Sheets.Count

  • 5将返回Worksheets.Count

  

警告:如果您的图表和工作表具有相同的名称,则使用3可能会导致冲突(在引用其他文件中的工作表时也应避免使用)。但对于一个简单的单个文件,仅限工作表的工作簿,请保存一些 Sheets 并坚持使用 Work

Sheets (方括号参考快捷方式)

[方括号]可用作参考工作表单元格范围 个人的快捷方式的细胞即可。您可以使用括号内的 [ ]引用样式命名范围作为Range属性的快捷方式。您不必输入单词&#34; Range&#34;或使用引号。

A1

这几乎不是documented,如果按逻辑顺序使用,方括号可用于引用工作表,则更少记录的事实。

结合示例,所有这些陈述将具有相同的结果

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() (变量数组)

如果要声明大量类似对象,则通常更容易(并且更有条理)将它们组合在一个数组中。数组可以声明为任何类型,包括例如Object,Worksheet。 (...甚至是很少使用和奇怪的类型,如LongLongIConverterApplicationPreferences。(显然,谁想到那个人并不关心快捷方式。)

wks() (循环设置变量数组)

当使用对象数组(任何任何变量集)时,下一个逻辑步骤是使用需要对整个对象组执行的任何任务来减少代码。

其他注释:

示例#1可能已被压缩到一行,但我希望它在答案中易于阅读。如果我们的工作表名称 For..Set..Next 而不是那么长的 S1..S5,我们会使用{ {1}},我们可以用105个字符完成同样的事情:

示例#1b:

Sht1..Sht5

数据类型快捷方式符号

另一个很少使用的日期回溯到1974年:Gary Kildall为CP / M操作系统选择的数据类型快捷方式

<强> :

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

今天仍然支持许多编码语言,例如,您可以互换使用这些语言:

Symbol  Data Type  Constant                                                               

更多信息:

答案 2 :(得分:1)

采用以下示例,为什么使用隐式变量声明通常是一个坏主意:

Sub Test()

    myVariable = 10

    myOutcome = myVaraible + 5

End Test

myOutcome = 5.你能明白为什么吗?

我在第二行拼错了myVariable,所以我基本上创建了一个全新的变量myVaraible(默认值为0)。

这就是为什么你应该总是在每个模块的开头使用Option Explicit;以及为什么你应该总是明确声明所有变量。

虽然它仍然有效,但你只是为不必要的调试问题做好准备。

如果您的问题是要缩小代码以使用更少的行,则可以执行以下操作:

Option Explicit

Sub Test()

    Dim myVariable As Long:    myVariable = 10
    Dim myOutput As Long
    myOutput = myVariable + 5

End Sub

您还可以在同一行声明多个变量:

Option Explicit

Sub Test()

    Dim myVariable As Long, myOutput As Long
    myVariable = 10
    myOutput = myVariable + 5

End Sub

不一定推荐这个(因为它会降低可读性),但它是另一种声明变量的方法。这确实需要相同的数据类型,但您可以在数组中添加工作表(来自您的示例):

Option Explicit

Sub Test()

    Dim xWs(1 To 5) As Worksheet

    Set xWs(1) = Worksheets("A")
    Set xWs(2) = Worksheets("B")
    Set xWs(3) = Worksheets("C")
    Set xWs(4) = Worksheets("D")
    Set xWs(5) = Worksheets("E")

End Sub