函数声明行上的“需要常量表达式”错误

时间:2019-06-21 20:25:09

标签: excel vba

我有一个用Visual Basic编写的函数,应该在两个Excel工作簿中阅读并对其进行一些文本分析。

我得到的问题是,每当我尝试在工作表的单元格中运行该函数时,都会在VBA中出现错误“需要常量表达式”,并且出现“ #VALUE!”错误。单元中的错误。

我的功能行看起来像

Function CriticalPercentage() As Double

然后我通过在单元格中键入“ = CriticalPercentage()”来调用该函数。

当我在单元格中键入函数调用后单击Enter时,它将转到VBA,显示错误消息,并且Function CriticalPercentage() As Double  以黄色突出显示。在我从函数中提供的以下代码的最后一行中,它也以蓝色突出显示.Count

Function CriticalPercentage() As Double

    Debug.Print "the first line works fine"

   ByVal WorkbookName1 As String, ByVal WorkbookName2 As String

' this section accesses the excel files and sheets the script will be working with

    WorkbookName1 = "name of excel file"
    WorkbookName2 = "name of excel file"

    Workbooks.Open WorkbookName1
    Workbooks.Open WorkbookName2

    ' define variables for the the two workbooks
    Dim Workbook1, Workbook2 As Excel.Workbook
    Dim Worksheet1, Worksheet2 As Excel.Worksheet

    ' create workbook objects to work with
    Set Workbook1 = Excel.Workbooks(WorkbookName1)
    Set Workbook2 = Excel.Workbooks(WorkbookName2)

    ' sets worksheet variables to the sheets contained in the two workbooks, respectively
    Set Worksheet1 = Workbook1.Sheets(1).Select
    Set Worksheet2 = Workbook2.Sheets(1).Select

'---------------------------------------------------------------------------------------

' this section of code works on reading in all the neccessary info from the ARCHER excel file

    ' search for [Application Name & Finding] 
    Dim i, j, k As Integer
    Dim numRows As Integer
    Const numRows = Worksheet1.UsedRange.Rows.Count

我尝试在Debug.Print之后放置Function CriticalPercentage() As Double语句,但是它不会立即显示在窗口中,因此我被认为在取消该功能时我做错了什么

在此方面的任何帮助以及对于我为什么会收到此错误的任何见解,我将不胜感激。如果需要提供更多代码,我会很乐意这样做。

非常感谢!

1 个答案:

答案 0 :(得分:4)

问题不在于函数的签名,而是此指令的问题:

Const numRows = Worksheet1.UsedRange.Rows.Count

DimConst语句不可执行,它们是声明性语句-您不能在它们上设置断点:当编译器看到{{ 1}}声明在处理VBA代码时,会在编译时在静态上下文中评估值表达式 ,并将该值“刻录”到所有调用站点。

Const

基本上,编译一次是:

Const foo = 42
Debug.Print foo

在编译时,Debug.Print 42 不是常量表达式:它需要直到运行时才存在的对象,例如Worksheet1.UsedRange.Rows.Count引用。

长话短说,对变量使用UsedRange,对恒定的事物使用Dim-例如ConstrgbRed = &HFF0000 ,即无论您如何看待或何时看待事物,始终具有相同价值的事物。如果它不是常数,则不应为Pi = 3.14159