[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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 >
(マナ) 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
https://www.tipsfound.com/vba/05iserror
https://dekiru.net/article/4471/
ほかのエラー値でも真と判定されますけどいいんですか?
(もこな2) 2020/09/20(日) 12:02
上書きされて消されてもいいんですか。
それとも #N/A を入力しているんですか。
(PP) 2020/09/20(日) 13:15
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
いつもありがとうございます。
>ほかのエラー値でも真と判定されますけどいいんですか?
ご指摘の通りですね…今回の場合は、#N/A以外のエラー値はありえないと思うので、
当方記載処理でもいいかもしれませんが、不測の事態の場合を考え、"#N/A"だったら、、
の処理に書き換えを検討したいと思います。
PP様
ありがとうございます。
F列には数式が入っています。
上書きされて消されても大丈夫です。
データを〇×に置き換えて、数式をなくすという処理にしています。
(数式を残していると、参照データを閉じた場合に全てエラーになってしまうため、
その前に置換えしています。)
(ピノ) 2020/09/21(月) 17:42
エラー値を処理するコードのご提示、ありがとうございます。
ループしない処理の方が、メモリを食わなくて助かります。
他で使用する機会がありそうなので、参考にさせていただきたいと思います。
(ピノ) 2020/09/21(月) 17:56
数式は前処理で値貼り付けして、文字列として読み込みできるようにしました。。
このコードについてもアドバイスいただけたら幸いです。
'値貼り付け 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
(マナ) 2020/09/21(月) 18:28
(マナ) 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
あがとうございます。
■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
■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
■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.