- ベストアンサー
エクセル表でのパターンの検索方法を教えてください
理系ですがパソコン関係が苦手な大学4年生女子です。 エクセルの各セルに、1か0が入った大きな表があります。 無限の広がりがあるのを考えたいのですが、できないので、例えば1万×1万の表とします。 その中に、 000 010 000 のパターンを見つけたいのですが、上手く検索できないので困っています。 エクセルの検索機のでは、000も検索できないので、一旦pdfで出力してみましたが、000とか010しか検索できないので、目で確かめないといけないです。 3行いっぺんに検索できないでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
自分がやるのならすぐにVBAでそんなパターンを検索するような手続きをつくるのだろうが,そんなことができない人でも頭を使えば出来合いのエクセルの検索機能だけでも可能です。 各セルには0か1しかないのが前提ですから,000-010-000になっていることと,これらの合計が1でかつ真ん中の数値が1であることと同値です。ということは,別の場所(別シート)で =(A1+A2+A3+B1+B2+B3+C1+C2+C3)*B2 のような計算をさせて1を検索すればよいのです。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
まあ、関数を使った、条件付き書式でも、できそうだが、VBAを使うのが素直だろう。 ーー でもこういうのは、その研究室の中での、引き継がれている、ソフトを先輩から聞いて、それを使わせてもらうのが筋だろう。パターンが複雑になると、エクセルでは得意と言えないと思う。 小生は、セル(細胞)のゲノム解析(AGTCの塩基配列)などの記事で、パターンを検索しているという記事が載るが、門外漢なので、いつもどういうロジックでやるのか、気になっている。 この程度になると専門家の知識と、コンピューターソフト作成技量と、アルゴリズムの知識が要ると思うが。本件は、おもちゃのような010なので、素人でも思いついたというわけ。ベターかどうかわからんが。 ーー ちゃちな例でやってみた。 コードに対してのコメントの意味がわじゃる判るようならやってみて。 例データ A1:F10 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 1 1 標準モジュールに Sub test01() Cells.Interior.ColorIndex = xlNone '塗りつぶしの色の書式を一旦クリア '--各セルで繰り返し For i = 1 To 10 '列は指定行全部 For j = 2 To 9 Step 3 '列的には3列まとめて=3列ごと If Cells(i, j) = 1 Then ''そのセルが1か If Cells(i, j).Offset(0, -1) = 0 And Cells(i, j).Offset(0, 1) = 0 Then 'その左右セルが0か Cells(i, j).Interior.ColorIndex = 6 'そのセル黄色塗りつぶし Cells(i, j).Offset(0, -1).Interior.ColorIndex = 6 '直左セル黄色塗りつぶし Cells(i, j).Offset(0, 1).Interior.ColorIndex = 6 '直右セル黄色塗りつぶし End If End If Next j Next i End Sub セルの色づけが適当かどうか、納得してみて。 1万行の場合は For i = 1 To 10の 10 かつ For j = 2 To 9 Step 3 の9 を 増やせばよい。
- kkkkkm
- ベストアンサー率66% (1734/2604)
No1の追加です。 それとも0で囲まれた1がひとつのブロックと考えるのでしょうか? 添付画像は分かりやすいように後から罫線で囲いました。 Sub Test() Dim c As Range Application.ScreenUpdating = False For Each c In Range(Cells(2, 2), Cells(101, 101)) If c.Value = 1 Then If WorksheetFunction.Sum(Range(Cells(c.Row - 1, c.Column - 1), Cells(c.Row + 1, c.Column + 1))) = 1 And _ WorksheetFunction.Count(Range(Cells(c.Row - 1, c.Column - 1), Cells(c.Row + 1, c.Column + 1))) = 9 Then Range(Cells(c.Row - 1, c.Column - 1), Cells(c.Row + 1, c.Column + 1)).Value = 2 c.Interior.Color = vbYellow c.Value = 1 End If End If Next Range(Cells(2, 2), Cells(101, 101)).Replace What:=2, Replacement:=0 Application.ScreenUpdating = True End Sub
お礼
再回答ありがとうございました。 すごいですね。 >それとも0で囲まれた1がひとつのブロックと考えるのでしょうか? ということです。 例示頂いたすべての1が該当します。
- kkkkkm
- ベストアンサー率66% (1734/2604)
0で囲まれた1を見つけたらいいのでしょうか?添付画像の感じです。 10000×10000だとかなり時間がかかると思いますので、テストは100×100で行ってみてください。 B2からデータが入っていると考えてます。添付画像はB2からG9までにしてます。 Sub Test() Dim c As Range Application.ScreenUpdating = False For Each c In Range(Cells(2, 2), Cells(101, 101)) If c.Value = 1 Then If WorksheetFunction.Sum(Range(Cells(c.Row - 1, c.Column - 1), Cells(c.Row + 1, c.Column + 1))) = 1 And _ WorksheetFunction.Count(Range(Cells(c.Row - 1, c.Column - 1), Cells(c.Row + 1, c.Column + 1))) = 9 Then c.Interior.Color = vbYellow End If End If Next Application.ScreenUpdating = True End Sub
お礼
解答いただけてありがとうございます。 プログラムできるなんてすごいですね。
お礼
回答いただけてありがとうございます。 初め何のことかわからなかったんですが・・・・・。 すごい発想ですね。 プログラムできないんで、とてもいい方法で解決しました! ありがとうございました。