Microsoft Excel:

  Таблицы и VBA. Справочник.
  Вопросы и Ответы. Советы. Примеры.
Меню Заметки | Как сохранить значения свойств элементов управления и формы


Rambler's Top100


Counter CO.KZ
Если Вы хотите, чтобы пользовательская форма отображалась с учётом изменений, которые происходили с ней во время предыдущей работы, например, изменение месторасположения на экране, внесённые данные в текстовое поле, выбор последнего элемента в поле со списком и т.д. и т.п., то для этого нужно запомнить "координаты" пользовательской формы, её высоту, ширину, а также значения необходимых свойств элементов управления и использовать эти данные в дальнейшем. Осуществить сие можно различными способами, с некоторыми из них Вы можете ознакомиться на этой странице. Вполне естественно, что узнать какие именно изменения Вы желаете сохранить не представляется возможным, поэтому, в данной заметке будет приведена лишь часть информации, однако, изменить всё в соответствии со своими требованиями, не составит особого труда (для удобства все варианты представлены в виде готовых примеров)



Вариант I.
Сохранить все нужные данные в ячейках рабочего листа, причём, желательного (но не обязательно) скрытого, в данном примере, это лист с именем "Настройки"

Естественно, все эти ячейки нужно предварительно заполнить первоначальными значениями, в противном случае, результат может оказать отличным от ожидаемого ...
Private Sub UserForm_Initialize()
    Me.ComboBox1.List = Array("Arial", "Tahoma", "Times New Roman")
    Me.ComboBox2.List = Array(8, 9, 10, 12, 13)
    With ThisWorkbook.Worksheets("Настройки")
         Me.Top = .Range("UserForm1.Top").Value
         Me.Left = .Range("UserForm1.Left").Value
         Me.Width = .Range("UserForm1.Width").Value
         Me.Height = .Range("UserForm1.Height").Value
         Me.TextBox1.Value = .Range("TextBox1.Value").Value
         Me.ComboBox1.Value = .Range("ComboBox1.Value").Value
         Me.ComboBox2.ListIndex = .Range("ComboBox2.ListIndex").Value
    End With
    Me.StartUpPosition = 0
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    With ThisWorkbook.Worksheets("Настройки")
         .Range("UserForm1.Top").Value = Me.Top
         .Range("UserForm1.Left").Value = Me.Left
         .Range("UserForm1.Width").Value = Me.Width
         .Range("UserForm1.Height").Value = Me.Heigh
         .Range("TextBox1.Value").Value = Me.TextBox1.Value
         .Range("ComboBox1.Value").Value = Me.ComboBox1.Value
         .Range("ComboBox2.ListIndex").Value = Me.ComboBox2.ListIndex
    End With
    ThisWorkbook.Save
End Sub
Комментарий : Обратите внимание на то, что здесь используются именованные ячейки, однако, применение имён также не является обязательным условием, так что Вы можете воспользоваться и другими способами получения информации [FAQ14]



Вариант II.
Сохранить все нужные данные, используя предварительно созданные и заполненные соответствующими значениями, пользовательские свойства.
Private Sub UserForm_Initialize()
    Me.ComboBox1.List = Array("Arial", "Tahoma", "Times New Roman")
    Me.ComboBox2.List = Array(8, 9, 10, 12, 13)
    With ThisWorkbook.CustomDocumentProperties
         Me.Top = .Item("Top").Value
         Me.Left = .Item("Left").Value
         Me.Width = .Item("Width").Value
         Me.Height = .Item("Height").Value
         Me.TextBox1.Value = .Item("TextBox1_Value").Value
         Me.ComboBox1.Value = .Item("ComboBox1_Value").Value
         Me.ComboBox2.ListIndex = .Item("ComboBox2_ListIndex").Value
    End With
    Me.StartUpPosition = 0
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    With ThisWorkbook.CustomDocumentProperties
         .Item("Top").Value = Me.Top
         .Item("Left").Value = Me.Left
         .Item("Width").Value = Me.Width
         .Item("Height").Value = Me.Height
         .Item("TextBox1_Value").Value = Me.TextBox1.Value
         .Item("ComboBox1_Value").Value = Me.ComboBox1.Value
         .Item("ComboBox2_ListIndex").Value = Me.ComboBox2.ListIndex
    End With
    ThisWorkbook.Save
