久々の投稿・・・
先日、ちょっと確認の意味で走らせて見たコード。
走らせるとどうなるか? ひたすらイミディエイトウィンドウに時間を表示する。そして普通にEXCELの操作もできる。では次はどうか?
走らせると、ひたすらSheet1のA1にタイマの値が書き込まれる。そして一見普通にEXCELの操作もできそうなのだが、ちょっと困ったことになる。
セルの書式設定などは行える。しかし、どこかのセルを編集状態にすると「アプリケーション定義またはオブジェクト定義のエラーです。」と表示されてエラーで停止する。エラーの箇所も示されないから、ちょっと困ったものだ。
この手法、バックグラウンドで何か処理をしながらユーザに操作もさせることができるので使えるかな?と思っていたのだが、ちょっと危ないかな?
もちろんOn Error Resume Nextと書けば、上のコードも編集中であってもエラー部はスキップされるのだが、何か、現在編集中、みたいなプロパティなどないものか。
先日、ちょっと確認の意味で走らせて見たコード。
Sub test()
While True
Debug.Print Now
DoEvents
Wend
End Sub
走らせるとどうなるか? ひたすらイミディエイトウィンドウに時間を表示する。そして普通にEXCELの操作もできる。では次はどうか?
Sub test()
While True
Thisworkbook.Sheets("Sheet1").Range("A1").Value = Timer
DoEvents
Wend
End Sub
走らせると、ひたすらSheet1のA1にタイマの値が書き込まれる。そして一見普通にEXCELの操作もできそうなのだが、ちょっと困ったことになる。
セルの書式設定などは行える。しかし、どこかのセルを編集状態にすると「アプリケーション定義またはオブジェクト定義のエラーです。」と表示されてエラーで停止する。エラーの箇所も示されないから、ちょっと困ったものだ。
この手法、バックグラウンドで何か処理をしながらユーザに操作もさせることができるので使えるかな?と思っていたのだが、ちょっと危ないかな?
もちろんOn Error Resume Nextと書けば、上のコードも編集中であってもエラー部はスキップされるのだが、何か、現在編集中、みたいなプロパティなどないものか。
何かを演算するなどして、シートにデータを展開するときに、Application.ScreenUpdatingやEnableCalculationで一時的に画面更新や再計算を抑制したときにどれだけ効果が出るか試してみた。
と、あるベンチマーク的なプロシージャの実行時間の結果を以下に示す。
これから行くと、ScreenUpdatingとEnableCalculation両方をFALSEにした方が良いということになる。
少なくとも、何もしないよりは格段に効果があることになる。
何もしない場合に極端に時間がかかるのは、どこかが変わると一気に残りの箇所(ここで使用したプロシージャだと999箇所)の再計算が始まってしまうからである。
・・・と、いうことならデータをセットする前にクリアする方が早いのか?
と、あるベンチマーク的なプロシージャの実行時間の結果を以下に示す。
| 方法 | 実行時間 |
|---|---|
| 何もせず | 5.215秒 |
| EnableCalculation=False | 0.831秒 |
| ScreenUpdating=FALSE | 0.633秒 |
| 両方 | 0.338秒 |
これから行くと、ScreenUpdatingとEnableCalculation両方をFALSEにした方が良いということになる。
少なくとも、何もしないよりは格段に効果があることになる。
何もしない場合に極端に時間がかかるのは、どこかが変わると一気に残りの箇所(ここで使用したプロシージャだと999箇所)の再計算が始まってしまうからである。
・・・と、いうことならデータをセットする前にクリアする方が早いのか?
以前、「ツールバーをすべて消す」などの記事を書いたが、それをもうちょっと進めてみた・・・ま、ちょっとしたお遊び(^^)
Trueにしてコールするとタイトルバーもメニューも何もかも消えてしまうので注意。消えちゃったときは、慌てずAlt-F11でVisual Basic Editorを表示して、Falseを指定してコールしなおしましょう。
でも、EXCELでEXCELっぽくないアプリを作りたいときは良いかも(^^)
Sub ShowFullScreen(ByVal b As Boolean)
Dim cb As CommandBar
Dim wb As Workbook
Dim ws As Worksheet
Dim w As Window
Application.DisplayFullScreen = b
Application.DisplayFormulaBar = Not b
Application.DisplayStatusBar = Not b
For Each cb In Application.CommandBars
cb.Enabled = Not b
Next
For Each wb In Application.Workbooks
For Each w In wb.Windows
w.DisplayHeadings = Not b
w.DisplayGridlines = Not b
w.DisplayHorizontalScrollBar = Not b
w.DisplayVerticalScrollBar = Not b
w.DisplayWorkbookTabs = Not b
Next
Next
End Sub
Trueにしてコールするとタイトルバーもメニューも何もかも消えてしまうので注意。消えちゃったときは、慌てずAlt-F11でVisual Basic Editorを表示して、Falseを指定してコールしなおしましょう。
でも、EXCELでEXCELっぽくないアプリを作りたいときは良いかも(^^)
以前の記事に関連することになるが、CSVファイルをシートに読み込む手法としてADOも使えそうなので使ってみることにした。前の記事の手法と速度的なものを比べてみたが、若干こちらの方が遅いけどあまり差異はない。
Officeアシスタントでちょっと遊んでみた。
ちょっとお遊び。
FileSystemObjectを使って、ファイルの一覧をEXCELのセルにセットしてみる。
FileSystemObjectを使って、ファイルの一覧をEXCELのセルにセットしてみる。
CSVはテキストで扱いやすいので別システムなどでデータをCSV形式で保存することがよくある。そのCSVを読みこみ、帳票として整形するのだが、リンクはしたくないので、マクロで一旦CSVを開き、帳票用のエクセルファイルの特定のシートに丸ごとコピーし、それを参照して使うのが私の定石である。が、不満があった。CSVを読み込む様子が表示されてしまうことである。
それは、美しくない・・・。
ということでちょっと考えてみた。
それは、美しくない・・・。
ということでちょっと考えてみた。
仕事で帳票用のEXCELファイルを作成した。Workbook_Openで必要なCSVを開き、シートに展開し、印刷プレビューを表示する、というものだ。
で、実機は警告なしにマクロが実行されるよう、セキュリティが低く設定してある。
そうすると、そのEXCELファイルを編集しようと開いても、自動的にマクロが実行させてしまう。
それは、都合が悪い・・・。
ということで、
で、実機は警告なしにマクロが実行されるよう、セキュリティが低く設定してある。
そうすると、そのEXCELファイルを編集しようと開いても、自動的にマクロが実行させてしまう。
それは、都合が悪い・・・。
ということで、
別にここに書くほどのことではないのだが、あるシステムで「印刷表示」と仕様書に書いてあり、どのようにしようか、と思ったときにこの方法を思いついた。
つまり、印刷表示ボタンを押したときにEXCELからマクロを使用して印刷プレビューを表示し、印刷プレビューから抜けたらそのまま終わる。そうすれば、印刷イメージは確認できるし、オペレータが不用意にEXCEL上のデータを書き換えてしまうことも無い。
もう一つの理由はExcel2007になって前のような方法でツールバーが消せなくなってしまったこともある。
つまり、印刷表示ボタンを押したときにEXCELからマクロを使用して印刷プレビューを表示し、印刷プレビューから抜けたらそのまま終わる。そうすれば、印刷イメージは確認できるし、オペレータが不用意にEXCEL上のデータを書き換えてしまうことも無い。
もう一つの理由はExcel2007になって前のような方法でツールバーが消せなくなってしまったこともある。
SHOJI's Code








