OK, here it is:
Public Sub INI_LoadForm(ByVal frm As Form, Optional ByVal INIFile As String, Optional ResetFile As Boolean = False)
' This is for incase the file was already deleted
On Error Resume Next
' Create a generic INI name from the App title
If INIFile = "" Then INIFile = App.Path & "\" & App.Title & ".ini"
If ResetFile = True Then Kill INIFile: Exit Sub
INI_LoadFormPos frm, INIFile
INI_LoadControlPos frm, INIFile
INI_LoadControlValues frm, INIFile
End Sub
----------------------
Public Sub INI_LoadControlValues(ByVal frm As Form, ByVal INIFile As String)
Dim i As Long ' Control counter
Dim j As Long ' ListView columnheader counter
Dim ControlX As Control
Dim ControlX_Type As String
Dim ControlX_Val As String
' Loop through all the controls
For i = 0 To frm.Controls.Count - 1
' Get the current control
Set ControlX = frm.Controls(i)
' Save the values for each control if there is one associated with it
' But first check if the control is part of an array
On Error Resume Next
If (Not ControlX.Index <> ""

Then
ControlX_Val = INI_Read("Control Data", frm.Name & "." & ControlX.Name & ".Value", INIFile)
Else
ControlX_Val = INI_Read("Control Data", frm.Name & "." & ControlX.Name & "(" & ControlX.Index & "

" & ".Value", INIFile)
End If
' Determine what kind of control this is
' and get the data accordingly.
ControlX_Type = TypeName(ControlX)
Select Case ControlX_Type
Case "CheckBox"
If ControlX_Val <> "" Then ControlX.Value = CInt(ControlX_Val)
Case "OptionButton"
If ControlX_Val <> "" Then ControlX.Value = CInt(ControlX_Val)
etc.