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