Private Sub Form_Open(Cancel As Integer)
Dim ctl As Access.Control
For Each ctl In Me.Controls
If TypeOf ctl Is TextBox Or TypeOf ctl Is ComboBox Then
ctl.ColumnWidth = -2
End If
Next
End Sub
I do not want to autofit the fields on the form. When a query is executed and it returns a result table, I want to autofit its columns.
Public Sub AutoFitQuery(qryName As String)
On Error Resume Next
Const TwipsToInches = 1440
Const TWIPSTOCHARWIDTH = TwipsToInches * 0.08
Dim I As Integer
Dim fld As Field
Dim qdf As QueryDef
Dim db As DAO.Database
Dim colChars As Collection
Set colChars = GetMaxChars(qryName)
Set db = CurrentDb
Set qdf = db.QueryDefs(qryName)
I = 1
For Each fld In qdf.Fields
fld.Properties("ColumnWidth") = colChars(I) * TWIPSTOCHARWIDTH + 200
I = I + 1
Next fld
DoCmd.OpenQuery qryName
End Sub
Public Function GetMaxChars(qryName As String) As Collection
Const ConMaxChars = 255
Dim I As Integer
Dim fld As DAO.Field
Dim RS As DAO.Recordset
Dim maxChars As Integer
Dim curChars As Integer
Dim NumberOfFields As Integer
Set GetMaxChars = New Collection
Set RS = CurrentDb.OpenRecordset(qryName)
NumberOfFields = RS.Fields.Count
For I = 0 To NumberOfFields - 1
RS.MoveFirst
maxChars = Len(RS.Fields(I).Name)
If RS.Fields(I).type = dbMemo Then 'Do not want to autofit a memo
GetMaxChars.Add (ConMaxChars)
Else
Do While Not RS.EOF
curChars = Len(CStr(Nz((RS.Fields(I)), 0)))
If curChars > maxChars Then maxChars = curChars
'Debug.Print maxChars & " " & I
RS.MoveNext
If maxChars > ConMaxChars Then maxChars = ConMaxChars
Loop
Debug.Print maxChars & " " & I
GetMaxChars.Add (maxChars)
End If
Next I
End Function
Public Sub TestAutoFit()
AutoFitQuery "qry3"
End Sub
Public Function FixColumnWidthsOfQuery _
(stName As String) As Boolean
Dim db As Database
Dim qdf As QueryDef
Dim frm As Form
Dim ictl As Integer
Dim ctl As Control
Set db = CurrentDb
On Error GoTo STANDARD_ERR
Set qdf = db.QueryDefs(stName)
DoCmd.OpenQuery stName, acViewNormal
Set frm = Screen.ActiveDatasheet
For ictl = 0 To frm.Controls.Count - 1
Set ctl = frm.Controls(ictl)
ctl.ColumnWidth = -2
Call SetDAOFieldProperty(qdf.Fields(ictl), "ColumnWidth", ctl.ColumnWidth, dbInteger)
Next ictl
DoCmd.Save acQuery, stName
FixColumnWidthsOfQuery = True
STANDARD_ERR:
End Function
Public Sub SetDAOFieldProperty _
(fld As DAO.Field, _
stName As String, vValue As Variant, _
lType As Long)
Dim prp As DAO.Property
For Each prp In fld.Properties
If StrComp(prp.Name, stName, _
vbBinaryCompare) = 0 Then
prp.Value = vValue
Exit For
End If
Set prp = Nothing
Next prp
If prp Is Nothing Then
Set prp = fld.CreateProperty(stName, _
lType, vValue)
fld.Properties.Append prp
End If
On Error GoTo STANDARD_ERR
STANDARD_ERR:
End Sub