Public Sub CmdRelocate(myCmd As Object, X0 As Long, X1 As Long, Bottom As Integer, PForm As Object, BetweenCmd As Integer)
' myCmd - объект-CommandButton
' X0 - левая граница блока кнопок
' X1 - правая граница блока кнопок
' Bottom - расстояние от нижней кромки формы
' PForm - форма, на которой располагаются кнопки

' BetweenCmd - расстояние между кнопками

Dim N As Integer
Dim Nx As Integer
Dim Ny As Integer
Dim Cikl As Integer
Dim CmdInLine As Integer
Dim i As Integer
Dim cmdColl As New Collection

'*** Загрузка коллекции
For i = 0 To myCmd.Count - 1
If myCmd(i).Visible = True Then
cmdColl.Add Item:=i
End If
Next i

'*** Установка кнопок в исходное состояние
For N = 0 To myCmd.Count - 1
If N > 0 Then
myCmd(N).Top = myCmd(0).Top
myCmd(N).Left = myCmd(N - 1).Left + myCmd(N - 1).Width + BetweenCmd
End If
Next N
myCmd(cmdColl.Item(1)).Left = X0
myCmd(cmdColl.Item(1)).Top = myCmd(0).Top

For N = 1 To cmdColl.Count
If N > 1 Then
myCmd(cmdColl.Item(N)).Top = myCmd(cmdColl.Item(1)).Top
myCmd(cmdColl.Item(N)).Left = myCmd(cmdColl.Item(N - 1)).Left + myCmd(cmdColl.Item(N - 1)).Width + BetweenCmd
End If
Next N
'*** Расчет количества строк и столбцов в строке
For N = 1 To cmdColl.Count
If ((myCmd(cmdColl.Item(N)).Left + myCmd(cmdColl.Item(N)).Width) > X1) And (N > 1) Then
Cikl = cmdColl.Count \ (N - 1) + IIf((cmdColl.Count / (N - 1)) - (cmdColl.Count \ (N - 1)) <> 0, 1, 0)
CmdInLine = N - 1
Exit For
End If
Next N
Debug.Print "Кнопок в строке: " & CmdInLine & " Строк:" & Cikl

For i = 1 To cmdColl.Count
If Cikl = 0 Then
If (PForm.Height - myCmd(cmdColl.Item(1)).Height - Bottom) > 0 Then
myCmd(cmdColl.Item(i)).Top = PForm.Height - myCmd(cmdColl.Item(1)).Height - Bottom
Else
myCmd(cmdColl.Item(i)).Top = 0
End If
Else
If (PForm.Height - (myCmd(cmdColl.Item(1)).Height * Cikl + (Cikl - 1) * BetweenCmd) - Bottom) > 0 Then
myCmd(cmdColl.Item(i)).Top = PForm.Height - (myCmd(cmdColl.Item(1)).Height * Cikl + (Cikl - 1) * BetweenCmd) - Bottom
Else
myCmd(cmdColl.Item(i)).Top = 0
End If
End If

Next i
'Установка 0-го элемента на случай, если невидимый
myCmd(0).Top = myCmd(cmdColl.Item(1)).Top
'*** Проход строк
For Ny = 1 To Cikl
For Nx = ((Ny - 1) * CmdInLine) To ((Ny - 1) * CmdInLine + (CmdInLine - 1))
If Nx < cmdColl.Count Then
myCmd(cmdColl.Item(Nx + 1)).Top = myCmd(cmdColl.Item(Nx + 1)).Top + (Ny - 1) * (myCmd(cmdColl.Item(Nx + 1)).Height + BetweenCmd)
If Nx = (Ny - 1) * CmdInLine Then
myCmd(cmdColl.Item(Nx + 1)).Left = X0
Else
myCmd(cmdColl.Item(Nx + 1)).Left = myCmd(cmdColl.Item(Nx)).Left + myCmd(cmdColl.Item(Nx + 1)).Width + BetweenCmd
End If
End If
Next Nx
Next Ny

End Sub

Используются технологии uCoz