Can you return an array in a function
Forums
Hi!
I am working on a function that would validate dates. I am aware of IsDate(), but it doesn't really suit my use case as it only accepts Date types and the two inbuilt conversion functions DateSerial and DateValue, will convert invalid dates into valid dates, by addding the excess months and days into years ( for example 01.13.2020 becomes 01.01.2021). Therefore i am writing my own implementation.
As part of this i have a funciton that strips the string into day, month and year and converts them to integers:
Function formatDate(dateString As String) As Integer()
Dim day As String
Dim month As String
Dim year As String
day = Left(dateString, 2)
month = Mid(dateString, 4, 2)
year = Right(dateString, 4)
Dim dateArr As Integer(2)
dateArr(0) = cInt(day)
dateArr(1) = cInt(month)
dateArr(2) = cInt(year)
formatDate = dateArr
End Function
This doesn't compile since the paranthesis after integer in the function declaration is seen as a syntax error. As far as i can tell the language browser doesn't mention anything about how to return arrays in functions. The way to do it in VBA would be as i tried in the function above, but I guess IDEAscript is based on an earlier version of VBA that doesn't support this behaviour. So is returning arrays in functions even possible in IDEAscript? I think I could solve my issue by declaring dateArr as a global variable, but I think returning an array would be cleaner, if i ever wanted to use my validateDate script as a custom function. I am also just plainly curious about the matter, because I imagine returning arrays could be useful in other scenarios.
Hi Hustlam,
Hi Hustlam,
I have taken your code and updated so it works as you want:
Option Explicit
Sub Main
Dim dateArr(2) As Integer
Call formatDate("11212022", dateArr)
MsgBox "Day:" & dateArr(0)
MsgBox "Month: " & dateArr(1)
MsgBox "Year: " & dateArr(2)
End Sub
Function formatDate(dateString As String, dateArr() As Integer)
Dim sDay As String
Dim sMonth As String
Dim sYear As String
sDay = Left(dateString, 2)
sMonth = Mid(dateString, 4, 2)
sYear = Right(dateString, 4)
dateArr(0) = CInt(sDay)
dateArr(1) = CInt(sMonth)
dateArr(2) = CInt(sYear)
End Function
I moved your array definition to the sub main as you want to have the array defintion from the calling function or sub routine. I added the array variable to the function call and defined it as part of the formatDate parameters. I also added an s to your variables as Day, Month and Year and VBA keywords are can't be used as a variable. That is why they were gold in the editor. Hopefully this is working as expected.
Thank you brian,
Thank you brian,
Moving the array definition to sub Main is a better solution than mine (having the array as a global variable). Does this mean that arrays cannot be returned by functions? If it does, just passing them in as arguments is a neat workaround, that should work in most use cases.
Sorry about the variable names being in conflict with VBA keywords, in the original script they were named in a different languages, and when i posted here i translated them to english so it would be easier to understand.
Seems like using the global
Seems like using the global keyword results in a syntax error wherever i use it. ( i have tried all these different scenarios one by one)
Dim arr(2) As Integer ' does not result in a syntax error
Sub Main
Global Const int1 = 2 ' does result in a syntax error
Global arr1(2) As Integer ' does result in a syntax error
Call test
End Sub
Function test
Global int2 As Integer ' does result in a syntax error
Global arr2(1) As Integer ' does result in a syntax error
End Function
IDEA help has a section on creating global arrays, where they use the Global keyword to create an array inside a procedure. However, I am only able to create a global array using Dim outside the procedure level