• ベストアンサー

Excel VBA 2次元配列を使った具体サンプル

tsubuyukiの回答

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.6

A列=あ行~J列=わ行 として五十音表を作ってみたけど・・ 良く考えたら、五十音表って右から始まるよね(汗)。 ・・・という状況(実際にあるかどうかわかりませんが)の時に 微妙に役に立つかもしれないサンプルです。 Sub Sample() Dim myList() As String    '配列を宣言 Dim myRow As Long, myColumn As Long Dim i As Long, j As Long ' 行列数を確認   myRow = Cells(Rows.Count, 1).End(xlUp).Row   myColumn = Cells(1, Columns.Count).End(xlToLeft).Column ' 配列の行列を、データの行列数に拡張   ReDim myList(myRow, myColumn) ' セルの内容を順に配列に格納   For j = 1 To myColumn     For i = 1 To myRow       Cells(i, j).Select       myList(i, j) = Cells(i, j)     Next i   Next j ' 元の表の10行下に左右を入れ替えつつ、配列から取り出し   For j = myColumn To 1 Step -1     For i = 1 To myRow       Cells(i + 10, j).Select       Cells(i + 10, j) = myList(i, myColumn - j + 1)     Next i   Next j End Sub サンプルと呼べるほど大袈裟なものではありませんが、一応。 ステップインで動かすと、何かが掴めるかもしれません。 本当は二次元配列の開始位置は「0,0」なのですが・・ 面倒なので「0,0」は無視して、「1,1」から使い始めているのが手抜きです。 まぁ要するに、他の方もおっしゃっていますが 「ワークシートのイメージそのまま」ですよ。 難しく考えるとどんどんハマりますから、簡単なところから徐々に行くのがミソです。

mezzanine_jog
質問者

お礼

少しイメージがつかめてきました。 サンプルもありがとうございました。 勉強します。

