【问题标题】:VBA - Data validation with variable rangeVBA - 可变范围的数据验证
【发布时间】:2018-11-27 05:02:43
【问题描述】:

我正在尝试从另一个工作表中的变量范围设置数据验证列表。但是,我无法使用第一段代码来定义范围。这是我的代码:-

Private Sub Workload_Schedule_Conditional_Formatting()

Dim LastRowWS As Long, LastRowPS As Long, rng As Range, ProjectRange As Range

    LastRowPS = Worksheets("Project_Summary").Range("B" & Rows.Count).End(xlUp).Row
    Set ProjectRange = Worksheets("Project_Summary").Range(Cells(2, 1), Cells(LastRowPS, 2))
    LastRowWS = Worksheets("Workload_Schedule").Range("A" & Rows.Count).End(xlUp).Row
    Set rng = Worksheets("Workload_Schedule").Range(Cells(4, 3), Cells(LastRowWS, 7))

'Other code for validation list.

End Sub

Set rng 行出现错误。我不知道为什么这会引发错误,但 Set ProjectRange 行没有(它基本上是完全相同的代码,但在不同的工作表中)。

【问题讨论】:

  • 您只需要完全限定 Cells 调用 - 它们隐式引用 ActiveSheet。此外,在过程名称中应避免蛇形大小写 - 下划线在 VBA 中作为接口分隔符具有特殊含义。我会重命名这个WorkloadScheduleConditionalFormatting
  • 非常感谢 Comintem!这最好在 With 命令中完成,还是在每次调用 Cell 之前指定工作表?
  • 我个人会使用 With 语句,但是对于 2 次调用,直接使用工作表引用确实不会对性能产生太大影响。
  • 再次感谢!你能帮我弄清楚如何限定单元格的工作表引用的格式吗?我假设这将类似于 Set ProjectRange = WSPS.Range(WSPS.Cells(2, 1), WSPS.Cells(LastRowPS, 2)) - 我将 WSPS 设置为 Worksheet 和 = Worksheets("Project_Summary ")。

标签: excel vba range


【解决方案1】:

具有可读性

完整

Sub Workload_Schedule_Conditional_Formatting()

    Dim LastRowWS As Long, LastRowPS As Long, rng As Range, _
            ProjectRange As Range

    With Worksheets("Project_Summary")
        LastRowPS = .Range("B" & .Rows.Count).End(xlUp).Row
        Set ProjectRange = .Range(Cells(2, 1), Cells(LastRowPS, 2))
    End With
    With Worksheets("Workload_Schedule")
        LastRowWS = .Range("A" & .Rows.Count).End(xlUp).Row
        Set rng = .Range(Cells(4, 3), Cells(LastRowWS, 7))
    End With

    ' Other code for validation list.

End Sub

Sub Workload_Schedule_Conditional_Formatting_Short()

    Dim rng As Range, ProjectRange As Range

    With Worksheets("Project_Summary")
        Set ProjectRange = .Range(Cells(2, 1), _
                Cells(.Range("B" & .Rows.Count).End(xlUp).Row, 2))
    End With
    With Worksheets("Workload_Schedule")
        Set rng = .Range(Cells(4, 3), _
                Cells(.Range("A" & .Rows.Count).End(xlUp).Row, 7))
    End With

    ' Other code for validation list.

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多