/ / Tipo incompatível ao retornar uma matriz de uma função - excel, vba, excel-vba

Tipo incompatível ao retornar uma matriz de uma função - excel, vba, excel-vba

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 № 1

Você 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 sido daysArr(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

  1. seu valor de retorno da função é realmente diminuído como um inteiro em vez de como inteiro ()

  2. em vez de escurecer o daysarray como array apenas diminuí-lo como uma variante e atribuir o valor