Кръстосана съвместимост на резолюцията на милисекундния таймер в Excel VBA

Бих искал да получа частична разделителна способност на таймера в проект на Excel VBA, който трябва да е съвместим с Windows Excel 2007 и Mac OS Excel 2011. Намерих метод в Windows, използващ sleep от kernel32.dll и метод на Mac OS, използващ MacScript("GetMilliSec").

В момента имам ограничен достъп до Mac, така че не мога да тествам това директно в момента. Ако декларирам Sleep така:

Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Ще се появи ли грешка, когато файлът се отвори в Mac? Или грешката ще бъде маркирана само когато/ако Sleep се извика в Mac?


person Hari Seldon    schedule 30.08.2011    source източник


Отговори (2)


Вярвам, че ще трябва да използвате условна компилация, за да избегнете декларацията на API да причини грешка на Mac.

   #If Mac Then
      MsgBox "I'm a Mac"
   #Else
      MsgBox "I'm a PC"
   #End If
person Tim Williams    schedule 30.08.2011
comment
Виждал съм този код и преди... нещо Mac ли е, което би било разпознато в кода за условна компилация? За мен не е възможно да разпространявам втора версия на проекта само за потребители на Mac, така че не можах да използвам нещо #CONST Mac = True и след това ръчно да го променя и разпространявам отново с #CONST Mac = False - person Hari Seldon; 30.08.2011
comment
@Hari - Мислех, че има някои вградени константи за условно компилиране, но изглежда, че може да не е така. Тествах кода си (без да декларирам константата на Mac) и изглежда, че работи, но сега виждам, че не дава грешка дори ако използвате недекларирана константа - просто й дава стойност по подразбиране False. - person Tim Williams; 30.08.2011
comment
@Tim... Благодаря за усилията! Това ми дава това, което трябва да знам. - person Hari Seldon; 30.08.2011

Имам Mac с Office 2011 и мога да потвърдя, че ще се появи грешка, когато подизвиква sleep с File not found: kernel32

Ако имате алтернативен подход за използване на командата sleep в Mac, моля, споделете и използвайте логиката по-долу, за да изберете Mac или Windows:

Public Sub WINorMAC()
'Test for the operating system.
    If Not Application.OperatingSystem Like "*Mac*" Then
        'Is Windows.
        Call Windows_specific_function()
    Else
        'Is a Mac and will test if running Excel 2011 or higher.
        If Val(Application.Version) > 14 Then
            Call Mac_specific_function()
        End If
    End If
End Sub

Можете също да използвате този код, за да зададете таймер с до 7 десетични знака, който работи както за Mac, така и за Windows:

'---------TIMER MACRO--------'
'PURPOSE: Determine how many seconds it took for code to completely run
'SOURCE: www.TheSpreadsheetGuru.com/the-code-vault

Dim StartTime As Double
Dim SecondsElapsed As Double
Dim minutesElapsed As Double

'Remember time when macro starts
StartTime = Timer

'*************************************
'------Start to run code--------'
'*************************************

        Your code goes here


'*************************************
'----------End code----------'
'*************************************


'Determine how many seconds code took to run

'If you want in seconds with two decimals, use this line:
'SecondsElapsed = Round(Timer - StartTime, 2)

'If you want with up to 7 decimals, use this line:
SecondsElapsed = Timer - StartTime

'Notify user how long the macro took
If SecondsElapsed > 60 Then
    minutesElapsed = Int(SecondsElapsed / 60)
    SecondsElapsed = Int(SecondsElapsed - (minutesElapsed * 60))

    Msgbox "This code ran successfully in " & minutesElapsed & " minutes and " & SecondsElapsed & " seconds", vbInformation

Else
    Msgbox "This code ran successfully in " & SecondsElapsed & " seconds", vbInformation

End If
person Niklas Johansson    schedule 16.02.2016