2014-02-06 73 views
0

我有以下代碼中聲明:Excel的VBA GetPrivateProfileString工作2007年,而不是2010

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long 

,我有一個函數來訪問它,如下所示:

Private Function ReadIniFileString(ByVal Sect As String, ByVal Keyname As String) As String 
Dim Worked As Long 
Dim RetStr As String * 128 
Dim StrSize As Long 
Dim iNoOfCharInIni As Long 
Dim sIniString As String 
Dim sProfileString As String 

iNoOfCharInIni = 0 
sIniString = "" 
If Sect = "" Or Keyname = "" Then 
    MsgBox "Section Or Key To Read Not Specified !!!", vbExclamation, "INI" 
Else 
    sProfileString = "" 
RetStr = Space(128) 
StrSize = Len(RetStr) 
Worked = GetPrivateProfileString(Sect, Keyname, "", RetStr, StrSize, IniFileName) 
    If Worked Then 
     iNoOfCharInIni = Worked 
     sIniString = Left$(RetStr, Worked) 
    End If 
End If 
ReadIniFileString = sIniString 
End Function 

此作品2007之下,但我在Excel 2010上得到一個錯誤:

Worked = GetPrivateProfileString(Sect, Keyname, "", RetStr, StrSize, IniFileName) 

我得到一個「無法找到子或函數錯誤」我有se在網上,我應該能夠解決這個問題,通過在PtrSafe聲明函數,並返回一個LongPtr。我已經完成了,但得到了相同的結果!

請任何幫助!

非常感謝!

拉斯

+1

您是否嘗試過刪除您聲明'private'? – Veve

回答

0

你不說的Excel 2010是32位或64。我不知道如果VBA模塊在Excel的64位實例中運行,如果它試圖打電話會做,會發生什麼一個32位的例程,而kernel32.dll是一個32位的庫。由於GetPrivatePorfileString已被棄用,我懷疑它沒有被移植到kernel32.dll的64位對應端口。

+0

這個函數的聲明可以更新爲64位,這裏舉例說明:http://dominogavin.blogspot.fr/2012/02/adjusting-our-word-vba-macros-for.html – Veve

1

要在的Excell的64位版本,你需要將PTRSAFE屬性添加到函數聲明像這樣這項工作:

Declare PtrSafe Function GetPrivateProfileString Lib "kernel32" Alias... 
+0

我可以證實這個解決方案事實上這個功能是起作用的。 –

相關問題