2016-12-07 5 views
2

Visual Basic for Applications(VBA)でコード用のUBoundアプリケーションを探索しようとしています。私は4×2の配列を持っているとしましょう...(A1:B4)と私は行の数を数えたいと思います。私はVBA UBound関数

Function test(list) As Double 
    test = UBound(list) 
End Function 

私の入力が=test(A1:B4)ですが、今のところ私が手に...私のコードは、と思うだろう「#VALUEを!」エラー。返品は4となると思いました。

私は間違っていますか?私は行のコマンドを使用して行の数を取得する方法を知っていますが、私は単にコーディングの練習をしたいです。

答えて

1

Listは配列ではありません。 Range.Valueは範囲から値の配列を返し、Range.Formulaは範囲から数式の配列を返します。

enter image description here

Function test(list As Range) As Double 

    test = UBound(list.Value) 

End Function 
1

あなたが明示的ではないDimlistを行うので、Variantです。したがって、=TEST(A1:B4)に電話するとRangeになり、Arrayにはなりません。 RangeにはUBoundは含まれていませんが、Rows.Countを持っています。

ので:

Function test(list As Range) As Double 
test = list.Rows.Count 
End Function 

は動作します。

それとも、本当にArrayが必要な場合は、あなたができる:

Function test(list As Variant) As Double 
list = list 
test = UBound(list) 
End Function 

list = listには、以下のん:listRange -objectある場合Setをするために使用されていないので、それはArrayに変換暗黙的になりますオブジェクトを設定します。 listが既にArrayの場合は、それ以降もArrayになります。

1

UBound関数は、バリアント配列内の要素を与えるためのもので、範囲を渡します。 2次元の範囲で

Sub mains() 
    Dim myRange As Range, myArray As Variant 
    Set myRange = Range("A1:B4") 
    myArray = myRange.Value 
    Debug.Print test(myArray) 
End Sub 
Function test(list) As Double 

    test = UBound(list) 

End Function 

EDIT(KazimierzJaworで述べたように)あなたが望んでいたように、デフォルトのUBOUNDは、垂直になり、指定したい場合は、オプションのperameterを追加することができます:あなたはこれを試みることができますUBound関数(リスト1)。しかし、あなたが望んだとして、これは4にdefults指定されたデータで

1

あなたがそれゆえ、あなたがのために追加のパラメータを提供する必要があり、2次元配列を持っているようだUBoundのような:

UBound(array, dimension) 

Excelレンジから配列を取得する場合は、1ベース配列よりも覚えておいてください。

Function testArrray(List, Dimmension) 

    Dim ListConverted As Variant 
     ListConverted = List 
    testArrray = UBound(ListConverted, Dimmension) 
End Function 

サンプルコール:=testArrray(G15:H20,1)が正しい結果として6生成

完全なソリューションは、このいずれかのように見えることができます。

0

UBOUNDこれは、関数の行数を取得する方法である。この

dim i(3) 
i(0) = 1 
i(1) =2 
i(2) = 3 

msgbox ubound(i) 
+0

ありがとうございました!それは有り難いです。 – Soto

2

を試してみてください、あなたが範囲に

を渡しているアレイ上で動作する機能です。

Option Explicit 

Function l_number_of_rows(rng_range As Range) As Long 

    l_number_of_rows = rng_range.Rows.Count 

End Function 

ディメンションから必要な場合は、これが解決策です。

Sub test() 

    Dim MyArray(1 To 2, 0 To 3)  As Long 
    MyArray(1, 0) = 10 
    MyArray(1, 1) = 11 
    MyArray(1, 2) = 12 
    MyArray(1, 3) = 13 
    MyArray(2, 0) = 20 
    MyArray(2, 1) = 21 
    MyArray(2, 2) = 22 
    MyArray(2, 3) = 23 

    Debug.Print MyArray(UBound(MyArray), 3) 

End Sub