- ベストアンサー
検索してヒットしたセルをすべて選択したい
Excell2000のVBAを使用して英単語リストを作成しようとしています。 あるテキストファイルを編集するのですが、A列に(1)のような番号、B列に英単語、C列に日本語訳が入っています。番号は(1)から始まりますが、どこまでで番号が終わるかはそのファイルごとに異なります。また、(1)~(n)で一度連続した番号が終わっても、数行飛んで再び(1)~(m)の番号が入ったりします。 印刷してから縦に半分に折って使用したいため、この番号をコピーしてC列に挿入し、C列にある日本語訳をとなりのD列に移動させたいのです。 ここで考えたのが、A列の中で")"を含むセルを検索して選択し、C列に挿入することだったのですが、検索してヒットしたセルを複数選択しなければなりません。ここのやり方がわかりません。どなたかおわかりになる方がいらっしゃれば、お教えいただけないでしょうか。あるいは、このような場合に、もっとよい方法があれば教えていただけないでしょうか。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>複数選択してコピーしても、くっついて貼り付けされてしまうのですね 回答したマクロが選択状態で終わっているのはそのためです。質問がそうなっていたもので・・・ >セルに関数を入れる方法を取った場合、挿入したC列のすべてのセルに >その値を入れる部分をマクロ化することは可能でしょうか? 当然可能ですね。でもそのような方法は余り行わないのではないでしょうか。 参考に関数を回答したのは関数だけで行うためです。 マクロの中に入れられますが、マクロ側で算式を作り、関数で判定することになり 非常に無駄なことを行うことになります。 そういう意味で、下に直接C列に書き出すようにしてみました。 前回の方法で、判定して選択状態にできるわけで、判定時に2つ右のC列に書くだけです。 Sub find_and_paste() Dim rg As Range '検索セル範囲 Dim rgfnd As Range '検索結果セル Dim fstAdr As String '最初に検索したセル番地 '検索範囲を定義 Set rg = Range("A1:A" & Range("A65536").End(xlUp).Row) 'A列の検索範囲で『(』を含むセルを検索する Set rgfnd = rg.Find(what:="(", LookAt:=xlPart) '見つかった場合 If Not rgfnd Is Nothing Then '最初に検索したセル番地 fstAdr = rgfnd.Address Do 'C列に書き込み。オフセット位置で右に2つ rgfnd.Offset(0, 2) = rgfnd '再度検索する Set rgfnd = rg.FindNext(After:=rgfnd) '最初に見つかったセルが再度見つかるまで続ける Loop While Not rgfnd Is Nothing And fstAdr <> rgfnd.Address End If End Sub 最後に、参考に前回回答した算式の説明を書いておきます。 ワークシート関数は沢山ありますが、中には、検索できなかったらエラーを返す関数があります。 Findもその1つですが、この算式は絶対検索位置が求まる算式にしてあります。 これは、線形探索のアルゴリズムで、探索すべきデータの一番最後に探索データと同じものを置く テクニックで、これを『番兵』といいます。この番兵を算式の中に入れてみたわけです。 また、エラーを出さない検索は別の意味でも有効で、1つのFind関数で多数の文字列の検索が可能になります。 =IF(FIND("(",A1&"(")<LEN(A1),A1,"") ・・・A1&"(" の『(』が番兵です。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
nishi6さんの解答のFIND("(",A1&"(")<LEN(A1),A1,"") の <LEN(A1)所が、技巧的というか引っかかったので =IF(ISERROR(FIND("(",A1,1))," ",A1)と関数をいれ複写して テストしたら(1)や(2)だけB列にコピーできました。 (ISERRORに付いて思い出せずOKWEBで教えて頂きました。有難うございました。)
お礼
問題は解決いたしました。ありがとうございました。
補足
ご回答ありがとうございます。 imogasiさんにもよろしければ教えていただきたいのですが、その方法を取った場合、挿入したC列のすべてのセルにその値を入れる部分をマクロ化することは可能でしょうか?なるべく手作業が入る部分を省略したいのです。恐れ入りますが、よろしくお願いいたします。
- nishi6
- ベストアンサー率67% (869/1280)
挿入したC列のC1に =IF(FIND("(",A1&"(")<LEN(A1),A1,"") として、下方向にコピーしてはどうですか?VBAの必要もないような気がしますが・・・ 以下はVBAで検索結果を選択状態にするマクロです。 シートのコードウインドウで作りました。 Sub find_and_select() Dim rg As Range '検索セル範囲 Dim rgfnd As Range '検索結果セル Dim fstAdr As String '最初に検索したセル番地 Dim rgArea As Range '検索結果セル範囲 '検索範囲を定義 Set rg = Range("A1:A" & Range("A65536").End(xlUp).Row) 'A列の検索範囲で『(』を含むセルを検索する Set rgfnd = rg.Find(what:="(", LookAt:=xlPart) '見つかった場合 If Not rgfnd Is Nothing Then '最初に検索したセル番地 fstAdr = rgfnd.Address Do If rgArea Is Nothing Then '最初に見つかったセル Set rgArea = rgfnd Else '2回目以降見つかったセルは結合する Set rgArea = Union(rgArea, rgfnd) End If '再度検索する Set rgfnd = rg.FindNext(After:=rgfnd) '最初に見つかったセルが再度見つかるまで続ける Loop While Not rgfnd Is Nothing And fstAdr <> rgfnd.Address End If '検索範囲が存在すれば選択する If Not rgArea Is Nothing Then rgArea.Select End If End Sub
補足
早速のご回答、ありがとうございました。わざわざマクロの例も記述くださり、参考になりました。なるほど、関数も合わせて使えば確かにこの方が簡単ですね。難しく考えすぎでした。(しかも後でわかったのですが、セルが離れている場合に複数選択してコピーしても、くっついて貼り付けされてしまうのですね。) セルに関数を入れる方法を取った場合、挿入したC列のすべてのセルにその値を入れる部分をマクロ化することは可能でしょうか?追加質問で大変恐れ入りますが、ご回答いただけないでしょうか。よろしくお願いいたします。
- imogasi
- ベストアンサー率27% (4737/17069)
>A列の中で")"を含むセルを検索して選択し、C列に挿入することだったのですが、検索してヒットしたセルを複数選択しなければなりません。---この前段の必要性が判りません。 B列とC列の間に、列をInsertして、A列をその 列にコピーしては具合が悪い理由はなんですか。 なぜ”)”を含むセルを検索しなければならないのですか。
補足
言葉が足りず失礼しました。 A列には実は番号だけでなく、日付や英単語の総数、正解率といった別の項目も記述されています((1)から上に6行分)。これをそのままC列に挿入すると、それらまで合わせてコピーされてしまうからなのです。 印刷するのでなるべくそれらはA列だけに残し、C列にはコピーしたくないのです。 いかがでしょうか。 <イメージ>見づらくてごめんなさい。 | A | B | C | D | ───────────────────────── 1 | 日付 |2002/4/28| | | 2 |【戦績】 | | | | 3 | 質問数 | 100| | | 4 | 正解数 | 75| | | 5 | 正解率 | 75|% | | 6 |【復習単語】| | | | 7 | (1) | star | 始め | | 8 | (2) | stop | 中止する | | :| : | : | : | | 31| 日付 | 2002/4/29| | | 32|【戦績】 | | | | :| | : | : | |
お礼
見事に自動的に番号がC列に書き込まれました。どうもありがとうございました。これで英単語もばしばし(?)覚えられます(^^) やり方はいろいろあっても、無駄な方法は取るべきでないということでしょうか。Excelも奥が深い・・・。関数もマクロももっと勉強しなければいけませんね。 >質問がそうなっていたもので・・・ もう少し確認してから質問すべきでした。申し訳ありません。また質問させていただくかもしれませんが、その際はよろしくお願いいたします。ありがとうございました。