EXCEL VBAでマクロの最後でFind関数のLookAtの設定を変更したい。

EXCELの検索機能において、通常は、オプションの「セル内容が完全に同一であるものを検索する」のチェックを外して使用しています。

あるマクロにおいて、Find関数のLookAtの値を「xlWhole」(完全一致)で使用しています。
この「LookAt」の値は、通常の手動での検索にも設定が引き継がれるため、このマクロの後に、検索機能を使用するとオプションの「セル内容が完全に同一であるものを検索する」はチェックされた状態になっています。

つまり、通常時はあいまい検索、マクロ時は完全一致検索を行いたいと思っており、マクロの最後で、あいまい検索に設定を変更しておきたいのですが、そういった指定は可能なのでしょうか。

ごり押しですが、最後に、あいまい検索で適当な検索を行っておくという事も考えましたが、もう少しスマートな方法があるのか、ご存知の方がいらっしゃればと思い質問させていただきました。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

あぁ、そういうことでしたか^^;


理解力が乏しくて申し訳ないです。

うろ覚えですが、Findメソッドは自身の処理が走る際に自動設定し保持しますので、再度Findメソッドを使ってやるしか方法はないかと思います。(本当にうろ覚えです^^;)

確かにスマートな形ではないので、それならばLike演算子を使ってやるのはいかがでしょう?

Sub Find()
Dim c As Object
  For Each c In Worksheets(1).Range("A1:A10")
    If c.Value Like "検索文字列" Then
      【処理】
    End If
  Next c
End Sub

みたいにしてやればお望みの処理が実現すると思いますが・・。
それともLike演算子ではダメな理由でもあるのでしょうか?
    • good
    • 1
この回答へのお礼

ありがとうございます!
遅くなりまして申し訳ございません。

Likeを使用する方法で、解決いたしました。

参考になります。

ありがとうございました!

お礼日時:2009/06/10 11:58

こうゆう事?


設定変更だけしかしないと思うんだけど

Sub 完全一致()
Cells.Find lookat:=xlWhole
End Sub

Sub 曖昧()
Cells.Find lookat:=xlPart
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
遅くなりまして申し訳ございません。

教えて頂いた方法ですと、
「引数の数が一致しません」とエラーとなってしまいました。

【環境】
Windows Vista
Excel2007

お礼日時:2009/06/10 11:56

補足ですが、#2はFindメソッドでいう「完全一致」と考えて良いです。



「If c.Value Like "検索文字列" Then」
の「検索文字列」部分前後にアスタリスク(「*」)をつけて「*検索文字列*」としてやれば、「検索文字列を含むセル」がtrueで返り、Findメソッドでいう「曖昧検索」の役割を果たします。
    • good
    • 0

単にマクロがが走る際のロジックの最初の行辺りで



Set hoge = .Find(What:="", lookat:=xlWhole)

マクロの最後の方で

Set hoge = .Find(What:="", lookat:=xlPart)

で良い気がしますが・・・。

そういうことではないんですかね?
    • good
    • 0
この回答へのお礼

ありがとうございます!

やはり、最後にあいまい検索を実行しておくって事になりますよね。

実際には、設定を変更するためだけに検索を実行してしまう事になるので、処理は行わず、設定の変更だけで、変えれるものなのかどうかって所で、悩んでおりました。

お礼日時:2009/05/21 09:05

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QエクセルVBAでファイルを連続して処理する方法は

エクセルVBAで、エクセルファイルを開いた状態で特定処理を行う仕組みを作りました。
ただ、複数のファイルを処理したいのですが、いちいちファイルを開いてから処理しなければならないため効率が今ひとつです。
ファイル名称をテーブル化するなどして、一気に連続して処理するようにしたいのですが、どのように行えばいいでしょうか。

また、処理したいのは、更新日付が一定日以降のエクセルファイルです。
更新日付と対象ファイルのフォルダーを指定すれば、更新日がそれ以降のファイルを検索し、それが順次処理されていくようなVBAをつくりたいと考えています。

