- ベストアンサー
エクセルVBAによるマトリクス表の縦配列
エクセルVBAで以下のような処理を行うプログラムを作成したいのですが、 シロウトなんで、なかなかスマートに作れません。 どのようにすればいいかご教示いただけたら有り難いです。 (1)下記のように、縦横のマトリクス表にデータが入力されている。 A B C ・・ 1 2 3 ・ ・ (2)これを別シートに縦に2列にデータを並べるように処理する。 左列には"列項目&行項目"、右列には該当するデータをセットする。 A1 A1のデータ A2 A2のデータ A3 A3のデータ ・ ・ B1 B1のデータ ・ ・ ・ ・ (3)尚、列項目(A.B.C...)と行項目(1.2.3...)の項目数は不定で、セルが空白になるまで、 処理を繰り返すかたちにする。 以上のような条件ですが、よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >(2)これを別シートに縦に2列にデータを並べるように処理する。 > 左列には"列項目&行項目"、右列には該当するデータをセットする。 そうしたら、事実上、データは1列ではありませんか? >左列には"列項目&行項目" >A1 A1のデータ 単に、アドレスのことではありませんか? 列項目&行項目として、例が挙げれている内容とは違うのでしたら、ご指摘ください。 もし、項目として別にあるのでしたら、データの左端上の部分のデータはないことになりますね。 >列項目(A.B.C...)と行項目(1.2.3...)の項目数は不定で、セルが空白になるまで、 よく意味がわかりません。マトリックスで取得したら、もし、項目が別にあるのなら左端上の空白以外には、空白セルはないことになりますが、データの中間地で空白があったら、そこでデータの取得は終わりだということですか? とりあえず、一旦、マトリックスで取得して、2次元配列で、アドレスと値を入れなおして、その配列を、別のシートに貼り付けるという方法です。256*256 以上のデータは取得しても、2列のセルには入りません。 アドレスを入れるところで、時間的なロスが生じています。数値からアドレスに変換するのは、面倒なので、そのままセルにアクセスしてしまいました。 '<標準モジュール> Sub Matrix2Vertical() Dim ArBuf As Variant, myArray As Variant, MaxNum As Long Dim j As Long, i As Long, k As Long, Sh2 As Worksheet '===設定:移し変えるシート================ Set Sh2 = Worksheets("Sheet2") '======================================= With Range("A1").CurrentRegion If .Count = 1 Then _ MsgBox "データがありません。", vbInformation: Exit Sub MaxNum = Application.Min(.Count, Rows.Count) ArBuf = .Value ReDim myArray(.Count - 1, 1) '2次元配列を入れなおし For j = LBound(ArBuf, 2) To UBound(ArBuf, 2) For i = LBound(ArBuf, 1) To UBound(ArBuf, 1) myArray(k, 0) = Cells(i, j).Address(0, 0) myArray(k, 1) = ArBuf(i, j) k = k + 1 Next i If k > MaxNum Then Exit For '多少のズレはあっても問題ないはず Next j End With Application.ScreenUpdating = False Sh2.Range("A1").Resize(MaxNum, 2).Value = myArray Application.ScreenUpdating = True Set Sh2 = Nothing Beep End Sub
その他の回答 (1)
- haukappu
- ベストアンサー率15% (46/296)
(CurrentRegionとか使って)範囲を取得してコピーした後、「形式を選択して貼り付け→行列を入れ替える」で駄目でしょうか?
お礼
ご回答ありがとうございます。 参考にさせて頂きます。
お礼
ご丁寧にありがとうございました。 本当に助かりました! なんとか自分でやろうと、一日やってましたが、 少しずつみえてきました。ご教示頂いた内容を参考に させていただくと、おそらくできると思います。