Board logo

標題: [分享] 使用API取得陣列維度 [打印本頁]

作者: Min    時間: 2010-5-9 20:55     標題: 使用API取得陣列維度

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function ArrayPtr Lib "msvbvm60.dll" Alias "VarPtr" (TargetArray() As Any) As Long
Private Sub Form_Load()
    Dim XXX(1, 2, 3, 4) As Byte
    Dim lpArray As Long
    Dim lDim As Long
      
    Call CopyMemory(lpArray, ByVal ArrayPtr(MD_HTML_Value()), 4)
    Call CopyMemory(lDim, ByVal lpArray, 2)
    Debug.Print "維數   =   " & lDim
End Sub
作者: wqfzqgk    時間: 2010-6-28 23:48

MsgBox(System.Windows.Forms.SystemInformation.BootMode.ToString)
        MsgBox(System.Windows.Forms.SystemInformation.WorkingArea.Height)
作者: dechiuan999    時間: 2011-1-31 10:21

閔大版主你好:

   小弟前日在EXCEL VBA發問一則
有關如何得知陣列維數。已承蒙HSIEH版主
大大解惑。同時也告知小弟另有閔大版主的API函數
功能也能得到相同結果。
    小弟也發費多日但仍無法引用版主大大此例如何
改成EXCEL VBA的方式而能得到版主大大所設定的功能。
是否能請版主大大解惑呢?
下列VBA語法為HSIEH版主大大提供如下
Function checkarray(mArray As Variant)
Dim i%, n%
i = 1
On Error Resume Next
Do Until Err.Number = 9   
    n = LBound(mArray, i)   
    If Err.Number = 0 Then i = i + 1   
Loop
    checkarray = i - 1   
End Function

感恩版主大大!
作者: Min    時間: 2011-2-1 07:07

回復 3# dechiuan999

您好 試試看這樣~
作者: dechiuan999    時間: 2011-2-1 11:00

本帖最後由 dechiuan999 於 2011-2-1 11:01 編輯

謝謝版主大大。
小弟揣摩版主大大的範例,
並修改實際例子之後;
卻出現陣列形態不符。
盼版主大大能再指點迷津。
另小弟有一疑惑,如果小弟想多了解
API函數的應用領域,不知如何著手呢?
Sub aa()   
    Dim ar1, ar2, ar3
    Dim mData()
    Dim s%, s1%, n1%, n2%, m%
    Dim mSht1 As Worksheet
    Dim mSht2 As Worksheet
    Dim ar As Variant
    Dim lpArray As Long
    Dim lDim As Long
   
    Set mSht1 = Worksheets(1)      
    With mSht1
        ar1 = .Range("a1:c5")  '二維陣列
        ar2 = .Range("e8:g8")
       ar2 = Application.Transpose(Application.Transpose(ar2))  '二維陣列轉成一維陣列
        ar3 = .Range("h10:j14")  '二維陣列        
      
        ReDim Preserve mData(0)
        mData(0) = ar1
        ReDim Preserve mData(1)
        mData(1) = ar2
        ReDim Preserve mData(2)
        mData(2) = ar3
        
        s = UBound(mData)
        For s1 = 0 To UBound(mData)
        ar = mData(s1)          '如何判斷ar 是一維陣列或是二維陣列呢?
         
         Call CopyMemory(lpArray, ByVal ArrayPtr(ar), 4)   '執行至此出現AR形態不符
       Call CopyMemory(lDim, ByVal lpArray, 2)
        Debug.Print "維數   =   "; lDim
        Next
        
    End With
            
End Sub

感恩版主大大。
作者: Hsieh    時間: 2011-2-1 12:40

回復 5# dechiuan999


    型態宣告的問題
    Dim ar() As Variant
作者: dechiuan999    時間: 2011-2-1 14:44

謝謝二位版主大大。

小弟已測試成功。
感恩大大!




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