Microsoft Excel:

  Таблицы и VBA. Справочник.
  Вопросы и Ответы. Советы. Примеры.
Меню FAQ | Макросы | MSForms


Rambler's Top100


Counter CO.KZ


    [1] [2] [2/1] [2 t] [3] [4]

  1. Как программно создать элемент управления, присвоить ему имя и изменить значения некоторых свойств ? 04.04.2009
  2. Как отловить программное создание элементов управления ? 04.04.2009
  3. Как "перебрать" все элементы управления определённого типа, расположенные на UserForm ? 06.02.2007
  4. Как "перебрать" все элементы управления определённого типа, расположенные на рабочем листе ? 06.02.2007
  5. Как создать всплывающую подсказку для элементов управления ActiveX, расположенных на рабочем листе ? 05.05.2007
  6. Как создать нестандартную кнопку, например, кнопку с округлёнными краями ? 20.05.2007
  7. Как создать контекстное меню для элементов управления ActiveX ? 01.03.2007
  8. Как создать строку состояния на диалоговом окне UserForm ? 17.09.2007
  9. Как создать кнопку с "переключающимся" рисунком ? 21.09.2007
  10. Как создать гиперссылку на диалоговом окне UserForm ? 15.03.2007
  11. Как скрыть ввод данных в диалоговом окне InputBox ? 09.06.2007
  12. Как отобразить стандартное диалоговое окно, позволяющее выбрать нужный цвет ? 18.09.2007
  13. Как программно выделить нужную закладку в MultiPage, TabStrip ? 02.08.2006
  14. Как изменить цвет отдельной страницы в MultiPage ? 21.10.2008
  15. Как вывести спецсимвол, например, в Label, TextBox ? NEW 30.07.2016
  16. Как избежать ошибки 1004 при использовании кнопки (ActiveX), расположенной в рабочем листе ? 02.08.2006
    [1] [2] [2/1] [2 t] [3] [4]


  • Ответ : Скачать пример Скачать пример Скачать перечень некоторых идентификаторов
    Для того, чтобы программно создать необходимый элемент управления нужно использовать метод Add об'екта Controls

    Данный метод имеет всего три аргумента, первый(обязательный) это программный идентификатор bstrProgID создаваемого контрола, второй (необязательный) Name это его имя, а третий(также необязательный) Visible просто отвечает за видимость элемента управления, по умолчанию = True

    Комментарий : Изменить имя можно и после создания элемента управления (см. вариант I), кроме того, допускается создание контролов вообще без явного указания имени (см. bonus), однако, если Вы планируете использовать ещё и события создаваемого элемента управления, то имя всё-таки придётся указать.

    Вариант I.
  • Private Sub UserForm_Initialize()
        With Me.Controls.Add(bstrProgID:="Forms.Label.1")
             .Name = "Label1"
             .Left = 5
             .Top = 5
             .Height = 18
             .Width = 100
             .Caption = "Ввод данных :"
        End With
        With Me.Controls.Add(bstrProgID:="Forms.TextBox.1")
             .Name = "TextBox1"
             .Left = 5
             .Top = 25
             .Height = 156
             .Width = 222
             .MultiLine = True
             .EnterKeyBehavior = True
        End With
        With Me.Controls.Add(bstrProgID:="Forms.CommandButton.1")
             .Name = "CommandButton1"
             .Left = 5
             .Top = 186
             .Height = 24
             .Width = 78
             .Caption = "Видимая Кнопка"
        End With
        With Me.Controls.Add(bstrProgID:="Forms.CommandButton.1")         
             .Name = "CommandButton2"
             .Visible = False
             .Left = 144
             .Top = 186
             .Height = 24
             .Width = 84
             .Caption = "Невидимая Кнопка"
        End With
        Me.Height = 234: Me.Width = 240
    End Sub
    Вариант II.
    Private Sub UserForm_Initialize()
        With Controls
             With .Add("Forms.Label.1", "Label1")
                  .Left = 5
                  .Top = 5
                  .Height = 18
                  .Width = 100
                  .Caption = "Ввод данных :"
             End With
             With .Add("Forms.TextBox.1", "TextBox1")
                  .Left = 5
                  .Top = 25
                  .Height = 156
                  .Width = 222
                  .MultiLine = True
                  .EnterKeyBehavior = True
             End With
             With .Add("Forms.CommandButton.1", "CommandButton1")
                  .Left = 5
                  .Top = 186
                  .Height = 24
                  .Width = 78
                  .Caption = "Видимая Кнопка"
             End With
             With .Add("Forms.CommandButton.1", "CommandButton2", False)
                  .Left = 144
                  .Top = 186
                  .Height = 24
                  .Width = 84
                  .Caption = "Невидимая Кнопка"
             End With
        End With
        Height = 234: Width = 240
    End Sub
    Bonus. Пример программного создания пользовательской формы и тридцати TextBox'ов, ComboBox'ов
    Private Sub CreateUserForm_Controls()
    '****************************************************************'
    ' MS Excel 97, MS Excel 2000, MS Excel XP (+ доступ к VBProject)
    '****************************************************************'
    With ThisWorkbook.VBProject.VBComponents.Add(3)
         .Properties(42) = 450 '("Width") = 450
         .Properties(43) = 200 '("Height") = 200
         For iCount% = 0 To 59
             With .Designer.Controls.Add(bstrProgID:= _
             IIf(iCount% < 30, "Forms.TextBox.1", "Forms.ComboBox.1"))
                  .Top = .Height * (iCount% Mod 10)
                  .Left = .Width * (iCount% \ 10)
             End With
         Next
         UserForms.Add(.Name).Show
    End With
    End Sub

  • Ответ : Скачать пример

    Если Вам необходимо отслеживать программное создание элементов управления, то для этого можно использовать соответствующее событие формы UserForm_AddControl(ByVal Control As MSForms.Control)
  • Ответ : Скачать пример

    Вариант I. Если имена элементов управления содержат "счётчик", который представляет собой возрастающую нумерацию с определённым шагом, то перебрать только нужные контролы можно так :
  • For iCount = 1 To 10
        With Me.Controls("TextBox" & iCount)
             .BackColor = Me.BackColor
             .Enabled = False
        End With
    Next
    Предполагается, что необходимо перебрать десять текстовых полей, имена которых должны быть : "TextBox1", "TextBox2", ..., "TextBox10"

    Вариант II, III. Если же имена нужных элементов управления имеют более осмысленные названия, то можно перебрать все контролы, определяя при этом их тип :
    Dim iControl As MSForms.Control
    For Each iControl In Me.Controls
        If TypeOf iControl Is MSForms.TextBox Then
           iControl.BackColor = Me.BackColor
        End If
    Next
    Dim iControl As MSForms.Control
    For Each iControl In Me.Controls
        If TypeName(iControl) = "TextBox" Then
           iControl.BackColor = Me.BackColor
        End If
    Next
    Вариант IV. Если нужные элементы управления должны быть "сгруппированы" в одном месте, то в таком случае можно :
    - создать элемент управления Рамка (Frame)
    - удалить текст, который отображается напротив поля Caption
    - напротив поля SpecialEffect выбрать 0 - fmSpecialEffectEtched
    а затем, расположить все однотипные контролы на этой рамке, после чего перебирать, например, так :
    Dim iTextBox As MSForms.TextBox
    For Each iTextBox In Me.Frame1.Controls
        iTextBox.Value = "0"
    Next
    Предполагается, что Frame1 это имя рамки, и мы создали только текстовые поля.

    Вариант V. Если нам необходимо перебрать только "избранные" элементы управления, то в таком случае можно использовать либо их индекс(номер) (обратите внимание на то, что нумерация начинается с 0), либо их имя, к примеру :
    For Each iIndex In Array(0, 1, 5)
        Me.Controls(iIndex).Value = "0"
    Next
    For Each iName In Array("Prihod", "Rashod", "Itogo")
        Me.Controls(iName).Value = "0"
    Next

  • Ответ : Скачать пример

    Вариант I. Если имена элементов управления содержат "счётчик", который представляет собой возрастающую нумерацию с определённым шагом, то перебрать только нужные контролы можно так :
  • For iCount = 1 To 10
        Me.OLEObjects("TextBox" & iCount).Object.Value = iCount
    Next
    Предполагается, что необходимо перебрать десять текстовых полей, имена которых должны быть : "TextBox1", "TextBox2", ..., "TextBox10"

    Вариант II. Если же имена нужных элементов управления имеют более осмысленные названия, то можно перебрать все OLE об'екты, определяя при этом программный идентификатор :
    Dim iObject As OLEObject
    For Each iObject In Me.OLEObjects
        If iObject.ProgId = "Forms.TextBox.1" Then
           iObject.Object.BackColor = &HFF&
        End If
    Next
    Dim iObject As OLEObject
    For Each iObject In Me.OLEObjects
        If StrComp(iObject.ProgId, "Forms.TextBox.1") = 0 Then
           iObject.Object.BackColor = &HFF0000
        End If
    Next
    Dim iObject As OLEObject
    For Each iObject In Me.OLEObjects
        If InStr(iObject.ProgId, "Forms.TextBox") > 0 Then
           iObject.Object.BackColor = &H4000&
        End If
    Next
    Dim iObject As OLEObject
    For Each iObject In Me.OLEObjects
        If iObject.ProgId Like "Forms.TextBox.*" Then
           iObject.Object.BackColor = &H80FFFF
        End If
    Next
    Вариант III, IV. Кроме того, можно определить и тип перебираемых об'ектов :
    Dim iObject As OLEObject
    For Each iObject In Me.OLEObjects
        If iObject.OLEType = xlOLEControl Then
           If TypeOf iObject.Object Is MSForms.TextBox Then
             iObject.Object.BackColor = RGB(255, 0, 0)
           End If
        End If
    Next
    Dim iObject As OLEObject
    For Each iObject In Me.OLEObjects
        If iObject.OLEType = xlOLEControl Then
           If TypeName(iObject.Object) = "TextBox" Then
             iObject.Object.BackColor = RGB(0, 255, 0)
           End If
        End If
    Next
    Примечание : Все вышеприведённые коды необходимо разместить в модуле рабочего листа, где находятся нужные элементы управления, в данных примерах, это текстовые поля. Впрочем, Вы можете разместить свой код и в стандартном модуле, обязательно заменив ключевое слово Me ссылкой на нужный рабочий лист.
  • Ответ : Скачать пример
    Для того, чтобы создать нестандартную кнопку можно проделать приблизительно следующее (в качестве примера описывается создание кнопки с округлёнными краями)

    1. В меню Вид выберите пункт Панели инструментов и команду Рисование.
    2. В появившейся стандартной панели инструментов в меню Автофигуры выберите пункт Основные фигуры, нажмите кнопку Скругленный прямоугольник и разместите выбранный об'ект в любом месте рабочего листа.
    3. Измените свойства и параметры форматирования (размер, текст, цвет заливки и т.п.) созданой фигуры, в соответствии с Вашими требованиями. В итоге, Вы должны получить имитацию нужной кнопки.
    4. Создайте графический файл, содержащий изображение созданной фигуры (для этого можно воспользоваться специальными программами, например, Paint. Впрочем, если Вы являетесь обладателем MS Excel 2000 или MS Excel XP, то используя этот [FAQ] можно обойтись без "посредников"
    5. Теперь, создайте Рисунок (Image) или Надпись (Label) и используя свойства созданного элемента управления :
    - удалите текст, который отображается напротив поля Caption (если Вы выбрали надпись)
    - напротив поля BorderStyle выберите 0 - fmBorderStyleNone (если Вы выбрали рисунок)
    - кликните мышкой небольшую серую кнопку в левой части поля Picture и выберите файл, содержащий необходимое изображение.
    - напротив поля AutoSize выберите True (если Вы выбрали рисунок, это действие, позволит Вам отобразить графику без искажений)
  • Ответ : Скачать пример
    Для того, чтобы создать контекстное меню, которое будет вызываться кликом правой кнопки мышки, можно использовать семейство CommandBars, а за отображение этого меню будет отвечать событие ListBox_MouseDown или ListBox_MouseUp.

    Скопируйте этот код в модуль нужной UserForm
  • Private Sub UserForm_Initialize()
        With Application.CommandBars.Add _
             (Name:="ContextMenu", Position:=msoBarPopup)
             With .Controls.Add(Type:=msoControlButton)
                  .FaceId = 2580
                  .Caption = "Выберите меня"
                  .OnAction = "ListBoxValue"
             End With
        End With
    End Sub

    Private Sub UserForm_Terminate()
        Application.CommandBars("ContextMenu").Delete
    End Sub

    Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        If Button = vbKeyRButton Then
           Application.CommandBars("ContextMenu").ShowPopup
        End If
    End Sub
    А этот код разместите в стандартном модуле
    Private Sub UserForm_Show()
        UserForm1.Show
    End Sub

    Private Sub TextCut()
        UserForm1.ActiveControl.Cut
    End Sub

    Private Sub TextCopy()
        UserForm1.ActiveControl.Copy
    End Sub

    Private Sub TextPaste()
        UserForm1.ActiveControl.Paste
    End Sub
    В этом примере используется Диалоговое окно - UserForm1, а также элемент управления Список - ListBox1 для которого и создаётся контекстное меню (во втором примере, это меню будет отображено только после выбора одного из элементов списка) Обратите внимание на то, что имя контекстного меню "ContextMenu" должно быть уникальным, т.к. если панель инструментов с аналогичным именем уже существует, то при попытке создания новой панели, Вы получите ошибку. Этой ошибки можно избежать, если перед созданием панели проверить, нет ли панели с этим именем или же отказаться от использования необязательного аргумента Name метода .Add (см. следующий пример)
  • Ответ : Скачать пример
    Для того, чтобы создать гиперссылку, которая после клика мышкой будет открывать нужную страницу, можно воспользоваться элементом управления Надпись - Label1, который необходимо разместить в нужном месте диалогового окна. После чего, можно ввести название нужной страницы, используя свойство Caption и подсказку для гиперссылки, используя свойство ControlTipText, и скопировать нижеприведённый код в модуль нужной пользовательской формы, заменив указанный URL на нужный.
  • Private iStyleHyperLink As Boolean

    Private Sub Label1_Click()
        On Error Resume Next
        ThisWorkbook.FollowHyperlink Address:="http://www.msoffice.nm.ru", NewWindow:=True
        If Err.Number = 0 Then
           Label1.ForeColor = vbRed 'RGB(255, 0, 0)
        End If
    End Sub

    Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        If Not iStyleHyperLink Then
           Label1.ForeColor = vbBlue 'RGB(0, 0, 255)
           Label1.Font.Underline = True
           iStyleHyperLink = True 'Or Not iStyleHyperLink
        End If
    End Sub
    Примечание : Установить нужный цвет и подчёркивание можно и заранее (см. пример), но используя событие Label_MouseDown можно также изменить и внешний вид элемента управления, т.е. у Вас есть простор для творчества.
  • Ответ : Скачать пример
    Для того, чтобы создать кнопку с "переключающимся" рисунком, т.е. кнопку, которая после каждого клика будет возвращать предыдущий рисунок, достаточно воспользоваться любым из двух нижеприведённых вариантов :

    Вариант I.
    Создайте элемент управления Кнопка - CommandButton1 и разместите его в нужном месте диалогового окна, после чего, используя свойства созданного элемента управления :
    - удалите или измените текст, который отображается напротив поля Caption
    - кликните мышкой небольшую серую кнопку, расположенную в левой части поля Picture и выберите графический файл, содержащий нужное изображение
    - при необходимости, скорректируйте высоту, ширину и месторасположение созданного элемента, используя свойства Height, Width, Left, Top
    Затем, создайте вторую кнопку, повторив все предыдущие действия, причём размеры и расположение обоих кнопок должны совпадать. Если при отображении UserForm на экране должен появиться рисунок первой кнопки, то либо поменяйте порядок создания кнопок, либо напротив поля Visible выберите False

    Теперь, для создания графического переключателя, достаточно использовать следующий код :
  • Private Sub CommandButton1_Click()
        CommandButton2.Visible = True
        'Основной код, если он различен
        'Или вызов общего макроса, например, StartMacro
    End Sub

    Private Sub CommandButton2_Click()
        CommandButton2.Visible = False
        'Основной код, если он различен
        'Или вызов общего макроса, например, StartMacro
    End Sub
    Вариант II.
    Создайте две кнопки, используя все действия, описанные в первом варианте, за исключением скрытия кнопки. А если отображении UserForm на экране действительно должен появиться рисунок именно первой кнопки, то выделите вторую кнопку, кликните правой кнопкой мышки и в появившемся контекстном меню просто выберите команду Переместить назад / Send Forward

    Теперь, для создания графического переключателя, достаточно использовать следующий код :
    Private Sub CommandButton1_Click()
        CommandButton2.ZOrder 0
        'Основной код, если он различен
        'Или вызов общего макроса, например, StartMacro
    End Sub

    Private Sub CommandButton2_Click()
        CommandButton1.ZOrder 0
        'Основной код, если он различен
        'Или вызов общего макроса, например, StartMacro
    End Sub
    Вариант III.
    Продолжение следует ...
  • Ответ : Скачать пример
    Функция InputBox, которая выводит на экран диалоговое окно, позволяющее ввести и получить необходимый текст, к сожалению, не даёт возможности скрыть ввод этого текста.
    Однако, это ограничение можно обойти, если создать нестандартное диалоговое окно и воспользоваться элементом управления Поле - TextBox1, которое имеет свойство PasswordChar, позволяющее скрыть текст, заменив его, например, на *
    Кроме того, для создания полноценной имитации, Вам ещё понадобится Надпись - Label1 и две Кнопки - CommandButton1, CommandButton2

    После того, как создание собственного диалогового окна будет закончено, необходимо будет разместить в модуле созданной формы, следующий код :
  • Private Sub CommandButton1_Click()
        Me.Hide
    End Sub

    Private Sub CommandButton2_Click()
        Me.TextBox1.Value = Empty '""
        Me.Hide
    End Sub

    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        Me.TextBox1.Value = Empty '""
    End Sub
    Теперь, по мере необходимости, Вы можете отображать собственное диалоговое окно, используя для этого функцию MyInputBox() Примеры вызова вышеупомянутой функции показаны в процедуре GetHiddenText()
    Private Sub GetHiddenText()
        iPassword$ = MyInputBox(Prompt:="Введите пароль", _
        Title:="Скрытый пароль", Default:="Директор")

        'iPassword$ = MyInputBox("Введите пароль", "", "Директор")
        'iPassword$ = MyInputBox(Prompt:="Введите пароль", Title:="Скрытый пароль")
        'iPassword$ = MyInputBox(Prompt:="Введите пароль")

        If iPassword$ <> "" Then
           MsgBox "Вы ввели : " & iPassword$, vbInformation, ""
        Else
           MsgBox "Вы произвели одно из следующих действий :" & _
           vbCrLf & _
           "- кликнули кнопку Отмена/Закрыть" & vbCrLf & _
           "- ничего не ввели" & vbCrLf & _
           "- удалили введённый текст", vbCritical, ""
        End If
    End Sub

    Private Function MyInputBox$(Prompt$, Optional _
        Title$ = "Microsoft Excel", Optional Default$)
        With UserForm1
             .Caption = Title$
             .Label1.Caption = Prompt$
             .TextBox1.Value = Default$
             .Show
             MyInputBox$ = .TextBox1.Value
        End With
    End Function

  • Ответ :
  • MultiPage1.Value = 1 'выделение второй закладки
    TabStrip1.Value = 1
    Комментарий : Обратите внимание на то, что нумерация существующих страниц(закладок) начинается с 0, а при отсутствие закладок значение свойства .Value = -1

    Если необходимо предварительно узнать количество закладок, то :
    iCountPages = MultiPage1.Pages.Count
    MsgBox iCountPages

  • Ответ : Скачать пример

    Для того, чтобы изменить цвет нужной страницы (MultiPage) достаточно проделать следующие действия :

    1. Создайте графический файл, содержащий изображение, которое в дальнейшем будет использовано в качестве цвета/фона
    (рекомендую создать файл как можно меньшего размера, т.к. рисунок становится частью элемента управления, в результате чего, увеличивается вес файла XLS, содержащего этот элемент управления; для создания же графики вполне сгодится даже Paint)
    2. Выделите нужную страницу, затем, используя свойства страницы :
    - кликните мышкой небольшую серую кнопку, расположенную в левой части поля Picture и выберите предварительно созданный графический файл.
    - напротив поля PictureTiling выберите True (если рисунок изначально заполнил всю страницу, то этот пункт можно пропустить)
    3. Если речь идёт о нескольких страницах, то повторите все необходимые действия.
  • Ответ :

    Для того, чтобы вывести спецсимвол/иероглиф, в общем, любой символ, ввод которого невозможен с клавиатуры, например, в Label можно предварительно выбрать шрифт, который поддерживает Unicode. А затем, просто использовать VB(A) функцию ChrW() , разумеется, указав код необходимого символа.
  • Label1.Font = "Arial Unicode MS"
    Label1.Caption = ChrW(8531) 'ChrW(9835)
    Пример создания текста, состоящего из более чем одного символа
    Private Sub UserForm_Initialize()
        Label1.Font = "Arial Unicode MS" 'Можно установить вручную
        Label1.Caption = ""              'Убрать текст тоже можно вручную
        For Each tmp In Array(20420, 32599, 26031, 32, 9786)
            Label1.Caption = Label1.Caption & ChrW(tmp)
        Next
    End Sub

  • Ответ : Актуально только для MS Excel 97

    Перейдите в режим конструктора [FAQ] найдите свойство TakeFocusOnClick и установите его значение как False

    Если подобная проблема возникла с другими ActiveX элементами управлениями, то необходимо предварительно установить фокус ввода на ячейке рабочего листа, т.е. :
  • ActiveCell.Activate


    Вопросы - Синонимы
  • Как динамически создавать элементы управления ActiveX на UserForm ?


  • Воспроизведение любых опубликованных здесь материалов возможно только с письменного разрешения автора : Microsoft Excel 95, 97, 2000, XP

    © 2004-2016 Климов П.Ю. Все права защищены. WebDesign & Error's Klimoff