VB6Parse / Library / Type Checking / ismissing

VB6 Library Reference

IsMissing Function

Returns a Boolean value indicating whether an optional Variant parameter was passed to a procedure.

Syntax

IsMissing(argname)

Parameters

Return Value

Returns a Boolean: - True if the optional Variant argument was not passed - False if the optional Variant argument was passed - Only works with optional Variant parameters - Does not work with other data types (only Variant) - Does not work with ParamArray parameters - Returns False if Null, Empty, or any value was explicitly passed

Remarks

The IsMissing function is used to detect whether an optional parameter was omitted:

Typical Uses

  1. Optional Parameter Detection: Check if optional argument was provided
  2. Default Value Logic: Apply different defaults based on whether parameter was omitted
  3. API Compatibility: Maintain backward compatibility with varying parameter counts
  4. COM Interop: Work with COM objects expecting optional parameters
  5. Flexible Functions: Create functions with multiple optional behaviors
  6. Database Operations: Handle optional WHERE clause parameters
  7. Configuration Functions: Apply settings only when explicitly provided
  8. Validation Logic: Distinguish "no value" from "zero value"

Basic Usage Examples

' Example 1: Simple optional parameter handling
Function Greet(name As String, Optional title As Variant) As String
Dim greeting As String

If IsMissing(title) Then
greeting = "Hello, " & name
Else
greeting = "Hello, " & title & " " & name
End If

Greet = greeting
End Function

' Usage
Debug.Print Greet("Smith")              ' "Hello, Smith"
Debug.Print Greet("Smith", "Dr.")       ' "Hello, Dr. Smith"
Debug.Print Greet("Smith", Empty)       ' "Hello,  Smith" - Empty was passed!

' Example 2: Multiple optional parameters
Sub LogMessage(msg As String, Optional level As Variant, Optional timestamp As Variant)
Dim output As String

output = msg

If Not IsMissing(level) Then
output = "[" & level & "] " & output
End If

If Not IsMissing(timestamp) Then
output = Format$(timestamp, "hh:nn:ss") & " " & output
Else
output = Format$(Now, "hh:nn:ss") & " " & output
End If

Debug.Print output
End Sub

' Usage
LogMessage "Application started"                    ' Uses current time, no level
LogMessage "Error occurred", "ERROR"                ' Uses current time, ERROR level
LogMessage "Debug info", "DEBUG", #1/1/2025 10:30#  ' Uses specified time

' Example 3: Distinguish missing from zero/empty
Function Calculate(value As Double, Optional multiplier As Variant) As Double
If IsMissing(multiplier) Then
' No multiplier provided - return original value
Calculate = value
ElseIf multiplier = 0 Then
' Multiplier is explicitly 0 - return 0
Calculate = 0
Else
' Multiplier provided and non-zero
Calculate = value * multiplier
End If
End Function

Debug.Print Calculate(10)           ' 10 - multiplier missing
Debug.Print Calculate(10, 2)        ' 20 - multiplier is 2
Debug.Print Calculate(10, 0)        ' 0 - multiplier is explicitly 0

' Example 4: Database query with optional filter
Function GetRecords(table As String, Optional whereClause As Variant) As Recordset
Dim sql As String

sql = "SELECT * FROM " & table

If Not IsMissing(whereClause) Then
If whereClause <> "" Then
sql = sql & " WHERE " & whereClause
End If
End If

Set GetRecords = db.OpenRecordset(sql)
End Function

' Usage
Set rs = GetRecords("Customers")                    ' All records
Set rs = GetRecords("Customers", "State = 'CA'")    ' Filtered records
Set rs = GetRecords("Customers", "")                ' All records (empty string passed)

Common Patterns

' Pattern 1: Optional parameter with computed default
Function ProcessData(data As String, Optional maxLength As Variant) As String
Dim limit As Long

If IsMissing(maxLength) Then
limit = Len(data)  ' Use full length when not specified
Else
limit = maxLength
End If

ProcessData = Left$(data, limit)
End Function

' Pattern 2: Cascading optional parameters
Sub SaveFile(filename As String, Optional path As Variant, Optional createBackup As Variant)
Dim fullPath As String
Dim backup As Boolean

If IsMissing(path) Then
fullPath = App.Path & "\" & filename
Else
fullPath = path & "\" & filename
End If

If IsMissing(createBackup) Then
backup = False  ' Default to no backup
Else
backup = createBackup
End If

' Save file logic...
End Sub

' Pattern 3: Count provided optional parameters
Function CountProvided(Optional arg1 As Variant, Optional arg2 As Variant, _
Optional arg3 As Variant) As Integer
Dim count As Integer

count = 0
If Not IsMissing(arg1) Then count = count + 1
If Not IsMissing(arg2) Then count = count + 1
If Not IsMissing(arg3) Then count = count + 1

