VBA относится к элементу управления как переменный синтаксис - PullRequest
0 голосов
/ 27 января 2019

Я создаю элементы управления с помощью VBA и не могу установить шрифт , ссылаясь на них как control . Я называю их и могу изменить шрифт, если я обращаюсь к ним по имени Me.(control variable name).Font.
Мне нужно знать правильный синтаксис , чтобы это работало. Я думаю, что попробовал каждую комбинацию, но ни одна не была успешной.

For CountRecords = 0 To rs.RecordCount - 1
    tempLeft = 6
    For countfields = 0 To rs.Fields.Count - 1
        tempname = rs.Fields.Item(countfields).Name & CountRecords
        frmtst.Controls.Add "forms.textbox.1", tempname
        Set ctl = Me.frmtst(tempname)
        Me.test.Font = 14 'set the font on a test textbox
        Me.Controls(tempname).Value.Font = 14 '****Trouble line ********
        ctl.Width = ((columnwidth(countfields) ^ 0.8) * 10) + 25
        ctl.Height = 24
        ctl.Left = tempLeft 'templeft + columnwidth(CountFields) + 18
        tempLeft = tempLeft + ctl.Width + 3
        ctl.Top = 20 * CountRecords + 3
        ctl = rs.Fields.Item(countfields).Value
        If rs.Fields.Item(countfields).Type = 6 Then 
            ctl = Format(ctl, "$#,##0.00")
        end if
    Next countfields
    rs.MoveNext
Next CountRecords

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Как правильно ссылаться на элементы управления

Вы можете ссылаться на элементы управления

  • 1a) напрямую по имени и использовать IntelliSense (например, Me.Test),
  • 1b) косвенно через коллекцию Controls или
  • 2) косвенно через установку объекта прямо или косвенно (например, Set ctl = Me.Controls(tempname))

Примечание что частица Me всегда ссылается на текущий экземпляр пользовательской формы (не на свое имя) и может / должна использоваться в модуле кода пользовательской формы,Например, вы можете ссылаться на Me.Controls или на данный элемент в коллекции элементов управления, например, Me.Controls(tempname).- неправильно использовать , однако ссылаться на экземпляр пользовательской формы по умолчанию (например, frmtst) из кода этой формы. Кроме того, невозможно сослаться на оба в одном и том же утверждении, например Me.frmtst(tempname).

Рекомендуемое чтение для более глубокого понимания : UserForm1.Show?

1a) Отсутствует свойство .Size при назначении теста для .Font

  ' Direct referencing a control of the current Userform instance - missing .Size property
    Me.Test.Font.Size = 14              ' instead of: Me.test.Font = 14 

1b) Неправильная вставка свойства .Value до сбояСвойство .Font

  ' Indirect referencing a control of the current Userform instance - bad .Value prop, .Font prop without .Size 
    Me.Controls(tempname).Font.Size = 14        ' instead of: Me.Controls(tempname).Value.Font = 14 

2) Ссылка на объект

Если, однако, вы предпочитаете устанавливать объект в память, строка кода, как показано на рисункеcase [1b] является избыточным, и вы должны решить придерживаться выбранного метода.

Dim ctl As MsForms.TextBox              ' declare MSForms object (e.g. TextBox, or Object)
Set ctl = Me.Controls(tempname)         ' instead of: Set ctl = Me.frmtst(tempname)
ctl.Font.Size = 14                  ' instead of: .Font = 14 

Дополнительные замечания

Всегда используйте Option Explicit для проверки правильного и полного объявления всех переменных (было бы неплохо включить некоторые из них в ваш код).

Кстати, вы на самом деле вычислили ширину элемента управления по экспоненте, т.е. ^ 0.8) * 10) + 25?

0 голосов
/ 27 января 2019

Использование Me в процедуре формы является заменой имени формы, которое выглядит как frmtst выше.Так что Me.frmtst(tempname) - это двойная ссылка.Вы можете обратиться к элементу управления tempname с помощью Me.tempname.Установите шрифт с помощью Me.tempname.Font.Name = "Lucida Console" и установите размер шрифта с помощью Me.tempname.Font.Size = 10

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...