Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : Excel 2016)
マクロ作動中の配列について
投稿日時: 23/01/27 17:08:35
投稿者: よりくん

ユーザーフォームを利用し、データをリストへ入力しています。
実行時エラー '9' インデックスが有効範囲にありません。
と表示され、動作が停止します。
 
ステップインやブレイクポイントを用いると問題なく最後まで動作します。
エラーが出ている行を確認すると、リストを格納している2次元配列でエラーが出ているようで、
VBEで配列名をドラッグしようとするだけでExcelが落ちてしまいます。
 
データ量が多くなってしまう関係で配列は利用したいと考えています、業務上コードなどは開示できませんので、
ステップインやブレイクポイントを用いると動作するものが、一気に作動させるとエラーになってしまう原因など心当たりがあればご教授いただきたいです。

回答
投稿日時: 23/01/30 09:06:54
投稿者: Suzu

引用:
実行時エラー '9' インデックスが有効範囲にありません。

 
存在しない インデックス を指定し、値を参照しようとしている時に出るエラーですね。
 
 
引用:
ステップインやブレイクポイントを用いると動作するものが、一気に作動させるとエラーになってしまう原因など心当たりがあればご教授いただきたいです。

 
何でしょうね。。
 
・配列の インデックスの 値が変わる
・インデックスとして指定している変数の最大値・最小値が流動的に変わる
辺りでしょうか。
 
引用:
VBEで配列名をドラッグしようとするだけでExcelが落ちてしまいます。

 
配列名をドラッグ??
 
VBEの コード画面で 変数 を ドラッグする?
配列変数の上に、マウスオーバー すれば、その時の インデックス値 に対応した
配列変数内の値が 判りますが、ドラッグとは??
 
ローカルウィンドの 配列となっている 変数 をクリックし、
内容を表示させようとして、変数左の「+」をクリックし Excelが 落ちると言う事でしょうか?
 
 
 
何にしても、エラー時に、指定しているインデックスの値に問題があるはずです。
 
Sub TEST()
  On Error GoTo Err_TEST

  Dim varList As Variant
  Dim i As Long

  Let varList = Range("A1:C6").Value
  For i = 1 To 7
    Debug.Print varList(i, 3)
  Next

Exit_TEST:
  MsgBox "Finish"
  Exit Sub

Err_TEST:

  MsgBox _
    "エラー発生" & vbCrLf & _
    " LBound : " & LBound(varList) & vbCrLf & _
    " UBound : " & UBound(varList) & vbCrLf & _
    " Index : " & i
End Sub

 
の様な感じで
エラー発生時の、
 ・配列の ディメンション 最小数
 ・           最大数
 ・指定しようとするインデスック地
を確認してみましょう。

投稿日時: 23/01/30 13:34:56
投稿者: よりくん

ご回答ありがとうございます。
先ほどエラー箇所が判明し、解消はできましたが、原因が分からないため、お分かりであれば、ご教授いただきたいです。
 
配列がおかしくなるのは、ユーザーフォームのラベルを変更しているところでした。
ここのラベルは userform.No.caption = "No." & 別の配列の数値 -3 で番号を表示しており、
"No." ・ "No." & "a"
前もって Now = 配列 - 3 と計算を行い、 "No." % Now などは表示できましたが、 "No." % 配列 - 3 にするとその行が実行されると
ウォッチリストに入れている配列がエラーになり、インデックスが有効範囲にありませんとなってしまいます。
 
この際はどういった原因が考えられますか?

回答
投稿日時: 23/01/30 15:18:16
投稿者: WinArrow

横から失礼
幾つか確認したいことがあります。

よりくん さんの引用:

ここのラベルは userform.No.caption = "No." & 別の配列の数値 -3 で番号を表示しており、

>userform.No.caption = "No." & 別の配列の数値 -3
この中の
>userform
とは、ユーザーフォームの名前でしょうか?
通常、Userform1
というように番号が付くと思うのですが・・・
 
よりくん さんの引用:

前もって Now = 配列 - 3 と計算を行い、 "No." % Now などは表示できましたが、 "No." % 配列 - 3 に

>Now
は変数ですか?
Excelの関数に「Now」があるので、だめではないかと思います。
>配列
これも変数ですか?
>%
は、なんですか?

回答
投稿日時: 23/01/30 16:16:34
投稿者: WinArrow

Now
という変数は、使用可能のようです。

回答
投稿日時: 23/01/30 17:04:28
投稿者: Suzu

