Функция выдает ошибку несоответствия. Не знаю, почему изменение имен переменных решило это - PullRequest
0 голосов
/ 12 октября 2019

Основная функция, вызывающая Day1WeekNum & Day1inMonth

Function NthDay(Date1)
' Tells you if a date is the 3rd Tuesday of the Month
Dim Day1Name, Day1WeekNum, A, B, DayName, Nth
Dim Status ' Tells you if there is anything in the rest of the Array
Dim cWeekNum ' Number for the current week
Dim WeekDiff 'Difference between the week numbers
Dim cDayNum   'Number for the day of the week for Date1
Dim Week1Num

Week1Num = Day1WeekNum(Date1) ' tells me the week number of the first day of the month
Day1Name = Day1inMonth(Date1) ' tell me the day of the week for the first day of the month

Код для Day1inMonth

Function Day1inMonth(Date1)
'Tells you the weekday of the first day in a month of the provided date
Dim cYear, cMonth, month1st, day1


cYear = Year(Date1)
cMonth = Month(Date1)
month1st = DateSerial(cYear, cMonth, 1)
day1 = Weekday(month1st, vbSunday)

Day1inMonth = day1
End Function

Код для Day1WeekNum

Function Day1WeekNum(Date1 As Date)
'Tells you the week of the first day of the month of the provided date
Dim cYear, cMonth, day1Week
Dim month1st As Date

cYear = Year(Date1)
cMonth = Month(Date1)
month1st = DateSerial(cYear, cMonth, 1)
day1Week = WorksheetFunction.WeekNum(month1st, 1)

Day1WeekNum = day1Week
End Function

Мне пришлось изменить код вышек коду ниже, чтобы остановить ошибку несоответствия. Я не знаю почему. Это должно относиться к переменной области или что-то еще? Я пытаюсь понять, чтобы избежать причины ошибки в будущем.

Новый код, который позволил ему работать:

Function Day2WeekNum(Date1)
'Tells you the week of the first day of the month of the provided date

Dim cYear1, cMonth1, day1Week1
Dim month1st1 As Date

cYear1 = Year(Date1)
cMonth1 = Month(Date1)
month1st1 = DateSerial(cYear, cMonth, 1)
day1Week1 = WorksheetFunction.WeekNum(month1st, 1)

Day2WeekNum = day1Week1
End Function

1 Ответ

4 голосов
/ 12 октября 2019

У вас есть локальная переменная и функция в области действия, которые имеют одно и то же имя - Day1WeekNum

Локальная переменная неявно является Variant, поскольку она не была объявлена ​​как имеющая какой-либо определенный тип. Варианты могут содержать как массивы, так и отдельные (скалярные) значения.

Назначение Week1Num = Day1WeekNum(Date1) выглядит как вызов функции, но фактически пытается получить доступ к массиву. Массив не был определен, поэтому вы получаете ошибку несоответствия типов. Если вы дадите переменной Week1Num явный тип, не относящийся к массиву / без вариантов, то ошибка изменится на «Ошибка компиляции: ожидаемый массив».

Изменение имени функции сработало, поскольку новое имя функции не былоt сопоставить любые локальные переменные в вызывающей процедуре. Чтобы избежать этой проблемы в будущем:

  • используйте Option Explicit в верхней части каждого модуля (включив «Требуется объявление переменной» в меню «Инструменты> Параметры> Редактор» в редакторе VBA)
  • присваивайте каждой переменной явный тип - например, Dim Day1WeekNum As Integer
  • избегайте объявления переменных, которые имеют то же имя, что и подпрограмма или функция, которая находится в области видимости, потому что это может сбивать с толку и приводить к проблемам
...