- 締切済み
シート内の複数の特定の文字を検出
お客さんからもらったEXCELのフォーマットに沿って集計ツールを EXCEL VBAで作成していますが、下記で詰まってしまいました。 表示されているシートを順に選択して、それ毎に「結果」と「実施日」と 入力されているセルがあるか探して、無ければとばして、あれば 処理していくという流れで作成しています。 ★の行が無い状態では動くのですが、それだとシート内で「結果」「実施日」を 見つけて処理した後に、次のシートへ行ってしまいます。 シートによっては複数の「結果」「実施日」があり(この2つはセット)、 それを全て拾って処理したいと考えて、繰り返す為に★の行を追加して実行すると、 一つ目の★の行で「オブジェクトが必要です」というエラーではじかれてしまいます。 自分としては、2つ目の★の行でオブジェクトを用意しているつもりですが。。。 For Each、、、に拘りは特に無いので、他の方法も含めて どなたかご教示いただきたいです。 For Each Sh In Worksheets Sh.Activate If Sh.Visible = True Then Set Kekka = Sh.Cells.Find(What:="結果") If Not Kekka Is Nothing Then Set jissibi = Sh.Cells.Find(What:="実施日") If Not jissibi Is Nothing Then For Each rg In UsedRange ★ Set rg = Range("kekka") ★ Day_Col = jissibi.Column Day_Col_Last_Row = Cells(Rows.Count, Day_Col).End(xlUp).Row Result_Col = rg.Column Call Count(A_count, B_count, C_count) Next rg ★ Else End If Else End If Else End If Next Sh
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
#2です。質問がよくわからないので勝手例題で、やってみた。 参考にして。 シートはSheet3対象(For each で複数シートに拡張はやさしい) 例データ シート内3セルで挟まれた中の日付を抽出。「開始日」と「終了」セルで挟まれたものを情報データ抜出。 データの状況と離散状況。 B4セルから3セル 開始日 2017/2/10 終了 D13セルから3セル 開始日 2017/2/18 終期日 A22セルから3セル 開始日 2017/2/24 終了 ーー 2番目のブロックは開始日ー終期日であり、開始日ー終了でないので拾わない。 標準モジュールに Sub test3() 'For Each sh In Worksheets Set sh = Worksheets("Sheet3") sh.Select With sh.Cells Set c = sh.Cells.Find(what:="開始日", lookat:=xlWhole) MsgBox "場所 " & sh.Name & "=" & c.Row & "," & c.Column tx = Cells(c.Row, c.Column) & Cells(c.Row, c.Column + 1) & Cells(c.Row, c.Column + 2) MsgBox "3セル結合" & tx If tx Like "開始日*終了" Then MsgBox "日付 " & Mid(tx, 4, Len(tx) - 5) End If '条件に当てはまるセルがあるかどうかを判定 If Not c Is Nothing Then '最初のセルのアドレスを覚える firstAddress = c.Address '繰返し検索し、条件を満たすすべてのセルを検索する Do Set c = .FindNext(c) If c Is Nothing Then Exit Do MsgBox "場所 " & sh.Name & "=" & c.Row & "," & c.Column tx = Cells(c.Row, c.Column) & Cells(c.Row, c.Column + 1) & Cells(c.Row, c.Column + 2) MsgBox "3セル結合" & tx If tx Like "開始日*終了" Then MsgBox "日付 " & Mid(tx, 4, Len(tx) - 5) End If If c.Address = firstAddress Then Exit Do Loop End If End With 'Next End Sub で実行。 Msgboxの出ようで、納得して。 検索該当終了で、最初の該当に戻るがその表示が出るままにしているが、夜遅いので手抜きした。
- imogasi
- ベストアンサー率27% (4737/17069)
質問内容・文章表現で補足すべきだとおもう。 (不完全と自認している)我流のコードを上げるよりも、データの状況を詳しく書け。 >特定の文字を検出 文字でなく、文字列(=複数文字の綴り)のことだろう? ーー ある1つのシートで >「結果」と「実施日」と 必ずペアか? 「結果」ー>「実施日の出現順序の前後はこの順序か? ーー ペアとして2ペア以上は出現しないのか? 質問のコードではFindNextが使われていないが。 ーー 結果と実施日の間の列間か行間に、ほしいデータがあるのか。 例でも挙げて説明のこと ーー こういう文章・語句間からデータを抜くのは、むつかしい。HTML文のタグの 間から内容を抜くのむづかしいが、TAGもないしね。 企業秘密もあるのだろうが、実例に近いものでも示して、質問しないと、わからない。 文章で処理ロジックを固めることがまず先だろう。 VBAでは検査語の組み合わせを指定して検索は、セルにデータが分れているだけに、かえって難しいのでは。 在り様が、結果+データ+実施日の3セルに限るなら、3セルのキストを結合し、「結果*実施日」で検索するとか思ったりするが。
- ushi2015
- ベストアンサー率51% (241/468)
こんばんは シートによっては複数の「結果」「実施日」があり(この2つはセット) とは? 2つのセットのセルの位置関係は? セットは必ず同じ行にあるとかですか?
補足
これらの「結果」「実施日」は、片方でしかシートに記載されていないということが無いということです。 記載されているシートもセルも固定ではなく、どこにあるか分からない状態なのでCells.Findという大雑把な検索しかできないんです。 自分でこういった入力する文書を作成する際には、集計のことも踏まえて固定で作成するのですが、お客さんから指定されているのでこのように作らざるを得なくなっています。
お礼
夜遅くにも関わらずご回答いただきまして、ありがとうございます。 意図と具体的なもの(データ)を整理してそちらから質問ようにした方が近道ですね。 コードも参考にさせていただきます。