End Sub
Комментарий : Все перечисленные пользовательские свойства обязательно должны существовать и иметь соответствующий тип, т.е. если необходимо сохранить, к примеру, высоту или ширину формы, контрола, то лучше выбрать Число, если текст, то, конечно же, Текст, а если речь идёт о элементе управления Флажок(CheckBox), то тип "Да или Нет"



Вариант III.
Сохранить все необходимые данные в реестре Windows.
Private Sub UserForm_Initialize()
    Me.ComboBox1.List = Array("Arial", "Tahoma", "Times New Roman")
    Me.ComboBox2.List = Array(8, 9, 10, 12, 13)
    
    Me.Top = GetSetting("UserForm1", "UserForm1", "Top", 150)
    Me.Left = GetSetting("UserForm1", "UserForm1", "Left", 160)
    Me.Width = GetSetting("UserForm1", "UserForm1", "Width", 240)
    Me.Height = GetSetting("UserForm1", "UserForm1", "Height", 180)
    Me.TextBox1.Value = GetSetting("UserForm1", "TextBox1", "Value", _
    "Пример, демонстрирующий сохранение :" & vbNewLine & _
    "некоторых значений элементов управления," & vbNewLine & _
    "а также высоты и ширины формы и её месторасположение")
    Me.ComboBox1.Value = GetSetting("UserForm1", "ComboBox1", "Value", "Tahoma")
    Me.ComboBox2.ListIndex = GetSetting("UserForm1", "ComboBox2", "ListIndex", 2)
    
    Me.StartUpPosition = 0
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    SaveSetting "UserForm1", "UserForm1", "Top", Me.Top
    SaveSetting "UserForm1", "UserForm1", "Left", Me.Left
    SaveSetting "UserForm1", "UserForm1", "Width", Me.Width
    SaveSetting "UserForm1", "UserForm1", "Height", Me.Height
    SaveSetting "UserForm1", "TextBox1", "Value", Me.TextBox1.Value
    SaveSetting "UserForm1", "ComboBox1", "Value", Me.ComboBox1.Value
    SaveSetting "UserForm1", "ComboBox2", "ListIndex", Me.ComboBox2.ListIndex
End Sub
Комментарий : В отличии от предыдущих вариантов :
  • этот способ не требует сохранения книги, т.к. данные хранятся в реестре
  • здесь первоначальные значения указываются непосредственно в коде (см. необязательный аргумент Default функции GetSetting)
  • Вы не сможете воспользоваться сохранёнными данными в случае, если файл будет открыт на другом компьютере.



    Вариант IV.
    Хранить (считывать, записывать) все значения, например, в текстовом файле (.ini, .txt)



    Скачать пример Примеры можно скачать здесь


    Вопросы, которые связаны с этой темой
  • FAQ : Как присвоить имя ячейке стандартными средствами ?
  • FAQ : Как создать пользовательское свойство для рабочей книги ?
  • FAQ7 : Как автоматически запустить программу при отображении UserForm ?
  • FAQ14 : Как обратиться к ячейке (получить/изменить значение ячейки) ?
  • FAQ22 : Как присвоить имя ячейке средствами VBA ?
  • FAQ299 : Как программно создать, изменить и получить пользовательское свойство рабочей книги ?
  • FAQ363 : Как создать или изменить раздел и запись в реестре Windows ?
  • FAQ381 : Как получить значение нужной записи из раздела в реестре Windows ?
  • FAQ382 : Как получить список всех значений и всех записей указанного раздела ?




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