用户选择和循环vba

时间:2016-08-25 16:39:48

标签: vba excel-vba excel

我试图建立为预算跟踪系统创建导航菜单的逻辑:每个预算行有12张表,每张表有12个月表。

导航菜单基于两个组合框,一个列出工作表,另一个是月份名称 - 当用户选择去哪里时,所选表格中的工作表和第一个单元格会激活。

我正在寻找的是一种更有效的组织方式,而不是编写144个不同的if-then条件,用于考虑用户可能选择的每个可能的listindex组合。选择案例方法也有效,但范围同样很大......

我一直在研究使用循环来达到目的 - 例如ListIndex值可以在一个循环中定义,但我对于总体概念的想法很缺乏。

提前谢谢!

3 个答案:

答案 0 :(得分:1)

选择表单非常简单。只需创建一个数组,该数组将保存与ListIndex对应的工作表名称。像这样的东西

Dim myArray(11) As String
myArray(0) = "a"
myArray(1) = "b"
myArray(2) = "c"
...
myArray(10) = "k"
myArray(11) = "l"

Worksheets(myArray(ComboBox1.ListIndex)).Activate

如果此人选择了第5个ComboBox元素,则表单" e"会被激活。

选择表格单元格有点问题,因为它取决于表格所在的工作表上的位置。如果它们等距离间隔,则可以使用简单的数学公式。也就是说,如果1月表在E7,2月在E27,3月在e47开始,则使用listindex计算起始行是一件简单的事情。例如:

Worksheets(myArray(ComboBox1.ListIndex)).Cells(7 + ComboBox2.ListIndex * 20, "E").Select

希望这会有所帮助。 :)

答案 1 :(得分:1)

我在这里设置了一个包含12个工作表的工作簿,每个月一个。每个工作表上都有12个表。当用户从下拉列表(cboWorkSheets)中选择工作表时,将清除第二个下拉列表(cboTables)列表,然后将所选工作表中的所有表名添加回列表。

当用户从cboTables中选择一个表名时,将搜索cboWorkSheets引用的工作表以查找该表。然后选择表格数据集范围中的第一个单元格。

enter image description here

SELECT *,
    ( 3959 * acos( cos ( radians(47.64585) )
        * cos( radians( lat ) ) 
        * cos( radians( longitude ) - radians(-117.159999) ) 
        + sin( radians(47.64585) )
        * sin( radians( lat ) )
        )
    ) AS distance 
FROM table
WHERE     
    companyname LIKE '%" . $name . "%' 
    OR address LIKE '%" . $name . "%'
    OR city LIKE '%" . $name ."%'
    OR state LIKE '%" . $name ."%'
HAVING distance > 100

答案 2 :(得分:0)

作为一般兴趣,这是我在@Tim的例子中构建的概念证明文件的代码的功能版本,如上所述。这是:

在Module1中:

Sub ComboBox1_Change()

Dim sheets_array(0 To 2) As Variant

sheets_array(0) = "Sheet1"
sheets_array(1) = "Sheet2"
sheets_array(2) = "Sheet3"

With UserForm1.ComboBox1
    .Clear
    .List = sheets_array
    .Style = fmStyleDropDownCombo

    End With

    Call ComboBox2_Change

    UserForm1.Show
End Sub

Sub ComboBox2_Change()

Dim monthsarray(0 To 3) As Variant

monthsarray(0) = "April"
monthsarray(1) = "May"
monthsarray(2) = "June"

With UserForm1.ComboBox2
    .Clear
    .List = monthsarray
    .Style = fmStyleDropDownCombo
    End With

End Sub

在UserForm1代码窗口中:

Private Sub ComboBox1_Change()

With UserForm1.ComboBox1
        Worksheets(.List(.ListIndex)).Activate
    End With
End Sub


Private Sub ComboBox2_Change()

With Worksheets(UserForm1.ComboBox1.ListIndex)
     .Select
     .Cells(7 + UserForm1.ComboBox2.ListIndex * 20, "E").Select
End With

End Sub
@Thomas Inzina,你的解决方案更加优雅,我希望我能在某个时候考虑你的关卡编程。