• ベストアンサー

エクセルのマクロで意図しない文字が消える

エクセルのマクロを組んでいて、なぜか実行すると意図しない文字が消えてしまいます 至急解消したいので、どうぞよろしくお願いします N8から、数値が一列に並んでいて、「0」を消して行くという目的です 下記のような組み方をしています すると、P列1行目からAF列まで入っていた文字が消えてしまいます これを解消する方法を教えて下さい '0を消す Const intCriteria As Integer = 0 With Cells(8, 14).CurrentRegion On Error GoTo errhandler .AutoFilter Field:=14, Criteria1:=intCriteria .Offset(1).Resize(.Rows.Count - 1). _ SpecialCells(xlCellTypeVisible).EntireRow.Delete End With ActiveSheet.AutoFilterMode = False Exit Sub errhandler: ActiveSheet.AutoFilterMode = False MsgBox intCriteria & "はありません。"

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >なぜか実行すると意図しない文字が消えてしまいます With Cells(8, 14).CurrentRegion  この部分が問題です。 おそらく、セルが続いているからなのですが、CurrentRegion ではなく、8行目を左端にするように決めてください。CurrentRegion では曖昧です。 本来は、CurrentRegion のままでもできるのですが、回答者側では、レイアウトが分かりませんので、CurrentRegion のままで、コードを書くことはできません。 少し手直ししてみました。 '-------------------------------------- Sub Test1()   Const intCRITERIA As Integer = 0   On Error GoTo ErrHandler   '念のため   If ActiveSheet.AutoFilterMode = True Then     ActiveSheet.AutoFilterMode = False   End If   With Range("N8", Range("N65536").End(xlUp).Offset(, 18)) '右は決めてください。現在は、AFまで     .AutoFilter Field:=14, Criteria1:=intCRITERIA     .Offset(1).Resize(.Rows.Count - 1). _     SpecialCells(xlCellTypeVisible).EntireRow.Delete   End With   ActiveSheet.AutoFilterMode = False   Exit Sub ErrHandler:   ActiveSheet.AutoFilterMode = False   MsgBox intCRITERIA & "はありません。" End Sub

lucvbnm
質問者

お礼

ありがとうございます。 もともとの構文をなおして下さり、私にも解り易い組み方をしてくださいました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

>、「0」を消して行くという目的です 下のコードを見るとN列のセルの値で0の行を削除するではないか。表現は正確に。 ーー 難しいフィルタたやxlCellTypeVisible を使っているから勘違いが起こっているのでは。 参考 私は削除をやるときはForNextを使い、下行からやっている。上からやると大変。 簡単に Sub test01() d = Range("N65536").End(xlUp).Row MsgBox d For i = d To 1 Step -1 If Cells(i, "N") = 0 Then Cells(i, "N").EntireRow.Delete Next End Sub で出来るが。

lucvbnm
質問者

お礼

ありがとうございます。 P列から文字が消えなくなりました。

