组合框中的多个宏

时间:2018-08-13 13:40:09

标签: excel vba combobox

我已经部分地处理了调用2出现在组合框中的另一个值。但是,我的工作是可以重复的(366个宏)(一年)。是否可以使用一些更短,更方便的代码来处理它?<​​/ p>

基本上,我有: 列C ->已在组合框中分配为列表索引 D列和E列在组合框中都被称为一个宏(例如,对于1.01,C1和D1如下代码所示) '一月

Sub jan01()
Range("A5").Value = "=D1"
Range("B5").Value = "=E1"
End Sub
Sub jan02()
Range("A5").Value = "=D2"
Range("B5").Value = "=E2"
End Sub
Sub jan03()
Range("A5").Value = "=D3"
Range("B5").Value = "=E3"
End Sub
Sub jan04()
Range("A5").Value = "=D4"
Range("B5").Value = "=E4"
End Sub
Sub jan05()
Range("A5").Value = "=D5"
Range("B5").Value = "=E5"
End Sub
Sub jan06()
Range("A5").Value = "=D6"
Range("B5").Value = "=E6"
End Sub
Sub jan07()
Range("A5").Value = "=D7"
Range("B5").Value = "=E7"
End Sub
Sub jan08()
Range("A5").Value = "=D8"
Range("B5").Value = "=E8"
End Sub
Sub jan09()
Range("A5").Value = "=D9"
Range("B5").Value = "=E9"
End Sub
Sub jan10()
Range("A5").Value = "=D10"
Range("B5").Value = "=E10"
'...
End Sub

要使用组合框运行它,我使用了“ case”选项:

Private Sub DateBox1_Change()
Select Case DateBox1
Case "1.01": jan01
Case "2.01": jan02
Case "3.01": jan03
Case "4.01": jan04
Case "5.01": jan05
Case "6.01": jan06
Case "7.01": jan07
Case "8.01": jan08
Case "9.01": jan09
Case "10.01": jan10
'...
End Select
End Sub

我按照图片使用了与旋转按钮链接的组合框。强文本 我将不胜感激。

提前谢谢

3 个答案:

答案 0 :(得分:2)

如果您知道ComboBox已分配/与C列中的日期列表对齐,那么您所要做的就是使用.ListIndex属性来查找选择列表中的哪个项目。一旦有了它,那就是您的行值。简单又好...

Private Sub DateBox1_Change()
If DateBox1.ListIndex >=0 then ' If the selection in invalid it will be -1
    Range("A5").Value = "=D" & DateBox1.ListIndex + 2
    Range("B5").Value = "=E" & DateBox1.ListIndex + 2
End if
End Sub

答案 1 :(得分:0)

不确定D&E的值是什么,但是您可以执行以下操作

Range("A5").Value = range("d1").offset(datediff("d",dateserial(2018,1,1),dateserial(2018,split(DateBox1,".")(1)-1,split(DateBox1,".")(0))),0)

Range("A5").Value = "=" & range("d1").offset(datediff("d",dateserial(2018,1,1),dateserial(2018,split(DateBox1,".")(1)-1,split(DateBox1,".")(0))),0).address

答案 2 :(得分:0)

类似的事情可能对您有用。

Option Explicit

Public Sub ProcessDay(ByRef ws As Worksheet, ByVal dayNumber As Long)
    ws.Cells(5, "A").Value = "=" & ws.Cells(dayNumber, "D").Address(0, 0)
    ws.Cells(5, "B").Value = "=" & ws.Cells(dayNumber, "E").Address(0, 0)
End Sub

您可以这样称呼它:

Private Sub DateBox1_Change()
    Dim dayNum As Long
    dayNum = dayNum = WorksheetFunction.Days(DateValue(Replace(DateBox1,".","/")), DateValue("1/1"))
    Call ProcessDay(Sheet1, dayNum)
End Sub

基本上,其工作方式是在DateBox1_Change()代码中,我们将10.01之类的文本转换为“ 10/01”之类的日期。然后,我们将该日期字符串转换为日期,并确定距1月1日已有多少天。

请注意,这假定日期时间设置中的“ 10/01”表示1月1日。对我来说,这意味着10月1日,我需要用另一种方式来处理文本,以使其对我有用。请告诉我这是否对您有效,因为它似乎表明我的日期时间设置与您的日期设置不一样。