VBA 中的“需要常量表达式”错误

Posted

技术标签:

【中文标题】VBA 中的“需要常量表达式”错误【英文标题】:"Constant Expression required" error in VBA 【发布时间】:2014-10-04 04:00:58 【问题描述】:

我是 VBA 的新手,我正在尝试编写一个简单的程序,将一张工作表复制到另一张工作表,然后将其粘贴到有选择地删除的某些行。作为我程序的一部分,我试图将使用的行数简单地保存为一个整数,在下面的代码中我称之为 shortLen。然而,当我尝试构造一个长度为更短的数组时,我得到一个编译错误:“需要常量表达式”。我不明白这一点,因为我用来查找已用行数的代码 (Sheets(2).UsedRange.Rows.count) 应该输出一个常量整数。我之前也试过,效果很好。有什么我想念的吗?我问了一个VBA专家的朋友,他不知道。任何帮助将不胜感激。

Sub Macro1()
Dim i As Integer
Dim numRows As Integer
numRows = Sheets(2).UsedRange.Rows.count
Debug.Print (numRows)
shorterLen = numRows - 11

Dim securityInd(shorterLen) As Integer

For i = 1 To shorterLen

If Not IsEmpty(ActiveSheet.Cells(i, 4)) Then
securityInd(i) = 1
Else:
securityInd(i) = 0
End If
Next i
ActiveSheet.Copy
Sheets.Add.Name = "sheet1"
Sheets("sheet1").select
ActiveSheet.paste

For i = 1 To numRows - 11
If securityInd(i) = 0 Then
Sheets("sheet1").Rows(i).Delete
End If

Next i

End Sub

【问题讨论】:

【参考方案1】:

要动态更改数组,请使用 ReDim 而不是 Dim

Dim 一般用于声明类型。 Redim 专门用于改变数组大小,第一次设置动态数组大小算作改变。

【讨论】:

谢谢,这消除了那个错误。我现在正在处理一个不同的错误——即我的新工作表是在不同的工作簿中创建的并且没有任何内容——但你仍然解决了我的问题。不过我还是有点困惑……那是我第一次声明securityInd,所以我没有“重新调整”它。为什么我必须在这种情况下使用 Redim? 谢谢。但我的数组不是动态的。我只想制作一个大小更短的静态数组 @paul 因为您想在运行时更改它,它动态的。静态数组被声明为固定大小,例如Dim A(1 to 10) As Integer。那样做就不能 Redim'd。 有趣。我猜 cab 与我习惯的 c 和 java 等语言有一些根本的区别。或者我只是不明白。在运行时更改它是什么意思?我只声明一次,就像所有其他变量一样 我的意思是你不知道你想要的数组的大小,直到你运行你的代码。因此,您不能声明固定大小。我想行话可能有点不同,但这个概念肯定很常见。

以上是关于VBA 中的“需要常量表达式”错误的主要内容,如果未能解决你的问题,请参考以下文章

查询表达式中的语法错误(缺少运算符) - VBA

VBA常量

word中vba常量

SQL日期查询中的VBA变量

Delphi中的SendKeys函数无法使用常量

VBA语法