Excel (VBA)

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

 
(Windows 11 Home : Excel 2016)
エラー回避
投稿日時: 23/12/10 13:08:30
投稿者: shimoichimabu

或るファイル内に
2012、2013、2018.3追加、2018,2019、2020、マスター
というシート名を作成しています。
シート名が2018以上(2018,2019,2020)のみのデータを処理したいです。
しかし、何故かシート名「2018.3追加」、「マスター」でもデータ処理されてしまいます。
どうも「型が一致しません」というエラーの場合は希望することが実行されません。
On Error GoTo のコマンドも同様にうまくいきません。
 
If IsError(Sheet名.Name * 1) = False Then
    If Err.Number <> 0 Then
・・・・・
 と組み合わせてもダメでした。
どのようなコマンドを使えば、いいのでしようか?
Sheet名.Name * 1 という使用が問題で、別の発想が必要かもしれません。
 
Dim Sheet名 as Variant
 
For Each Sheet名 In Worksheets
 
On Error Resume Next
 
    If Sheet名.Name * 1 >= 2018 Then
        ・・・・・・・
        ・・・・・・・
    End If
 
On Error GoTo 0
 
Next

回答
投稿日時: 23/12/10 22:04:49
投稿者: WinArrow

最初に
デバッグ中は、エラートラップを使うのはやめましょう。
基本的に、コードで条件設定できない場合に、エラートラップを使用する方が効果的です。
なお、エラートラップの設定で、[Resume Next]は、使い方に注意が必要です。
 
 
  
シート名は、文字列ですから、そのままの状態で四則演算してはいけません。
数値確認するのが鉄則です。
  
次のようなコードにすれば、エラートラップ不要になります。
  

Dim Sht As Worksheet 'Variant
    For Each Sht In Worksheets
        If Len(Sht.Name) = 4 Then   ’@
            If IsNumeric(Sht.Name) Then  'A
                If CLng(Sht.Name) >= 2018 Then 'B
            '
                End If
            End If
        End If
    Next

@シート名の桁数で、絞り込みます。 
この段階で「2018.3追加」は対象外になります。
A数字だけのシート名で、絞り込みます。
この段階で「マスター」は対象外になります。
Bシート名を数値化して、対象を絞り込みます。
 
シート名の全てが説明されていないので、
他にも対象とする条件があるならば、同じような記述を追加してください。
 

投稿日時: 23/12/10 22:12:40
投稿者: shimoichimabu

WinArrowさんの回答だったと思いますが、(間違っていたらごめんなさい)
何故かこの回答が消えていました。
大体、回答の内容は下記のコードだったと思います。
IsNumeric、CLngを使わせてもらい、うまくいきました。
本当にありがとうございました。
 
For Each Sheet名 In Worksheets
 
 If LEN(Sheet名.Name)=4 Then
          
      If IsNumeric(Sheet名.Name) Then
         
          If CLng(Sheet名.Name) >= 2018 Then
・・・・・・・
・・・・・・・