Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : その他)
Callで呼び出したPublic Subで配列の処理をすると処理途中でメイン(?)に戻ってしまう
投稿日時: 20/05/13 11:52:35
投稿者: Alice87

「Microsoft Excel for Office 365」を使用しています。
 
Callで呼び出した下記Public Subで配列の処理をすると処理途中でメイン(?)に戻ってしまいます。
 
配列ではない動作(ex.Msgbox)ではメインに戻らずに済みます。
配列名や変数の表記を変えたりしましたが、同様です。
 
解決策がお分かりの方がいらっしゃいましたら、アドバイスをいただけると幸いです。
 
宜しくお願い致します。
_________________________________
 
Public Sub HDerror_category()
 
Dim i, j As Integer
 
Dim category() As String
Dim error_add() As Integer
 
ReDim category(HDcategory_error)
ReDim error_add(HDcategory_error)
 
i = 1
 
   For ii = start_row To Cells(Rows.Count, 22).End(xlUp).Row
 
        If Not IsError(Cells(ii, 26).Value) And IsError(Cells(ii, 22).Value) Then
 
               category(i) = Cells(ii, 22) ←ここの処理をすると、Call呼び出し元に戻ってしまい、
                       このプロシージャの処理がなされないままになるのです
               error_add(i) = ii
                
               i = i + 1
        End If
 
    Next
 
★以降は割愛
     
  

回答
投稿日時: 20/05/13 13:32:41
投稿者: exvatpc

Forループの開始値(start_row)が、0なので、
"If Not IsError(Cells(ii, 26).Value) And IsError(Cells(ii, 22).Value) Then" 行で
エラーで落ちているので、start_rowに1以上の正しい値をセットすればいいと思います。

回答
投稿日時: 20/05/13 14:28:03
投稿者: WinArrow
投稿者のウェブサイトに移動

Star_ROwを含めて、
このプロシジャの中で使用している変数は、
どこで、どのように定義、初期化しているのでしょうか?

投稿日時: 20/05/13 15:21:01
投稿者: Alice87

メインの方で取得したデータを、Callで呼び出しているプロシージャでも使用しているので、メインの冒頭で
以下の記載をしています。
(ちなみに、下記いずれのデータも呼び出し後のプロシージャでいかされています。)
 
Public HDcategory_error As Integer
Public start_row As Integer
 
これら以外はメインから引用している変数はありません。

回答
投稿日時: 20/05/13 15:36:12
投稿者: exvatpc

Alice87 さんの引用:
メインの方で取得したデータを、Callで呼び出しているプロシージャでも使用しているので、メインの冒頭で
以下の記載をしています。
(ちなみに、下記いずれのデータも呼び出し後のプロシージャでいかされています。)
 
Public HDcategory_error As Integer
Public start_row As Integer
 
これら以外はメインから引用している変数はありません。

 
このSubに入るときに、start_row に強制的に "0" 以外の数値にすると
処理は正常に動きますか?
 

回答
投稿日時: 20/05/13 18:31:56
投稿者: WinArrow
投稿者のウェブサイトに移動

Alice87 さんの引用:
メインの方で取得したデータを、Callで呼び出しているプロシージャでも使用しているので、メインの冒頭で
以下の記載をしています。
(ちなみに、下記いずれのデータも呼び出し後のプロシージャでいかされています。)
 
Public HDcategory_error As Integer
Public start_row As Integer
 
これら以外はメインから引用している変数はありません。

 
変数を使っている場合は、
どこで定義していrか?
本プロシジャに入るとき、どのような値を設定しているか?
を説明する必要があります。(これは質問者の義務です)
 
↑では、定義場所は説明されていますが、
どのような「値」を設定しているか?・・・・説明がありません。
 
回答者には見えるように説明してください。

回答
投稿日時: 20/05/13 19:52:13
投稿者: simple

すでにある指摘に加えて、エラー内容を確認されていますか?
 
If Not IsError(Cells(ii, 26).Value) And IsError(Cells(ii, 22).Value)
ということは、
・Cells(ii, 26).Valueがエラーではなく、
・Cells(ii, 22).Valueがエラーの時、
ということですよね。
 
するとエラー値を
Dim category() As String
という文字列配列に入れようとして、型不一致になるんじゃないですか?

回答
投稿日時: 20/05/13 20:17:03
投稿者: WinArrow
投稿者のウェブサイトに移動

エラーがでて、呼び出し元にも踊ってしまう・・・
ということは、エラートラップしているのかしら?
 

回答
投稿日時: 20/05/14 06:07:53
投稿者: simple

そうですね、On Error Resume Nextとしているのかもしれません。
そうだとすると、
エラーが発生した行以下は実行されずに、
メインプロシージャ の Call ステートメントの次の行に制御が移りますね。
 
例:

Sub test()
    On Error Resume Next
    Call testSub1
    'ここに戻ります。
End Sub

Sub testSub1()
    Dim aryString(1 To 2) As String
    
    [A1].Formula = "=1/0"
    aryString(1) = [A1].Value  'ここでエラーが発生。
    
    MsgBox "OK"     'この行は実行されない。
End Sub

 
エラートラップは、できるだけ限定的な範囲で使うのがよいと思います。

投稿日時: 20/05/14 09:14:47
投稿者: Alice87

simple様
 
>するとエラー値を
>Dim category() As String
>という文字列配列に入れようとして、型不一致になるんじゃないですか?
 
⇒ご指摘の通りでした。配列に入れたいデータの列番号を誤っていました。
 エラー値になっていないデータの列番号に変更しましたら、問題なく進んだ後にメインに戻ることができました。
 
 振り返ってみると、ケアレスミスによるものだったのでお恥ずかしいです。
 
 でも、sumple様のご指摘がなければ、気付かずじまいになっていそうだったので、心から感謝します。
 ありがとうございました。