Eu estou tentando criar uma função, para uso emsubs, que cria uma matriz de dias reais em um mês. Não consigo executar a função usando a janela Immediate diretamente ou com um sub. O código da função é o seguinte (Debug.Print
instâncias são removidas, pois elas nunca são acionadas):
Function GenererDager(ByVal month As Integer, ByVal year As Integer) As Integer
Dim dateFormat As String, daysArr() As Integer, actualDays As Integer
actualDays = 1
" Find the number of actual days in given month
For dayCheck = 1 To 31
dateFormat = month & "/" & dayCheck & "/" & year " mm/dd/yyyy format
If IsDate(dateFormat) Then
actualDays = actualDays + 1
Else
Exit For
End If
Next dayCheck
" Redimension the array with the actual number of days in the month
ReDim daysArr(actualDays)
" Populate the array with the correct number of days
For daysToArray = 1 To actualDays
daysArr(daysToArray) = daysToArray
Next daysToArray
GenererDager = daysArr
End Function
Executando a função usando a janela Immediate com GenererDager(2, 2017)
produz a seguinte mensagem de erro: Compile error: Expected: =
Executando a função usando a janela Immediate com ?GenererDager(2, 2017)
produz a seguinte mensagem de erro: Compiler error: Type mismatch
com o último uso de daysArr selecionado
O test-sub que estou usando para chamar a função é assim:
Sub HentDager()
Dim daysArray() As Integer
daysArray = GenererDager(2, 2017)
Debug.Print daysArray(4)
End Sub
Chamando este sub na janela Immediate com HentDager()
produz o seguinte erro: Compile error: Expected: =
Eu tenho sido muito preso a este problema parajá faz algum tempo, e tenho reescrito o código várias vezes para identificar o (s) problema (s), mas até agora não consegui resolvê-lo. Eu poderia ter produzido mais erros do que o que consertei no processo, pois me ocorreu que não tenho ideia do que realmente estou fazendo agora :-)
Respostas:
3 para resposta № 1Você tem que declarar seus objetos e funcionar como Variant para passar arrays.
Além disso, sua função precisava de algumas mudanças:
actualDays = actualDays - 1
porque você retornou o primeiro valor para o qual não é uma data!ReDim daysArr(1 To actualDays)
para evitar ter um valor vazio no primeiro índice do array,
o que teria sidodaysArr(0)
Função de trabalho (testado):
Function GenererDager(ByVal month As Integer, ByVal year As Integer) As Variant
Dim dateFormat As String, daysArr() As Variant, actualDays As Integer, dayCheck As Integer, daysToArray As Integer
actualDays = 1
" Find the number of actual days in given month
For dayCheck = 1 To 31
dateFormat = month & "/" & dayCheck & "/" & year " mm/dd/yyyy format
If IsDate(dateFormat) Then
actualDays = actualDays + 1
Else
Exit For
End If
Next dayCheck
actualDays = actualDays - 1
" Redimension the array with the actual number of days in the month
ReDim daysArr(1 To actualDays)
" Populate the array with the correct number of days
For daysToArray = 1 To actualDays
daysArr(daysToArray) = daysToArray
Next daysToArray
GenererDager = daysArr
End Function
Testes:
Sub HentDager()
Dim daysArray() As Variant
daysArray = GenererDager(2, 2017)
"Display last day of the month in the immediate window
Debug.Print daysArray(UBound(daysArray))
End Sub
Depois de um pouco de tentativa e erro, aqui está um exemplo usando Integer
:
Sub TestIntSub()
Dim TestInt() As Integer
TestInt = FctIntArr
Debug.Print TestInt(1) & "|" & TestInt(2)
End Sub
Public Function FctIntArr() As Integer()
Dim IntArr() As Integer
ReDim IntArr(1 To 2)
IntArr(1) = 545
IntArr(2) = 232
FctIntArr = IntArr
End Function
2 para resposta № 2
Você precisa definir o tipo de retorno da função corretamente -
Function GenererDager(ByVal month As Integer, ByVal year As Integer) As Integer
Mude para
Function GenererDager(ByVal month As Integer, ByVal year As Integer) As Variant
1 para resposta № 3
algumas coisas que parecem estar erradas são
seu valor de retorno da função é realmente diminuído como um inteiro em vez de como inteiro ()
em vez de escurecer o daysarray como array apenas diminuí-lo como uma variante e atribuir o valor