引用:
userform.No.caption = "No." & 別の配列の数値 -3

 
上記は、VBA のコードでしょうか?
 
左辺は、ユーザーフォーム上の コントロール【No】 の Caption プロパティ
右辺の、演算の結果 として 文字列 【No.○】 ○には数値が入る の 意味でしょうか?
 
引用:
"No." ・ "No." & "a"

これは・・・どういう意味 でしょうか?
右辺の 演算結果 として、【No.】 または 【No.a】 となるという意味でしょうか?
 
右辺の演算結果 として
【No.】と【空白文字列】、【No.】と【a】 を結合すれば 求める結果となりますが
 
右辺の 式が、 "No." & 別の配列の数値 -3 ← この部分は、数値になりますので
【空白文字列】 や、 【a】 を採りえませんので、求める結果にはならないです。
 
 
 
引用:
前もって Now = 配列 - 3 と計算を行い、 "No." % Now などは表示できましたが、
 "No." % 配列 - 3 にするとその行が実行されるとウォッチリストに入れている配列がエラーになり

 
Now?? そのNow って何ですか? 新たな変数でしょうか?
% ?? % って何を表しているのでしょうか?
 
引用:
"No." % 配列 - 3

?? 上記は数式?? 良く判りません。
 
 
引用:
インデックスが有効範囲にありませんとなってしまいます。

計算結果 の インデックスの数値は いくらなのですか?
 計算結果の 数値は、配列の インデックスの 下限 から 上限 まで に含まれる 整数なのですか?

回答
投稿日時: 23/01/30 18:32:05
投稿者: WinArrow

引用:
"No." % 配列 - 3

察するに、「%」は、掲示板への入力時の、入力ミスのようですね?
 
掲示板にコードを入力する際、
手入力は、無駄なキャッチボールを増やすだけです。
必ず、コードペインからコピペしてください。
 

回答
投稿日時: 23/01/31 11:02:56
投稿者: WinArrow

>実行時エラー '9' インデックスが有効範囲にありません
 
エラーが出るヒント

Sub test()
Dim 配列(0 To 2), x As Long

    For x = 0 To 2
        配列(x) = x
    Next
    x = 2
    Debug.Print 配列(x - 3)
    
End Sub

上のコードでは、配列という配列変数を参照している時、
インデックス:x がマイナスになるケースです。
このようなケースに該当するかもしれないので
参考にして検証してみてください。

投稿日時: 23/02/01 11:22:38
投稿者: よりくん

経験が浅く、こういった場所でも質問したことがないため、足りていない部分が多く申し訳ないです。。。
変数名やフォーム名など実際使用しているものと別のものを入力しているため、誤解を生じさせてしまいました。
また、今回記述しているマクロは業務用のパソコンで記述しており、そちらのパソコンでは当サイトを利用できないため、手入力になってしまいます、今後入力の際は注意させていただきます。
また、業務的に開示できない物もあるため一部変更させて記載させていただきます。
(内容的にエラーでないと思われる部分)
 
下に疑似的に作成しています。
簡単に作っているため別のエラーが出てしまうような場合がありますが
今回は配列(tmp)の中身が途中で消えてしまうような事が起きてしまう原因が知れればと思っております。
また、先に変数(Number)に格納した後に、ユーザーフォームのラベルの表示を変える際はエラーが起きていないため、tmpの中身をReDimなどで消しているといった事は起きていないかと思われます。
 
---------------------------------------------------------
 
Sub Test()
 
 Dim tmp
 Dim Count() as long
 Dim Number as long
 '抽出Form(ユーザーフォーム名)
 
tmp = Cells.CurrentRegion
 
 Count(0) = 5 '本来はFunctionで配列に格納しています。
 Count(1) = 7
 Count(2) = 10
 
i = 0
 
Do while i <= Ubound(Count())
 
Number = Count(i) - 3
 
If tmp(Count(i),2) <> "" then (2週目ここでエラーが出てしまう)
 goto n
End If
 
 抽出Form.No.caption = "No" 'エラーなし
  【"No."】出力結果
 抽出Form.No.caption = "No" & "a" 'エラーなし
  【"No.a"】出力結果
 抽出Form.No.caption = "No" & Number 'エラーなし
  【"No.2"】出力結果
 抽出Form.No.caption = "No" & Count(1) - 3 'インデックスが有効範囲にありません。(配列tmp)
  【"No.2"】出力結果(結果は出力できるが、配列tmpがエラーになる)
 
