Перекрестная совместимость разрешения миллисекундного таймера в 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
@ Тим ... Спасибо за ваши усилия! Это дает мне то, что мне нужно знать. - 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