返回列表 上一主題 發帖

[分享] 使用API取得陣列維度

[分享] 使用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

[版主管理留言]
  • Min(2010/6/29 06:54 AM): 非常感謝您的分享! 這是.NET的方式吧~

MsgBox(System.Windows.Forms.SystemInformation.BootMode.ToString)
        MsgBox(System.Windows.Forms.SystemInformation.WorkingArea.Height)
学习

TOP

閔大版主你好:

   小弟前日在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

感恩版主大大!

TOP

回復 3# dechiuan999

您好 試試看這樣~

Book1.rar (6.19 KB)

若是我回答,使您滿意,請您讓我知道!                  
若是我的回覆,您仍有其他見解,也請您不嗇指教!

TOP

本帖最後由 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

感恩版主大大。

arrTest2.rar (9.33 KB)

TOP

回復 5# dechiuan999


    型態宣告的問題
    Dim ar() As Variant
學海無涯_不恥下問

TOP

謝謝二位版主大大。

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

TOP

        靜思自在 : 原諒別人就是善待自己。
返回列表 上一主題