ошибка «требуется постоянное выражение» в строке объявления функции - PullRequest
1 голос
/ 21 июня 2019

У меня есть функция, написанная на Visual Basic, которая должна читаться в двух книгах Excel и для некоторого текстового анализа по ним.

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я пытаюсь запустить функцию в ячейке на своем листе, я получаю сообщение об ошибке «Требуется постоянное выражение» в VBA и «#VALUE!»ошибка в ячейке.

Моя строка функции выглядит как

Function CriticalPercentage() As Double

, и я вызываю функцию, набирая "= CriticalPercentage ()" в ячейке.

Когда я нажимаю клавишу ввода после ввода моегоВызов функции в ячейке идет на 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 Ответ

4 голосов
/ 21 июня 2019

Проблема не в сигнатуре функции, а в этой инструкции:

Const numRows = Worksheet1.UsedRange.Rows.Count

Dim и Const операторы не являются исполняемыми, они декларативные операторы - вы не можете поместить на них точку останова: когда компилятор видит объявление Const при обработке код VBA, он оценивает выражение значения в статическом контексте, во время компиляции и «записывает» значение во все сайты вызовов.

Const foo = 42
Debug.Print foo

После компиляции это по существу:

Debug.Print 42

Во время компиляции Worksheet1.UsedRange.Rows.Count не является константным выражением: для него требуются объекты, которые не будут существовать до времени выполнения, например, ссылка UsedRange.

Короче говоря, используйте Dim для переменных и оставьте Const для вещей, которые постоянны - например, rgbRed = &HFF0000 или Pi = 3.14159, то есть вещей, которые всегда будут иметь одно и то же значение, независимо от того, как и когда вы смотрите на него. Если оно не постоянное, оно не должно быть Const.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...