[[20200920100612]] 『VBA IF文で型が一致しないエラー』(ピノ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA IF文で型が一致しないエラー』(ピノ)

いつもお世話になっております。

VBA IF文にて、以下コードを記載したところ、、
「If Cells(i, 6) = "#N/A" Then」
ここで、型が一致しないエラーになります。
原因が見つからないため、アドバイスをいただけないでしょうか。

エラーが出たところでイミディエイトウィンドウにて
変数「i」を見ると、7となっており、ここは正常にとれているようです。

<やりたいこと>
F列の7〜最終行までセルを順々に見ていき、#N/Aだったら×を入力、
そうでなければ、〇と入力し、同行O列の値をクリアにし、黄色塗りにする。

<コード>
Sub データ加工()

    Dim LR As Long
    Dim i As Long

    LR = Cells(Rows.Count, "F").End(xlUp).Row

       For i = 7 To LR
            If Cells(i, 6) = "#N/A" Then
                Cells(i, 6) = "×"
            Else
                Cells(i, 6) = "〇"
                Cells(i, 15).Clear
                Cells(i, 15).intrior.Color = 6
            End If

        Next I
End Sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


https://www.relief.jp/docs/excel-vba-not-iserror.html

(マナ) 2020/09/20(日) 10:22


マナ様

有難うございます。
URL参考に完成させることができました。

       For i = 7 To LR
        Cells(i, 6).Select
          If Not IsError(ActiveCell.Value) Then '"#N/A" でなかったら
                        Cells(i, 6) = "〇"
                        Cells(i, 15).Clear
                        Cells(i, 15).Interior.Color = RGB(255, 215, 173)
          Else                                  '"#N/A" だったら
                    Cells(i, 6) = "×"
          End If
        Next i

(ピノ) 2020/09/20(日) 11:28


>If Not IsError(ActiveCell.Value) Then '"#N/A" でなかったら

https://www.tipsfound.com/vba/05iserror
https://dekiru.net/article/4471/

ほかのエラー値でも真と判定されますけどいいんですか?

(もこな2) 2020/09/20(日) 12:02


F列には数式が入っているんですか。

上書きされて消されてもいいんですか。

それとも #N/A を入力しているんですか。

(PP) 2020/09/20(日) 13:15


#N/Aにかかわらず、ともかくエラーかそうじゃないかで分岐するならループ処理を使わなくても大丈夫です。
    Sub ループ処理しない()
        Dim LR As Long
        LR = Cells(Rows.Count, "F").End(xlUp).Row

        If LR < 7 Then Exit Sub
        With Range("F7:F" & LR)
            On Error Resume Next

            'エラー値以外
            With Intersect(.Cells, .Resize(, 2).SpecialCells(xlCellTypeFormulas, xlNumbers + xlTextValues + xlLogical))
                .Value = "〇"
                .Offset(, 9).Clear
                .Offset(, 9).Interior.Color = RGB(255, 215, 173)
            End With

            'エラー値
            Intersect(.Cells, .Resize(, 2).SpecialCells(xlCellTypeFormulas, xlErrors)).Value = "×"
            On Error GoTo 0
        End With

    End Sub

また、LRが必ず8以上になるということなら以下でもよいとおもいます。
(なんで7だとまずいのかは、[[20200911193145]]のJakaさんのコメントを参照してください)

    Sub ループ処理しない_簡易版()
        With Range("F7:F" & Cells(Rows.Count, "F").End(xlUp).Row)
            On Error Resume Next

            'エラー値以外
            With .SpecialCells(xlCellTypeFormulas, xlNumbers + xlTextValues + xlLogical)
                .Value = "〇"
                .Offset(, 9).Clear
                .Offset(, 9).Interior.Color = RGB(255, 215, 173)
            End With

            'エラー値
            .SpecialCells(xlCellTypeFormulas, xlErrors).Value = "×"
            On Error GoTo 0
        End With

    End Sub

(もこな2) 2020/09/20(日) 19:10


もこな2様

いつもありがとうございます。
>ほかのエラー値でも真と判定されますけどいいんですか?
ご指摘の通りですね…今回の場合は、#N/A以外のエラー値はありえないと思うので、
当方記載処理でもいいかもしれませんが、不測の事態の場合を考え、"#N/A"だったら、、
の処理に書き換えを検討したいと思います。

PP様
ありがとうございます。
F列には数式が入っています。
上書きされて消されても大丈夫です。
データを〇×に置き換えて、数式をなくすという処理にしています。
(数式を残していると、参照データを閉じた場合に全てエラーになってしまうため、
その前に置換えしています。)

(ピノ) 2020/09/21(月) 17:42


もこな2様

エラー値を処理するコードのご提示、ありがとうございます。
ループしない処理の方が、メモリを食わなくて助かります。
他で使用する機会がありそうなので、参考にさせていただきたいと思います。
(ピノ) 2020/09/21(月) 17:56


度々恐れ入ります。
頂いたアドバイスをもとに、エラー値をすべて処理するのではなく、
"#N/A"のみ処理するコードを記載したいのですが、
やはり、「If Not Cells(i, 6) = "#N/A" Then 」
ここで、型が一致しないエラーになります。

数式は前処理で値貼り付けして、文字列として読み込みできるようにしました。。

このコードについてもアドバイスいただけたら幸いです。

      '値貼り付け
        Range("f:f").Copy
        Range("f:f").PasteSpecial Paste:=xlPasteValues

       For i = 7 To LR
        Cells(i, 6).Select
          If Not Cells(i, 6) = "#N/A" Then '"#N/A" でなかったら
                        Cells(i, 6) = "〇"
                        Cells(i, 15).Clear
                        Cells(i, 15).Interior.Color = RGB(255, 215, 173)
          Else                                  '"#N/A" だったら
                    Cells(i, 6) = "×"
          End If
        Next I

End Sub

(ピノ) 2020/09/21(月) 18:11


1)#N/A 以外のエラーなら、〇にするのですか???
  わたしには、エラーなら×が普通かと思いました。
