Определение размеров и расположения существующих элементов управления на пользовательской форме с помощью кода VBA Excel и сохранение их в текстовый файл.
Описание возможной проблемы
В разных версиях Excel установки по умолчанию могут различаться, и элементы управления могут отображаться на пользовательской форме некорректно, в том числе вылезать за границы формы.
Если вы программируете на VBA Excel по заказу, то необходимо, чтобы у всех ваших клиентов пользовательская форма всегда открывалась корректно, независимо от операционной системы и версии приложения.
Этого можно достичь, задавая размеры и расположение элементов управления и размеры самой пользовательской формы при ее загрузке. Но вручную писать код VBA с установкой размеров и расположения хотя и не сложно, но достаточно трудоемко.
Исходный код для решения
Вместо ручной работы, можно использовать следующий код VBA Excel, который считывает размеры и расположение элементов управления с указанной формы и записывает результаты в текстовый файл RazmeshcheniyeElementov.txt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
'Копирование расположения и размеров элементов 'управления пользовательской формы Sub RazmeshcheniyeElementovUpravleniya() On Error GoTo Instr Dim myControl As Control, myForm As String, myKod As String myForm = "UserForm1" With UserForms.Add(myForm) myKod = "With " & .Name & vbNewLine & _ Space(4) & ".Height = " & .Height & vbNewLine & _ Space(4) & ".Width = " & .Width & vbNewLine End With For Each myControl In UserForms.Add(myForm).Controls With myControl myKod = myKod & Space(3) & "With ." & .Name & _ vbNewLine & Space(8) & ".Height = " & .Height & _ vbNewLine & Space(8) & ".Width = " & .Width & _ vbNewLine & Space(8) & ".Top = " & .Top & _ vbNewLine & Space(8) & ".Left = " & .Left & _ vbNewLine & Space(4) & "End With" & vbNewLine End With Next Set myControl = Nothing myKod = myKod & "End With" 'Записываем результаты в текстовый файл Dim fso As Object, myFile As Object, ws As Object Set fso = CreateObject("Scripting.FileSystemObject") Set myFile = fso.CreateTextFile(ThisWorkbook.Path & _ "\RazmeshcheniyeElementov.txt") myFile.WriteLine myKod myFile.Close 'Открываем текстовый файл с записанным кодом Set ws = CreateObject("WScript.Shell") ws.Run ThisWorkbook.Path & "\RazmeshcheniyeElementov.txt" Set ws = Nothing Set fso = Nothing Set myFile = Nothing Exit Sub Instr: If Err.Description <> "" Then MsgBox "Произошла ошибка: " & Err.Description End If End Sub |
Для реализации программы необходимо представленный выше код вставить в стандартный модуль книги Excel с обрабатываемой формой. В строке myForm = "UserForm1"
следует заменить UserForm1 на имя нужной пользовательской формы, и можно запускать код на выполнение непосредственно из редактора VBA.
Текстовый файл с записанным кодом будет сохранен в ту же папку, где расположена книга с обрабатываемой формой. Сгенерированный код VBA сразу готов к вставке в процедуру UserForm_Initialize()
.
Вы можете самостоятельно добавить в мой код тип и размер шрифта, если посчитаете необходимым.
Рекомендую открывать файлы для просмотра методом ThisWorkbook.FollowHyperlink. Пример и преимущества этого метода в статье VBA Excel. Открыть файл другой программы.
Пример сгенерированного кода
Исходный код определения размеров и расположения элементов управления был запущен для формы UserForm1 с двумя надписями и с одним экземпляром текстового поля, комбинированного списка и кнопки.
В результате был сгенерирован следующий код VBA Excel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
With UserForm1 .Height = 168 .Width = 294,75 With .Label1 .Height = 24 .Width = 84 .Top = 12 .Left = 18 End With With .Label2 .Height = 24 .Width = 84 .Top = 54 .Left = 18 End With With .TextBox1 .Height = 25,5 .Width = 156 .Top = 12 .Left = 114 End With With .ComboBox1 .Height = 25,5 .Width = 156 .Top = 54 .Left = 114 End With With .CommandButton1 .Height = 24 .Width = 72 .Top = 102 .Left = 102 End With End With |
Создайте любую пользовательскую форму с таким же набором элементов управления разных размеров и хаотичным размещением их на форме. Вставьте сгенерированный код в процедуру UserForm_Initialize()
и запустите ее. Вы получите пользовательскую форму с тем же дизайном, как и у меня.