質問です。


エクセルでA列またはB列のどちらかに下記のエラー文字が表示されています。
ファイルを検索してこの文字のある行毎削除したいのですが
マクロまたは関数で削除する方法を教えて下さい。
ほかにまだ別な種類のエラーがあった場合追加できると助かります。
拡張子はCSVです。
よろしくお願いします。


#NAME?

#REF!

回答の条件
  • 1人3回まで
  • 13歳以上
  • 登録:2011/05/11 20:01:53
  • 終了:2011/05/12 18:52:22

ベストアンサー

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692011/05/11 21:04:29

ポイント40pt

たぶん複数のファイルだと思うので前回同様にフォルダを選択する形にしました。

他のエラーの場合も作ってコメントアウトしてありますので、追加する場合はコメントを外してください。


Sub Macro()
    '開始行を設定
    Const stRow As Integer = 1
    
    Dim FSO As Object
    Dim fldPath As String
    Dim fil As Object
    Dim wb As Workbook
    Dim lastRow As Long
    Dim i As Long
    Dim f As Boolean
        
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            fldPath = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
    
    Application.ScreenUpdating = False
    
    Set FSO = CreateObject("Scripting.FileSystemObject")

    For Each fil In FSO.GetFolder(fldPath).Files
        If LCase(FSO.GetExtensionName(fil)) = "csv" Then
            Set wb = Nothing
            On Error Resume Next
            Set wb = Workbooks.Open(fil.Path)
            On Error GoTo 0
            
            If Not wb Is Nothing Then
                With wb.Worksheets(1)
                    lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
                    
                    For i = lastRow To stRow Step -1
                        f = False
                        If IsError(Cells(i, "A")) Or IsError(Cells(i, "B")) Then
                            '#NULL!
'                            If .Cells(i, "A").Text = "#NULL!" Or .Cells(i, "B").Text = "#NULL!" Then
'                                f = True
'                            End If
                            '#DIV/0!
'                            If .Cells(i, "A").Text = "#DIV/0!" Or .Cells(i, "B").Text = "#DIV/0!" Then
'                                f = True
'                            End If
                            '#VALUE!
'                            If .Cells(i, "A").Text = "#VALUE!" Or .Cells(i, "B").Text = "#VALUE!" Then
'                                f = True
'                            End If
                            '#REF!
                            If .Cells(i, "A").Text = "#REF!" Or .Cells(i, "B").Text = "#REF!" Then
                                f = True
                            End If
                            '#NAME?
                            If .Cells(i, "A").Text = "#NAME?" Or .Cells(i, "B").Text = "#NAME?" Then
                                f = True
                            End If
                            '#NUM!
'                            If .Cells(i, "A").Text = "#NUM!" Or .Cells(i, "B").Text = "#NUM!" Then
'                                f = True
'                            End If
                            '#N/A
'                            If .Cells(i, "A").Text = "#N/A" Or .Cells(i, "B").Text = "#N/A" Then
'                                f = True
'                            End If
                        End If
                        If f Then
                            Rows(i).Delete
                        End If
                    Next i
                End With
                
                Application.DisplayAlerts = False
                wb.Save
                wb.Close
                Application.DisplayAlerts = True
            End If
        End If
    Next
    
    Set FSO = Nothing
    Application.ScreenUpdating = True
End Sub
id:inosisi4141

ありがとうございます。

ホルダーにエラー NAME? のあるファイルを入れて

やってみたのですが削除されませんでした

何かやり方があるのでしょうか。

2011/05/12 10:21:00

その他の回答(2件)

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692011/05/11 21:04:29ここでベストアンサー

ポイント40pt

たぶん複数のファイルだと思うので前回同様にフォルダを選択する形にしました。

他のエラーの場合も作ってコメントアウトしてありますので、追加する場合はコメントを外してください。