部分的にでもよいので、どなたか分かる方、教えてください。
ちなみにエクセルのバージョンは2000です。
よろしくお願いします。

Aベストアンサー

> 選択フォルダのサブフォルダをのものも含むようにはできないでしょうか。

再帰処理すればできますよ。

Microsoft Scripting Runtime を参照してから、次のコードを試してみて
下さい。
取り急ぎで書いたので、エラーがあるかもしれませんが。。。

まあ、環境によっては使えませんし、推奨はできないのですが、FileSearch
を使ってもサブフォルダを含めた検索はできます。調べればサンプルはすぐ
でてくると思いますよ。

ご参考までに。

Private mDateFilter As Date

Sub フォルダ内のXLSファイル順次処理()

  Dim fso As FileSystemObject
  Dim sDir As String
  
  ' // 日付のフィルタ条件設定 例)10日前の 0:00 以降更新のファイルを対象とする場合
  mDateFilter = DateAdd("d", -10, Date) + TimeValue("00:00:00")

  ' // 対象ファイルのあるフォルダを指定
  sDir = BrowseForFolder()
  If Len(sDir) = 0 Then
    Exit Sub
  End If

  Set fso = CreateObject("Scripting.FileSystemObject")
  
  Dim fld As Folder
  Dim iRes As Integer
  
  If fso.FolderExists(sDir) Then
    Set fld = fso.GetFolder(sDir)
    iRes = 0
    If fld.SubFolders.Count > 0 Then
      iRes = MsgBox("サブフォルダも検索しますか?", _
             vbYesNoCancel Or vbInformation)
    End If
    Select Case iRes
      Case vbYes:  Call FindFiles(fld, True)
      Case vbNo, 0: Call FindFiles(fld, False)
      Case Else:  ' // User Cancel
    End Select
  End If
  
  Set fld = Nothing
  Set fso = Nothing


End Sub

' // XLS ファイルを検索するサブプロシージャ
Private Sub FindFiles( _
  ByRef fld As Folder, _
  ByVal fCheckSubfolders As Boolean _
)

  ' // ファイルへの処理
  Dim f   As Object
  For Each f In fld.Files
    If f.Name Like "*.xls" And f.Name <> ThisWorkbook.Name Then
      If f.DateLastModified >= mDateFilter Then
        ' // 処理例
        Call MainProc(f)
      End If
    End If
  Next

  ' // サブフォルダ検索オプション
  Dim subFolder As folder
  If fCheckSubfolders Then
    ' // 再帰呼び出し
    For Each subFolder In fld.SubFolders
      Call FindFiles(subFolder, True)
    Next
  End If

End Sub

' // メイン処理 -- FindFiles から順次呼び出されます
Sub MainProc(ByRef f As file)

  ' // ここにご自分で書いたプロシージャを
  ' // とりあえず、セルにでも書き出してみます
  Dim i As Long
  i = Cells(Rows.Count, "A").End(xlUp).Row + 1
  Cells(i, "A").Value = f.Name
  Cells(i, "B").Value = f.DateLastModified

End Sub

' // フォルダ選択ダイアログ
Private Function BrowseForFolder() As String

  Const BIF_RETURNONLYFSDIRS = &H1

  Dim fld As Object
  Set fld = CreateObject("Shell.Application") _
       .BrowseForFolder(0&, "選択します", BIF_RETURNONLYFSDIRS)
  If Not fld Is Nothing Then
    BrowseForFolder = fld.Self.Path
  End If
  Set fld = Nothing

End Function

> 選択フォルダのサブフォルダをのものも含むようにはできないでしょうか。

再帰処理すればできますよ。

Microsoft Scripting Runtime を参照してから、次のコードを試してみて
下さい。
取り急ぎで書いたので、エラーがあるかもしれませんが。。。

まあ、環境によっては使えませんし、推奨はできないのですが、FileSearch
を使ってもサブフォルダを含めた検索はできます。調べればサンプルはすぐ
でてくると思いますよ。

ご参考までに。

Private mDateFilter As Date

Sub フォルダ内のXLS...続きを読む

