Macos 用Excel为Windows编写的VBA不在Mac上工作

Macos 用Excel为Windows编写的VBA不在Mac上工作,macos,vba,excel,Macos,Vba,Excel,我有一组宏可以根据特定行的内容隐藏和取消隐藏列。它们都是用Excel 2013 for Windows编写的(如果相关的话,与我的MBA课程并行运行),并且在那里运行良好。但当我在Excel2011 for Mac中打开工作表时,宏给出了奇怪的结果。“取消隐藏所有列”宏工作正常;其他函数可以隐藏所有列,但不能取消隐藏我想看到的列 我只能假设Excel for Mac在for EACH循环中存在问题,但我不知道是什么!我希望得到任何指导:我需要让这个系统同时在Windows和Mac上工作 代码如下

我有一组宏可以根据特定行的内容隐藏和取消隐藏列。它们都是用Excel 2013 for Windows编写的(如果相关的话,与我的MBA课程并行运行),并且在那里运行良好。但当我在Excel2011 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

这一次我支持@Steven,代码没有明显的错误。我不是Mac用户,但完全有可能日期函数有些奇怪,尤其是那些需要格式化才能解析的函数

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

因为您可能无法运行基准测试

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

我看不出你的代码有任何明显的错误,我也不熟悉Mac Excel的VBA实现。我建议输入一个断点并通过For Each检查值是否符合预期。谢谢提示!我通过一个Debug.Print在最内层为每个循环打印。看起来DatePart(“m”,cell.Value)返回的值与DatePart(“yyy”,cell.Value)的值相同,这可以解释为什么循环没有做任何有用的事情。然而,它为什么会发生是个谜,我不知道如何解决它。我在Excel for Mac中找不到任何关于DatePart行为异常的文档。有什么想法吗?避免使用DatePart感觉有点失败,但您可以尝试使用本月(cell.Value)和年(cell.Value)。对于每个v循环,您打算如何处理
?现在看起来您正在将
DatePart(“m”,cell.Value)
作为布尔值进行计算。对我来说,这似乎是错误的,或者至少是可能产生意想不到的结果的事情。谢谢@史蒂文的建议(以及共产国际更详细的回答)很好地解决了这个问题。可能是失败主义者,但我并不太骄傲,不会做有效的事情。大卫:每个v的
会将单元格的月份与当前季度的每个月进行比较,并将单元格的年份与当前年份进行比较,如果两者都为真,则会隐藏单元格的列(该位位于右侧)。非常感谢!问题解决了,在这个过程中我学到了更多的VBA。
If v = Month(CDate(cell.Value)) And intCurrentYear = Year(CDate(cell.Value)) Then
    cell.EntireColumn.Hidden = False
End If