【问题标题】:Use of Combobox to populate cell with functions and external links使用组合框为单元格填充函数和外部链接
【发布时间】:2017-03-27 19:34:31
【问题描述】:

这很简单,但我无法弄清楚。可能是因为做不到?不管我们去哪里:

我想使用一个组合框,当被选中时,该组合框将输入带有文本值、函数和对外部单元格的引用的单元格。

选项的第一行是填充名称。

第二行是一个公式,会因课程而异。

第三行将为一个单元格提供对另一个文件中另一个单元格内容的引用。因此,如果使用多个课程文件,我可以拥有一个主文件,如果我更改单元格的内容,更改将反映在更新后引用它的所有课程文件单元格。

这是我希望它执行的粗略代码形式。

    Private Sub ComboBox1_Change()
If Me.ComboBox1.Value = "ITCourse" Then
    Worksheets("PARADE STATE").Range("I1").Value = "ITCourse"
    Worksheets("Data Base").Range("C1").Value = IF(V9>70,"Prep Week",IF(V9>65,"Week 1",IF(V9>60,"Week 2",IF(V9>55,"Week 3",IF(V9>50,"Week 4",IF(V9>45,"Week 5",IF(V9>40,"Week 6",IF(V9>35,"Week 7",IF(V9>30,"Week 8",IF(V9>25,"Week 9",IF(V9>20,"Week 10",IF(V9>15,"Week 11",IF(V9>10,"Week 12",IF(V9>5,"Week 13",IF(V9>0,"Week 14")))))))))))))))
    Worksheets("Week 1").Range("B2").Value = 'N:\ITcourse\00 - Data Base\[ITcourse.xlsx]Sheet'!$A$3
End If
If Me.ComboBox1.Value = "HRCourse" Then
    Worksheets("PARADE STATE").Range("I1").Value = "HRCourse"
    Worksheets("Data Base").Range("C1").Value = IF(V9>40,"Prep Week",IF(V9>35,"Week 1",IF(V9>30,"Week 2",IF(V9>25,"Week 3",IF(V9>20,"Week 4",IF(V9>15,"Week 5",IF(V9>10,"Week 6",IF(V9>5,"Week 7",IF(V9>5,"Week 8")))))))))
    Worksheets("Week 1").Range("B2").Value = 'N:\ITcourse\00 - Data Base\[HRcourse.xlsx]Sheet'!$A$3
End If
End Sub

谢谢!

【问题讨论】:

  • 第一行运行正常吗?我怀疑第二行没有做你想做的事。您正在设置一个单元格 Value,但您想要的是 to set a .Formula
  • 我知道这很简单。所以是的,第一行有效。现在,只要您以这种方式格式化,第二行就可以工作: Worksheets("Data Base").Range("C1").Value = "IF(V9>70,""Prep Week"",IF(V9> 65,""Week 1""........)))" 只要你每次需要在你打开一个之后输入一个双""然后用"关闭该行。第三行有效也是。
  • 所以要花费我正在用这些公式做的事情。我为每种课程类型使用了一个电子表格,但编译的大多数统计数据都是相同的,所以我只想拥有一个可以处理所有课程类型的电子表格。选择课程类型后,它将根据选择更改公式并获取单元格。在电子表格中,我有每周要完成的任务议程,并且有一个主电子表格,我对其进行了更改,现在反映到所有相同类型的课程中。我们一次开设 5 种不同类型的约 9 门课程。

标签: excel combobox vba


【解决方案1】:

您需要一个函数来返回任何给定课程名称的周数。此函数应使用Dictionary 来存储信息,并且可以从专用工作表中加载字典。

Function WeeksPerCourse(courseName As String) As Long
    Static dict As Scripting.Dictionary
    If dict Is Nothing Then
        ' Fill the dictionary here. Note that it is better
        ' to load the values from a dedicated, hidden worksheet
        Set dict = CreateObject("Scripting.Dictionary")
        dict("ITCourse") = 14
        dict("HRCourse") = 8
        ' Etc...
    End If
    WeeksPerCourse = dict(courseName)
End Function

使用此功能,您的程序可以简化如下:

Private Sub ComboBox1_Change()
    Dim course As Sting: course = Trim(ComboBox1.value)
    Worksheets("PARADE STATE").Range("I1").value = course

    'Dim nWeek As Long
    'nWeek = WeeksPerCourse(course) - Worksheets("PARADE STATE").Range("V9").value / 5
    'Worksheets("Data Base").Range("C1").value = IIf(nWeek < 1, "Prep Week", "Week " & nWeek)

    Worksheets("Data Base").Range("C1").Formula = "= ""Week "" & INT((WeeksPerCourse('PARADE STATE'!I1) - 'PARADE STATE'!V9)/5)"

    Worksheets("Week 1").Range("B2").Formula= "='N:\ITcourse\00 - Data Base\[" & course & ".xlsx]Sheet'!$A$3"
End Sub

【讨论】:

  • 我不确定它是否理解我试图用这个函数做什么。该功能有效我只是希望它在我更改组合框的值时填充到特定的单元格中,因为它会根据课程进行更改。该函数使用 V9 查看距离课程结束日期还有多少天。然后该函数使用这个值来计算你今天是星期几。
  • @NicolasCardin-Lemay 好吧,我不知道您的第二行是公式而不是值。无论如何,我更改了代码以反映这一点,它将使用 WeeksPerCourse 作为 UDF。唯一的问题是现在它应该显示“第 0 周”而不是“准备周”;如果我们验证该想法符合您的需求,我们最终可以更改它。请注意,公式可以是静态的,因为它会在 I1V9 更改时自动更新。这意味着您可以直接将其输入到 excel 中,并且在组合选择更改时无需更新它。
猜你喜欢
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多