So, I fiddled enough with the code that I think I found a solution that solves almost all the problems mentioned in the question. Here is the code behind the form: Private Sub Form_Load() 'When the form loads, we need to find the relative position of each control 'and save it in the control's "Tag" property so the resize event can use it. 'Call the SaveControlPositionsToTags sub and pass this form as an argument SaveControlPositionsToTags Me End Sub Private Sub Form_Resize() 'Set the height of the header and footer before calling RepositionControls 'since it caused problems changing their heights from inside that sub Const HEADER_HEIGHT_PERCENTAGE = 0.1 Const FOOTER_HEIGHT_PERCENTAGE = 0.1 Me.Section(acHeader).Height = Me.WindowHeight * HEADER_HEIGHT_PERCENTAGE Me.Section(acFooter).Height = Me.WindowHeight * FOOTER_HEIGHT_PERCENTAGE 'Call the RepositionControls Sub and pass this form as an argument RepositionControls Me End Sub And here is the code that can be placed in a standard module: Public Enum ControlTag FromLeft = 0 FromTop ControlWidth ControlHeight OriginalFontSize OriginalControlHeight End Enum Public Sub SaveControlPositionsToTags(frm As Form) On Error Resume Next Dim ctl As Control Dim ctlLeft As String Dim ctlTop As String Dim ctlWidth As String Dim ctlHeight As String Dim ctlOriginalFontSize As String Dim ctlOriginalControlHeight As String For Each ctl In frm.Controls 'Find the relative position of this control in design view 'e.g.- This control is 5% from the left, 10% from the top, etc. 'Those percentages can then be saved in the Tag property for this control 'and used later in the form's resize event ctlLeft = CStr(Round(ctl.Left / frm.Width, 2)) ctlTop = CStr(Round(ctl.Top / frm.Section(ctl.Section).Height, 2)) ctlWidth = CStr(Round(ctl.Width / frm.Width, 2)) ctlHeight = CStr(Round(ctl.Height / frm.Section(ctl.Section).Height, 2)) 'If this control has a FontSize property, then capture the 'control's original font size and the control's original height from design-time 'These will be used later to calculate what the font size should be when the form is resized Select Case ctl.ControlType Case acLabel, acCommandButton, acTextBox, acComboBox, acListBox, acTabCtl, acToggleButton ctlOriginalFontSize = ctl.FontSize ctlOriginalControlHeight = ctl.Height End Select 'Add all this data to the Tag property of the current control, separated by colons ctl.Tag = ctlLeft & ":" & ctlTop & ":" & ctlWidth & ":" & ctlHeight & ":" & ctlOriginalFontSize & ":" & ctlOriginalControlHeight Next End Sub Public Sub RepositionControls(frm As Form) On Error Resume Next Dim formDetailHeight As Long Dim tagArray() As String 'Since "Form.Section(acDetail).Height" usually returns the same value (unless the detail section is tiny) 'go ahead and calculate the detail section height ourselves and store it in a variable formDetailHeight = frm.WindowHeight - frm.Section(acHeader).Height - frm.Section(acFooter).Height Dim ctl As Control 'Loop through all the controls on the form For Each ctl In frm.Controls 'An extra (probably unncessary) check to make sure the Tag property has a value If ctl.Tag <> "" Then 'Split the Tag property into an array tagArray = Split(ctl.Tag, ":") If ctl.Section = acDetail Then 'This is the Detail section of the form so use our "formDetailHeight" variable from above ctl.Move frm.WindowWidth * (CDbl(tagArray(ControlTag.FromLeft))), _ formDetailHeight * (CDbl(tagArray(ControlTag.FromTop))), _ frm.WindowWidth * (CDbl(tagArray(ControlTag.ControlWidth))), _ formDetailHeight * (CDbl(tagArray(ControlTag.ControlHeight))) Else ctl.Move frm.WindowWidth * (CDbl(tagArray(ControlTag.FromLeft))), _ frm.Section(ctl.Section).Height * (CDbl(tagArray(ControlTag.FromTop))), _ frm.WindowWidth * (CDbl(tagArray(ControlTag.ControlWidth))), _ frm.Section(ctl.Section).Height * (CDbl(tagArray(ControlTag.ControlHeight))) End If 'Now we need to change the font sizes on the controls. 'If this control has a FontSize property, then find the ratio of 'the current height of the control to the form-load height of the control. 'So if form-load height was 1000 (twips) and the current height is 500 (twips) 'then we multiply the original font size * (500/1000), or 50% Select Case ctl.ControlType Case acLabel, acCommandButton, acTextBox, acComboBox, acListBox, acTabCtl, acToggleButton ctl.FontSize = Round(CDbl(tagArray(ControlTag.OriginalFontSize)) * CDbl(ctl.Height / tagArray(ControlTag.OriginalControlHeight))) End Select End If Next End Sub