CountProvided = count
End Function

' Pattern 4: Optional override parameter
Function GetSetting(key As String, Optional overrideValue As Variant) As Variant
If IsMissing(overrideValue) Then
' Load from registry or config file
GetSetting = LoadFromConfig(key)
Else
' Use provided override
GetSetting = overrideValue
End If
End Function

' Pattern 5: Optional parameter affects behavior
Sub PrintReport(data As Variant, Optional includeHeader As Variant)
If Not IsMissing(includeHeader) Then
If includeHeader Then
PrintHeader
End If
Else
' Default: always include header when not specified
PrintHeader
End If

PrintData data
End Sub

' Pattern 6: Validation with optional strict mode
Function ValidateEmail(email As String, Optional strictMode As Variant) As Boolean
Dim strict As Boolean

If IsMissing(strictMode) Then
strict = False  ' Default to lenient validation
Else
strict = strictMode
End If

If strict Then
ValidateEmail = ValidateEmailStrict(email)
Else
ValidateEmail = ValidateEmailBasic(email)
End If
End Function

' Pattern 7: Optional range parameters
Function GetSubstring(text As String, Optional startPos As Variant, _
Optional length As Variant) As String
Dim start As Long
Dim len As Long

If IsMissing(startPos) Then
start = 1
Else
start = startPos
End If

If IsMissing(length) Then
len = Len(text) - start + 1
Else
len = length
End If

GetSubstring = Mid$(text, start, len)
End Function

' Pattern 8: Build parameter list dynamically
Function BuildCommand(command As String, Optional arg1 As Variant, _
Optional arg2 As Variant) As String
Dim cmd As String

cmd = command

If Not IsMissing(arg1) Then
cmd = cmd & " " & arg1
End If

If Not IsMissing(arg2) Then
cmd = cmd & " " & arg2
End If

BuildCommand = cmd
End Function

' Pattern 9: Optional error handler callback
Function ProcessRecords(records As Variant, Optional errorHandler As Variant) As Long
Dim count As Long
Dim i As Long

count = 0
For i = LBound(records) To UBound(records)
On Error Resume Next
ProcessRecord records(i)

If Err.Number <> 0 Then
If Not IsMissing(errorHandler) Then
' Call custom error handler if provided
Application.Run errorHandler, records(i), Err.Number
End If
Err.Clear
Else
count = count + 1
End If
On Error GoTo 0
Next i

ProcessRecords = count
End Function

' Pattern 10: Optional configuration object
Sub Initialize(Optional config As Variant)
If IsMissing(config) Then
' Use default configuration
LoadDefaultConfig
Else
' Apply provided configuration
ApplyConfig config
End If
End Sub

Advanced Usage Examples

' Example 1: Flexible query builder
Public Class QueryBuilder
Private m_sql As String

Public Sub SelectFrom(table As String, Optional fields As Variant, _
Optional whereClause As Variant, _
Optional orderBy As Variant)
If IsMissing(fields) Then
m_sql = "SELECT * FROM " & table
Else
m_sql = "SELECT " & fields & " FROM " & table
End If

If Not IsMissing(whereClause) Then
If whereClause <> "" Then
m_sql = m_sql & " WHERE " & whereClause
End If
End If

If Not IsMissing(orderBy) Then
If orderBy <> "" Then
m_sql = m_sql & " ORDER BY " & orderBy
End If
End If
End Sub

Public Function GetSQL() As String
GetSQL = m_sql
End Function
End Class

' Usage:
Dim qb As New QueryBuilder
qb.SelectFrom "Customers"                           ' SELECT * FROM Customers
qb.SelectFrom "Customers", "Name, Email"            ' SELECT Name, Email FROM Customers
qb.SelectFrom "Customers", , "State = 'CA'"         ' SELECT * FROM Customers WHERE State = 'CA'
qb.SelectFrom "Customers", "Name", "Active = 1", "Name"  ' Full query

' Example 2: Logger with flexible output
Public Class Logger
Private m_logFile As String

Public Sub Initialize(Optional filename As Variant)
If IsMissing(filename) Then
m_logFile = App.Path & "\app.log"
Else
m_logFile = filename
End If
End Sub

Public Sub Log(message As String, Optional level As Variant, _
Optional timestamp As Variant, Optional writeToFile As Variant)
Dim output As String
Dim logLevel As String
Dim useTimestamp As Date
Dim toFile As Boolean

' Determine log level
If IsMissing(level) Then
logLevel = "INFO"
Else
logLevel = level
End If

' Determine timestamp
If IsMissing(timestamp) Then
useTimestamp = Now
Else
useTimestamp = timestamp
End If

' Determine output destination
If IsMissing(writeToFile) Then
toFile = True  ' Default to file
Else
toFile = writeToFile
End If

