お世話になっております。
【現象】
エクセルで配列の加工をするプログラムを作成していますが、
ステップ実行をすれば最後までエラーがなく終了するのに
通常実行すると、「インデックスが有効範囲にありません」というエラーが発生します。
【内容】
配列処理の大まかな流れは以下の通りです。
①メイン関数(②~④を呼び出す)
②配列取得関数(シートから配列を取得)
③配列のチェック&加工関数(行ごとにループを回してます。)
※ここでエラー発生、関数間で配列の参照渡しがうまくいっていないか、
読み込み等に時間がかかってエラーになるのでしょうか?
④配列の出力関数(配列の値をシートに戻す)
宜しくお願い致します。
'******************************************************* 'メイン '******************************************************* Public Sub main() Dim window1 As Window Dim anser As Long Dim arry() As Variant Dim rStart As Long Dim rLast As Long '処理実行 If MakeArry(arry(), rStart, rLast) = 0 Then '配列作成 '配列作成成功 Call Keyword_check(arry(), rStart, rLast) 'キーワードチェック Call out_arry(arry(), rStart, rLast) '配列出力 End If End Sub '******************************************************* '配列作成 '******************************************************* Private Function MakeArry(ByRef arry As Variant, ByRef rStart As Long, ByRef rLast As Long) As Integer '配列の必要最小範囲を調べる Range("G5").Select '先頭行を選択 If ActiveCell.Value <> Empty Then '1行目が空でなければスタートを1行目にする rStart = ActiveCell.Row '配列の最初行 Else Selection.End(xlDown).Select '最初にぶつかる行へ移動 If ActiveCell.Value <> Empty Then rStart = ActiveCell.Row '配列の最初行 Else MsgBox "対象データがありません" MakeArry = -1 Exit Function End If End If Range("G65536").Select '最終行を選択 If ActiveCell.Value <> Empty Then '65536行目が空でなければスタートを65536行目にする rLast = ActiveCell.Row '配列の最終行 Else Selection.End(xlUp).Select '最初にぶつかる行へ移動 If ActiveCell.Value <> Empty Then rLast = ActiveCell.Row '配列の最終行 Else Selection.End(xlUp).Select '最初にぶつかる行へ移動 If ActiveCell.Value <> Empty Then rLast = ActiveCell.Row '配列の最終行 Else MsgBox "対象データがありません" MakeArry = -1 Exit Function End If End If End If 'C~J列取込み arry = Range("C" & rStart & ":J" & rLast) MakeArry = 0 Exit Function End Function '******************************************************* 'チェック&編集 '******************************************************* Private Sub Keyword_check(ByRef arry As Variant, ByRef rStart As Long, ByRef rLast As Long) Dim i As Long For i = LBound(arry) To UBound(arry) If arry(i, 5) <> Empty Then '難易度判定 If 0 <= arry(i, 6) And arry(i, 6) <= 32 Then '0~32の場合 arry(i, 1) = "OK1" arry(i, 2) = arry(i, 5) arry(i, 5) = Empty ElseIf 33 <= arry(i, 6) And arry(i, 6) <= 50 Then '33~50の場合 arry(i, 1) = "OK2" arry(i, 2) = arry(i, 5) arry(i, 5) = Empty Else 'その他の場合 arry(i, 1) = "NG" arry(i, 2) = arry(i, 5) arry(i, 5) = Empty End If End If Next i End Sub '******************************************************* '配列出力 '******************************************************* Private Sub out_arry(ByRef arry() As Variant, ByRef rStart As Long, ByRef rLast As Long) 'C~J列に戻す Range("C" & rStart & ":J" & rLast) = arry '値がある最初行~値がある最終行まで End Sub
提示されている情報では、「変なActive依存のコードがあるのでは?」ぐらいしか言えません。詳細な回答を得たい場合は、質問を編集し、問題が再現するコードを追加してください。
実際のコードを提示しましょう。
あなたのコードの記述に間違いがあるのでエラーが出るのです、としか言えませんぜ
ご指摘ありがとうございます。
説明不足ですいません。
元々②~④の関数は1つの関数で処理していたのですが、
今後の、保守や拡張を想定して、
目的ごとに関数に分けたのですが、
その際に今回の不具合が発生しました。
関数を分けるにあたり、配列を関数間で参照渡しをしたのですが、
配列の参照渡しがよく分かっておらず、
ここがちゃんとなっていないために
エラーになっていると思います。
質問にコードを追記しました。
宜しくお願い致します。
原因が別にあり、解決されないかもしれませんが、まずは
関数を呼び出している部分は()なし arry
関数は()あり ByRef arry() As Variant
に統一してみてください。
TanakaHiroakiさん
回答ありがとうございます。
ご指摘いただいた変更をしたら無事解決しました。
ありがとうございました。
また、「解決」ステータスに変更したいので、
お手数ですが、「回答」欄に
記載していただけると助かります。
よかったですね。
実際のコードを提示するようアドバイスをくださった方に
感謝しましょう。
imihitoさん、y_waiwaiさん、
コードを記載するよう、ご指摘いただき、
改めてありがとうございました。
おかげで、問題解決に結び付きました。
回答1件
あなたの回答
tips
プレビュー