関連するQ&A

  • EXCELマクロ AutoFilterの使い方を教えて下さい。

    EXCELマクロ AutoFilterの使い方を教えて下さい。 EXCELマクロ初心者です。使用環境は、EXCEL2007です。 Web上で紹介されていたマクロをアレンジして以下のようなマクロを作成しました。 B列に指定した数字が記載された行を削除するものです。 これをさらに、4,5,6,・・・,11,12,1,2,3の中から指定した数字以外がB列に記載 された行を削除するように書き換えたいのですが、「Criteria1:=intCriteria」 を「Criteria1:<>intCriteria」として実行してみましたがエラーが出てしまいま す。 どなたか、良い方法をご教示ください。不足の情報、私の説明不足がありましたら、 ご指示ください。 以下、MACRO内容 Sub B列に指定の数字がある場合、行を削除() Application.ScreenUpdating = False intCriteria = InputBox("検索する数字を入力。", "数字入力") With Cells(2, 1).CurrentRegion On Error GoTo errhandler .AutoFilter Field:=2, Criteria1:=intCriteria .Offset(1).Resize(.Rows.Count - 1). _ SpecialCells(xlCellTypeVisible).EntireRow.Delete End With ActiveSheet.AutoFilterMode = False Exit Sub  errhandler: ActiveSheet.AutoFilterMode = False  MsgBox intCriteria & "はありません。" Application.ScreenUpdating = True End Sub

  • Excelマクロで他シートへの抽出:エラー

    こちらの質問 http://okwave.jp/qa/q4760155.html を参考に、エクセルマクロを作りました。 Sheet1の10列目(J)に@が入っている行をすべて、 Sheet2に抽出表示します。コードは次になります。 Private Sub Worksheet_Activate() With Sheets("Sheet1") .AutoFilterMode = False .Range("A1:N1").AutoFilter .Range("A1:N1").AutoFilter Field:=10, Criteria1:="@" .Range(.Range("A1"), .Range("A1").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy Range("A1") .AutoFilterMode = False End With End Sub このマクロを実行すると、確かにSheet2では抽出が行われるのですが、 同時にSheet1の内容も抽出された内容に変わってしまいます。 どこに問題があるのでしょうか。 よろしくお願いします。

  • EXCEL 頭に特定の文字があった場合、文字記入

    B列に複数の品番がありますが、頭に「CY」があった品番のみK列に「図面は不要」と自動で入力するように下記マクロに追加したいのですが、教えて下さる方からの回答をお待ちしています。 ※BからK列のJ列に記載があったものだけを抜粋しています。 sub macro()  range("B:K").autofilter field:=9, criteria1:="="  activesheet.autofilter.range.offset(1).entirerow.delete shift:=xlshiftup  activesheet.autofiltermode = false end sub

  • マクロ教えてください!コマンドボタンがどんどん大きくなっていきます・・・

    質問ですが、コマンドボタンを使ってマクロを動かしたいのですが、一回目押下すると正常に動くんですが、二回目以降コマンドボタンを押下すると、コマンドボタンの大きさ、ボタンの中の文字の大きさがどんどん大きくなっていきます。なぜですか?ちなみに自分なりにどこで大きくなるか調べたところ .SpecialCells(xlCellTypeVisible).EntireRow.Delete の後からその現象がおきます。教えてください。もっと詳しくロジック必要ならおっしゃってください。 Application.ScreenUpdating = False On Error Resume Next With Columns("F:G") '空白行F~Gの間(文字列が入っていない行)を削除 .SpecialCells(xlCellTypeConstants).EntireRow.Hidden = True .SpecialCells(xlCellTypeComments).EntireRow.Hidden = True .SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With Application.ScreenUpdating = True

  • エクセル2010 VBA 行削除

    特定列が空白であれば行削除をしたいのですが、下記コードでうまく削除は出来るのですが、応答なしになったり、とても遅いのですが、もう少し早く処理出来る方法はありますか? E列が空白であれば行削除をしたいのですが・・ With Range("E13", Cells(Rows.Count, 5).End(xlUp)) .AutoFilter Field:=1, Criteria1:="" On Error Resume Next Set rng = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible) If Err.Number = 0 Then rng.EntireRow.Delete On Error GoTo 0 .AutoFilter End With

  • 指定した範囲内が空白なら行削除するマクロ

    エクセルで指定した範囲内(A列からC列まで)で何も文字が入っていなければ(空白)、行を削除する、というマクロを教えてください。 いくつか調べて、以下を試しましたが、何も動作しませんでした。 どなたかアドバイスをいただければ助かります。 よろしくお願いします。 Sub DeleteBlankRows2() Application.ScreenUpdating = False On Error Resume Next With Columns("A:C") .SpecialCells(xlCellTypeConstants).EntireRow.Hidden = True .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden = True .SpecialCells(xlCellTypeComments).EntireRow.Hidden = True .SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With Application.ScreenUpdating = True End Sub

  • EXCEL 特定の列内で記載があった行を削除

    G列に記載があったものだけを残したいと以前質問した際に回答を頂いた内容ですが、 この内容にプラスして、L列に何か記載があった場合、その行は削除するようにしたいと考 えています。 詳しい方が居りましたら、是非頂けないでしょうか? sub macro2()  range("G:L").autofilter field:=1, criteria1:="="  activesheet.autofilter.range.offset(1).entirerow.delete shift:=xlshiftup  activesheet.autofiltermode = false end sub 環境 Excel2003を利用しています。

  • エクセルのVBAの変更点がわからないので教えてください

    下のようなプロシージャをエクセルに組み込んでいますが、次のようなことができるように変更したいので教えてください。 なお、プロシージャは正常に作動しています。 Private Sub Worksheet_Activate() With Sheets("シート名") .AutoFilterMode = False .Range("A1:d1").AutoFilter .Range("A1:d1").AutoFilter field:=1, Criteria1:="<>" .Range(.Range("d1"), .Range("A1").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy Range("A1") .AutoFilterMode = False .Range("A1:d1").AutoFilter End With End Sub 修正してできるようにしたいこと 1、with sheets("シート名")のシート名にシートがアクティブになったとき、そのシート名が自動で入るようにしたい。 ※シートの数は6シーとあります。 2、セルd1のデータからその行のデータ全体がコピーされるので、必要なセルのデータのみがコピーできるようにしたい。

  • エクセル ○○以外を抽出

    (シート1) A     B      1 リンゴ   沖縄    2 みかん  北海道 3 かき    滋賀 4 さんま   山口 5 かき    滋賀 6 いわし   東京 7 リンゴ   沖縄 で、リンゴ・みかん・かきの行以外を別シートに自動反映する方法ありませんか? リンゴだけを抽出といった方法は分かったのですが、、、      ↓(ちなみにそれは) Private Sub CommandButton3_Click() With Sheets("Sheet1") .AutoFilterMode = False .Range("A1:M1").AutoFilter .Range("A1:M1").AutoFilter Field:=1, Criteria1:="リンゴ" .Range(.Range("A1"), .Range("A1").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy Range("A1") .AutoFilterMode = False End With End Sub のようにやりました。 すんません、教えてください!!!

  • エクセルVBA実行エラーの対処方法

    以前教えていただいた構文ですが、NOWより過ぎてない日付がFirstRow 31より有り、過ぎた日付がない場合に実行するとエラーが出ます。これを回避するのを教えてください。 宜しくお願いします。 Const DateColumn = "B" '日付が入力されている列 Const FirstRow = 31 '削除の対象となる可能性がある最初の行 Dim LastRow With ActiveSheet LastRow = .Range(DateColumn & Rows.Count).End(xlUp).row If LastRow <= FirstRow Then MsgBox "処理すべきデータがありません。" _ & vbCrLf & "マクロを終了します。" _ , vbExclamation, "データ無し" Exit Sub End If With Application .ScreenUpdating = False .Calculation = xlManual End With .Range(DateColumn & FirstRow - 1 & ":" & DateColumn & LastRow) _ .AutoFilter Field:=1, Criteria1:="<=" & Now, _ Field:=1, Criteria2:="", Operator:=xlOr .Range(DateColumn & FirstRow & ":" & DateColumn & LastRow) _ .SpecialCells(xlCellTypeVisible).EntireRow.Delete .Cells.AutoFilter End With With Application .CutCopyMode = False .Calculation = xlAutomatic .ScreenUpdating = True End With

専門家に質問してみよう