No.11ベストアンサー
- 回答日時:
試験がてらに作ってみました、
Dictionaryの2段重ね+.NET Frameworkの ArrayList
Sub megu2()
Dim Dic As Object
Dim r As Range, rr As Range
Dim key1, key2, i As Integer
Set Dic = CreateObject("Scripting.Dictionary")
For Each r In Range("A1", Cells(Rows.Count, "A").End(xlUp))
If Not Dic.Exists(r.Value) Then Dic.Add r.Value, CreateObject("Scripting.Dictionary")
If Not Dic(r.Value).Exists(r.Offset(, 1).Value) Then Dic(r.Value).Add r.Offset(, 1).Value, CreateObject("System.Collections.ArrayList")
Dic(r.Value)(r.Offset(, 1).Value).Add (r.Offset(, 2).Value)
Next
Set rr = Range("E1")
For Each key1 In Dic.keys
rr.Value = key1
For Each key2 In Dic(key1).keys
Set rr = rr.Offset(1)
rr.Offset(, 1).Value = key2
Set rr = rr.Offset(1)
For i = 0 To Dic(key1)(key2).Count - 1
rr.Offset(i, 2).Value = Dic(key1)(key2)(i)
Next
Set rr = rr.Offset(Dic(key1)(key2).Count - 1)
Next
Set rr = rr.Offset(1)
Next
Set Dic = Nothing
End Sub
でも実際は他の方法でも出来るでしょうし、ジャグ配列はどのような時に使うかより問題解決時の1つの手段だと思いますよ。
No.10
- 回答日時:
質問はサンプルでしたっけ。
取り敢ず私は通常の使い方はしていなく(文字列型とか数値型とか)なので今回はDictionaryオブジェクトと.NET Frameworkの ArrayList と組み合わせたモドキな物を
書きました。
データと結果は画像にて。
分類と名称がバラバラに並んでいたとして、分類毎に横並びに換える物です。
Sub megu()
Dim Dic As Object
Dim r1 As Range, r2 As Range
Dim i As Integer, key
Set Dic = CreateObject("Scripting.Dictionary")
For Each r1 In Range("A1", Cells(Rows.Count, 1).End(xlUp))
If Not Dic.exists(r1.Value) Then Dic.Add r1.Value, CreateObject("System.Collections.ArrayList")
Dic(r1.Value).Add (r1.Offset(, 1).Value)
Next
Set r2 = Range("D1")
For Each key In Dic.Keys
r2.Value = key
Set r2 = r2.Offset(1)
For i = 0 To Dic(key).Count - 1
r2.Offset(, i + 1).Value = Dic(key)(i) ' ジャグ配列モドキ
Next
Set r2 = r2.Offset(2)
Next
Set Dic = Nothing
End Sub
No.9
- 回答日時:
No.4のお礼について。
>C#はエクセルで使用できるのでしょうか。
ん~、まだ経験はしていませんが。
やりたい作業をdllと言う拡張子のファイルに纏めて作成しておき、
そこに対して値を与え結果を得る事は可能なのかも知れません。
ただVBA自体が古いVBに近いのでもしかすると今の.NET以前の
VBかVC++などの方になるかもです。
C#(VC#)は.NETになって以降出てきた物のはずですので。
それにこれまで記載したのはVisualStudioと言う開発環境の中の言語というより、
基盤となる.NET Frameworkが持つ機能の一部を使っているだけです。
でもMicrosoftも最新の機能をVBAで使えるようにとはしていなく、あくまで初期の頃のほんの一部にしか過ぎません。
(私は古いMicrosoftOfficeしかないので検証した訳ではないのですが、多分そうだと思います。それに今後はPythonになるとかなんとか話も聞こえてきますし。)
No.7
- 回答日時:
No.3 で私が書いたのは、あくまでも、VBAの話です。
>>myPoint = myArr(2, 3)
>って多次元配列とは違うのでしょうか?
表を取り出した時に、ジャグになるという認識でしたが、読み込みのスタイルで書き直してみました。添付画像のようなスタイルになります。これなら、文句はでないと思います。
コードは見えるとは思いますが、配列を作ってその配列を入れていくことになります。
No.6
- 回答日時:
No.4です。
No,5さんへ
>ListやArrayListがVBAで使用できるということを初めて知りました。
私も書いててVBAとVBでごっちゃになりましたが、VBAで使えたのは
System.Collections.ArrayList
System.Collections.SortedList
などですね。(しかも古い.NET 2.0位までのGenericではない方です。なので最新のOSだと古い.NET Frameworkが必要かも)
ListクラスはGenericなので撃沈しました。
No.5
- 回答日時:
> ジャグ配列とはどういうときに使用するのか
多次元配列で、各次元の要素数が定まらない場合に良く使用します。
データを要素として追加していくので最終的に要素が幾つになるかわからない場合とか?
例えば学校の全生徒の情報を配列に読み込ませて、何かを行いたい場合とか(実際にそういうケースがあるかは知りません)
data = Array() '空の配列を作成
データ読み込み
data(grade)(class)(id)で各データにアクセス
grade:学年番号
class:クラス番号
id:生徒の番号
当然、各学年のクラス数、各クラスの生徒数は異なります。
> てっきりジャグ配列って
私もNo.4さんと同じ認識です。
だからセル上に作成した表などのデータを処理する場合にはあまり使わないのではないかと思います。
> ジャグ配列
> 配列の配列」の場合、内側の配列について、要素数が揃っていることを要求しないデータ構造であることもある。ジャグ配列 (jagged array)、不規則配列などと言う。
https://ja.wikipedia.org/wiki/%E9%85%8D%E5%88%97 …
VBAだとこんな感じ?
Dim ary As Variant
ary = Array(Array(1, 2, 3), _
Array(4, 5, 6, 7), _
Array(8, 9))
MsgBox UBound(ary) ' -> 2
MsgBox UBound(ary(0)) ' -> 2
MsgBox UBound(ary(1)) ' -> 3
MsgBox UBound(ary(2)) ' -> 1
MsgBox ary(0)(0) ' -> 1
MsgBox ary(1)(0) ' -> 4
MsgBox ary(2)(0) ' -> 8
ReDim Preserve ary(UBound(ary) + 1)
ary(UBound(ary)) = Array(10, 11)
MsgBox ary(3)(0) ' -> 10
ListやArrayListがVBAで使用できるということを初めて知りました。いままでは類似のクラスを定義して使用していました。今度試してみます。(確かにReDimは煩わしいですね)
No.4
- 回答日時:
No.1です。
私の不勉強ですかね?
No.3さんの
>myPoint = myArr(2, 3)
って多次元配列とは違うのでしょうか?
てっきりジャグ配列って(例題がC#で申し訳ないですが)
int[][] myArr = new int[][]{
new int[]{1,2,3},
new int[]{1,2,3,4},
new int[]{1,2}};
textBox1.Text = myArr[1][3].ToString(); // 4 が表示(Indexは0から始まるのでそれぞれが-1の位置になる)
こうゆうものかと思いこんでました。
No.3
- 回答日時:
こんばんは。
ジャグ配列というのは、多段階配列の一種ですが、Excelでは、一般的なもので、表の構造をそのまま写し取れば、シャグ配列になります。配列の中にまた配列があるようなもののです。
添付画像でみたとおり、縦横格子のマトリックス状になっています。
myArr =Range("A1:D3").Value
● 表を表のままに一気に取り扱う時は便利です。
myPoint = myArr(2, 3)
は、データが、A1から始まっていれば、myArr(2,3)は、2列の3行目、つまり、B3を表します。
事実上、2次元配列ですから、そのまま扱わない限りは、1次元に戻して扱ったほうが早かったりします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 PCとスマホのテンキー配列の違いの由来は? 2 2023/08/19 11:03
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- 写真 写真(画像)編集スキルを質問する時 1 2022/12/07 14:14
- C言語・C++・C# C言語 配列とポインタについて 2 2022/06/02 11:53
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- 格安スマホ・SIMフリースマホ 楽天モバイルスマホを使用しているのですが、毎回画面上に、刃物のカタログが出てきます。買ったこともない 3 2022/12/25 21:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで配列の計算
-
パソコンキーボードで時分秒を...
-
EXCEL VBA で、0から?1から?
-
VB.net 引数で配列変数を渡す際...
-
C#の質問
-
VBでbyte配列型のインスタンス...
-
VBで作った乱数を一度も重複さ...
-
このプログラミングの問題を教...
-
マップチップの当たり判定の出し方
-
ジャグ配列とは
-
IF関数でEmpty値を設定する方法。
-
C#でのコントロール配列について
-
空き番号探し
-
五目並べのプログラムを配列と...
-
javaプログラムについて
-
排列と配列の漢字の使い分けは
-
複数のテキストボックスに同じ...
-
ログデータを表示するグラフに...
-
遅延バインディングを使用でき...
-
動的配列が存在(要素が有る)か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで配列の計算
-
IF関数でEmpty値を設定する方法。
-
パソコンキーボードで時分秒を...
-
EXCEL VBA で、0から?1から?
-
C言語 重複しない4ケタの乱数...
-
変数を動的に作るには?
-
VB.net 引数で配列変数を渡す際...
-
応用情報技術者試験の令和元年...
-
動的配列が存在(要素が有る)か...
-
VBで作った乱数を一度も重複さ...
-
VBでbyte配列型のインスタンス...
-
配列の要素数を超えた参照のコ...
-
複数のテキストボックスに同じ...
-
遅延バインディングを使用でき...
-
Visual C++ でコントロールを...
-
Excel VBAで配列の途中から(X)M...
-
C++、クラスメンバの構造体配列...
-
C言語で3次元配列の課題をして...
-
For文と配列
-
【MFC】GetCount()とGetSize()...
おすすめ情報