- ベストアンサー
タスクバーのアプリ開閉を回避する方法
- 30件程度のエクセル「個別ファイル」を集計する際に、タスクバーでのアプリ開閉を回避する方法について調査しました。
- VBAのコードを実行すると、個別ファイルのエクセルがタスクバーで開閉してしまい、画面がちらつく問題が発生しました。
- ExecuteExcel4MacroやApplication.ScreenUpdatingを試しましたが、処理が遅くなるため、個別ファイルのウィンドウだけを開閉し、処理の最後にエクセルアプリを閉じる方法を探しています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>個別ファイルも一緒に開く事があります ちょっと意味不明です。 先のリンク先の内容にある通り、どこかで指定が漏れているのかも? 一連のステップが終了した段階か、あるいは、ステップ実行しながらで タスクマネージャでExcelが新たに何処で立ち上がっているか確認されては? If SheetCount < 3 Then GoTo ERR0 End If ・・中略 If oBK.Worksheets(1).Cells(4, 5).Value Like "A00*" Then ・・中略 ElseIf _ oBK.Worksheets(3).Cells(4, 5).Value Like "A00*" Then oBK.Worksheets(3).Activate Call 抽出(oBK) Else ERR0: oBK.Close savechanges:=False Set oBK = Nothing ・・この後にも処理は続いているのですよね? If に対するEnd If が無くてコンパイルエラーにはなっていないのなら こちらの杞憂ですけど。 勝手に想像して oBK.Worksheets(3).Cells(4, 5).Value Like "A00*" Then oBK.Worksheets(3).Activate Call 抽出(oBK) End If ERR0: oBK.Close savechanges:=False Set oBK = Nothing oXL.Quit 'どこかで最終的に閉じてますか? msgbox "終わったよ" のような感じではないかと・・ ご参考まで。
その他の回答 (4)
- nicotinism
- ベストアンサー率70% (1019/1452)
Dim oXL As New Excel.Application Dim oBK As New Excel.Workbook 'oXL.Visible = True oXL.Workbooks.Open LocalFileName, ReadOnly:=True '"d:\DATA\123.xls" Set oBK = oXL.Workbooks(1) 'Debug.Print oBK.Sheets(1).Name Workbooks(DataArr(i, 0)).Worksheets(1).Activate '↑↓これは呼び出し先のBookではなく自身のExcel上のBookを参照していると思います SheetCount = ActiveWorkbook.Worksheets.Count If SheetCount < 3 Then GoTo ERR0 End If '↓このシート・ブックも参照先が怪しいような If Worksheets(1).Cells(4, 5).Value Like "A00*" Or _ Worksheets(1).Cells(4, 5).Value Like "a00*" Then Workbooks(DataArr(i, 0)).Worksheets(1).Activate Call 抽出 ElseIf Worksheets(2).Cells(4, 5).Value Like "A00*" Or _ Worksheets(2).Cells(4, 5).Value Like "a00*" Then Workbooks(DataArr(i, 0)).Worksheets(2).Activate Call 抽出 End If oBK.Close savechanges:=False Set oBK = Nothing ←------------------開いたきり使って無さそうなのも? どこでエラーになったかが不明ですが、Index・・ なので真っ先に疑いたくなるのは、DataArr(i, 0) です。 下記リンクは実行時バインディングの場合ですが考え方は共通です http://homepage1.nifty.com/rucio/main/technique/teq_15.htm oXL、oBK、を操作したい場合はそれを明示する必要があります。
補足
ご回答ありがとうございます。 取り合えず、下記コードで動作しました。(ご参考まで) 画面が動かないので抜群の仕事してなさそう感が漂いました^^; 何故か、このVBAを実行すると、たまに、個別ファイルも一緒に開く事があります。。。 わかりますでしょうか??(ご回答頂けなかったら、とりあえず閉め切ります) >Set oBK = Nothing ←------------------開いたきり使って無さそうなのも? 確かに有っても無くても動作とタスクには影響が無かったです。 Dim oXL As New Excel.Application Dim oBK As New Excel.Workbook oXL.Workbooks.Open LocalFileName, ReadOnly:=True Set oBK = oXL.Workbooks(1) SheetCount = oBK.Sheets.Count If SheetCount < 3 Then GoTo ERR0 End If If oBK.Worksheets(1).Cells(4, 5).Value Like "A00*" Then oBK.Worksheets(1).Activate Call 抽出(oBK) ElseIf _ oBK.Worksheets(2).Cells(4, 5).Value Like "A00*" Then oBK.Worksheets(2).Activate Call 抽出(oBK) ElseIf _ oBK.Worksheets(3).Cells(4, 5).Value Like "A00*" Then oBK.Worksheets(3).Activate Call 抽出(oBK) Else ERR0: oBK.Close savechanges:=False Set oBK = Nothing
- end-u
- ベストアンサー率79% (496/625)
>エクセルファイルを他にも開いている時に実行すると、... なるほど。 そこも気になるようでしたら、nicotinismさんの案を検討なさってください。 他の案としては、BookをOpenせずに集計する方法くらいですかね。 単純な参照で可能であれば、の話ですけど。 http://okwave.jp/qa/q6298551.html?order=asc >ExecuteExcel4Macroを試し、かなり苦戦したのですが処理が遅かったです。 実はExecuteExcel4Macroよりも普通に参照数式を使ったほうが速いのです。 または、個別ファイルの形式がデータテーブル的なものだったら QueryTable(外部データの取り込み)を使って 同一ファイル内の作業シートで処理できるかもしれませんが。
補足
ご回答ありがとうございました。 単純参照が有効な際は、活用させて頂きますね。
- end-u
- ベストアンサー率79% (496/625)
Excelのオプション「すべてのウィンドウをタスクバーに表示する」設定になっているからでしょうね。 そのチェックを外せば良いだけですが、通常時は「..タスクバーに表示」しておきたいならコードでの対応が必要です。 処理冒頭に Dim flg As Boolean flg = Application.ShowWindowsInTaskbar Application.ShowWindowsInTaskbar = False ShowWindowsInTaskbarプロパティの設定を覚えておいてFalseにする。 処理後に戻す。 Application.ShowWindowsInTaskbar = flg ..みたいな感じです。
お礼
お礼という機能があるのですね。。。 今回も勉強になりました。 また質問した時には是非ご回答をお願いしますね^^
補足
end-uさん ご回答ありがとうございます。 エクセルファイルを他にも開いている時に実行すると、エクセルが整列!処理・・・解散!! みたいで、「仕事をしている気がしました」^^ これも凄い知識だなぁと思いました。 コードも複雑じゃないし良いかなと思いますが、もうしばらく検討します。
- nicotinism
- ベストアンサー率70% (1019/1452)
個人的には・・ >画面がちらちらしてしまいます 仕事してるな・・という感じがして好きなのですけど 他にも方法があるかもしれませんが、新たなExcelのインスタンスを立ち上げて そこで操作してみては如何でしょう? Sub t() Dim oXL As New Excel.Application Dim oBK As New Excel.Workbook 'oXL.Visible = True oXL.Workbooks.Open "d:\DATA\123.xls" Set oBK = oXL.Workbooks(1) Debug.Print oBK.Sheets(1).Name oBK.Close savechanges:=False Set oBK = Nothing oXL.Quit End Sub
補足
nicotinismさん 回答ありがとうございます。 >仕事してるな・・・っていうのがツボにはまりました^^ 確かにせこせことやってる感じがしますね。 本題ですが、ご提示頂いたコード(Debug.Printがわかりませんが。。)をMsgBoxに替えてよい感じだと思いました。 しかし、私のコードに付け加えると「インデックスが有効範囲にありません。」とエラーが出てしまいました。 Dim oXL As New Excel.Application Dim oBK As New Excel.Workbook 'oXL.Visible = True oXL.Workbooks.Open LocalFileName, ReadOnly:=True '"d:\DATA\123.xls" Set oBK = oXL.Workbooks(1) 'Debug.Print oBK.Sheets(1).Name Workbooks(DataArr(i, 0)).Worksheets(1).Activate SheetCount = ActiveWorkbook.Worksheets.Count If SheetCount < 3 Then GoTo ERR0 End If If Worksheets(1).Cells(4, 5).Value Like "A00*" Or _ Worksheets(1).Cells(4, 5).Value Like "a00*" Then Workbooks(DataArr(i, 0)).Worksheets(1).Activate Call 抽出() ElseIf Worksheets(2).Cells(4, 5).Value Like "A00*" Or _ Worksheets(2).Cells(4, 5).Value Like "a00*" Then Workbooks(DataArr(i, 0)).Worksheets(2).Activate Call 抽出() End If oBK.Close savechanges:=False Set oBK = Nothing 前後省略しておりますが、わかりますでしょうか?
お礼
自book(VBAが記述されている)を開くと同時に(タスク的には、開く直前) 前回、oXL.Workbooks.Open LocalFileName, ReadOnly:=Trueで開かれた 個別ファイル(LocalFileName)が立ち上がるという現象です。 言葉足らずですみません。 現状、その現象が出てないので把握出来なくなりましたが、「ステップ実行」 というもので確認していきたいと思います。 また解らなくなった時に質問したいと思います。 End Ifはコピペ落ちでした。 oXL.Quitはご提示いただいた感じで使っております^^ 長い間お付き合い下さりありがとうございました。