' Build output
output = Format$(useTimestamp, "yyyy-mm-dd hh:nn:ss") & " [" & _
logLevel & "] " & message

' Write output
Debug.Print output
If toFile Then
WriteToLogFile output
End If
End Sub

Private Sub WriteToLogFile(text As String)
Dim fileNum As Integer
fileNum = FreeFile
Open m_logFile For Append As fileNum
Print #fileNum, text
Close fileNum
End Sub
End Class

' Example 3: HTTP request builder
Public Class HttpRequest
Public Function Get(url As String, Optional headers As Variant, _
Optional timeout As Variant) As String
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP")

' Set timeout if provided
If Not IsMissing(timeout) Then
http.SetTimeouts timeout, timeout, timeout, timeout
End If

http.Open "GET", url, False

' Add custom headers if provided
If Not IsMissing(headers) Then
Dim headerList As Variant
Dim i As Long

If IsArray(headers) Then
For i = LBound(headers) To UBound(headers)
http.setRequestHeader Split(headers(i), ":")(0), _
Trim$(Split(headers(i), ":")(1))
Next i
End If
End If

http.send
Get = http.responseText
End Function
End Class

' Example 4: Validation framework
Public Class Validator
Public Function Validate(value As Variant, Optional minValue As Variant, _
Optional maxValue As Variant, _
Optional pattern As Variant) As Boolean
Dim isValid As Boolean
isValid = True

' Check minimum value
If Not IsMissing(minValue) Then
If value < minValue Then
isValid = False
Exit Function
End If
End If

' Check maximum value
If Not IsMissing(maxValue) Then
If value > maxValue Then
isValid = False
Exit Function
End If
End If

' Check pattern (if string)
If Not IsMissing(pattern) Then
If VarType(value) = vbString Then
isValid = MatchesPattern(CStr(value), CStr(pattern))
End If
End If

Validate = isValid
End Function

Private Function MatchesPattern(text As String, pattern As String) As Boolean
' Simple pattern matching implementation
MatchesPattern = (text Like pattern)
End Function
End Class

Error Handling

IsMissing itself does not raise errors, but improper usage can:

' ERROR: Cannot use with non-Variant optional parameters
Function BadExample(Optional value As Integer) As Boolean
BadExample = IsMissing(value)  ' Compile error!
End Function

' CORRECT: Must use Optional Variant
Function GoodExample(Optional value As Variant) As Boolean
GoodExample = IsMissing(value)  ' Works correctly
End Function

' ERROR: Cannot use after assignment
Function BadExample2(Optional value As Variant) As Boolean
Dim temp As Variant
temp = value
BadExample2 = IsMissing(temp)  ' Always False! Use value directly.
End Function

' CORRECT: Use parameter directly
Function GoodExample2(Optional value As Variant) As Boolean
GoodExample2 = IsMissing(value)  ' Works correctly
End Function

Performance Considerations

Best Practices

  1. Use Only with Variant: IsMissing only works with Optional Variant parameters
  2. Direct Check: Always check IsMissing directly on the parameter name
  3. Document Behavior: Clearly document what happens when parameter is omitted
  4. Provide Defaults: Consider if default values on Optional parameters would work instead
  5. Avoid Complexity: Don't overuse optional parameters - can make APIs confusing
  6. Check Early: Test IsMissing before using the parameter value
  7. Combine Wisely: Can combine with IsEmpty, IsNull checks for complete validation
  8. API Design: Use for true optional behavior, not just to avoid typing
Function Purpose Returns Use Case
IsMissing Check if optional parameter omitted Boolean Detect missing Optional Variant arguments
IsEmpty Check if uninitialized Boolean Detect Empty Variant values
IsNull Check if Null Boolean Detect Null values
IsError Check if error value Boolean Detect CVErr error values
VarType Get variant type Integer Detailed type information
TypeName Get type name String Type name as string

IsMissing vs IsEmpty

Sub Test(Optional param As Variant)
' Case 1: Parameter not provided
' Call: Test
Debug.Print IsMissing(param)  ' True - was not provided
Debug.Print IsEmpty(param)    ' True - is Empty

' Case 2: Explicit Empty passed
' Call: Test Empty
Debug.Print IsMissing(param)  ' False - was provided (even though Empty)
Debug.Print IsEmpty(param)    ' True - is Empty

' Case 3: Null passed
' Call: Test Null
Debug.Print IsMissing(param)  ' False - was provided
Debug.Print IsEmpty(param)    ' False - is Null, not Empty

' Case 4: Zero passed
' Call: Test 0
Debug.Print IsMissing(param)  ' False - was provided
Debug.Print IsEmpty(param)    ' False - has value (0)
End Sub

Platform and Version Notes

Limitations

← Back to Type Checking | View all functions