Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 函数声明行出现“需要常量表达式”错误_Excel_Vba - Fatal编程技术网

Excel 函数声明行出现“需要常量表达式”错误

Excel 函数声明行出现“需要常量表达式”错误,excel,vba,Excel,Vba,我有一个用VisualBasic编写的函数,应该在两本Excel工作簿中阅读,并对它们进行一些文本分析 我遇到的问题是,每当我尝试在工作表中的单元格中运行函数时,我都会得到VBA中所需的错误常量表达式和值!单元格中出现错误 我的功能线看起来像 Function CriticalPercentage() As Double 我通过在单元格中键入=CriticalPercentage来调用该函数 当我在单元格中键入函数调用后单击enter时,它将转到VBA,显示错误消息,函数CriticalPer

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

我遇到的问题是,每当我尝试在工作表中的单元格中运行函数时,我都会得到VBA中所需的错误常量表达式和值!单元格中出现错误

我的功能线看起来像

Function CriticalPercentage() As Double
我通过在单元格中键入=CriticalPercentage来调用该函数

当我在单元格中键入函数调用后单击enter时,它将转到VBA,显示错误消息,函数CriticalPercentage显示为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语句放在函数CriticalPercentage之后,将其设置为Double,但它没有显示在即时窗口中,因此我认为我在函数的解析中做错了什么

我将非常感谢在这方面的任何帮助,以及我为什么会出现这个错误的任何见解。如果需要提供进一步的代码,我将很乐意这样做


非常感谢

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

Const numRows = Worksheet1.UsedRange.Rows.Count
Dim和Const语句不是可执行的,它们是声明性语句-不能在它们上放置断点:当编译器在处理VBA代码时看到Const声明时,它会在编译时在静态上下文中计算值表达式,并将值烧入所有调用站点

Const foo = 42
Debug.Print foo
一旦编译,基本上是:

Debug.Print 42
在编译时,Worksheet1.UsedRange.Rows.Count不是一个常量表达式:它需要在运行时之前不存在的对象,如UsedRange引用


长话短说,用Dim表示变量,用常量表示常量,比如rgbreed=&HFF0000,或Pi=3.14159,也就是说,不管你怎么看或什么时候看,它们总是有相同的值。如果不是常量,则不应为常量。

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

Const numRows = Worksheet1.UsedRange.Rows.Count
Dim和Const语句不是可执行的,它们是声明性语句-不能在它们上放置断点:当编译器在处理VBA代码时看到Const声明时,它会在编译时在静态上下文中计算值表达式,并将值烧入所有调用站点

Const foo = 42
Debug.Print foo
一旦编译,基本上是:

Debug.Print 42
在编译时,Worksheet1.UsedRange.Rows.Count不是一个常量表达式:它需要在运行时之前不存在的对象,如UsedRange引用


长话短说,用Dim表示变量,用常量表示常量,比如rgbreed=&HFF0000,或Pi=3.14159,也就是说,不管你怎么看或什么时候看,它们总是有相同的值。如果它不是常量,它就不应该是常量。

你不能声明这样的常量。顺便说一句,你已经有了和整数一样长的小数值。去掉常量。不需要选择任何一个。你不能声明这样的常量。顺便说一句,你已经有了和整数一样长的小数值。摆脱常量。无需选择任何一个。感谢您提供了非常详细和清晰的答案!我从numRows中删除了Const,并将其类型改为Long,正如我在帖子中的一条评论所建议的那样。然而,我仍然得到了与我在帖子中指定的完全相同的错误消息和突出显示的代码部分。这个错误是否可能是由我的代码后面的内容引起的?或者我在Excel表格中的阅读方式?是否删除了.Select调用?BigBen的评论也应该被注意=是的,我做了,我的坏朋友忘了提。实际上,我修复了我在帖子中提供的第三行代码,并将其设置为Dim WorkbookName1,WorkbookName2作为字符串,我认为这修复了原始代码行中有蓝色高亮显示的错误,但现在下一行代码Dim AppNameStringsWorksheet1.UsedRange.Rows.Count As String上有蓝色高亮显示。Count,但我不知道为什么。啊,好吧,明白了——正如我在上面写的,Dim语句是不可执行的,所以它们的内容必须在编译时可计算。将Dim更改为ReDim,如果您想要该数组的Dim语句,您可以将Dim AppNameString作为字符串来声明它为动态数组。这就成功了!非常感谢你帮助我,我被这个错误困扰了太久,真的很感激:谢谢你给出了非常详细和清晰的答案!我从numRows中删除了Const,并将其类型改为Long,正如我在帖子中的一条评论所建议的那样。然而,我仍然得到了与我在帖子中指定的完全相同的错误消息和突出显示的代码部分。这个错误是否可能是由我的代码后面的内容引起的?或者我在Excel表格中的阅读方式?你知道吗
删除。选择呼叫?BigBen的评论也应该被注意=是的,我做了,我的坏朋友忘了提。实际上,我修复了我在帖子中提供的第三行代码,并将其设置为Dim WorkbookName1,WorkbookName2作为字符串,我认为这修复了原始代码行中有蓝色高亮显示的错误,但现在下一行代码Dim AppNameStringsWorksheet1.UsedRange.Rows.Count As String上有蓝色高亮显示。Count,但我不知道为什么。啊,好吧,明白了——正如我在上面写的,Dim语句是不可执行的,所以它们的内容必须在编译时可计算。将Dim更改为ReDim,如果您想要该数组的Dim语句,您可以将Dim AppNameString作为字符串来声明它为动态数组。这就成功了!非常感谢你帮助我,我被错误缠住太久了,真的很感激: