電子書籍の厳選無料作品が豊富!

VBAを学習しており、最近配列という仕組みを知り勉強中です。

array関数の使い方をいくつかサイトを見て回っているのですが、
実務として理解するのに躓いております。

要素の追加は直接指定しかないのでしょうか?
要素が多数ある場合などの使用例がわかりません。
ループやリスト参照等で格納することは可能なのでしょうか?
それとも他の関数を使用するのでしょうか?

Dim A As Variant
A = Array(10,20,30) ’・・・・100までなど多数の場合は?
B = A(2)

A 回答 (5件)

No2です。


Array関数を使うのは、配列を作るときに、同時に初期値(配列の内容)も生成したい場合です。
従って、100個のデータを全て指定するのは、余り実用的ではありません。
従って、配列の要素の数が少なく、しかも、配列生成時に、同時に初期値も格納したい場合のみ、Array関数を使うべきです。
そうでないなら
Dim A(100) as String
Dim B(1000) as Long
のように配列を宣言すべきです。
尚、配列の要素数が事前に決められない場合は、
(例えば、テキストファイルを読み込み1行を1つの要素に格納したい場合、それが何行あるかは、ファイルを読み込んでみないと判らない)
Dim C() as Stringのように()内に数値を記入しないで宣言します。
(この使い方はテクニックが多少必要なので自分で調べてください。それでも判らない場合は質問してください)
    • good
    • 0
この回答へのお礼

tatsu99さん

>Array関数を使うのは、配列を作るときに、同時に初期値(配列の内容)も生成したい場>合です。
> 従って、100個のデータを全て指定するのは、余り実用的ではありません。

そういうことでしたか
納得です!
説明サイトでarray()をよく見かけたので使ってみたいと思ったですが、そういうことですね!
tatsu99さんに教えていただかなければ一生わかりませんでした、
ありがとうございました

お礼日時:2017/05/25 13:13

モヤモヤがもっと膨らむかもしれません。


配列で疑問になった部分は、一通りカバーされているはずです。
ちなみに、Excel VBAでは、一般的に、3次元はありません。使わないという意味です。2次元までです。

以下は、配列を扱うテクニックです。
'------------
Sub Test1()
'文字列の場合
Dim ar
Const myDATA As String = "a,b,c,d,e,f,g"
ar = Split(myDATA, ",")
End Sub
'----------
Sub Test2()
'数値
Dim ar
ar = [{1,2,3,4,5,6,7}]
End Sub
'----------------
Sub Test3()
'ループを使う
Dim ar
Dim Rng As Range
Dim i As Long
For i = 1 To 100
Cells(i, 1).Value = i
Next

Set Rng = Range("A1", Cells(Rows.Count, 1).End(xlUp))
ar = Rng.Value '一括代入
ar = Application.Transpose(ar) '1次元に戻す
End Sub
'----------------
'Dynamic Array
Sub Test4()
'仕切り直し
Dim ar()
Dim i As Long
ReDim ar(1000)
For i = 0 To 99
 ar(i) = i + 1
Next
ReDim Preserve ar(i - 1)
End Sub
'----------------
Sub Test5()
'連想配列
Dim objDic As Object 'New Scripting.Dictionary
Dim i As Long, k As Long
''×Dim i, k as Long ''このように書くと、i は、Variant型になってしまう
Dim Ar
Set objDic = CreateObject("Scripting.Dictionary")
 Randomize
 k = 1
 For i = 1 To 100
  j = Int((100 * Rnd) + 1)
  If Not objDic.exists(j) Then
   objDic.Add j, i
   Cells(k, 1).Value = j
   k = k + 1
  End If
 Next
 Ar = objDic.Keys()
 '並べ替えが必要なら、
 Stop
 Call Test5sort(Ar)
End Sub

Sub Test5sort(ByRef myData)
Dim DataList As Object
Dim Ar()
Dim i As Long
Set DataList = CreateObject("System.Collections.SortedList") '.Net Framework

For i = LBound(myData) To UBound(myData)
 DataList.Add myData(i), i
Next i
ReDim Ar(UBound(myData))
For i = 0 To DataList.Count - 1
 Ar(i) = DataList.GetKey(i) '.GetByIndex(i)
Next i
'一括で貼り付ける方法
 Range("B1").Resize(UBound(Ar()) + 1).Value = Application.Transpose(Ar)
End Sub
    • good
    • 0
この回答へのお礼

WindFallerさん

こんにちわ
ご回答ありがとうございます!

>ちなみに、Excel VBAでは、一般的に、3次元はありません。使わないという意味です。>2次元までです。
なるほど!EXCELやCSVで行う業務は既に配列済みということですね

>Randomize
ほんとうに美しい記述ですね!ここまで使いこなせるのはうらやましいです!
業務でマクロを触っていた程度なのでランダムに出力することもありませんでした。
PHPも学習し始めたので配列のイメージが沸きました。

お礼日時:2017/05/25 13:14

こんばんは。


ほとんど先のお二方に言われてしまいましたが、多次元配列に関して等、補足します。

Excelのワークシート自体が、二次元配列のようなものです。
Dim nums(1 To 100, 1 To 100) As Variant
のような宣言をすれば、
100マス×100マスの表のイメージが出来上がります。
すると、x軸(列)、y軸(行)の感覚で、座標を指定してデータを取得できるわけです。

実はワークブックが三次元配列に相当し、
Dim nums(1 To 100, 1 To 100, 1 To 100) As Variant
と宣言すれば、さらにz軸(シート)を、座標を指定してデータを取得できるわけです。

Dim i As Long
Dim j As Long

For i = 1 To 100
For j = 1 To 100

とし、For文を入れ子にしてよく利用します。
    • good
    • 0
この回答へのお礼

taigoitoさん

こんにちわ
ご回答ありがとうございます!

>Excelのワークシート自体が、二次元配列のようなものです。
>Dim nums(1 To 100, 1 To 100) As Variant
>のような宣言をすれば、
>100マス×100マスの表のイメージが出来上がります。

あ!なるほど!
最近PHPも学習し始めました。
EXCELありきで考えると、実態が既にあるので回りくどく見えますが
PC言語から見れば、この配列の考え方が効いてくるのですね!

お礼日時:2017/05/25 13:13

100個の配列に数値を格納する場合の一例です。


dim A(99) as long
dim i as long
for i = 0 to 99
A(i) = 10 * (i+1)
next
------------
A(0)=10
A(1)=20
A(2)=30
・・・・
A(99)=1000
のように格納されます。
    • good
    • 0
この回答へのお礼

tatsu99さん

こんにちわ
ご回答ありがとうございます!

なるほど、配列の使い方が少しわかってきました。
今の自分にはこの例はしっくりきました。ありがとうございます。

お礼日時:2017/05/25 13:12

B=30


でしょ?

>100までなど多数の場合は?
その為に
Dim userAddress(3) As Variant

userAddress(0) = "東京都"
userAddress(1) = "北海道"
userAddress(2) = "愛知県"

For で100回 まわして (i)で やるのが一般的かな

http://www.officepro.jp/excelvba/array/index6.html
    • good
    • 0
この回答へのお礼

2014itochan さん

こんにちわ
ご回答ありがとうございます!

そうですよね、
いただいた例で47都道府県に増やした場合・・・

For i = 1 To 47
userAddress(i) = Cells(i, 1).Value
Cells(i, 2) = userAddress(i)

Next i

array()の出番がないと感じていました。

お礼日時:2017/05/25 13:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!