Sub Macro()
    '開始行を設定
    Const stRow As Integer = 1
    
    Dim FSO As Object
    Dim fldPath As String
    Dim fil As Object
    Dim wb As Workbook
    Dim lastRow As Long
    Dim i As Long
    Dim f As Boolean
        
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            fldPath = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
    
    Application.ScreenUpdating = False
    
    Set FSO = CreateObject("Scripting.FileSystemObject")

    For Each fil In FSO.GetFolder(fldPath).Files
        If LCase(FSO.GetExtensionName(fil)) = "csv" Then
            Set wb = Nothing
            On Error Resume Next
            Set wb = Workbooks.Open(fil.Path)
            On Error GoTo 0
            
            If Not wb Is Nothing Then
                With wb.Worksheets(1)
                    lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
                    
                    For i = lastRow To stRow Step -1
                        f = False
                        If IsError(Cells(i, "A")) Or IsError(Cells(i, "B")) Then
                            '#NULL!
'                            If .Cells(i, "A").Text = "#NULL!" Or .Cells(i, "B").Text = "#NULL!" Then
'                                f = True
'                            End If
                            '#DIV/0!
'                            If .Cells(i, "A").Text = "#DIV/0!" Or .Cells(i, "B").Text = "#DIV/0!" Then
'                                f = True
'                            End If
                            '#VALUE!
'                            If .Cells(i, "A").Text = "#VALUE!" Or .Cells(i, "B").Text = "#VALUE!" Then
'                                f = True
'                            End If
                            '#REF!
                            If .Cells(i, "A").Text = "#REF!" Or .Cells(i, "B").Text = "#REF!" Then
                                f = True
                            End If
                            '#NAME?
                            If .Cells(i, "A").Text = "#NAME?" Or .Cells(i, "B").Text = "#NAME?" Then
                                f = True
                            End If
                            '#NUM!
'                            If .Cells(i, "A").Text = "#NUM!" Or .Cells(i, "B").Text = "#NUM!" Then
'                                f = True
'                            End If
                            '#N/A
'                            If .Cells(i, "A").Text = "#N/A" Or .Cells(i, "B").Text = "#N/A" Then
'                                f = True
'                            End If
                        End If
                        If f Then
                            Rows(i).Delete
                        End If
                    Next i
                End With
                
                Application.DisplayAlerts = False
                wb.Save
                wb.Close
                Application.DisplayAlerts = True
            End If
        End If
    Next
    
    Set FSO = Nothing
    Application.ScreenUpdating = True
End Sub
id:inosisi4141

ありがとうございます。

ホルダーにエラー NAME? のあるファイルを入れて

やってみたのですが削除されませんでした

何かやり方があるのでしょうか。

2011/05/12 10:21:00
id:taknt No.2

きゃづみぃ回答回数13539ベストアンサー獲得回数11982011/05/11 21:10:23

ポイント20pt

拡張子はCSVは、実はエクセルで開けますが エクセルのファイルではありません。

エラーとなる箇所は 数式となっている箇所ですね。


= なんとか となっている箇所を探したらいいでしょう。

秀丸などで 開いて = を検索したらいいですね。

id:inosisi4141

ありがとうございます。

秀丸でみても=はついていませんでした。

ファイル毎に列全部調べるのは時間がかかる感じですね。

2011/05/12 10:03:04
id:SALINGER No.3

SALINGER回答回数3454ベストアンサー獲得回数9692011/05/12 11:56:45

ポイント20pt

これではどうでしょうか。

Sub Macro()
    '開始行を設定
    Const stRow As Integer = 1
    
    Dim FSO As Object
    Dim fldPath As String
    Dim fil As Object
    Dim wb As Workbook
    Dim lastRow As Long
    Dim i As Long
    Dim f As Boolean
        
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            fldPath = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
    
    Application.ScreenUpdating = False
    
    Set FSO = CreateObject("Scripting.FileSystemObject")

    For Each fil In FSO.GetFolder(fldPath).Files
        If LCase(FSO.GetExtensionName(fil)) = "csv" Then
            Set wb = Nothing
            On Error Resume Next
            Set wb = Workbooks.Open(fil.Path)
            On Error GoTo 0
            
            If Not wb Is Nothing Then
                With wb.Worksheets(1)
                    lastRow = .UsedRange.Row + .UsedRange.Rows.Count - 1
                    
                    For i = lastRow To stRow Step -1
                        f = False
                        '#NULL!
