人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 辦公軟件教程 > 詳細頁面

excel中VarPtr、StrPtr 與 ObjPtr 函數的用法

excel中VarPtr、StrPtr 與 ObjPtr 函數的用法

更新時間:2024-01-23 文章作者:未知 信息來源:網絡 閱讀次數:

Microsoft Excel是Microsoft為使用Windows和Apple Macintosh操作系統的電腦編寫的一款電子表格軟件。直觀的界面、出色的計算功能和圖表工具,再加上成功的市場營銷,使Excel成為最流行的個人計算機數據處理軟件。
excel中VarPtr、StrPtr 和 ObjPtr 函數的用法

一、發展歷史

在 Basic 語言演變成 QBasic,然后到 Visual Basic 之前,VarPtr 函數就已經存在了。開始,這個函數存在于 VB 運行庫 1.0 版中。通過聲明可以調用這個函數:
Declare Function VarPtr Lib "vbrun100.dll" (Var As Any) As Long

數年之后,vbrun100.dll 變成了 msvbvm50.dll,但該函數的入口點卻還在那兒。為了獲取變量的地址,只須將變量名傳遞給該函數就行了。例如:
Dim l As Long
Debug.Print VarPtr(l)

類似地,為了獲取字符串的指針,而非保存字符串的變量的指針,只須在變量名前加上 ByVal 即可。如:
Debug.Print VarPtr(s),VarPtr(ByVal s)

在VB3之前,用這種方法來獲取字符串緩沖的指針是非常普遍的。但在VB4卻遇到了一點麻煩。

ANSI/UNIDCODE問題

這種差異是如何影響 VarPtr 函數的呢?當一個字符串傳遞給 VarPtr 函數時,函數執行后所返回的地址是保存臨時ANSI 字符串的臨時 ANSI 字符串 或變量的地址。換句話說,這個地址并不是你聲明的變量的真正地址。因此,對于字符串變量以及包括字符串的結構來講,這個函數一點用也沒有。

VB5來解決問題

為了能VarPtr能重新發揮作用,VB5 加入了三個針對 VBA 類型庫的入口點。這些入口點為 VarPtr 函數提供了內置的聲明。這三個函數的作用是:

VarPtr:返回變量地址

StrPtr:返回真正的 UNICODE 字符串緩沖區的地址

ObjPtr:返回任何對象變量引用的地址

二、下面是這三個函數的具體用法:

1、StrPtr

該函數主要用來產生高效的 UNICODE API 調用。在 VB4,UNICODE 形式的 API 函數的調用必須借助于 Byte 數組,例如:
Declare Sub MyUnicodeCall Lib "MyUnicodeDll.dll" (pStr as Byte)
Sub MakeCall(MyStr As String)
Dim bTmp() As Byte
bTmp = MyStr & vbNullChar
MyUnicodeCall bTmp(0)
MyStr = bTmp
MyStr = Left(MyStr, Len(MyStr) - 1)
End Sub

如果使用 StrPtr,上面的代碼精簡為:
Declare Sub MyUnicodeCall Lib "MyUnicodeDll.dll" (pStr as Byte)
Sub MakeCall(MyStr As String)
MyUnicodeCall StrPtr(MyStr)
End Sub

VarPtr/StrPtr/ObjPtr 的執行速度非常非常快,因此調用 UNICODE 函數所贊成有系統負擔實際上小于調用相對應的ANSI函數。因為前者不需進行轉換。

StrPtr 還能用于優化 ANSI API 函數的調用。在調用時使用 StrConv 和 StrPtr 就能避免將一個字符串變量多資傳遞給函數以及為每個調用而執行轉換操作所造成的系統負擔。例如原來的:
Declare Sub MyAnsiCall Lib "MyAnsiDll.dll" (ByVal pStr As String)
MyAnsiCall MyStr
?

現在變為:
Declare Sub MyAnsiCall Lib "MyAnsiDll.dll" (ByVal pStr As Long)
MyStr = StrConv(MyStr, vbFromUnicode)
MyAnsiCall StrPtr(MyStr)
MyStr = StrConv(MyStr, vbUnicode) '并不總是要求

StrPtr 還是唯一能直觀地告訴你空字符串和 null 字符串的不同的方法。對于 null 字符串(vbNullString),StrPtr 的返回值為 0,而對于空字符串,函數的返回值為非零。

2、VarPtr

該函數能與要求包含有UNICODE字符串的結構的API調用一起使用。如果將一個 MyUDTVariable 變量(一個自定義類型的變量)傳遞給一個由 ByRef UDTParam As MyUDT定義的參數,就會發生 ANSI/UNICODE 之間的轉換。但是,如果將 VarPtr(MyUDTVariable) 傳遞給由 ByVal UDTParam As Long 定義的參數,則不會發生這樣的轉換。

有一點需要特別注意,在VB中指針的算法非常重要。此外,你必須計算元素的大小,因為VB不會幫你完成這項工作。你還必須處理缺乏無符號長整型數據類型的問題。下面的函數實現了無符號算法
Function UnsingedAdd(ByVal Start As Long, ByVal Incr As Long) As Long
Const SignBit As Long = &H80000000
UnsignedAdd = (Start Xor SignBit) + Incr Xor SignBit
End Function

3、ObjPtr

該函數返回由對象變量引用的接口指針。由于大多數對象都支持多重接口,因此搞清楚地址對應的是對象的哪一個接口就非常重要了。通常個函數用來放在集合中的 對象。通過創建基于對象地址的關鍵字,你就可以在不需要啟遍歷整個集合中所有元素的情況下,輕松地將對象從集合中刪除。在許多情況下,對象地址是唯一可靠 的能作為關鍵字的東西,示例如下:
ObjCol.Add MyObj1, CStr(ObjPtr(MyObj1))
'.....
ObjCol.Remove CStr(ObjPtr(MyObj1))


Excel整體界面趨于平面化,顯得清新簡潔。流暢的動畫和平滑的過渡,帶來不同以往的使用體驗。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 乳山市| 体育| 双牌县| 石楼县| 建瓯市| 全州县| 刚察县| 三原县| 特克斯县| 涿州市| 通海县| 城口县| 沂南县| 综艺| 嘉荫县| 沙田区| 合川市| 罗田县| 邯郸市| 自治县| 佳木斯市| 科尔| 常熟市| 东明县| 康乐县| 包头市| 大石桥市| 宜春市| 蓝山县| 延安市| 安义县| 临武县| 大姚县| 左贡县| 北京市| 珠海市| 新安县| 元江| 金秀| 上林县| 庆元县|