Отображение пользовательской формы так, как будто она находится на листе Excel, а не отдельно

#excel #vba #activex #userform

#excel #vba #activex #пользовательская форма

Вопрос:

Я хочу, чтобы моя пользовательская форма отображалась так, как будто она на самом деле является частью листа Excel, а не отдельным окном из книги Excel. Я не могу использовать элементы управления ActiveX, которые на самом деле были бы расположены на листе, потому что мне нужно назначить RawSource для моих списков со списком, что не является опцией в версии ActiveX. Есть ли способ, которым я могу сделать так, чтобы моя пользовательская форма отображалась так, как будто она находится на листе, как если бы я использовал элементы управления ActiveX?

Ответ №1:

Вы не можете заставить пользовательскую форму отображаться «внутри» листа.

Я не знаю вашей идеи, лежащей в основе вашего запроса. Если вы хотите иметь возможность использовать форму и лист параллельно, вы можете показать свою форму немодальной ( userform1.show False )

Однако вы можете использовать элементы управления ActiveX. Вы можете получить доступ к этим элементам управления из VBA и установить RowSource (свойство именуется ListFillRange ) в диапазон, или вы можете установить элементы по отдельности (однако вы не можете смешивать это).

Установить в диапазон:

 Dim ctrl As OLEObject
Set ctrl = ThisWorkbook.Worksheets(1).OLEObjects("ComboBox1")
ctrl.ListFillRange = "A2:A10"
  

Установить для отдельного списка элементов:

 with ctrl
    .ListFillRange = ""    ' Make sure that ListFillRange  is empty
    With .object           ' "Object" is the real ComboBox object
        .clear
        .AddItem "Cheese"
        .AddItem "Tomato"
        .AddItem "Onion"
        .AddItem "Ham"
        .AddItem "Olives"
        
        .Value = "Onion"
    End With
End With
  

Если вы предпочитаете, вы также можете написать

 Sheet1.ComboBox1.ListFillRange = "A2:A10"
  

или

 Sheet1.ComboBox1.Clear
Sheet1.ComboBox1.AddItem "Hello"
  

Это предполагает, что кодовое имя листа Sheet1 — кодовое имя отображается в представлении проекта VBA и может отличаться от имени листа.