プロが教えるわが家の防犯対策術!

エクセルのマクロについて質問いたします。

下記のステップ1からステップ2を一発で行うマクロ文は、
どのようになりますか? 教えてください。

<ステップ1>
あるシートのB列に『AAA』という文字を含んでいる行があったら
その行は丸ごと削除する。
また、『AAA』という文字を含んでいなかったら、
エラーなどが出ないで、次のステップ2の処理に移る。

<ステップ2>
ステップ1と同じシートのC列に、『B』という文字を含んでいる行があったらその行は丸ごと削除する。
※この”『B』という文字を含んでいる”という意味は、
『B-』や”『B5』と入力されている場合も含めるということです。

また、『B』という文字を含んでいなかったらエラーなどが出ないこと。

A 回答 (8件)

抽出してから削除するのはどうでしょう?


参考URL
http://www.moug.net/skillup/ebb/evbb/evbb002-2.htm

この回答への補足

早速の回答ありがとうございます。

残念ながら
オートフィルターを設定できない表なので質問どうりでお願いします。

補足日時:2007/11/26 08:23
    • good
    • 0

こんにちは。



基本的には、ご質問のような製作依頼の内容は、きちんとした理由がない限りは、あまり思ったとおりの回答は付かないということを覚えておいたほうがよいと思います。私は、通常、製作依頼のような内容でも、好めば回答は付けていますが、厳しいようですが、今回のものは、基本的には回答は書くつもりがありません。ここでは、質問者さんが努力しているものに対して、手助けをするというのが基本的なスタイルです。

>残念ながら
>オートフィルターを設定できない表なので質問どうりでお願いします。

オートフィルタを設定できないような表が存在するとは思えません。
サンプルを出して、こういう表で、そのようにできないかを説明しないと納得できないです。

#1の方が、示されたサンプルは、入門レベルから上位レベルまで使われるテクニックで、実際には、そのすべてを記録マクロでは処理できるとは私は思いませんが、ご質問者さんが断言できるような内容かは、なぜ出来ないかご説明できないと、それは判断つきかねます。

Excelの場合は、基本的に手作業で出来る方法を、マクロ化させるわけです。ですから、VB言語のコードとは違った効率化を図るというのが、Excelマクロの基本的なコンセプトです。
    • good
    • 0

> オートフィルターを設定できない表なので質問どうりでお願いします。


「オートフィルターを設定できない」と思い込んでいるのでは?
例えば、検索したいデータが10行目以降にあり、1~9行目には10行目以降とは異なるフォーマットでデザインされている。
質問者さんは、「オートフィルタは1行目に設定するもの」と思い込んでいるので、上記のような条件をつけてきているのでは?
10行目からでもオートフィルタは設定できます。

また、複数の表がヨコに並んでいるからかなとも思いましたが、
それなら、VBAで行削除を行えば消したくない方の表も消えるので違うのだろうと思っています。
でも、単にそのことに気付いていないだけなのかも...

よく、「こんなこと出来ないかな」と相談され、よくよく聞いてみると、
そんな面倒ことをしなくても、根本を変更することで済んでしまった。
といった経験を何度もしています。
変な例えですが。
「何探してるの」
「この辺、コンビニが見あたらなくて。。。」
「なにを買いたいの」
「コーラ」
「そこにコーラの自販機あるけど」
「あ・・・」

サンプルを提示すれば、より有効な提案があるかもしれません。
    • good
    • 0

行削除の条件について、



  ・B列に『AAA』という文字を含んでいる行は削除
  ・C列に『B』という文字を含んでいる行は削除

であるならば、整理すると

  ・B 列に "AAA" または C 列に "B" という文字が含まれれば行削除

と解釈して良いのでしょうか?

 For i=最終行番号 To 開始行番号 Step -1
   If InStr(Cells(i, "B").Value, "AAA") > 0 Or InStr(Cells(i, "C").Value, "B") > 0 Then
     Rows(i).Delete Shift:=xlShiftUp
   End If
 Next i

最終行番号の取得方法は調べればすぐわかります。End プロパティー。

行削除のポイントは、最終行から開始行に向かって、つまり下から上へ
向かって処理することです。その他の注意事項としては、VBA は

 1. 大文字・小文字
 2. 全角・半角

を区別することです。

この回答への補足

ありがとうございます!

すんなりと解決できました。

また、やりたいこともすぐにできるようになりました。

簡潔かつ美しい回答、丁寧な説明、本当に感謝いたします。
ただ回答を締め切るのは別の事情がありもう少しお待ちください。
また改めて御礼をさせていただきます。

