2009-10-10 12 views
7

私は少しのコードに苦労していて、それを回避することはできません... 配列のセルの範囲から配列を取得しようとしていますしかし、1要素幅であることが示されている。私の理解アイテムごとなどExcel VBAでの範囲からの配列

Dim item As Variant 
MsgBox Range("D19:H19").Count  
item = Range("D19:H19").Value 
MsgBox LBound(item) & " " & UBound(item) 

2D配列が含まれている必要があります...しかし、私は次のような結果に 第一のMsgBoxプリント5枚の 第二のMsgBoxプリント1 1

を取得しています:さて、ここで
コードです何がうまくいかないの?

+0

は奇妙に思えます。範囲の最初の値を返していますか? – dave

+0

一般に、VBAは第1次元の行の値と第2次元の列の値を持つ2D配列を返しますが、ここでは1行に5つのセルを持つ範囲を探しています。 2d配列が返されます... –

+0

@dave:はい、その範囲の最初の値を返します...それがなぜそうしているのか? –

答えて

11

問題が

jtolleがLBOUNDとUBound関数について正しかったLBOUNDとUBound関数です。

LBound(item, 2) 

UBound(item, 2) 

ただし、項目を配列として淡色表示することはできません(エラーが発生します)。

私は、これはあなたがIN句のためにそれに参加する1次元配列を、必要な場合、たとえば、あなたがあなたの範囲を移調する必要がありますが

Dim item As Variant 
MsgBox Range("D19:H19").Count 
item = Range("D19:H19").Value 

MsgBox LBound(item, 2) & " " & UBound(item, 2) 

For i = LBound(item, 2) To UBound(item, 2) 
    MsgBox item(1, i) 
Next 
+0

正しいです。私の編集は、RangeオブジェクトのValueプロパティを取得してitemに入れることで返される配列の形式を記述するためのものでした。私は、項目が配列として宣言されるべきであることを示唆するつもりはなく、一度割り当てられると、そのように宣言された変数と同じに見えるでしょう。 – jtolle

+0

@imfrancisd:チャームのように動作します!私はまだ何が間違っていたのか分からなかった、私はVBAの配列の概念を理解していないようだ。 –

1

これは正しいです。あなたはセルのアレイを選択した場合でも、あなたはまだ

.Value 

だけあなたのコンテンツを取得します(この配列の項目を通って、タブ付き例えばステップ)配列のうちの1つのセルを選択するオプションがあります現在選択されているセルを1つ選択します。

あなたは、配列の列挙をする場合はH19「は」それぞれの「e」によって含まれるまで、あなたが呼び出し、そのD19と仮定するとRange -object

.Cells() -methodを呼び出すことができ

Range("D19:H19").Cells(2) 

"b"を返します。これは1ベースの配列であり、2次元であることに注意してください。 Cells()は、選択の起点からの内側オフセットを指定するために最大で2つのパラメータをとります。 ...明確

希望は予想通り

+0

ここでのコードスニペットは、「ワークシートから値を取り出して配列を埋める」セクションのhttp://support.microsoft.com/kb/213798にも同様のコードが表示されているので、なぜコードが機能していないのでしょうか? –

+0

これをExcel 2k3でテストしました。おそらく、これはValueが2次元である可能性があるためです... 'lbound'は、次元と呼ばれるものを表現する第2引数をとります。どのパラメータがどの値に対応しているかわからない。 'VarType(Range(" D19:H19 ")。Value)'とは何ですか?それは 'vbArray'でなければなりません...あなたは' Ubound(item、1) 'の代わりに' Ubound(1) 'を試してみるかもしれません。 – Atmocreations

+0

私はUbound(item、1) 2番目のMsgBoxの出力から。 (Range( "D19:H19")。値)は返さなければなりません...私は本当に確信していないと思います。コードサンプルを扱っています。 –

2

あなたの項目が2次元配列が含まれている必要がありみなします。コードにブレークポイントを置き、VBAエディタの小さな「ローカル」ウィンドウを見ると、そのことが分かります。 LBoundとUBoundへの呼び出しは、最初の次元で境界を取得しています。あなたがLbound(item、2)とUBound(item、2)を呼び出すと、期待通りに1と5が得られるはずです。

EDIT: あなたは割り当てを行った後、アイテムは、あなたがそのように宣言している可能性が何かのようになり、次のとおりです。(5への1対1、1)

薄暗い項目

ワンVBAプログラミングのベーンの中で、配列は任意の下限を持つことができます。したがって、すべてのコードでそのことを認識する必要があります。

+0

これをチェックして投稿してください!... –

0

たいものだと思います。 私は一度、このようなデータの列に対して、行の二回転置する必要が見つけた:遊びの価値

Dim rngRow As Range, rngColumn As Range 

Set rngRow = Sheets(1).Range("A1", "Z1") 
Set rngColumn = Sheets(1).Range("A1", "A20") 

Dim arrRowValues, arrColValues 
arrRowValues = WorksheetFunction.Transpose(WorksheetFunction.Transpose(rngRow)) 
arrColValues = WorksheetFunction.Transpose(rngColumn) 

Dim numList As String, stringList As String 
numList = Join(arrRowValues, ",") 
stringList = "'" & Join(arrColValues, "','") & "'" 

1

このお試しください:私は、VBAの専門家だが、範囲(または配列)の値をとる

Dim item As Variant 
MsgBox Range("D19:H19").Count 
item = Application.Transpose(Range("D19:H19").Value) 
MsgBox LBound(item) & " " & UBound(item) 
+0

私は "Transpose"が列のためだと思った...とにかくこれをチェックアウトするだろう... –

+0

FYI 、転記はExcel 2003では利用できません。 – ErikE

+1

これは面白いことですが、それが私がコードを書いた場所です。 – JimmyPena