Microsoft Excel:

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


Rambler's Top100


Counter CO.KZ

Ответы на некоторые наиболее часто задаваемые вопросы, касающиеся ActiveX элементов управления, Вы можете найти также здесь ...

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

  1. Как сохранить месторасположение формы и необходимые значения свойств элементов управления ? 12.10.2010
  2. Как программно создать UserForm, изменить значения нужных свойств, а затем отобразить созданную форму ? 16.06.2007
  3. Как изменить значения нужных свойств контрола или формы, расположенной в другой рабочей книге ? 07.03.2009
  4. Как скрыть приложение во время работы с UserForm ? 28.08.2016
  5. Как отобразить UserForm используя в качестве имени переменную ? 02.10.2006
  6. Как отобразить UserForm используя горячие клавиши ? 15.03.2007
  7. Как отобразить UserForm расположенную в другой рабочей книге ? 15.03.2007
  8. Как отобразить UserForm с последующей возможностью работы с ячейками ? 22.05.2005
  9. Как отобразить UserForm с последующей возможностью работы с ячейками (MS Excel 97) ? 29.07.2007
  10. Как отобразить UserForm при выделении нужной ячейки ? 12.04.2007
  11. Как отобразить UserForm в верхнем правом углу приложения ? 06.01.2006
  12. Как центрировать UserForm относительно центра и разместить в верхнем левом углу экрана ? 01.07.2005
  13. Как автоматически запустить программу при отображении UserForm ? 2004
  14. Как в зависимости от версии 97-2000 отобразить UserForm в модальном или немодальном режиме ? 08.05.2007
  15. Как отловить изменение размеров UserForm ? 04.04.2009
  16. Как отловить перемещение UserForm ? 28.07.2016
  17. Как запретить закрытие UserForm нажатием на крестик [X] ? 02.10.2006
  18. Как после нажатия на крестик [X] выводить предупреждающее сообщение, позволяющее отменить закрытие ? 08.05.2007
  19. Как удалить заголовок пользовательской формы ? 17.08.2007
  20. Как удалить крестик [X] из строки заголовка UserForm ? 05.08.2007
  21. Как заблокировать крестик [X] и удалить команду Закрыть ? 19.08.2007
  22. Как в заголовок формы добавить кнопку Свернуть ? 21.04.2007
  23. Как создать иконку для окна UserForm и окна приложения Excel ? 23.09.2007
  24. Как с помощью кнопок организовать перемещение между пользовательскими формами ? 05.05.2007
  25. Как распечатать нестандартное диалоговое окно ? 15.03.2008
  26. Как отловить нажатие клавиши ENTER и ESC ? 20.04.2008
  27. Как отменить/вернуть последнее выполненное действие ? 11.10.2010
  28. Как сделать, чтобы при наведении курсора мышки на элемент управления на экране появилась нужная подсказка ? 22.02.2009
  29. Как "создать" горячие клавиши для некоторых элементов управления ? 22.02.2009
  30. Как загрузить графический файл и отобразить его в нужном элементе управления ? 24.04.2014
    [1] [2] [2/1] [2 t] [3] [4]


  • Ответ : Скачать пример
  • With ThisWorkbook.VBProject.VBComponents.Add(3)
         .Properties("Width") = 200  '43
         .Properties("Height") = 100 '42
         .Properties("BackColor") = vbRed '2
         .Properties("Caption") = "Моя форма" '39
         .Properties("StartUpPosition") = 0 'Manual '49
         .Properties("ScrollBars") = fmScrollBarsVertical '22
         .Properties("SpecialEffect") = fmSpecialEffectEtched '28
         VBA.UserForms.Add(.Name).Show
    End With
    Примечание : Все перечисленные свойства использованы только в качестве примера.

    Комментарий : Особенности работы с VBProject в MS Excel XP изложены здесь.
  • Ответ :

    Для того, чтобы изменить значения некоторых свойств элемента управления, а также самой формы, находящейся в другой рабочей книге, например, в личной книге макросов "PERSONAL.XLS", можно использовать следующий вариант :
  • With Workbooks("Personal.xls").VBProject.VBComponents("UserForm1")
         .Properties("Caption").Value = "Новый заголовок"
         .Properties("PictureTiling").Value = True
        
         Set .Properties("Picture").Object = _
         LoadPicture("C:\Windows\WinLogo.Gif")
       
         With .Designer.Controls("TextBox1")
              .Value = "Новый текст"
              .MaxLength = 10
              .BackColor = RGB(200, 200, 0)
         End With
    End With
    А здесь Вы можете найти ещё и пример создания события TextBox1_Enter(). Событие, конечно же, будет создано только при условии отсутствия искомого текста в модуле формы, проще говоря, при если событие TextBox1_Enter отсутствует.
    With Workbooks("Personal.xls").VBProject.VBComponents("UserForm1")
         With .CodeModule
              If Not .Find("TextBox1_Enter", 1, 1, _
              .CountOfLines, 1) Then .CreateEventProc "Enter", "TextBox1"
         End With
         With .Designer
              .Caption = "MSForms.UserForm"
              .PictureTiling = True
              .Picture = LoadPicture("C:\Windows\WinLogo.Gif")
              With .Controls("TextBox1")
                   .Text = "MSForms.TextBox"
                   .MaxLength = 15
                   .BackColor = RGB(100, 100, 100)
              End With
         End With
    End With
    Предполагается, что :
  • - рабочая книга "Personal.xls" в данный момент открыта,
  • - она содержит пользовательскую форму "UserForm1",
  • - на форме присутствует текстовое поле "TextBox1"
  • - в папке "C:\Windows" находится файл "WinLogo.gif"

    Комментарий : Особенности работы с VBProject в MS Excel XP изложены здесь.
  • Ответ : Скачать пример

    Для того, чтобы во время работы с пользовательской формой UserForm, на экране не было видно окон Microsoft Excel, можно просто воспользоваться этим советом [FAQ431] и скрыть приложение, т.е.
  • Application.Visible = False
    UserForm1.Show
    Application.Visible = True
    Внимание : Форма с указанным именем, разумеется, должна существовать.
  • Ответ : Скачать пример
  • iFormName = "UserForm1"

    UserForms.Add(iFormName).Show
    iFormName = "UserForm1"

    VBA.UserForms.Add(iFormName).Show
    Внимание :
  • - Форма с указанным именем должна существовать и располагаться в том же проекте, что и модуль с этим кодом.
  • Ответ : Скачать пример
    Для того, чтобы в нужной рабочей книге отобразить форму, используя горячие клавиши, например CTRL+Q, скопируйте этот код в модуль ThisWorkbook(ЭтаКнига) :
  • Private Sub Workbook_Activate()
        Application.OnKey Key:="^q", Procedure:=Me.CodeName & ".UserForm_Show"
    End Sub

    Private Sub Workbook_Deactivate()
        Application.OnKey Key:="^q"
    End Sub

    Private Sub UserForm_Show()
        UserForm1.Show
    End Sub
    Примечание : Если процедура, которая отвечает за отображение формы, будет расположена в стандартном модуле этой книге, то достаточно просто указать "UserForm_Show"
  • Ответ :

    Для того, чтобы отобразить форму находящуюся в другой рабочей книге, например, в личной книге макросов "PERSONAL.XLS", достаточно сделать следующее :

    1. В редакторе VBA перейти в проект нужной рабочей книги и создать необходимую форму.
    2. Разместить в любом стандартном модуле этой книги следующий макрос (при отсутствии модуля его желательно создать)
  • Private Sub UserForm_Show()
        UserForm1.Show
    End Sub
    3. Затем, по мере необходимости, вызывать его следующим образом.
    Private Sub PersonalForm_Show()
        Application.Run "Personal.xls!UserForm_Show" 'Or Run ...
    End Sub
    Внимание :
  • - Предполагается, что рабочая книга, которая содержит UserForm, в данный момент открыта.
  • Ответ : Актуально только для MS Excel 2000 и старше

    Вариант I.
    В свойствах UserForm необходимо найти ShowModal и установить его значение как False

    Вариант II.
    Используйте константу Const vbModeless = 0 метода Show
  • UserForm1.Show vbModeless ' Вариант II(а)
    UserForm1.Show 0 ' Вариант II(б)

  • Ответ : Скачать пример
    Для того, чтобы при выделении нужной ячейки, пользовательская форма отображалась на экране, достаточно скопировать этот код в модуль нужного рабочего листа [FAQ31]
  • Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
        If Target.Address = "$C$3" Then UserForm1.Show
    End Sub
    Актуально только для MS Excel 2000 и старше
    Если же Вы отображаете форму в немодальном режиме, то для предотвращения отображения нескольких форм, можно добавить небольшую проверку :
    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
        If Target.Address = "$C$3" Then
           If Not UserForm1.Visible Then
              UserForm1.Show vbModeless
           Else
              MsgBox "Диалоговое окно уже отображено", vbSystemModal, ""
           End If
        End If
    End Sub
    Bonus : Пример, где вместо вывода сообщения MsgBox, используется мигание заголовка окна, можно скачать здесь.
  • Ответ :

    Вариант I. (полный)
  • Private Sub UserForm_Initialize()
        iAppTop = Application.Top
        iAppLeft = Application.Left
        iAppWidth = Application.Width
        iUserFormWidth = Me.Width

        Me.StartUpPosition = 0
        Me.Move iAppWidth + iAppLeft - iUserFormWidth, iAppTop
    End Sub
    Вариант II. (сокращённый)
    Private Sub UserForm_Initialize()
        Me.StartUpPosition = 0
        Me.Move Application.Width + Application.Left - _
        Me.Width, Application.Top
    End Sub
    Вариант III.
    Private Sub UserForm_Initialize()
        Me.StartUpPosition = 0
        Me.Top = Application.Top
        Me.Left = Application.Width + Application.Left - Me.Width
    End Sub
    Внимание :
  • - Значение свойства StartUpPosition можно установить вручную
  • Ответ :
    В свойствах UserForm необходимо найти StartUpPosition и установить его значение как :
    1-CenterOwnerдля центрирования относительно приложения
    2-CenterScreenдля центрирования относительно экрана
    3-WindowsDefault  для размещения в верхнем левом углу экрана

  • Ответ : Скачать пример
  • Private Sub UserForm_Initialize()
    'Здесь должен быть код Вашей программы.
    End Sub
    Private Sub UserForm_Activate()
    'Здесь должен быть код Вашей программы.
    End Sub
    Совет : Для запуска макроса перед отображением формы используйте событие UserForm_Initialize()

  • Ответ :
  • #If Vba6 Then
        UserForm1.Show vbModeless '0
    #Else
        UserForm1.Show
    #End If

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

    Если Вам необходимо отслеживать изменение размеров пользовательской формы, то разместите в модуле нужной UserForm следующий код :
  • Private iOldHeight!, iOldWidth!
    
    Private Sub UserForm_Initialize()
        iOldHeight! = Me.Height: iOldWidth! = Me.Width
    End Sub
    
    Private Sub UserForm_Resize()
        MsgBox "Были изменены размеры UserForm :" & vbCrLf & _
        "Высота : до = " & iOldHeight! & " после = " & Me.Height & vbCrLf & _
        "Ширина : до = " & iOldWidth! & " после = " & Me.Width, , ""
        
        iOldHeight! = Me.Height: iOldWidth! = Me.Width
    End Sub

  • Ответ : Актуально для MS Excel 2000(и старше)

    Если Вам необходимо отслеживать перемещение пользовательской формы, то начиная с версии 2000 для этого можно использовать событие UserForm_Layout()
  • Private iCount&
    
    Private Sub UserForm_Layout()
        iCount = iCount + 1
        Me.Caption = "Количество перемещений = " & iCount
    End Sub
    Примечание : При использовании данного события имейте ввиду, что оно также выполняется и при перемещении элементов управления, но при условии выполнения двух условий, а именно :

    1) Перемещение осуществляется с помощью метода Move, а не свойств Left, Top
    2) Был использован пятый(необязательный) аргумент Layout
    CommandButton1.Move Left:=10, Layout:=True

  • Ответ : Скачать пример
  • Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        If CloseMode = vbFormControlMenu Then Cancel = True
    End Sub
    Если Вы не выгружаете свою форму используя инструкцию UnLoad, то :
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        Cancel = True
    End Sub

  • Ответ : Скачать пример
  • Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        If CloseMode = vbFormControlMenu Then
           If MsgBox("Вы действительно хотите закончить работу ?", _
              vbYesNo, "") = vbNo Then Cancel = True
        End If
    End Sub
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        If CloseMode = vbFormControlMenu Then _
           Cancel = MsgBox("Вы действительно хотите закончить работу ?", vbYesNo, "") = vbNo
    End Sub
    Если Вы не выгружаете свою форму используя инструкцию UnLoad, то первую проверку можно удалить/закомментировать.
  • Ответ : Скачать пример

    Для первой формы используйте тольку кнопку cbNext (следующий)
  • Private Sub cbNext_Click()
        Unload Me 'Me.Hide
        UserForm2.Show
    End Sub
    Для второй формы необходимо использовать обе кнопки
    Private Sub cbPrevious_Click()
        Unload Me 'Me.Hide
        UserForm1.Show
    End Sub

    Private Sub cbNext_Click()
        Unload Me 'Me.Hide
        UserForm3.Show
    End Sub
    А для последней (предположим, что у нас всего три UserForm) достаточно использовать только кнопку Previous (предыдущий)
    Private Sub cbPrevious_Click()
        Unload Me 'Me.Hide
        UserForm2.Show
    End Sub
    Примечание : Имена пользовательских форм и кнопок использованы только в качестве примера.
  • Ответ :

    Если Вы используете DialogSheet, то для того, чтобы распечатать это диалоговое окно достаточно использовать метод PrintOut :
  • DialogSheets(1).PrintOut
    Если же Вы работаете с UserForm, то в этом случае можно использовать метод PrintForm :
    UserForm1.PrintForm

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

    Если Вам необходимо отловить нажатие клавиши ENTER и/или ESC, а фокус ввода может находиться на любом элементе управления, то можно создать кнопку CommandButton и расположить её на нужной пользовательской форме. Затем, найти свойства Default и Cancel установить их значение как True. После чего использовать следующее событие, выбрав необходимую управляющую инструкцию.
  • Private Sub CommandButton1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Select Case KeyCode
            Case vbKeyEscape: 'Здесь должен быть код1 Вашей программы.
            Case vbKeyReturn: 'Здесь должен быть код2 Вашей программы.
        End Select
    End Sub
    Примечание : Если пользовательская форма не предполагает "наличие" кнопки, то кнопку можно просто скрыть, для этого достаточно установить значение свойств Width и/или Height = 0
  • Ответ :

    Если во время работы с диалоговым окном, Вам понадобилось отменить последнее совершённое действие, то для этого можно использовать клавиши CTRL + Z, а вернуть всё обратно можно с помощью клавиш CTRL + Y (для отмены всех действий существует клавиша ESC)

    Тоже самое, но программно можно осуществить либо с помощью методов UndoAction и RedoAction, либо имитировав нажатия только что упомянутых клавиш [FAQ91]
  • UserForm1.UndoAction 'Отменить
    UserForm1.RedoAction 'Вернуть
    Если же необходимо определить ещё и возможность отмены/возврата, то можно просто добавить небольшую проверку, а именно :
    If UserForm1.CanUndo = True Then
       UserForm1.UndoAction
    Else
       MsgBox "Отмена невозможна"
    End If
    If UserForm1.CanRedo = True Then
       UserForm1.RedoAction
    Else
       MsgBox "Возврат на круги своя - невозможен"
    End If

  • Ответ :

    Для того, чтобы после наведения курсора мышки на элемент управления на экране появилась необходимая подсказка, можно выбрать нужный элемент управления, затем найти свойство ControlTipText и ввести текст нужной подсказки.

    Примечание : Если на экране отсутствует окно свойств, то достаточно просто выполнить одно из нижеперечисленных действий :
    - кликнуть клавишу F4
    - щёлкнуть правой кнопкой мышки и в контекстном меню выбрать команду Свойства / Properties
    - в меню Вид / View выбрать команду Окно свойств / Properties Window
    - кликнуть кнопку Свойства / Properties Window, которая расположена на панели инструментов Стандарт / Standard
  • Ответ : Скачать пример

    Для того, чтобы создать горячие клавиши ALT + [A-Z] для следующих элементов управления : CommandButton, ToggleButton, OptionButton, CheckBox, Label, TabStrip, MultiPage можно выбрать нужный элемент управления, найти свойство Accelerator и ввести символ (от A до Z) (0-9), после чего использовать событие нужного элемента управления, к примеру, Click

    Примечание : Не забывайте, что для TabStrip и MultiPage подсказки необходимо создавать для каждой отдельной вкладки (Tab) и страницы (Page)
  • Ответ :

    Для того, чтобы загрузить графический рисунок из файла и отобразить его на пользовательской форме или элементе управления (как правило, для таких целей используют Image или Label, но допускается загрузка графики и для других контролов), можно воспользоваться VB(A) функцией LoadPicture
  • UserForm1.Picture = LoadPicture("C:\MyCat.jpg")

    Image1.Picture = LoadPicture("C:\MyDog.jpg")
    Разумеется, указанный файл должен существовать, т.к. в противном случае Вы получите ошибку, которой можно избежать, если в зависимости от ситуации, использовать следующие варианты :

  • всегда используется один и тот же файл - тогда его(рисунок) можно просто предварительно загрузить вручную
  • изображений немного и все они постоянны, в этом случае можно
    - либо создать нужное количество Image, загрузить вручную все необходимые рисунки, скрыть эти контролы, установив значение свойства Visible как False, а затем, по мере необходимости, "извлекать" нужные картинки, т.е.
  • Image1.Picture = Image2.Picture 'Set Image1.Picture = Image2.Picture
    - либо изначально хранить всю графику в контейнере ImageList (пример, возможно, появится в ближайшее время)
  • можно хранить всю графику в определённой папке, а перед загрузкой, просто проверять наличие нужного файла [FAQ44] В случае же отсутствия файла - отображать что-то вроде "Изображение не найдено"

    Внимание :
    - Обратите внимание на то, что с помощью функции LoadPicture можно загрузить только файлы с расширением .bmp, .cur, .gif, .ico, .jpg, .jpeg, .wmf
    - Для работоспособности данной функции должна наличествовать следующая ссылка OLE Automation (stdole2.tlb)
    Воспроизведение любых опубликованных здесь материалов возможно только с письменного разрешения автора : Microsoft Excel 95, 97, 2000, XP

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