Excel (VBA)

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

 
(Windows 10全般 : Excel 2013)
0と#REF!が入っている行を削除したい
投稿日時: 19/11/20 20:14:50
投稿者: morason

テーブル状の表における、
「B列に0と#REF!(セル書式は数値)が入っている行だけを削除するマクロ」を作成したいのです
以下コード
 
Sub 行削除()
 
  Dim lRow As Long
  Dim i As Long
    lRow = Cells(Rows.Count, 1).End(xlUp).Row
    Application.ScreenUpdating = False
     
    For i = lRow To 2 Step -1
     
       If Cells(i, 2).Value = 0 Then '0が入っている行を削除★(エラー箇所)
            Range(i & ":" & i).Delete
        ElseIf Cells(i, 2).Value = "#REF!" Then  ’#REF!が入っている行を削除
            Range(i & ":" & i).Delete
        End If
    Next i
     
    Application.ScreenUpdating = True
 End Sub
 
すると、0が入っている行は削除できるのですが、#REF!の行になると★のコードで
「13 型が一致しません」のエラーが出ます
#REF!が入っているセルを文字列形式に変えてみたりしたのですが変わらず原因が掴めません
何卒、ご助言をお願い致します。
[/b]

回答
投稿日時: 19/11/20 20:34:15
投稿者: WinArrow
投稿者のウェブサイトに移動

> Range(i & ":" & i).Delete
でもいいが、
Rows(i).Delete
の方がスマートだよね・・・
 
#REF!は、
IsError(セル)で判定しましょう

投稿日時: 19/11/21 09:48:45
投稿者: morason

ありがとうございます
#REF は数式が入ってるわけでなく、
数値張り付けしたものなんですが、その場合もERROR で処理なんでしょうか?
 
また恐れ入りますが、その場合どういったコードになりますでしょうかm(_ _)m

回答
投稿日時: 19/11/21 10:08:07
投稿者: WinArrow
投稿者のウェブサイトに移動

基本的なこと
 
セルには、4種類のデータが格納できます。
(1)文字列
(2)数値
(3)論理値(TRUE/FALSE型のデータ)
(4)エラーデータ
 
各々は、直接手入力することも、数式の結果となる場碧もあります。
 
今回の
>#REF!
は、数式の家モ「値」複写して貼り付けてものと思います。
 
(4)については、ISError関数で判定します。

If IsError(Cells(1,1)) Then
 
 

回答
投稿日時: 19/11/21 10:18:41
投稿者: WinArrow
投稿者のウェブサイトに移動

文章訂正
>は、数式の家モ「値」複写して貼り付けてものと思います。

は、数式の結果を「値」複写して貼り付けてものと思います。
 
なお、手入力(値貼付け)で数式の結果でも同じです。
 
どうしても、#REF! だけを判定したい場合は、
↓のようにするとよいでしょう
    If CStr(Range("A3").Value) Like "*2023" Then
        MsgBox "REFエラー"
    End If

回答
投稿日時: 19/11/21 10:33:02
投稿者: bi

こんなのでもいいかもしれません。
 

Sub 行削除()
 
    Dim lRow As Long, i As Long
    
    lRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    Application.ScreenUpdating = False
     
    For i = lRow To 2 Step -1
        If Cells(i, 2).Text = "#REF!" Then Rows(i).Delete
        If Cells(i, 2).Value = 0 Then Rows(i).Delete
    Next i
   
    Application.ScreenUpdating = True

End Sub

回答
投稿日時: 19/11/21 11:38:43
投稿者: WinArrow
投稿者のウェブサイトに移動

bi さん
 
そうか・・・セル.Textで判別できるんでしたね・・
気が付きませんでした。
ありがとうございました。

トピックに返信