2015-04-20 4 views
0

У меня есть набор макросов для скрытия и отображения столбцов на основе содержимого определенной строки. Все они были написаны в Excel 2013 для Windows (работает в параллелях с моей MBA, если это так) и отлично работают. Но когда я открываю рабочий лист в Excel 2011 для Mac, макросы дают нечетные результаты. Макрос «показать все столбцы» работает нормально; другие функции доходят до того, что скрывают все столбцы, но не до тех пор, пока не отобразятся те, которые я хочу видеть.VBA, написанный в Excel для Windows, не работающий на Mac

Я могу только предположить, что Excel для 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 
+2

Я не могу увидеть что-нибудь явно не так с вашим кодом и я не знаком с Mac Внедрение VBA в Excel. Я бы предложил положить в точку останова и пройти через «Для каждого», чтобы проверить значения как ожидалось. – Steven

+0

Спасибо за подсказку! Я сделал это с помощью Debug.Print в самом внутреннем для каждого цикла. Похоже, DatePart («m», cell.Value) возвращает то же значение, что и DatePart («yyyy», cell.Value), что объясняет, почему цикл не делает ничего полезного. _Why_ это происходит, это тайна, и я не могу понять, как это исправить. Я не могу найти документацию о неправильной работе DatePart в Excel для Mac. Любые идеи? – JHoodoo

+0

Чувствуется немного пораженческим, чтобы избежать использования DatePart, но вы можете попробовать использовать этот месяц (cell.Value) и Year (cell.Value). – Steven

ответ

0

Я с @Steven на этом, ничего явно не так с кодом. Я не пользователь Mac, но вполне возможно, что есть некоторые странности вокруг функций даты, особенно тех, которые требуют форматирования для решения.

Я бы попытался заменить вызовы на DatePart() вызовами Month() и Year() в таких ситуациях, даже если это касается не-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 
+0

Большое спасибо! Проблема решена, и я изучил немного больше VBA в этом процессе. – JHoodoo