Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 窗体和滚动条_Excel_Vba - Fatal编程技术网

Excel 窗体和滚动条

Excel 窗体和滚动条,excel,vba,Excel,Vba,我碰到了一个小问题,这让我头痛不已。我已经为此寻找了很长时间,但我仍然没有找到如何做到这一点 我有一个小脚本,可以在表单上创建组合框 For j = 0 To UBound(ComponentList) - 1 'Set Label Set control = ComponentSelectionForm.Controls.Add("Forms.Label.1", "ComponentLabel" & CStr(j), True) With control .Caption =

我碰到了一个小问题,这让我头痛不已。我已经为此寻找了很长时间,但我仍然没有找到如何做到这一点

我有一个小脚本,可以在表单上创建组合框

For j = 0 To UBound(ComponentList) - 1
'Set Label
Set control = ComponentSelectionForm.Controls.Add("Forms.Label.1", "ComponentLabel" & CStr(j), True)
With control
    .Caption = "Component " & CStr(j)
    .Left = 30
    .Top = Height
    .Height = 20
    .Width = 100
    .Visible = True
End With

'set ComboBox
Set combo = ComponentSelectionForm.Controls.Add("Forms.ComboBox.1", "Component" & CStr(j), True)
With combo
    .List = ComponentList()
    .Text = "NONE"
    .Left = 150
    .Top = Height
    .Height = 20
    .Width = 50
    .Visible = True
    Set cButton = New clsButton
    Set cButton.combobox = combo
    coll.Add cButton
End With
Height = Height + 30
Next j
我发现有时我可能会有多达50多个组合框。这显然会离题。我试图做的是创建一个容器来保存表单中的这些组合框,表单中有一个垂直滚动条,用户可以滚动浏览它们

我应该能够创建一个滚动条,但我如何做,使滚动条滚动通过组合框,但离开标签上面,它下面的按钮所在的位置

我正在寻找一些帮助/指点,以帮助实现这一目标


提前感谢。

您不能将组合框放入容器控件(如框架)中,然后添加滚动条(设置水平和垂直的方向属性)

因此,在循环外添加帧:

ComponentSelectionForm.Controls.Add("Forms.Frame.1", "fraContainer" , True)
然后将滚动条添加到容器中

ComponentSelectionForm.Controls("fraContainer").controls.add("Forms.Scrollbar.1", "scHorizontal" , True)

with ComponentSelectionForm.Controls("fraContainer").controls("scHorizontal")
    ' set orentation to Horizontal
    .orientation=1
end with

ComponentSelectionForm.Controls("fraContainer").controls.add("Forms.Scrollbar.1", "scVertical" , True)

with ComponentSelectionForm.Controls("fraContainer").controls("scVertical")
    ' set orentation to Vertical
    .orientation=0
end with
现在,在你的循环中

更改您的代码,这样它就不会将组合框添加到表单中,而是将它们*添加到框架容器中*

在这方面有很多帮助

让我们知道你进展如何


Philip

能否将组合框放在容器控件(如框架)中,然后添加滚动条(设置水平和垂直方向的方向属性)

因此,在循环外添加帧:

ComponentSelectionForm.Controls.Add("Forms.Frame.1", "fraContainer" , True)
然后将滚动条添加到容器中

ComponentSelectionForm.Controls("fraContainer").controls.add("Forms.Scrollbar.1", "scHorizontal" , True)

with ComponentSelectionForm.Controls("fraContainer").controls("scHorizontal")
    ' set orentation to Horizontal
    .orientation=1
end with

ComponentSelectionForm.Controls("fraContainer").controls.add("Forms.Scrollbar.1", "scVertical" , True)

with ComponentSelectionForm.Controls("fraContainer").controls("scVertical")
    ' set orentation to Vertical
    .orientation=0
end with
现在,在你的循环中

更改您的代码,这样它就不会将组合框添加到表单中,而是将它们*添加到框架容器中*

在这方面有很多帮助

让我们知道你进展如何


Philip你好,这是一个子程序。希望这对您的概念有所帮助:)