Qマクロで、質問です。 Find関数を使う時。。 Set FoundCell = Range(”A:

マクロで、質問です。
Find関数を使う時。。

Set FoundCell = Range(”A:A”).Find(Cells(j.code).Row

if FoundCell Is Nothing Then
処理
Else
処理

の場合、(格納が合っているかは分かりませんが…)
見つからなかった場合の処理はせずスルーして
次にまだまだあるコードにうつるには処理のところはなんと記述すれば良いのですか?

Aベストアンサー

nk.knさんが書いたIf文は次のような意味ですよね。

If FoundCell Is Nothing Then
  見つからなかった場合の処理
Else
  見つかった場合の処理
End If

見つからなかった場合、その処理をスルーするのであれば、その処理を書かなければ良いだけです。こんな感じです。

If FoundCell Is Nothing Then
Else
  見つかった場合の処理
End If

でも、普通は次のように書きますね。

If Not FoundCell Is Nothing Then
  見つかった場合の処理
End If

QエクセルVBA 2千万行のCSVファイルを開きたい

上から順に読み込み、順次処理していき最終的には全部処理します。CSVファイルは読むだけです。

やり方はいくつか考えられます。
1
100万行ずつシートに読み込み、終わったら次を読み込む。CSVファイルは開きっぱなし。

2
100万行ずつのエクセルファイルに分割し、順次開いて処理。ファイル開閉に時間がかかる

3
2千万行の巨大な配列に代入し、順次処理。
CSVファイルは閉じることが出来る。

3がいいように思えますが、どうでしょうか?使用メモリは1と同じですか?

Aベストアンサー

> 懸念点は、最初から最後まで巨大なCSVファイルを開いたまま処理することです。

それに関しては問題ないです。VBAのOpenでファイルを開いた場合、実は一切読んでいません。今何行目を読んでいるかを示すカウンタを用意するだけです。またLine Inputで読み込む場合も、今操作している一行しか相手にしません。

だからこそ、実装している物理メモリ量をはるかに超えるサイズのファイルを扱っていても、仮想メモリのお世話にならずに済むわけです。

なので懸念材料はそこではなく、分割処理することによってデータ同士の断絶が起きると言うか、連続性がなくなることでしょうか。最初の100万行の固まりと、次の100万個の固まりには全くつながりがないことになるので。

Qシェルのfindコマンドであるディレクトリ以外のファイルを検索

ホームディレクトリにある.(例.dtや.atok)ディレクトを検索対象から外し尚且つ、*aa*のファイルを検索するにはどうしたら良いでしょうか?

find . -type d -name .dt -prune -o -print | xargs grep "*aa*"
でいろいろやってみましたができませんでした。

OS:HP-UX K-Shellです
どうぞ宜しくお願いいたします。

Aベストアンサー

安易な手としては、

find . -type f -print | grep -v './.atok/' | xargs grep "*aa*"

"*aa*" は正規表現として正しくないですが、意図したことがわからないのでそのままにしてあります。

QVBAからファイルをセル入力から開く方法

VBAからファイルをセル入力から開く方法

だれかご教授頂けませんでしょうか?VBAからエクセルファイルを開こうとしています。
そこでシート1のA1セルにファイル名を記述してあり、そのファイル名からファイルを開く事は出来ますでしょうか?
何か良い方法がありましたら教えて頂きたいのですが。

Aベストアンサー

下記で試してください。
パス名の最後には\を付けるようにしてください。

Workbooks.Open "D:\ABC\" & Sheets("シート1").Range("A1").Value


ワークシートのイベントを使う方法も考えられると思います。
BeforeDoubleClickイベント辺りを使って
ファイル名セルをダブルクリックすれば

Excel(エクセル) VBA入門:ワークシートのイベント
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html

QEXECEl VBA FIND 検索について

お世話になります。

VBAのFINDで文字列 01234 という検索なら
一致するデータがあるとでるのですが、

VBAのFINDで文字列 012-34 の検索をかけると
検索対象ファイルに012-34というデータがあるのに
一致するデータがないと返ってきます。

どのようにしたら、一致するデータがあるとできますか?
ハイフォンが間に入ると検索できないのでしょうか?

Aベストアンサー

上手くいかないプログラムをご提示いただいた方が良いかと思います。

少なくとも以下は動きました。(A列にデータありで)

Dim r As Range
Dim s As String: s = "012-34"

Set r = Range("A:A").Find(s)
MsgBox r.Address

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q【Teratermマクロ】文字列の一致比較について

If文を用いて、文字列同士が同じかを確かめたいのですが
If文では数字のみしか比較できないらしいということがわかりました。

Teratermの場合、他の方法などで文字列の一致を確認できないのでしょうか?

ご存知の方がいらっしゃいましたら、是非教えて下さい。

Aベストアンサー

そんなあなたに: strcompare

他にも、strmatch(要バージョン4.59以降)などあります。
詳しくは、TTLコマンドリファレンスをご覧ください。

Q他のExcelファイルのVBAコードを検索したい

他のExcelファイルに書かれたVBAコードに、ある特定のキーワード(パス名など)が使われているかを自動的に調べるためのVBAを書きたいと思っています。

仕事で使っているマクロが書かれたExcelファイルからある特定の処理をしているマクロを含むものを検索したいのですが、検索するExcelファイルが膨大なため、順番にExcelファイルを開いてVBAコードをチェックしていく工程をマクロ化したいのです。ファイルを順に開いていく処理はマクロ化できるのですが、書かれたVBAコードのチェックをどうしたらよいか悩んでいます。

「VBAコードに対して検索する」または「VBAコードを1行ずつ変数に代入する」、「モジュールシートをテキストファイルに出力する」などの処理が自動化できれば対応できそうなのですが、そのような処理をExcelVBAで作成できるでしょうか。

なお環境はWindowsXPのExcel2003です。
よろしくお願いいたします。

Aベストアンサー

開いたブックにあるVBAコードをテキストに出力する方法
Sub VBExport(WKB As Workbook)
  Dim A, B
  Set A = WKB.VBProject.VBComponents
  For Each B In A
    B.Export "C:\~" '★テキストファイルでエクスポート
    xxxxxx '★上記テキストファイルを調べる処理
  Next
End Sub
ブックやシートにあるコードも(空でも)出力されます。
もし、標準モジュールのみ処理したい場合は「B.Type = 1」に限り
エクスポートします。

QDOSのFINDコマンドで、「Ctrl+Z」を検索する方法

WEBのログをデータベースに読み込ませる作業しているのですが、何らかの原因でるURLの部分が化けてしまうログがありました。文字化けした中に「Ctrl+Z」(=End Of File)があり、その部位を読むとその後ろのログを読み込みません。

ですので、バッチ処理でエラーの出るレコードを削除してから、データベースに読み込ませることにしましたが、以下のコマンドを打つとエラーで実現できません。


FIND /V "^Z" [ログFILE] > [NEWログFILE]
(""で囲まれた文字は、「End Of Fileの文字」が入ります。)

を実行すると、「FIND:パラメータの書式が違います」と出てしまいます。


要求を満たすような処理は可能でしょうか?宜しくお願いします。

環境
OS:WIN2000
CPU:700MHZ
MEMORY:256MB

Aベストアンサー

エスケープシーケンスの検索なら「findstr」で「\x」を使えばいいのですが、
どうも\xhhの16進文字列のシーケンスには対応していないみたいです。
つまり「Ctrl+Z」は\x1aなのですがこれには引っかかりませんでした。
#やり方が悪いのかな?

ActivePerl等を入れてスクリプトを外部で処理してはどうでしょうか?
バッチを使っているとやはり限界を感じますし。

また、フリーのツールを使っていいのであれば
バッチから呼べるフリーで16進のエスケープシーケンスに対応した文字列変換ツールを使えばいいのでは?
#とりあえず参考URLのものはMS-DOS用でしたが変換できました。

参考URL:http://www.vector.co.jp/soft/dl/dos/util/se018504.html


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報