関連するQ&A

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • Excel VBA 2次元配列の一部をセルに出す

    Excel VBAで2次元配列中の一つの次元をセルに一発(For等でループせずに)で縦方向に書きたいのですが、何か良い方法は有るでしょうか。 例 Dim tmp(2, 2) As String tmp(0, 0) = "A"     : tmp(0, 1) = "B"  :  tmp(0, 2) = "C" tmp(1, 0) = "D"    : tmp(1, 1) = "E"    : tmp(1, 2) = "F" tmp(2, 0) = "G"    : tmp(2, 1) = "H" :   tmp(2, 2) = "I"   セル B1 ~ B3 に tmp(1,0)~temp(1,2)の出力したい ( セル B1に D、セルB2に E、 セル B31に F が入る) Transposeをみたのですが、一次元配列が前提のようです。 2次元配列の要素の一つを一次元にする方法でも構いません。   よろしくお願いします。

  • 2次元配列がわかりやすく記述されたおすすめの書籍はありませんか?

    こんばんは、皆さん。 2次元配列がわかりやすく説明されているおすすめの本はありませんか? リファレンスも怪しいので、そこから丁寧に解説されていて、 2次元配列を中心に、多次元配列にも触れられている本を探しています。 私の技術レベルを持っている本で表すと以下のとおりです。 ・Perlの絵本(一通り理解しました) ・技術評論社のすぐわかるPerl(一通り理解しました) ・ASCII社のPerl/CGIスクリプト入門(CGIの前までは理解しました) これらの本には2次元配列については触れられておらず、 まだ自分には早いのかとも思いましたが、必要に迫られています。 アマゾンの評価は、具体的にこの項目についてはどうだといった情報が載っていないため、参考にできませんでした。 権威ある分厚い本は、持っている本を完全に理解してからにしようと思っています。 Perlの絵本くらいわかりやすく図解されているとありがたいです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Excel VBA 配列の分割について

    Excel VBAでコーディングしていますが 行き詰っているのでお助け下さい。 (1)二次元配列に格納されている値の中から 特定の値が格納されている位置をループを使わず 取得したいのですがその方法が分かりません。 <例>  Dim x(2,2) As Valiant   x(0,0) = "あああ"   x(0,1) = "いいい"   x(0,2) = "ううう"   x(1,1) = "えええ"      ・      ・      ・ この配列から"えええ"が格納されている位置をループを使わず 取得する方法を教えてください。 ⇒ 1, 1 (2)二次元配列の指定した列(?)を一次元配列に 格納する方法も重ねて教えてください。 以上、よろしくお願いします。

  • 2次元配列の使い方

    Access 2013 vba メイン画面に、2つのサブフォーム(共に帳票)があり 親→子→孫 となっています。 この時、親、子、孫のレコードを取得して ある書類を作成しエクセルに出力しようとしています。 この場合、親のデータは普通に変数Aに入れて 子のデータは一次元配列B()に入れ 孫のデータは一次元配列C(0)~C(3)に入れたものを、更に子用の一次元配列B1()~B4()に入れるように作りにしようと考えています。 この場合、 子の画面で次の2レコード目に進んだ時、子画面用のB1...B4の配列変数に入れている孫のC(0)~C(3)の配列の中身は、子画面の一レコードと二レコード目では同じものになるのでしょうか。 もし、同じものになるのであれば、この方法は使えないと思っていますが。。。 他に何か良い方法はありますでしょうか。 Accessで、クラスを作って、それを配列変数に入れるとか・・・ よろしくお願いします。

  • エクセルで「3次元配列」表の作成方法

    エクセルで「3次元配列」表の作成方法 エクセルの表は、縦横の2次元配列と言えるでしょう。 そのため、縦を顧客とし、横を月とし、月毎の顧客別売り上げのような表は見やすく表現できるし、それに対応した関数も沢山あります。 これに対し、3次元以上の配列を表現するには長けていないと思います。 私は、月、顧客、製品別に、コスト、売り上げを計算する3(4?)次元のデータを扱いたいのですが、合理的な方法はないでしょうか? エクセルに詳しくない人でも、顧客や製品を新たに追加できるようなものを作りたいのですが・・・。 今思いついた方法は、顧客リストシートと製品リストシートを作成する方法ですが、それを参照する製品は400種類、顧客は18社ですので、製品毎、顧客ごとにシートを作るのは現実的ではありません。

  • エクセル(VBA)の空白配列の削除について

    エクセルのVBAで配列を使おうと考えています。 データ配列 = Split(データ源, Chr(13)) として、1次元配列に取り込んだところ、chr(10)だけが入力されたデータ配列(?)が出来てしまいました。このデータ配列を詰めたいのですが、何かいい方法が無いでしょうか?教えてください。 元の配列 データ配列(0)  "てすと1" データ配列(1)  chr(10) データ配列(2)  "テスト2" とすれば、 詰めたあと、 データ配列(0)  "てすと1" データ配列(1)  "テスト2" となるようにしたいのです。(配列の最大数が減る必要が必ずしもありません。) for each で回せばいいのでしょうか? Dim 仮 AS Variant for Each 仮 In データ配列    処理をここに書く Next では、上手く行きませんでした。 どなたか?詳しい方がいらっしゃいましたら教えてください。宜しくお願い致します。

  • ExcelのVBAにつきまして

    ExcelのVBAを勉強中です。入門書を読みました。「なるほど!」と理解できたのですが1から組むとなるとまだまだ実力不足です。サンプル集を購入してそれで理解を深めようと考えていますがVBAの文法書のような物はありますか?またもっと効率のよい勉強方法をご存知の方がいらっしゃいましたら教えてください。宜しくお願い致します。

  • VBからDLLへ多次元配列を渡す/配列の添え字

    C++で作ったdllにVBAから配列を渡して、計算結果を再びVBAに戻して、アウトプットはVBAで、ということをしています。(経験豊富な方への相談です。) 具体的には、渡したい配列の先頭アドレスをlong型で記憶し、そのlong型の配列を受け渡ししています。 ただ、ご存知の方が多いかもしれませんが、VBAとC++では配列の添え字の順序が逆になっており、非常に面倒です。どういうことかといいますと、 Dim array(0 to 4, 0 to 9) as long をdllに渡し、array(2,6)を参照したい場合、C++では(Cでの配列名をc_arrayとし、これに先頭アドレスを入れると)、 c_array[(4+1)*6 + 2 ]; としなければならないと思います。これをプリプロセッサで #define C_ARRAY(a,b) c_array[(4+1)*b + a] としたらVBでの配列の感覚で扱えますが、この擬似配列C_ARRAY(a,b)を関数に渡すときなどは結局同じ混乱が再び生じることになってしまいます。 これを、何らかの方法で、簡潔に解決することはできないものでしょうか? VBA(エクセルを念頭においています)のほうで配列の添え字の順序をC++のそれに沿うように変更できたりしたら非常にうれしいですが、無理でしょうか?

  • エクセル 動的配列とPF使用量の関係について

    皆様にいつもご指導いただきありがとうございます。 エクセルでVBAを使えるようになり、仕事もはかどるように なってきており、誠に感謝しております。 今回ご質問させていただく件なのですが、 最近は多次元(主に2次元又は3次元)の配列を用いて VBAを作ったりすることがあるのですが、そこで疑問といいますか 大丈夫なのかな?と心配になることがあります。 と言うのは 2次元で配列を格納した後、PF使用量を見ると増えたままに なっているので、PCの処理能力に影響していくるのではと 思っております。 例えば、セルに  A B C D E F G H I J  1 1 2 3 4 5 6 7 8 9 10 ~ 9 81 82 83 84 85 86 87 88 89 90 と入力されているセルに 下記のVBAをVBAを動かすと20MBほどPF使用量が増加したまま になっております。 初期化を行っていても、PF使用量が増えたままなので、 大丈夫なのかな?と思っております。 今後とも配列を用いてVBAを記述していく事が多くなると 思いますので、その辺りの注意点などあれば、ご指導いただければ と思っております。宜しくお願いいたします。 Sub 配列テスト() Dim testData() As Variant testData = Worksheets("Sheet1").Cell.(1,1).CurrentRegion.Value Erase testData End Sub また、PF使用量と言うもの自体も正確に理解しきれていない 部分も多くありますので、的を得た質問になっていないかも しれませんが、その辺りははご了承くださいませ。