Microsoft Access 掲示板

EXCELのデータを連想配列に入れる

4 コメント
views
4 フォロー

sheet1のデータです。

orange 100
apple 200

    With Sheets("test")

      Dim flArray As Dictionary
      Set flArray = New Dictionary 'Dim flArray As New Dictionaryと、2つをまとめて表記する事も可

    For i = 1 To 2
      flArray.Add .Cells(i, 1), .Cells(i, 2)
     Next
    End with

     Debug.Print flArray("apple")

データが、格納できないのは何故なのでしょうか?
call flArray.Add (.Cells(i, 1), .Cells(i, 2))
でも、うまくいきません。

txtの場合は、問題なく取り込めるのですが、
ECELのデータを取り込み時は、なにか必要になるのでしょうか?

タークン
作成: 2024/03/21 (木) 21:58:47
通報 ...
1
hatena 2024/03/21 (木) 23:10:05 修正
   flArray.Add .Cells(i, 1), .Cells(i, 2)

とすると、セルの値ではなく、キーとアイテムにセルオブジェクトがセットされてしまいます。
下記のようにValueを明示的に指定するようにしましょう。

  flArray.Add .Cells(i, 1).Value, .Cells(i, 2).Value

ただし、.Cells(i, 1).Value に重複がないことが前提です。
重複があるとエラーになります。

2
タークン 2024/03/22 (金) 16:40:06 7a0a1@2705a

ありがとうございました。
.Valueを入れないと、セルの枠を指定することになって、中身が入らないようですね。
あと、.Valueを付ければ取り込めるのですが、
要素がバリアント型として取り込まれているため、
flArray("ほげほげ")では、呼び出せません。

今回は、A列の要素は、すべて文字列だったので、
Dim n as string
n = .Cells(i, 1).value
flArray.Add n, .Cells(i, 2).Value
で逃げ切りましたが、もやもやさま~ずです。
そもそも、データ型が混在している要素が混在してたら逃げ切れないし。

かといって、matchで行数調べて、要素を取り出すのは面倒極まりないわけで。

なにか、良い方法は、ありますでしょうか?

3
hatena 2024/03/22 (金) 16:52:02 修正

下記で文字列として読み込んだらどうでしょう。

flArray.Add .Cells(i, 1).Text, .Cells(i, 2).Value

そもそも、データ型が混在している要素が混在してたら逃げ切れないし。

ここはAccessに関する掲示板なので、データベース観点からいれば、
そもそも、テーブルの列にデータ型が混在しているデータはありえないと思います。

4
タークン 2024/03/22 (金) 18:14:12 7a0a1@2705a

xECELシートからの読込なので、データの混在はあります。
データの保存先は、ACCESSになります。

A列には、フィールド名と紐づく要素。
B列には、保存するデータが並びます。

なので、B列の要素は、データ型はバラバラになるのが普通です。
.textで値だけ取ってきて、’yや#を使い分ければよいわけですね。
これなら、inputでテキストファイルを読み込むのと、同じ要領で処理できます。
.textって、便利ですね。
ありがとうございました。
蛇足ですが、テキストファイルをADOで読み込むのは、データ型の問題で使い物になりませんでした。

本当に助かりました。

XECELシートを使うのは、誰でも簡単に入力できるからです。
リストから選択するようにしておけば、間違いも減ります。

しかし、内容は自分で決められないので、
連想配列に取り込んで、吐き出させるのが無難です。
処理速度は求めないし、データの大きさも知れたものだし、
いつ変更されるかも分からないので、専用画面など作りたくはないのです。