'                        If .Cells(i, "A").Text = "#NULL!" Or .Cells(i, "B").Text = "#NULL!" Then
'                            f = True
'                        End If
                        '#DIV/0!
'                        If .Cells(i, "A").Text = "#DIV/0!" Or .Cells(i, "B").Text = "#DIV/0!" Then
'                           f = True
'                        End If
                        '#VALUE!
'                        If .Cells(i, "A").Text = "#VALUE!" Or .Cells(i, "B").Text = "#VALUE!" Then
'                            f = True
'                        End If
                        '#REF!
                        If .Cells(i, "A").Text = "#REF!" Or .Cells(i, "B").Text = "#REF!" Then
                            f = True
                        End If
                        '#NAME?
                        If .Cells(i, "A").Text = "#NAME?" Or .Cells(i, "B").Text = "#NAME?" Then
                            f = True
                        End If
                        '#NUM!
'                        If .Cells(i, "A").Text = "#NUM!" Or .Cells(i, "B").Text = "#NUM!" Then
'                            f = True
'                        End If
                        '#N/A
'                        If .Cells(i, "A").Text = "#N/A" Or .Cells(i, "B").Text = "#N/A" Then
'                            f = True
'                        End If
                        If f Then
                            Rows(i).Delete
                        End If
                    Next i
                End With
                
                Application.DisplayAlerts = False
                wb.Save
                wb.Close
                Application.DisplayAlerts = True
            End If
        End If
    Next
    
    Set FSO = Nothing
    Application.ScreenUpdating = True
End Sub
  • id:taknt
    ちなみに csvファイルを エクセルで開くと エクセルの流儀にあわせられてしまって いろいろ都合が悪い場合があります。

    たとえば
    0900000 とかいうように 頭に 0がついてる場合は ""で くるまないと
    900000 というよに 文字列ではなく 数値として 表示されてしまいます。
    それで 保存すると 900000のままとなってしまいます。
  • id:inosisi4141
    ありがとうございます。

    どうしてもCSV使うことが必要なため0900000 などが
    ある場合はいったんtxtにして文字列で読み込んでいます。

    いろいろアドバイスよろしくお願いします。
  • id:taknt
    以下のような CSVファイルを作成して エクセルで開いてみてください。

    a,b,=aaaa
    #REF!



    #REF!は 参照していたセルが消えてしまった場合などに出るエラーですが csvでは その文字列を入れるしかないですね。

    ちなみに エラーの出る箇所のCSVの内容は 何になってますか?
    その一行が わかれば その原因も推測しやすいかと思います。
  • id:SALINGER
    最終行の取得の仕方をA列の最後の方に空白がある可能性を考慮すると
    lastRow = .Cells(Rows.Count, "A").End(xlUp).Row

    lastRow = .UsedRange.Row + .UsedRange.Rows.Count - 1
     
    あとは、エクセルのエラーをそのままCSVで保存すると、"#NAME?"という文字列になると思いますが、
    実際のCSVのデータが一時一句間違いないか確認してみてください。
  • id:inosisi4141


    a,b,=aaaa
    #REF!
    a,b,=aaaa


    #NAME?
    =aaaaをC6にいれた場合
    #NAME?
    =aaaaをA7に入れた場合

    ちなみに エラーの出る箇所のCSVの内容は 何になってますか?
    その一行が わかれば その原因も推測しやすいかと思います。

    A列にアドレスがある行ですのでドメインをくっつけたか@をくっつけたか何かに作業して式を取らずに行削除してしまったか
    いろいろ考えられますが私のところへ来た時点ではエラーがある
    アドレスのA行と性別のB行だけのCSVですので
    原因は分かりませんが整理したデータに直したいのですが。

    返事の意味が的を得てないかもしれませんがすみません。
  • id:taknt
    そのCSVのファイルを 秀丸等のエディタで開いてもらって
    エラーが出る箇所を 確認してもらえればいいと思いますよ。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません