プロが教える店舗&オフィスのセキュリティ対策術

非表示でExcelを開きそのExcel内をfindで検索させようとするとfindの戻り値をとるところでExcelが開きチカチカします。
戻り値をとらないように=をとるとチカチカがなくなります。
戻り値を取らないと結果が取れないので意味がないですが、find関数を開いたExcelを非表示のまま検索することは可能なのでしょうか?

せっかく非表示にして画面で他操作できるように高速化しても高速ではありますが、画面がチカチカするのをどうにか避けたいです
findの関数の使い方何かあるのでしょうか?

質問者からの補足コメント

  • うーん・・・

    フォルダ内のExcelを非表示で開く
    Findで検索
    検索結果を見えてるExcelに書き込む
    開いたExcelを閉じる
    これをループするとチカチカになります。
    対象が一個だと見えないレベルになります。

    やり方どうこういいあっても仕方ないので
    Find関数の指定方法でなんとか出来ないのかのみ回答できる方お願いします。

      補足日時:2022/06/15 20:16

A 回答 (3件)

こんにちは。



■回答
Find メソッドの問題ではないでしょう。
仮に Active や Select で画面遷移があったとしても、それは
  Application.ScreenUpdating = False
でチラつきは抑えられる範囲です。他に原因がありそうです。

■考えられる原因
恐らく Workbooks.Open の問題です。

Workbooks.Open を実行すると
  Application.ScreenUpdating = False
  Application.Visible = False
に関係なく、画面再描写の割込が入ります。

ループで連続した場合、チラつくまたは画面が白くフリーズした様な状態になります。CPU 稼働率が高まると、再描写が間に合わなくなるためでしょう。

■回避策の提案
バックグラウンドプロセスで Excel.Application を作成し、そちらで処理します。
注意点は、オブジェクト変数でブックやシートを参照した場合、丁寧に全て破棄しないとプロセスが残ります。

  '↓ループ前にバックグラウンドプロセスでEXCELを起動
  Dim xlApp  As Excel.Application
  Set xlApp = New Excel.Application

  For ~

    Dim xlWbook As Workbook
    Dim xlSheet As Worksheet
    Set xlWbook = xlApp.Workbooks.Open(ファイルパス)
    Set xlSheet = xlWbook.Worksheets(シート名など)

    'Findを使った処理を挟む

    Set xlSheet = Nothing
    xlWbook.Close SaveChanges:= False
    Set xlWbook = Nothing

  Next

  ’ループを抜けた後
  xlApp.Quit
  Set xlApp = Nothing
    • good
    • 0

こんにちは


>find関数を開いたExcelを非表示のまま検索することは可能なのでしょうか?
ちょっと意味が、 が の使い方で上手く分からないのですが、
使えると思います

>戻り値をとらないように=をとるとチカチカがなくなります。
findの取得に問題があるのではなく、取得したモノでの処理に問題があると思います

>やり方どうこういいあっても仕方ないので
議論するつもりなどありません

>Find関数の指定方法でなんとか出来ないのかのみ回答できる方お願いします。
Find関数の為と決めつけられているようですが、間違えありませんか?
ステップインなどで画面を見ながら検証しては、いかがでしょう?

実際のプロシージャを見ないと何とも言えませんが・・・
そもそもチカチカは画面制御系の問題と思います
>非表示 
と言うと Application.Visible だと思いますが、、
Application.ScreenUpdatingを指していたりしますか?
また、取得した値などで他のブックやApplicationを呼び出すなどは行っていますか?
.ScreenUpdatingはさほど強い命令ではないので解除される可能性があるので工夫が必要になる場合があります

find関数の検証用サンプルを示しておきます

’デモデータ作成用
Sub test1()
Dim sh As Worksheet
For Each sh In Worksheets
sh.Range("B2:E100") = "A"
Next
End Sub

’find関数の検証’
Sub test()
Dim sh As Worksheet, i As Long
Dim rng As Range, tmpR As Range, srcR As Range
Application.Visible = False
For Each sh In Worksheets
Set srcR = sh.Range("B2:E100")
Set rng = srcR.Find(What:="A", LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, MatchByte:=False)
Set tmpR = rng
Do While Not rng Is Nothing
sh.Cells(1, 1) = i
i = i + 1
Set rng = srcR.FindNext(rng)
If rng.Address = tmpR.Address Then
Exit Do
End If
Loop
i = 0
Next
Application.Visible = True
End Sub

コード内でA1セルに書き出すコードをあえて入れてあります。
チカチカしますか?
    • good
    • 0

こんばんは



>やり方どうこういいあっても仕方ないので~
やり方の問題のような気もしますが、それは考慮の対象外ということなので・・

>フォルダ内のExcelを非表示で開く
>Findで検索
>検索結果を見えてるExcelに書き込む
>開いたExcelを閉じる
>これをループするとチカチカになります。
同じことを試してみましたが、私の環境ではチラつきはまったく起きませんね。
Find に関しては Range.Find メソッドで、ごく普通の方法で行っています。
ただし、検索対象のブックは、別スレッドのエクセルで操作しています。
    • good
    • 0
この回答へのお礼

うーん・・・

うーん。同じですね
まあ、オープンとfindが原因なのですが
これを手でやったら文字コピーして一個一個開いて
ctrl+で検索開いてって大変です。
しかも一覧にするのも大変。

お礼日時:2022/06/16 21:14

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