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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1505閲覧

vbaで配列処理をするときステップ実行だと大丈夫なのに通常実行だとエラーになる。

manabumono

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/12/24 11:24

編集2018/12/24 18:14

お世話になっております。

【現象】
エクセルで配列の加工をするプログラムを作成していますが、
ステップ実行をすれば最後までエラーがなく終了するのに
通常実行すると、「インデックスが有効範囲にありません」というエラーが発生します。

【内容】
配列処理の大まかな流れは以下の通りです。
①メイン関数(②~④を呼び出す)
②配列取得関数(シートから配列を取得)
③配列のチェック&加工関数(行ごとにループを回してます。)
※ここでエラー発生、関数間で配列の参照渡しがうまくいっていないか、
読み込み等に時間がかかってエラーになるのでしょうか?
④配列の出力関数(配列の値をシートに戻す)

宜しくお願い致します。

'******************************************************* 'メイン '******************************************************* 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

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

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

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

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

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

imihito

2018/12/24 11:32

提示されている情報では、「変なActive依存のコードがあるのでは?」ぐらいしか言えません。詳細な回答を得たい場合は、質問を編集し、問題が再現するコードを追加してください。
y_waiwai

2018/12/24 14:32

実際のコードを提示しましょう。 あなたのコードの記述に間違いがあるのでエラーが出るのです、としか言えませんぜ
manabumono

2018/12/24 18:15 編集

ご指摘ありがとうございます。 説明不足ですいません。 元々②~④の関数は1つの関数で処理していたのですが、 今後の、保守や拡張を想定して、 目的ごとに関数に分けたのですが、 その際に今回の不具合が発生しました。 関数を分けるにあたり、配列を関数間で参照渡しをしたのですが、 配列の参照渡しがよく分かっておらず、 ここがちゃんとなっていないために エラーになっていると思います。 質問にコードを追記しました。 宜しくお願い致します。
TanakaHiroaki

2018/12/24 23:13

原因が別にあり、解決されないかもしれませんが、まずは  関数を呼び出している部分は()なし arry  関数は()あり ByRef arry() As Variant に統一してみてください。
manabumono

2018/12/25 01:51 編集

TanakaHiroakiさん 回答ありがとうございます。 ご指摘いただいた変更をしたら無事解決しました。 ありがとうございました。 また、「解決」ステータスに変更したいので、 お手数ですが、「回答」欄に 記載していただけると助かります。
TanakaHiroaki

2018/12/25 01:57

よかったですね。 実際のコードを提示するようアドバイスをくださった方に 感謝しましょう。
manabumono

2018/12/25 09:06

imihitoさん、y_waiwaiさん、 コードを記載するよう、ご指摘いただき、 改めてありがとうございました。 おかげで、問題解決に結び付きました。
guest

回答1

0

ベストアンサー

原因が別にあり、解決されないかもしれませんが、まずは
関数を呼び出している部分は()なし arry
関数部分は()あり ByRef arry() As Variant
に統一してみてください。

投稿2018/12/25 01:54

TanakaHiroaki

総合スコア1063

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

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

manabumono

2018/12/25 01:58

TanakaHiroakiさん 回答ありがとうございます。 ご指摘いただいた変更をしたら無事解決しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問