要修改的内容:

Private Sub UserForm_Click()
    Call AddCombo(30)
End Sub

Private Sub AddCombo(num As Integer, Optional gap As Single = 2.25, _
                     Optional ctrlHeight As Single = 18)
    Dim ctrl As Control, i As Integer
    Static lastTop As Single
    lastTop = 2
    For i = 1 To num
        Set ctrl = UserForm1.Controls.Add("Forms.ComboBox.1", "Combo" & i, True)
        With ctrl
            If i = 1 Then
               ctrl.Top = lastTop
               ctrl.Height = ctrlHeight
               'Add other codes here .....
            Else
               lastTop = lastTop + ctrlHeight + gap
               ctrl.Top = lastTop
               ctrl.Height = ctrlHeight
               'Add other codes here .....
            End If
        End With
    Next i
    If lastTop > Me.Height Then
       Me.ScrollHeight = lastTop
       Me.ScrollBars = fmScrollBarsVertical
    End If
End Sub
  • 我已经使用UserForm_Click()事件调用AddCombo sub,所以请调用 你想去哪里就去哪里
  • 我没有设置left属性,您可以在下面轻松地进行设置 控制高度
  • 根据需要更改其他属性

  • 嗨,这里有一个子程序。希望这对您的概念有所帮助:)

    要修改的内容:

    Private Sub UserForm_Click()
        Call AddCombo(30)
    End Sub
    
    Private Sub AddCombo(num As Integer, Optional gap As Single = 2.25, _
                         Optional ctrlHeight As Single = 18)
        Dim ctrl As Control, i As Integer
        Static lastTop As Single
        lastTop = 2
        For i = 1 To num
            Set ctrl = UserForm1.Controls.Add("Forms.ComboBox.1", "Combo" & i, True)
            With ctrl
                If i = 1 Then
                   ctrl.Top = lastTop
                   ctrl.Height = ctrlHeight
                   'Add other codes here .....
                Else
                   lastTop = lastTop + ctrlHeight + gap
                   ctrl.Top = lastTop
                   ctrl.Height = ctrlHeight
                   'Add other codes here .....
                End If
            End With
        Next i
        If lastTop > Me.Height Then
           Me.ScrollHeight = lastTop
           Me.ScrollBars = fmScrollBarsVertical
        End If
    End Sub
    
    • 我已经使用UserForm_Click()事件调用AddCombo sub,所以请调用 你想去哪里就去哪里
    • 我没有设置left属性,您可以在下面轻松地进行设置 控制高度
    • 根据需要更改其他属性

    • 是的,但我不知道怎么做。我是通过代码而不是图形设计来写的。如果我以图形方式进行,我不会有问题,但它是在代码中进行的。@NoLiver92整个表单是在内存中构造的吗?看起来您应该能够使用forms GUI最初创建这些控件,然后使用VBA操作控件等。如果有疑问,请创建一个具有类似控件的虚拟表单并查看它们的属性。我已经更新了我的代码,并提供了一个链接,您可以从中获得一些示例代码和示例workbook@DavidZemens是的,由于工作程序的性质,它都是从代码创建的。我无法直观地执行此操作,因为它将始终更改为显示文件中的数据。@Philip谢谢你,我现在在家,但我在上班时会做第一件事(因为受限制,我无法将其带回家)。是的,但我不知道如何执行此操作。我是通过代码而不是图形设计来写的。如果我以图形方式进行,我不会有问题,但它是在代码中进行的。@NoLiver92整个表单是在内存中构造的吗?看起来您应该能够使用forms GUI最初创建这些控件,然后使用VBA操作控件等。如果有疑问,请创建一个具有类似控件的虚拟表单并查看它们的属性。我已经更新了我的代码,并提供了一个链接,您可以从中获得一些示例代码和示例workbook@DavidZemens是的,由于工作程序的性质,它都是从代码创建的。我无法直观地执行此操作,因为它将始终更改为显示文件中的数据。@Philip谢谢,我现在在家,但我在工作时会做第一件事(因为受限制,我无法将其带回家)