取り急ぎ、御礼申し上げます。

補足日時:2007/11/27 02:22
    • good
    • 0

ひょっとして私が「Bを含む」を間違って「B」の条件でサンプルを書いたので混乱されたのでしょうか。


ミスを訂正し、且つ行の削除済みデータも作成する(元データは消さずに新しいシートにする)のであれば、以下のコードでどうでしょう。
Sub Senbetsu()
Dim NSht As Worksheet

With Selection
.AutoFilter Field:=2, Criteria1:="<>", Operator:=xlAnd, Criteria2:="<>AAA"
.AutoFilter Field:=3, Criteria1:="<>*B*", Operator:=xlAnd
.Copy
End With
Set NSht = ActiveWorkbook.Sheets.Add(Before:=Worksheets(1))
NSht.Paste Destination:=NSht.Range("A1")
End Sub

この回答への補足

補足日時:2007/11/27 01:19
    • good
    • 0
この回答へのお礼

お礼日時:-0001/11/30 00:00

ステップ1とステップ2はステップ1優先でよいのでしょう。

ッステップ1が該当したら、ステップ2は考えなくて良いのでしょう。ですからステップ2の後へ飛べばよい。
であればステップ1,2、は直線的にならべて書いて可では。
--
何も疑問は無いと思うが。
行削除は下の方の行から上にやるのが良いと思う。
For i=d to 1 Step -1
--
「含んでいる」という検査のコードがわからないのですか。
InStr関数などでできます。
本質問は、丸投げ質問なんで、あえてコードは書きません。
    • good
    • 0

こんにちは。



#2の回答者です。あえて、今回のことに、割り込みさせていただきます。

ご質問者さんは、まだ、いろんな面で、ここの掲示板に不慣れのようです。他のカテゴリで書いた内容は、こちらのカテゴリで書いてくださらないと分かりません。不要な手間やトラブルを起こす元です。

あえてすでに解決しているようですが、ここのご質問だけなら、オートフィルターで出来るのではないかと思います。ただし、もし複数の行単位で存在するブロックだとすると、これはなんともいえません。また、コードの方法論を決められてしまうと、本来は、質問者さんからコードを提示してもらわないといけません。

せっかく、Raistlin様が別の場所から続けて回答されておられるので、あえて私も、参考程度に考えさせていただきました。私は、自信のほどはありませんが。

>※この”『B』という文字を含んでいる”という意味は、
>『B-』や”『B5』と入力されている場合も含めるということです。
ということですと、B* となるかと思います。

これは、全角・半角の区別はしませんが、大文字・小文字の区別はします。

また、ActiveSheet.Range("A1:C" & i)
のA1 は、左上端の始点のことですから、A2 だったらら、A1 をA2に書き換えてください。

'標準モジュールが適しています。

Sub Test1()
  Dim i As Long
  Dim FiltRng As Range
  Dim uRng As Range
  
  ActiveSheet.AutoFilterMode = False
  Application.ScreenUpdating = False
  On Error Resume Next
  i = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
  Set FiltRng = ActiveSheet.Range("A1:C" & i)
  With FiltRng
    .AutoFilter Field:=2, Criteria1:="AAA"
    With .Offset(1).Resize(.Rows.Count - 1).EntireRow
      Set uRng = .SpecialCells(xlCellTypeVisible)
    End With
  End With
  With FiltRng
    ActiveSheet.ShowAllData
    .AutoFilter Field:=3, Criteria1:="B*"
    With .Offset(1).Resize(.Rows.Count - 1).EntireRow
      Set uRng = Union(uRng, .SpecialCells(xlCellTypeVisible))
    End With
  End With
  ActiveSheet.AutoFilterMode = False
  Application.ScreenUpdating = True
  On Error GoTo 0
  If uRng Is Nothing Then
    MsgBox "該当する行がありません。", vbInformation
  Else
    uRng.Select
    If MsgBox("選択した範囲を削除します。よろしいですか?", vbQuestion + vbOKCancel) = _
      vbOK Then
      uRng.Delete
    End If
  End If
  FiltRng.Cells(1).Select
  Set uRng = Nothing
  Set FiltRng = Nothing

End Sub
    • good
    • 0

#7の文章の訂正です。



#これは、全角・半角の区別はしませんが、大文字・小文字の区別はします。

・・全角・半角の区別はしますが、大文字・小文字の区別はしません。
でした。失礼しました。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!