• ベストアンサー

エクセルブック内の決められた文字列の有無を確認するには?

Wendy02の回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

私のはあまり参考にならないかもしれませんね。 >全てのブックを対象にするのは、結構うっとおしいので、 最初に、xdoc2txt.exe というフリーソフトウェアがあります。 これは、Excelの必要なブックを全てText ファイルに落としてしまうものです。text に落としたものから、検索すると非常に速いです。ブックの開け閉めはしませんからね。 マクロからでも利用できますが、今の所、私の方ではそのコードを公開する予定がありません。 xdoc2txt (フリーソフトウェア) http://www31.ocn.ne.jp/~h_ishida/xdoc2txt.html また、KWIC Finder http://www31.ocn.ne.jp/~h_ishida/KWIC.html というのは、それをアプリケーションにしたものです。 バイナリ検索は、シェアウェアです。 a269783255様へ。 参考にさせていただきましたが、気を悪くなさらないでくださいね。 '<標準モジュール登録です。> Option Explicit Private FindWordsflg As Boolean Private FindMsg As String Private Sub FindWords() Dim SearchWord As Variant Dim Rng As Range Dim i As Integer, j As Integer FindMsg = "" FindWordsflg = False SearchWord = Array("住所", "氏名", "電話") For j = 1 To .Worksheets.Count  With .Worksheets(j)  For i = LBound(SearchWord) To UBound(SearchWord)   Set Rng = .Cells.Find(What:=SearchWord(i), _       After:=ActiveCell, _       LookIn:=xlValues, LookAt:=xlPart, _       SearchOrder:=xlByRows, _       SearchDirection:=xlNext, _       MatchCase:=False)   If Not Rng Is Nothing Then    FindMsg = FindMsg & .Worksheets(j).Name & ": " & SearchWord(i) & Chr(10)    FindWordsflg = True    Set Rng = Nothing   End If   Next i   End With   Next j End Sub Sub Auto_Close() Call FindWords If FindWordsflg = True Then   If MsgBox("このブックには、" & Chr(10) & FindMsg & "が含まれています。" & Chr(10) & _     "終了を止めますか?", 16 + 4) = vbYes Then    Application.ExecuteExcel4Macro "Halt(True)"    Exit Sub   Else    ThisWorkbook.Save   End If End If End Sub >「ActiveWorkbook.Save」と記述を追加するだけで済む様にするためです。 ActiveWorkbook に対するイベントは、一旦、インスタンスを作らないといけないと思います。それで、一番良いのは、Personal.xls になるかと思います。新しく開いたものに、イベントのインスタンスを作ります。 '<Class1モジュール> Public WithEvents App As Application Private Sub App_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean) Call FindWords If FindWordsflg = True Then   If MsgBox("このブックには、" & Chr(10) & FindMsg & "が含まれています。" & Chr(10) & _     "終了を止めますか?", 16 + 4) = vbYes Then    'Application.ExecuteExcel4Macro "Halt(True)"    Cancel = True    Exit Sub   Else    Wb.Close True   End If End If End Sub '<標準モジュール> '一番上に登録 Public FindWordsflg As Boolean Public FindMsg As String Public myClass As Class1 Private FindWordsflg As Boolean ' -略 - End Sub Sub Auto_Open() Set myClass = New Class1 Set myClass.App = Application End Sub

masaoz_2000
質問者

お礼

ツールの紹介までいただきありがとうございます。とても有用なツールですね。実はこういうものも探しておりましたので、利用させていただこうと思います。ところでWendy02様の書いたコードを試す場合は、 アドインとするプロシージャとして Sub FindWords()、Sub Auto_Close() を標準モジュール上に記述し、 Personal.xls 上のクラスモジュール上に Sub App_WorkbookBeforeClose(ByVal Wb As Workbook Cancel As Boolean) 標準モジュール上に Sub Auto_Open()、Sub FindWords() を記述するということでよろしいのでしょうか? まだまだ初心者でWendy02様の内容を全て理解しきれていなく申し訳ありませんが、お教えいただければ幸いです。

