設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 9429|回復(fù): 7
打印 上一主題 下一主題

[模塊/函數(shù)] Access或VB VBA判斷數(shù)組是否為空的幾種方法

[復(fù)制鏈接]

點擊這里給我發(fā)消息

跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2015-2-14 13:32:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
Access或VB VBA判斷數(shù)組是否為空的幾種方法
方法一:Error方法


就是采用通用的錯誤捕獲功能
On Error Goto 行號       '遇到錯誤,轉(zhuǎn)到行號處處理
On Error Resume Next '忽略錯誤,繼續(xù)執(zhí)行
On Error Goto 0           '強制取消錯誤捕獲功能
Function IsNotEmpty(ByVal sArray As Variant) As Boolean '判斷數(shù)組是否為空
        Dim i     As Long
        IsNotEmpty = True
        On Error GoTo lerr:
        i = UBound(b)
        Exit Function
lerr:
        IsNotEmpty = False
End Function

方法二:CopyMemory方法


VB的數(shù)組都是安全數(shù)組,通過訪問一個結(jié)構(gòu)來確定 數(shù)組內(nèi)容保存位置,上標下標和維數(shù)
安全數(shù)組結(jié)構(gòu)的地址可以用
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
             (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
安全數(shù)組的頭兩位就保存著維數(shù)信息
Option Explicit
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Sub Form_Load()
    Dim MyArr() As Long
    Dim pMyarr As Long
    Dim nDims As Integer
    '從數(shù)據(jù)指針得到SafeArray結(jié)構(gòu)的指針
    CopyMemory pMyarr, ByVal VarPtrArray(MyArr), 4
    If pMyarr = 0 Then
        MsgBox "這個數(shù)組是空數(shù)組"
        '再從這個指針所指地址的頭兩個字節(jié)取出cDims
        CopyMemory nDims, ByVal pMyarr, 2
        MsgBox "這個數(shù)組有" & nDims & "維"
    End If
End Sub

方法三:使用api函數(shù)safearraygetdim()的返回值,返回值值<=0,說明數(shù)組元素個數(shù)為0或者數(shù)組還沒有初始化.

SafeArrayGetDim用來判斷一個數(shù)組的維數(shù),該函數(shù)在MSDN中定義為:
UINT SafeArrayGetDim(
  SAFEARRAY FAR* psa
轉(zhuǎn)換維VB中的語法格式為:
Public Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saArray() As Any) As Long
如果數(shù)組已經(jīng)初始化,則返回非0,否則返回0。
'API判斷數(shù)組為空或沒有初始化
Sub diag()
Dim msg As String
Dim arr1() As String, arr2() As String, arr3() As Date, arr4() As Date, arr5() As Range, arr6() As Range
msg = "arr1 " & IIf(SafeArrayGetDim(arr1) > 0, "數(shù)組不為空!", "數(shù)組為空!")
arr2 = Split("一、二、三、四、五、六", "、")
msg = msg & vbCrLf & "arr2 " & IIf(SafeArrayGetDim(arr2) > 0, "數(shù)組不為空!", "數(shù)組為空!")
msg = msg & vbCrLf & "arr3 " & IIf(SafeArrayGetDim(arr3) > 0, "數(shù)組不為空!", "數(shù)組為空!")
ReDim arr4(1 To 100)
msg = msg & vbCrLf & "arr4 " & IIf(SafeArrayGetDim(arr4) > 0, "數(shù)組不為空!", "數(shù)組為空!")
ReDim arr6(1 To 256, 1 To 65536)
msg = msg & vbCrLf & "arr5 " & IIf(SafeArrayGetDim(arr5) > 0, "數(shù)組不為空!", "數(shù)組為空!")
msg = msg & vbCrLf & "arr6 " & IIf(SafeArrayGetDim(arr6) > 0, "數(shù)組不為空!", "數(shù)組為空!")
MsgBox msg
End Sub

方法四:使用cstr(Join(list[, delimiter]))函數(shù)的返回值是否不等于""


將delimiter參數(shù)設(shè)置為""
例如:if (cstr(join(arr,""))) = "" then msgbox "arr 數(shù)組為空或者尚未初始化"

本帖被以下淘專輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享分享 分享淘帖1 訂閱訂閱

點擊這里給我發(fā)消息

2#
發(fā)表于 2015-2-14 17:12:31 | 只看該作者
很有針對性,不錯,收藏了。

點擊這里給我發(fā)消息

3#
發(fā)表于 2015-2-15 09:22:11 | 只看該作者
學(xué)一招
回復(fù)

使用道具 舉報

點擊這里給我發(fā)消息

4#
發(fā)表于 2015-2-15 22:14:40 | 只看該作者
非常有用的技巧!

點擊這里給我發(fā)消息

5#
發(fā)表于 2015-2-24 06:59:30 來自手機 | 只看該作者
很好的技巧!!
6#
發(fā)表于 2015-3-18 22:45:12 | 只看該作者
不錯不錯 感謝
7#
發(fā)表于 2016-3-25 20:48:09 | 只看該作者
很好,經(jīng)典
回復(fù)

使用道具 舉報

8#
發(fā)表于 2016-8-3 18:02:51 | 只看該作者
學(xué)習(xí)了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 08:33 , Processed in 0.091743 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表