人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

質問です。

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


#NAME?

#REF!


●質問者: inosisi
●カテゴリ:コンピュータ インターネット
✍キーワード:name かに エクセル エラー ファイル
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● SALINGER
●40ポイント ベストアンサー

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

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


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
◎質問者からの返答

ありがとうございます。

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

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

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


2 ● きゃづみぃ
●20ポイント

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

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


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

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

◎質問者からの返答

ありがとうございます。

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

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


3 ● SALINGER
●20ポイント

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

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
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