【问题标题】:VBA written in Excel for Windows not working on Mac用 Excel for Windows 编写的 VBA 不能在 Mac 上运行
【发布时间】:2015-04-20 11:44:26
【问题描述】:

我有一组宏来根据特定行的内容隐藏和取消隐藏列。它们都是用 Excel 2013 for Windows 编写的(如果相关的话,在我的 MBA 上并行运行)并且在那里工作正常。但是当我在 Excel 2011 for Mac 中打开工作表时,宏会给出奇怪的结果。 “取消隐藏所有列”宏工作正常;其他功能可以隐藏所有列,但不能取消隐藏我想要查看的列。

我只能假设 Excel for Mac 在 FOR EACH 循环中的内容存在问题,但我不知道是什么问题!如有任何指导,我将不胜感激:我需要让这个系统同时在 Windows 和 Mac 上运行。

代码如下。

此功能有效:

Sub GANTT_Filter_Show_All()

Dim rngDates As Range

Set rngDates = Range("GANTT_Dates")

rngDates.EntireColumn.Hidden = False

End Sub

但是这个只隐藏了所有的列:

Sub GANTT_Filter_This_Quarter()

Dim intCurrentMonth As Integer, intCurrentYear As Integer, rngDates As Range, cell As Range
Dim intCurrentQuarterMonths(3) As Integer

Set rngDates = Range("GANTT_Dates")
intCurrentMonth = DatePart("m", Date)
intCurrentYear = DatePart("yyyy", Date)

'loading months of current quarter into an array intCurrentMonth

Select Case intCurrentMonth
    Case 1 To 3
        intCurrentQuarterMonths(0) = 1
        intCurrentQuarterMonths(1) = 2
        intCurrentQuarterMonths(2) = 3
    Case 4 To 6
        intCurrentQuarterMonths(0) = 4
        intCurrentQuarterMonths(1) = 5
        intCurrentQuarterMonths(2) = 6
    Case 7 To 9
        intCurrentQuarterMonths(0) = 7
        intCurrentQuarterMonths(1) = 8
        intCurrentQuarterMonths(2) = 9
    Case 10 To 12
        intCurrentQuarterMonths(0) = 10
        intCurrentQuarterMonths(1) = 11
        intCurrentQuarterMonths(2) = 12
    End Select

'hiding all columns

rngDates.EntireColumn.Hidden = True

'comparing each column to array of months in current quarter and hiding if false

For Each cell In rngDates
    For Each v In intCurrentQuarterMonths
        If v = DatePart("m", cell.Value) And DatePart("yyyy", cell.Value) = intCurrentYear Then cell.EntireColumn.Hidden = False
    Next v
Next cell

Application.Goto Reference:=Range("a1"), Scroll:=True

End Sub

【问题讨论】:

  • 我看不出您的代码有任何明显错误,而且我不熟悉 Mac Excel 的 VBA 实现。我建议设置一个断点并单步执行 For Each 以检查值是否符合预期。
  • 感谢您的提示!我这样做了,在最里面的 For Each 循环中有一个 Debug.Print。看起来 DatePart("m", cell.Value) 返回的值与 DatePart("yyyy", cell.Value) 相同,这可以解释为什么循环没有做任何有用的事情。 为什么它会发生是一个谜,但我不知道如何解决它。我在 Excel for Mac 中找不到任何有关 DatePart 行为不端的文档。有什么想法吗?
  • 避免使用 DatePart 感觉有点失败,但您可以尝试使用这个 Month(cell.Value) 和 Year(cell.Value)。
  • 你打算用For each v 循环做什么?现在看起来您正在评估 DatePart("m", cell.Value) 作为布尔值。这对我来说似乎是错误的,或者至少看起来可能会产生意想不到的结果。
  • 谢谢! @Steven 的建议(以及共产国际更详细的答案)将其整理出来。可能是失败主义者,但我对做有效的事情并不太自豪。大卫:For each v 将单元格的月份与当前季度的每个月份进行比较,并将单元格的年份与当前年份进行比较,如果两者都为真,则隐藏单元格的列(该位在右侧)。

标签: macos vba excel


【解决方案1】:

我和@Steven 一起讨论这个问题,代码没有明显错误。我不是 Mac 用户,但日期函数很可能有些奇怪,尤其是那些需要格式化才能解决的问题。

在这种情况下,我会尝试用对 Month() 和 Year() 的调用替换对 DatePart() 的调用——即使对于非 Mac 用户也是如此。它不依赖于解析字符串进行格式化,因此效率更高(并且易于阅读):

Sub Benchmarks()

    Dim starting As Double, test As Date, i As Long
    test = Now

    starting = Timer
    For i = 1 To 1000000
        Year test
    Next i
    Debug.Print "Elapsed: " & (Timer - starting)

    starting = Timer
    For i = 1 To 1000000
        DatePart "yyyy", test
    Next i
    Debug.Print "Elapsed: " & (Timer - starting)

End Sub

由于您可能无法运行基准测试...

Elapsed for Year():     0.109375
Elapsed for DatePart(): 0.515625

另请注意,除此之外,您正在搜索的列中的日期是作为变体出现的,将它们显式转换为日期可能会有所帮助:

If v = Month(CDate(cell.Value)) And intCurrentYear = Year(CDate(cell.Value)) Then
    cell.EntireColumn.Hidden = False
End If

【讨论】:

  • 非常感谢!问题解决了,在这个过程中我学到了更多的 VBA。
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
相关资源
最近更新 更多