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

Ami*_*irY 1 excel vba

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

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

我的功能线看起来像

Function CriticalPercentage() As Double
Run Code Online (Sandbox Code Playgroud)

我通过在单元格中键入“=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
Run Code Online (Sandbox Code Playgroud)

我试过在Debug.Print后面发表声明Function CriticalPercentage() As Double立即但它没有显示在直接窗口中,所以我相信我在函数的声明中做错了什么。

我将不胜感激对此的任何帮助以及有关为什么我会收到此错误的任何见解。如果需要提供进一步的代码,我很乐意这样做。

非常感谢!

Mat*_*don 5

问题不在于函数的签名,问题在于这个指令:

Const numRows = Worksheet1.UsedRange.Rows.Count
Run Code Online (Sandbox Code Playgroud)

DimConst语句不可执行,它们是声明性语句——你不能在它们上放置断点:当编译器Const在处理 VBA 代码时看到一个声明时,它会在编译时静态上下文中评估值表达式“燃烧”到所有调用站点的值。

Const foo = 42
Debug.Print foo
Run Code Online (Sandbox Code Playgroud)

一旦编译基本上是:

Debug.Print 42
Run Code Online (Sandbox Code Playgroud)

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

所以长话短说,使用Dim变量,并保持Const对事情是不变-像rgbRed = &HFF0000,或者Pi = 3.14159,即东西的时候,你看的话总是会不管如何,或者具有相同的值。如果它不是常量,它不应该是Const.