n:
i = i + 1
 
Loop
 
 End Sub
-------------------------------------------------------------
 
・userform.No.caption = "No." & 別の配列の数値 -3 
 ラベルに現在の番号を表示したいのですが、配列に該当者の行番号を入れており(Count()とします)
  シートの4行目がNo.1になるため 配列内の行番号から -3 を行いたい状況です。
 userform. ←の部分ですが、ここはユーザーフォームの名前を入れております。
 
 訂正:ユーザーフォーム名.No.caption = "No." & Count(i) -3
 
 
・Now・配列・%について
 Nowは急いで入力し、試したためNow関数と重複してしまいました。申し訳ないです。
 上記コードではNumberへ変更しています。
 Now → Number
  
 配列も上記同様分かれば良いと記述していました。
 配列 → Count()
 
 %については、完全に誤字です。
 % → &
 
・配列 - 3 (上記 Count(i) - 3)について
 FunctionでCount()に格納する際に、4以下のものが入ることはありません。
 またエラーが出ているわけではなく、ここで配列(tmp)の中身が消えてしまっているため、別場所で配列(tmp)を参照した際に、インデックスが有効範囲にありませんとエラーが出てしまっております。
 
[/code]

回答
投稿日時: 23/02/01 15:49:10
投稿者: Suzu

現状に対し、つじつまが合わない事を含み、中途半端な説明なので、
原因がこれだけでは 判断つきません。
 
 
とりあえず、 エラーが出たときに
VBE 画面 エラー発生行 が 色反転して コード実行が停止すると思います。
 
その状態で、VBE画面
 
If tmp(Count(i), 2) 〜 で止まるなら
 
Count(i) の 部分にマウスオーバーすれば
【Count(i) = 7】 の様に、
停止時点の 変数 Count の インデックス が i の 値が表示されます。
 
次に、tmp の部分にマウスオーバー すれば
【tmp(ount(i), 2)=<インデックスが有効範囲にありません>】の様に 表示されます。
この場合は、
 
tmp に対し、tmp(7,2) の値を参照しようとし、7 または 2 の
インデックス の値が存在しないので、有効範囲にありません となっています。
 
7 または 2 は、ローカルウィンドで、
+ tmp
  となっている + 部分をクリックすれば
 
- tmp
|---tmp(1)
| |-----tmp(1,1)
| -----tmp(1,2)
  :
 
の様に、すれば、配列の次元数は確認できますから、
インデックスがその範囲になる様に、コードを修正しましょう。
 
 
---------------------------------------------------------------------------------------
記載の中で、つじつまが合わなかったり、修正した方が良い部分 を下記に記します。
先の 手段で インデックスの問題が解決したなら、下記への返答は不要です。
 

引用:
FunctionでCount()に格納する際に、4以下のものが入ることはありません。
 またエラーが出ているわけではなく、ここで配列(tmp)の中身が消えてしまっているため、別場所で配列(tmp)を参照した際に、インデックスが有効範囲にありませんとエラーが出てしまっております。

 
・その Fucnttion は どんな処理をしているの?
・Count は Function の引数として渡している?
・Count と言う 関数が存在しています。
   関数が呼ばれたのか、変数が呼ばれたのか、挙動不審になりますので
   関数と同名は避けましょう。
 
 
引用:
別場所で配列(tmp)を参照した際に

このコード内で、tmp を宣言しているのに 別場所で、tmp を参照?? できませんよね?
tmp も 引数で渡している??
 
それとも、提示されたコード Subプロシージャ 内で宣言しているのではなく、
Sub プロシージャ外の Publicで宣言している??

回答
投稿日時: 23/02/02 07:56:27
投稿者: WinArrow

引用:

また、今回記述しているマクロは業務用のパソコンで記述しており、そちらのパソコンでは当サイトを利用できないため、手入力になってしまいます、今後入力の際は注意させていただきます。

 
上記について
 
全部、手入力しなくても
コードペインの必要な箇所(掲示板に投稿したい部分)を
メモ帳などにコピペして
隠したい部分の文字列を「置換」または、手修正すれば
よいのではないでしょうか?
 
なお、エラーになるとところを
逃げないで、変数の「値」をつぶさに調査する努力をしましょう。
変数は、なるべく、プロパティやメソッドで使用しない名前にしましょう。
読んでいて、紛らわしい。
(漢字の変数でもよいし、先頭の文字列を工夫しましょう)
 
 

トピックに返信