|
▼kanabun さん:
>シートのレイアウトがこんな風だったとしますと、
>
><Sheet1>
>----------------------------------------------------------------
> A B C D E F G H … AV
>1 品名/日付 5/15 5/16 5/17 5/18 5/19 5/20 5/21 … 6/30
>2 A品名
>3 B品名
>4 C品名
>
><Sheet2>
>-------------------------------
> A B C
>1 品名 日付 数量
>2 A品名 5月15日 100
>3 A品名 5月18日 200
>4 A品名 5月30日 500
>5 B品名 5月15日 100
>
>先に説明した概略手順に対応するコードはこんな風です。
>(エラー処理とかやってません)
>
>Sub Try1()
>
>>'<シート1>
>>'(1) 書き込みたい正味範囲だけの配列を用意します。
>>' 図の ↓部分(行番号, 列番号)
>>' ┌-----------------------------
>>' | (1,1) (1,2) (1,3) (1,4)
>>' | (2,1) (2,2) (2,3) (2,4)
>>' | (3,1) (3,2) (3,3) (3,4)
>>' |
> Dim arry
> Dim 品名 As Range
> Dim 日付 As Range
> Dim 行数 As Long, 列数 As Long
> With Sheets("Sheet1")
> Set 品名 = .Range("A2", .Range("A65536").End(xlUp))
> Set 日付 = .Range("B1", .Range("IV1").End(xlToLeft))
> End With
> 行数 = 品名.Rows.Count
> 列数 = 日付.Columns.Count
> ReDim arry(1 To 行数, 1 To 列数)
>
>
>>'(2)品名と行番号の対応表を用意します。
>>' 「A品名」といったら、行番号1 が、
>>' 「B品名」で問い合わせたら、行番号2が返るようなシステムです。
>>' ・・・
>>' これには Dictionary オブジェクトを使います。
>>' dic("A品名") = 1
>>' dic("B品名") = 2
>>' dic("C品名") = 3
>>' と、
>>' 品名をキーに、行番号をアイテムとして辞書に記憶しておくと、
>>' 毎回A列を検索しなくても、ある品名に対応する行番号が
>>' 行番号 = dic(品名)
>>' のようにたちどころに得られます。
> Dim 品名List, Ls
> Dim dic As Object
> Dim i As Long
>
> 品名List = 品名.Value
> Set dic = CreateObject("Scripting.Dictionary")
> For i = 1 To UBound(品名List)
> dic(品名List(i, 1)) = i
> Next
>
>
>>'(3)同様に、日付から列番号が返るような式を用意します。
>>' 上の例ですと, 5/15 が 1列目なので、
>>' ある日付の列番号 は (ある日付 - 5/14シリアル値) という式
>>' でもいちおう列番号が得られそうです。
>>'
> Dim date0 As Long
> date0 = 日付.Item(1).Value2 - 1 'つまり 5/14のシリアル値
>
>>'(4)
>>' (1)の配列と (2)(3) を予備調査したら、
>>' データベースを上から順に読んでいき、
>>' 行番号 = dic("A品名")
>>' 列番号 = #5/1/2008# - #5/14/2008#
>>' 配列(行番号, 列番号) = 100
>>'のように 順に配列内の適切な位置に データを代入していき、
>>'
> Dim data
> Dim y As Long, x As Long
> With Sheets("Sheet2")
> data = .Range("A2", .Range("A65536").End(xlUp)).Resize(, 3).Value
> End With
> For i = 1 To UBound(data)
> y = dic(data(i, 1))
> x = CLng(data(i, 2)) - date0
> arry(y, x) = data(i, 3)
> Next
>
>
>>'(5)最後に シートの[B3]セル以降に 配列を貼り付けます。
> Sheets("Sheet1").Range("B2").Resize(行数, 列数).Value = arry
>
> Set dic = Nothing
>End Sub
2回も回答いただきありがとうございます。
返事がおくれましたのは、試行錯誤していて頭が病んでいました。
書き込みたい正味範囲だけの配列を用意する部分はよくわかりました。
シート1の行数と列数を配列処理するのは、プログラムを見て理解できました
わからないのは、2)品名と行番号の対応表を用意する部分
品名List = 品名.Value この処理ですが品名の値(商品名)だと思いますが、
For i = 1 To UBound(品名List)この文でFor〜Next文1から最大値(添え字?)
の範囲を処理する部分が、前に書いてある、
dic("A品名") = 1
>' dic("B品名") = 2
>' dic("C品名") = 3
を辞書に登録してないとうごかないのでしょうか?
上記登録は、モジュールにするのだとおもいますが、どこに入力しておくと処理
されるのでしょうか?
後Dim date0 As Long
date0 = 日付.Item(1).Value2 - 1 'つまり 5/14のシリアル値
のItem(1).Value2-1 ’5/14を求める理由がわからない
x = CLng(data(i, 2)) - date0’
この部分の意味がわかりません
後まったくそのまま使用して下記部分でデバッグがでます
arry(y, x) = data(i, 3) 'インデックスが有効範囲にありませんと表示される
何回かよみなおしていますが、文章読解能力がないようです(悲)
T-k
|
|