Board logo

標題: sleep問題? [打印本頁]

作者: joey0415    時間: 2012-8-15 15:55     標題: sleep問題?

本帖最後由 joey0415 於 2012-8-15 15:57 編輯

以前在程式前家上
'宣告win api函數
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


之用程式來調用它都沒有問題

現在因為昇級成win7 64位元,office 2010也是64位元後,打開檔案後就會有問題



不知道怎麼修改呢?

謝謝
作者: c_c_lai    時間: 2012-8-15 21:20

回復 1# joey0415
試試看!
差別在於 Long 及 LongLong 的宣告型態。
  1. #If VBA7 And Win64 Then
  2.        ' 64 bit Excel
  3.        Public Declare Sub Sleep Lib "kernel32" ( _
  4.            ByVal dwMilliseconds As LongLong)
  5. #Else
  6.       ' 32 bit Excel
  7.      Public Declare Sub Sleep Lib "kernel32" ( _
  8.          ByVal dwMilliseconds As Long)
  9. #End If

  10. Sub Test()
  11.       Sleep NumberOfSeconds * 1000
  12. End Sub
複製代碼

作者: joey0415    時間: 2012-8-15 21:55

回復  joey0415
試試看!
差別在於 Long 及 LongLong 的宣告型態。
c_c_lai 發表於 2012-8-15 21:20


感謝大大的回應,不過還是有些錯誤,請問怎麼修改呢?


作者: Hsieh    時間: 2012-8-15 22:50

回復 3# joey0415
我沒有64位元系統無法測試,您可參考下列連結技術文章
http://msdn.microsoft.com/zh-tw/ ... erfaceCompatibility
作者: c_c_lai    時間: 2012-8-16 08:24

回復 4# Hsieh
回復 3# joey0415
原來如此, 受教了! 轉述如下:
  1. Declare Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long
複製代碼
在 Microsoft Visual C 和 Microsoft Visual C++ 中,前一範例會同時正確地編譯 32 位元和 64 位元。這是因為 HKEY 會定義為指標,
其大小反映程式碼編譯所在之平台的記憶體大小。
在舊版 VBA 中,並沒有特定的指標資料類型,因此會使用 Long 資料類型。此外,由於 Long 資料類型一律為 32 位元,
因此在具有 64 位元記憶體的系統上使用時,會因為截斷上方 32 位元或複寫其他記憶體位址而損毀。
這些情況會導致無法預期的行為或系統當機。
為了解決這個問題,VBA 現在包含正確的「指標」資料類型:LongPtr。此新資料類型可讓您正確地寫入原始 Declare 陳述式,如下所示:
  1. Declare PtrSafe Function RegOpenKeyA Lib “advapire32.dll” (ByVal hKey as LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As Long
複製代碼
此資料類型和新的 PtrSafe 屬性可讓您在 32 位元或 64 位元系統上使用此 Declare 陳述式。
PtrSafe 屬性會向 VBA 編譯器指示 Declare 陳述式是針對 64 位元版本的 Office 2010。如果沒有此屬性,
在 64 位元系統中使用 Declare 陳述式會導致編譯時期錯誤。請注意,PtrSafe 屬性在 32 位元版本的 Office 2010 上為選用。
這讓現有的 Declare 陳述式可如往常般運作。
作者: joey0415    時間: 2012-8-16 16:01

回復 5# c_c_lai

好像有好一點!不過畫面會出現下面如圖

============================
---------------------------
Microsoft Visual Basic for Applications
---------------------------
編譯錯誤:

沒有定義這個 Sub 或 Function
===============================
[attach]12144[/attach]
作者: joey0415    時間: 2012-8-16 16:26

本帖最後由 joey0415 於 2012-8-16 16:29 編輯

找到方法了!32與64位元都可以用的哦!
  1. '宣告win api函數  , 以下方法是64與32位元都可以用的方式哦!
  2. 'Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

  3. [code]'宣告win api函數  , 以下方法是64與32位元都可以用的方式哦!
  4. 'Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

  5. #If VBA7 Then
  6. Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
  7. #Else
  8. Private Declare Sub Sleep Lib "kernel32" (ByVal ms as Long)
  9. #End If
複製代碼
[attach]12156[/attach]




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)