2)そもそも、数式で、〇×、色は条件付き書式にしておけばよいだけでは?

(マナ) 2020/09/21(月) 18:28


区別しないのがメリットだと思いますが
区別したいなら
https://www.relief.jp/docs/excel-vba-check-na-error.html

(マナ) 2020/09/21(月) 18:32


マナ様
ありがとうございます。
頂いたリンク参照し、今回はエラー値を区別するパターンで作成しました。

ただ、区別しないエラー値の記載方法も、今後必要になると思いますので、覚えておきます。
またおっしゃる通り、色付けはエクセル上の数式設定でもいいように思えるので、今後の参考にさせていただきます。

        For i = 7 To LR
        Cells(i, 6).Select
          If WorksheetFunction.IsNA(ActiveCell.Value) Then '"#N/A" だったら
                     Cells(i, 6) = "×"
          Else
            Cells(i, 6) = "〇"
            Cells(i, 15).Clear
            Cells(i, 15).Interior.Color = RGB(255, 215, 173)
          End If
        Next i

(ピノ) 2020/09/21(月) 23:14


>このコードについてもアドバイスいただけたら幸いです。

■1
他のトピックで書いたかもしれませんが・・・
Sub〜End Sub までが一つのプロシージャと呼ばれるかたまりなので、横着せずに全部提示すべきだとおもいます。

■2

 Cells(i, 6).Select

↑は必要ないとおもいます。(2020/09/21(月) 18:11 時点のコード)

 Cells(i, 6).Select
 If WorksheetFunction.IsNA(ActiveCell.Value) Then

↑は↓のようにすれば、いちいち選択する必要はないとおもいます。

 If WorksheetFunction.IsNA(Cells(i, 6)) Then

■3
好みの問題かもしれませんが、やはりValueプロパティを省略しているのが気になります。

■4
インデントもなんか適当な印象を受けます。
無理にとは言いませんが、どういうルールで字下げしたのか教えてもらえませんか?

■5

 Range("f:f").Copy
 Range("f:f").PasteSpecial Paste:=xlPasteValues
 For i = 7 To LR

コピーして値貼り付けする部分でF列全体を対象にしてますが、どうせ7〜LR行までしか処理する必要はないのでしょうから限定したほうがよくないですか?

■6
マナさんが指摘されているとおり、#N/A以外はなんであろうと〇というのは解せませんが、とりあえず■2、■5を踏まえるとこんな感じでは?

   Sub 実験04()
      Dim LR As Long
      Dim MyRNG As Range

      With ActiveSheet
         LR = .Cells(.Rows.Count, "F").End(xlUp).Row
         If LR < 7 Then Exit Sub

         With .Range("F7:F" & LR)
            .Value = .Value
            For Each MyRNG In .Cells
               If WorksheetFunction.IsNA(MyRNG.Value) Then
                  MyRNG.Value = "×"
               Else
                  MyRNG.Value = "〇"
                  ActiveSheet.Cells(MyRNG.Row, "O").Clear
                  ActiveSheet.Cells(MyRNG.Row, "O").Interior.Color = RGB(255, 215, 173)
               End If
            Next MyRNG
         End With
      End With
   End Sub