関連するQ&A

  • Excel セル内文字列編集

    (Excel2003/WinXP) いつも大変お世話になっています。 Excelの任意のセル内に文字列があり、 その中をドラッグして部分文字列を選択します。 その選択した文字列を同じセル内の任意の位置に移動するには、 {Ctrl}+cや{Ctrl}+vを使わないとすると、 どんな方法が考えられますか? (Word的な編集テクニックです) テキストボックスに置き換えても どうもうまく実装できません。 なんとかこれを実現する方法を探してます。 既存のテキストエディターとリンクする、 アドインなどもやってみましたが、 機能的にはOKなんですが、いまいち満足していません。 スマートな方法はないものでしょうか? VBA&API、なんでもいいので、 教えていただければ幸いです。 いつも質問ばかりで気が引けるのですが、 よろしくお願いいたします。

  • エクセルの文字列操作

    住所録の様式で A列にNo、B列に氏名、C列に住所のファイルがあり、 C列の住所で、1個のセルに何故かしら「住所と電話番号」が入っています。 住所と電話番号を夫々別の列に分割したくて、 電話番号は、RIGHT 関数で取り出しました。 住所は、文字数が一定でないので、LEFTまたはMID関数では出来ません。 ここで質問です 住所データの末尾に混在する電話番号は10文字の場合に限定し、 文字数の異なる、住所(○○市XX町△△番地○△荘2-103など)のみ 抽出する方法はありませんか。 なお、VBAなどは無知です、エクセル関数だけの操作があれば教えてください。

  • エクセルの文字列分解

    住所録なのですが、A列に文字列で"(1)氏名(2)住所(3)電話番号(4)メールアドレス"とあります。これをB~E列に分解したいです。A列の共通の文字は(1)(2)(3)(4)です。 現状 A (1)氏名(2)住所(3)電話番号(4)メールアドレス 変更後 B     C     D       E 氏名   住所   電話番号   メールアドレス よろしくお願いします。

  • 文字列を2つに分ける

    10個近くある異なるブックのシートを、新しい1つのブックにまとめてしまおうと考えています。 手動で1つのブック内の複数シートを選択して、新しいブックにコピーしようとしましたが、1つのセルに入力されている文字列の中に、かなり長い(255字以上)ものが含まれており、コピーした際にデータが捨てられてしまいます。 長い文字列を、事前にマクロで探して、2つのセルに分ける (たとえば、A1に長い文章があるなら、A2にセルを挿入して、文字列を2つにわける) ことは可能でしょうか? 分けたあとにそれぞれが255字以下になっていることも確認したいと思っています

  • Excelでセル内の文字列のみをコピーする方法

    Excelでセル内の文字列のみをクリップボードにコピーする方法を教えてください。 ※クリップボードにコピーをする方法であり、他のセルに値のみをペーストする方法ではありません。 満たしたい点は2つです。 ・表示している文字列のみを取得 ・複数のセルを同時にコピー 一つのセルに以下の文字列が入っていた場合(#以外) #123 #"abc" コピーするとクリップボードを文字列として取得すると以下の文字列が得られます #"123 #""abc""" これを以下の文字列が得られるようにしたいのです。 #123 #"abc" 1つのセルだけでいい場合は、セルを編集状態にしてコピーしたり アクティブセルの数式バーをコピーすればいいのですが、 これは当然、複数のセルを同時に選択する場合には使えません。 VBAを使う方法でもそうでなくてもかまいません。 (VBAの場合はコードもお願いしたいです) よろしくお願いします。

  • Excelで特定の文字列があるかないかの検査

    Excel VBAで文字列を調べて、そのセルに文字列が存在すれば切り抜いて変数に保存するという作業を行いたいと 思っています。例えば、本という列があるとします。本の列には、 $$book=本 $$books=本部類 という値が入っていたりします。"="以降を切り抜いて、bookは列1、booksは列2に挿入したいと思います。 この場合、"本"という値は列1へ、"本分類"という値は列2へ入ることになります。 この文字列の調べ方がわかりません。Instr関数を使うことを考えたのですが、どちらの値もヒットしてしまいます。 どのような関数を使ったら上手に文字列を切り抜くことが可能でしょうか?

  • EXCELでの文字列検索

    EXCELで複数のシートにまたがっての文字列検索をおこなう方法はないのでしょうか?またできれば複数のブックにまたがった場合でもできればありがたいのですが.. 以前は1-2-3で同様のことがやりたかったのでその時はアドインソフトを購入したのですが、できればフリーの ソフト等でそういったことができないかと思っています。 どなたかご存知の方教えて下さい。

  • エクセルブック内で文字列を検索するマクロを作りたい!

    Excel2002を使用しています。 Excelマクロで、そのBOOK内の文字列を検索するウィンドウを出すマクロを作りたいのですが、うまくいきません。 これは、不可能なのでしょうか?実際に登録したい操作は、「編集→検索」です。 他の方法で可能であれば、教えていただきたいです。 よろしくお願いします!

  • EXCELで日付を文字列として取り出すには

    EXCELで日付形式のセルの内容を、そのイメージのまま文字列にするにはどうすれば良いでしょうか。何かうまい方法があれば教えてください。 例えば、2006/01/05 と表示されている日付をそのまま文字列として 取り出したいのです。単にセルの書式設定で文字列に変えただけでは 38722とタイムスタンプの値らしきものに化けてしまうので困っています。

  • ブック全体の文字列検索について

    Excelでセルに任意の文字列をペーストします。そのセルは別のブックにリンクしているのでペーストする度にリンク先のセルでは文字列が更新されます。リンク先のブックにはワークシートが10あっていづれかのシートのA列にその文字列がある事になっています。更新された文字列を検索する作業を繰り返すのでマクロで組み込もうと思ったのですがFIND関数にしても、VBでCell.Find(What:=....と書くにも参照する文字列を直接指定してやらないと動きません。参照する文字列が相対的に変化するので「特定のセルの中に入力された文字列」を参照してブック内を検索したいということなのですが、実現するにはどうしたらようでしょうか?と質問して moji = "B1" Set c = Range("A:A").Find(What:=moji, LookIn:=xlValues, LookAt:=xlWhole) If Not c Is Nothing Then c.Select というコードをしめしていただきました。このままだと検索対象がRangeオブジェクトになっているのでActivesheet上でしか検索がかからないのでCellsにすればブック内のすべてのシートに検索がかけられるかな?と思っていたのですがエラーがでます。ブック内を検索範囲に入れるためにはどうしたらよいでしょうか?