[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『表全体にある色つきセルだけを取り出す』(ぴーこ)
こんにちは。
分かる方がいれば教えてください。
A1:I4000前後(行の数は変動します)の表があります。
その中に黄と赤の塗りつぶしセルがまばらに多数あります。
やりたいことを簡潔に言うと、要約どうり
「表全体にある色つきセルだけを取り出したい」です。
1つの列に色フィルターをかけてしまうと
その列しか色セルはでてきてくれませんよね。
他の列にあった色つきセルは
フィルターをかけたところに色セルがないともちろん出てきません…
なんか対策を考えていたのですが
頭が固いのか、どうも思いつきません・・・
しかし、ふと考え付いたのは、
2行目から最終行までの行に
塗りつぶしセルがなかったら行を削除、または非表示
を繰り返すのはいいんじゃないかと。
でも、VBA習いたての私には
どのようにコードを書けばいいか分かりません。。。
恐縮ですが、コードを教えていただけないでしょうか?
無理なお願いかと思いますが
お力をください。
よろしくお願いします。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
何を悩んでるかよく分かんないですが 「表全体にある色つきセルだけを取り出したい」で、 削除とかしていいなら 表全体を指定して、色がついてないセルを削除すればいいだけじゃないですか?
取り出すといっても、どこのシートのどこに取り出すだとか 具体例があったほうが回答者も答えやすいと思いますよ (nazo) 2017/03/01(水) 14:17
手順としては
結果シートをコピーして、抽出シートに貼り付け、
抽出シートのA8をセレクトしてCtrl+→、Ctrl+↓で表全体を指定、
色がついてないセル(塗りつぶしなしセル)を削除
こんな感じです。
よろしくお願いします。
(ぴーこ) 2017/03/01(水) 14:29
処理前、
[A] [B] [C] [D] [E] [F] ┌───┬───┬───┬───┬───┬───┐ [1]│項目1 │項目2 │項目3 │項目4 │項目5 │項目6 │ ├───┼───┼───┼───┼───┼───┤ [2]│ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ [3]│ 赤 │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ [4]│ │ 黄 │ │ │ 赤 │ │ ├───┼───┼───┼───┼───┼───┤ [5]│ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ [6]│ │ │ │ 黄 │ │ │ ├───┼───┼───┼───┼───┼───┤ [7]│ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ [8]│ │ │ 赤 │ │ │ │ ├───┼───┼───┼───┼───┼───┤ [9]│ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ [10]│ │ │ │ │ │ 黄 │ └───┴───┴───┴───┴───┴───┘
こんな感じですよね?
オートフィルターを掛けて
全部の列で色フィルターの塗りつぶしなしを選んで、
[A] [B] [C] [D] [E] [F] ┌───┬───┬───┬───┬───┬───┐ [1]│項目1 │項目2 │項目3 │項目4 │項目5 │項目6 │ ├───┼───┼───┼───┼───┼───┤ [2]│ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ [5]│ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ [7]│ │ │ │ │ │ │ ├───┼───┼───┼───┼───┼───┤ [9]│ │ │ │ │ │ │ └───┴───┴───┴───┴───┴───┘
こうなると思うので、
表示されている行を削除
で、オートフィルター解除で行けると思います。
(まっつわん) 2017/03/01(水) 14:47
>でも、VBA習いたての私には
>どのようにコードを書けばいいか分かりません。。。
とりあえず、手順が解っているなら、
マクロの記録をして、コードを探るところから始めたらいいと思います。
(まっつわん) 2017/03/01(水) 15:04
やりたいことは、仰っていた通りです!
マクロの記録をしてみました。
↓↓↓
Sub Macro1()
Range("A7").Select
ActiveSheet.Range("$A$7:$I$12056").AutoFilter Field:=1, Operator:= _ xlFilterNoFill ActiveSheet.Range("$A$7:$I$12056").AutoFilter Field:=2, Operator:= _ xlFilterNoFill ActiveSheet.Range("$A$7:$I$12056").AutoFilter Field:=3, Operator:= _ xlFilterNoFill ActiveSheet.Range("$A$7:$I$12056").AutoFilter Field:=5, Operator:= _ xlFilterNoFill ActiveSheet.Range("$A$7:$I$12056").AutoFilter Field:=7, Operator:= _ xlFilterNoFill ActiveSheet.Range("$A$7:$I$12056").AutoFilter Field:=9
Rows("71:71").Select
Range(Selection, Selection.End(xlDown)).Select Selection.Delete Shift:=xlUp
Range("A7").Select Selection.AutoFilter
End Sub
列で塗りつぶしなしを選択する時に、
Field:=4、Field:=6、Field:=8、
が塗りつぶしセルがなかったのですが、
このような場合どうやってループ?するんでしょう?
(ぴーこ) 2017/03/01(水) 15:13
んー。考えてても進まないのでとりあえずやってみる^^
Sub Macro1()
Dim i As Long
Sheets("Sheet1").UsedRange.Copy Sheets("Sheet2").Range("A1")
With Sheets("Sheet2").UsedRange For i = 1 To .Columns.Count .AutoFilter Field:=i, Operator:=xlFilterNoFill Next .Offset(1).Delete Shift:=xlUp .AutoFilter End With End Sub (まっつわん) 2017/03/01(水) 15:29
コードの書き込みありがとうございます。
Aから最終列までフィルターをかけ終えた後、
↓↓
.AutoFilter Field:=i, Operator:=xlFilterNoFill
この部分で
「実行時エラー'1004':
RangeクラスのAuto Filterメゾットが失敗しました」
とエラーメッセージが出て来たのですが、
何が原因で止まってしまったんでしょうか><
(ぴーこ) 2017/03/01(水) 15:54
出遅れているかもしれませんが。
・なにかを行う対象は セル ですか、その行 ですか? ・その なにか とは 削除 ですか? 非表示 ですか? ・対象は 色付きを ですか? 色なしを ですか?
(β) 2017/03/01(水) 16:36
なら、
.AutoFilter Field:=i, Operator:=xlFilterNoFill
はもう実行されないはずなので、、、、
ちょっとこちらでは想像できないです。
ステップ実行してiの値をローカルウィンドウで確認してみて、
えらーで止待った時のiの値を教えてください。
(まっつわん) 2017/03/01(水) 16:45
Sub Macro1()
Dim i As Long Sheets("Sheet1").UsedRange.Copy Sheets("Sheet2").Range("A1") With Sheets("Sheet2").UsedRange For i = 1 To .Columns.Count .AutoFilter Field:=i, Operator:=xlFilterNoFill Next If .Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then .Offset(1).Delete Shift:=xlUp End If .AutoFilter End With End Sub (まっつわん) 2017/03/01(水) 16:51
上記のコードで実行してみましたが
.AutoFilter Field:=i, Operator:=xlFilterNoFill
で止まってしまいます><
ローカルウィンドウで値を確認したところ、
値が10になっていました。
(ぴーこ) 2017/03/01(水) 17:07
Sheets("Sheet2").UsedRange.resize(,9)
にしてください。
10列目にタイトルがないのかなと想像します。
(まっつわん) 2017/03/01(水) 17:27
>まっつわん さん
〓>Sheets("Sheet2").UsedRange 〓Sheets("Sheet2").UsedRange.resize(,9) 〓にしてください。
の変更をしなくても、Sheet1のA1に何か文字列を入れておけば、いいのかも?
(マリオ) 2017/03/01(水) 18:56
オートフィルターが本線でしょうし、(β) 2017/03/01(水) 16:36 の質問にも答えていただいてないので お邪魔虫でしょうけど、皆さんの回答コードを見ると、色なし行を削除する(色付きセルがある行を残す)ということらしいので 天邪鬼ですが、あえて、コテコテループで。
領域の特定の書式の値を取得した時に、その値が混在なら NULL、すべてのセルが同じ値なら、その値が戻される特性を利用して 行単位に処理しています。
Sub Sample() Dim r As Range Dim a As Range Dim ck As Variant
With ActiveSheet.UsedRange.Columns("A:I") For Each r In Intersect(.Cells, .Offset(1)).Rows ck = r.Interior.ColorIndex If ck = xlNone Then If a Is Nothing Then Set a = r Else Set a = Union(a, r) End If End If Next End With
If Not a Is Nothing Then a.Delete xlUp
End Sub
(β) 2017/03/02(木) 00:34
の変更をしなくても、Sheet1のA1に何か文字列を入れておけば、いいのかも?
iが10まで進んでいるので、A1にはタイトル行とみなせる何かがありそうです。
むしろ、
>A1:I4000前後(行の数は変動します)の表
だから、9列だと明示することで、エラーは回避できるはずですが、
シートが見れないので、オートフィルターが失敗する原因が特定できないですねー。。。
(まっつわん) 2017/03/02(木) 07:51
お返事遅れて申し訳ありません。
(まっつわん)様のコードでも(β)様のコードでも
動作がスムーズに通りました!!
(β)様、2017/03/01(水) 16:36 の質問スルーしてすみません。
悪気があってスルーしたわけではありませんのでお許しください。
この度はVBA初心者な私に親切にご回答いただき
誠にありがとうございました。
いつか皆様のような回答者になれるくらいの実力を身につけていきたいと思います。
本当にありがとうございました><
(ぴーこ) 2017/03/02(木) 09:12
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.