【发布时间】: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将单元格的月份与当前季度的每个月份进行比较,并将单元格的年份与当前年份进行比较,如果两者都为真,则隐藏单元格的列(该位在右侧)。