(もこな2) 2020/09/22(火) 01:41


もこな2様

あがとうございます。

■1 について
以前もご注意いただいたのに、失礼しました。
Sub〜End Sub までが1つのプロシージャですが、聞きたいところ以外にも記載があるため、
割愛し、Sub〜End Subの記載を怠ってしまいました。
以後気を付けたいと思います。

■2 について
有難うございます。
おっしゃる通りですね。
なるべくスマートなコードをかけるように努力していきたいと思います。

■3 について
alueプロパティが必要な理由はなんでしょうか。
前回のお話で、Excelの機能で勝手にValueと認識してくれるとのことでしたので、引き続き、記載は省いてしまっておりました。

■4 について
インデントは、IFやWithなどで、関連するコードを字下げしたりとかしていますが、明確なルールは定まっていません。もこな2様はどのようなルールでインデントを使われているか、参考にさせていただきたいです。

■5 について
おっしゃる通りかもしれません。
列全体とした方が簡単だったので、それで記載してしまいました。

■6 について

コード有難うございます。
自分で記載したコードよりも、はるかにスマートになっており、、。
実行しても、意図した結果になりました。
こちら、使用させていただきたいと思います。
有難うございます。

#N/A以外は発生する可能性が考えられないため、IFNAといたしましたが、
不具合が出るようでしたら、IsErrorに書き換えたいと思います。
(ピノ) 2020/09/22(火) 18:21


■3の返答の返答
 繰り返しになりますが好みの問題でしょう。
 私の場合、ぱっと見でRangeオブジェクトとして参照しているのか、値を使っているのかわかるようにプロパティを記述するようにしています。

■4の返答の返答
 基本的には同じ考えだとおもいますよ。ただ、そのルールでいくと

        For i = 7 To LR
        Cells(i, 6).Select
          If WorksheetFunction.IsNA(ActiveCell.Value) Then '"#N/A" だったら
                     Cells(i, 6) = "×"
          Else
            Cells(i, 6) = "〇"
            Cells(i, 15).Clear
            Cells(i, 15).Interior.Color = RGB(255, 215, 173)
          End If
        Next i

        For i = 7 To LR
          Cells(i, 6).Select  '★For〜Nextステートメントに対して1段階インデントを挿入
          If WorksheetFunction.IsNA(ActiveCell.Value) Then '"#N/A" だったら
            Cells(i, 6) = "×"'★Ifステートメントに対してインデントを1段階に変更
          Else
            Cells(i, 6) = "〇"
            Cells(i, 15).Clear
            Cells(i, 15).Interior.Color = RGB(255, 215, 173)
          End If
        Next i

じゃないですか?

■6の返答の返答
>#N/A以外は発生する可能性が考えられないため、IFNAといたしましたが
>不具合が出るようでしたら〜
好きにすればいいんじゃないですか。

なお、私なら「#N/A以外は発生する可能性が考えられない」のであれば、エラーの種類を限定せずともかくエラーなら真(偽)と判定するでしょうけど。

 (エラーの種類を区別しないのであればSpecialCellsが使えることは提示のとおり)

ちなみに、2020/09/20(日) 12:02で確認した理由は、単純にやってることとコメントが合ってなかったからです。
(別トピックの流れからVLOOKUP関数の結果を見ているのかなぁと想像しましたけど、そもそもこのトピックで全体が示されてないので、確証がありませんでした・・・)

(もこな2) 2020/09/22(火) 20:13


■3の返答の返答
 なるほどです。レンジか値かをそこで見分けるというのもあるんですね、
 ご意見参考に、Valueの使い方、再考してみたいと思います。

■4の返答の返答
 仰る通りですね…。どっかからコピペしてインデントをそのままにしてしまっていました。
 可読性にも関わってくるので、以後気を付けたいと思います。

>「#N/A以外は発生する可能性が考えられない」のであれば、エラーの種類を限定せずともかくエラーなら真(偽)と判定するでしょうけど。
確かにエラーを区別しないならそれでよかったです…
慌ててしまいましたが、ちょっと考えればわかることでした。失礼しました。

 コードをきちんと提示せず、申し訳ありませんでした。
今後は Sub〜End  Subの必要箇所は、提示するようにいたします。

(ピノ) 2020/09/23(水) 18:14


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.