質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

6161閲覧

2次元配列のループ文について質問です。

xss

総合スコア36

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/11/22 04:41

編集2017/11/22 05:36

###前提・実現したいこと
2次元配列numXとnumYがあります。
numXとnumYにはDBから取得したレコードの情報が要素順で格納されてます。
①DBから取得したレコード例:カラム1:所属(1 or 2) カラム2:名前 カラム3:年齢 カラム4:性別
②numXとnumYの中身
(0,0) 値"1"
(0,1) 値"田中"
(0,2) 値"28"
(0,3) 値"男"
(1,0) 値"2"
(1,1) 値"山田"
(1,2) 値"23"
(1,3) 値"女"

今回はnumXが(2,3)、numYが(0,3)とします。
なので、
numX  numY
要素数 要素数
0 ー  0
1 /
2 /
ような感じで2次元配列のnumX(最新情報)とnumY(前回の情報)をFor文で回し、
numX要素数0 numY要素数0
(0,0) 値"1" = (0,0) 値"1"
(0,1) 値"田中" = (0,1) 値"岸田"
(0,2) 値"28"  =  (0,2) 値"28"
(0,3) 値"男" = (0,3) 値"女"
のようにnumXとnumYの要素を比べて値を比較して行きたいのですが、回したらエラーで落ちてしまいます。
どう記述すれば実現出来るのでしょうか?
ご教授をよろしくお願いします。

###発生している問題・エラーメッセージ
System.IndexOutOfRangeException: 'インデックスが配列の境界外です。'

###該当のソースコード

' マーク(文字列) Dim strMark As String = String.Empty '最新numX For x As Integer = 0 To numX.GetLength(0) - 1 '初期化処理 strMark = "" '履歴numY For y As Integer = 0 To NumY.GetLength(0) - 1 '同じ所属(1 or 2)ならば比較する If numX.GetValue(x, 0).Equals(numY.GetValue(y, 0)) Then 'カラム数分回し比較する For z As Integer = 0 To numX.GetLength(1) - 1 '同じ所属の各項目を比較し、値に差異があった場合はマークに「A」を代入する If numX.GetValue(x, z).Equals(numY.GetValue(y, z)) Then strMark = "A" Exit For End If Next End If Next y '同じ所属でなかったら「B」を代入する。 strMark = "B" Next x

###補足情報(言語/FW/ツール等のバージョンなど)
開発環境 VisualStudio2017 vb.net

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

実際のデータが提示されていないので憶測ですが、IndexOutOfRangeExceptionが出ているということは範囲外の配列を参照していることになります。
配列の参照箇所は4箇所あります。

VBA

1' ①② 2If numX.GetValue(x, 0).Equals(numY.GetValue(y, 0)) Then 3' ③④ 4If numX.GetValue(x, z).Equals(numY.GetValue(y, z)) Then

①②③は、numXまたはnumYのGetLengthの範囲内で参照しているので問題なし。
④はnumYの参照に対してnumXの要素数(z)に依存してしまっています。
numY.GetValue(y, z) ← zはnumXの要素数でループしている。
つまりnumXとnumYで2次元目の要素数が異なる(numYが少ない)のではないでしょうか。

投稿2017/11/22 06:06

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xss

2017/11/30 00:54

ttyp03さん回答ありがとうございます。 検証したところそのようでした。 ご指摘感謝します。
guest

0

SQL上で比較する方が良いように思います。
それができないのは、numYのデータがデータベース上にないからでしょうか。
その場合、LINQの使用も検討できるかと思います。

投稿2017/11/22 05:37

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xss

2017/11/30 00:52

suyamaさん回答ありがとうございます。 numYにもnumXのようにデータが入っていましてこの説明ではそうとられても仕方ないです。 LINQ使ったことないですが参考になります。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問