SHOJI's Code
仕事や趣味で書いた各種言語のプログラミングコード(エクセルVBA,PHP,C/C++/C#,JavaScript等)、その他雑記。
2009.10<<123456789101112131415161718192021222324252627282930>>2009.12
DoEvents中のセル編集 (EXCEL VBA)
久々の投稿・・・

先日、ちょっと確認の意味で走らせて見たコード。
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と書けば、上のコードも編集中であってもエラー部はスキップされるのだが、何か、現在編集中、みたいなプロパティなどないものか。

テーマ:プログラミング - ジャンル:コンピュータ
ScreenUpdating, EnableCalculation の効果 (EXCEL VBA)
何かを演算するなどして、シートにデータを展開するときに、Application.ScreenUpdatingやEnableCalculationで一時的に画面更新や再計算を抑制したときにどれだけ効果が出るか試してみた。

と、あるベンチマーク的なプロシージャの実行時間の結果を以下に示す。
方法実行時間
何もせず5.215秒
EnableCalculation=False0.831秒
ScreenUpdating=FALSE0.633秒
両方0.338秒


これから行くと、ScreenUpdatingとEnableCalculation両方をFALSEにした方が良いということになる。
少なくとも、何もしないよりは格段に効果があることになる。
何もしない場合に極端に時間がかかるのは、どこかが変わると一気に残りの箇所(ここで使用したプロシージャだと999箇所)の再計算が始まってしまうからである。

・・・と、いうことならデータをセットする前にクリアする方が早いのか?
完全全画面表示 (EXCEL VBA)
以前、「ツールバーをすべて消す」などの記事を書いたが、それをもうちょっと進めてみた・・・ま、ちょっとしたお遊び(^^)
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っぽくないアプリを作りたいときは良いかも(^^)
テーマ:Excel - ジャンル:コンピュータ
ADOを使ってCSVファイルをシートに読みこみ (EXCEL VBA)
以前の記事に関連することになるが、CSVファイルをシートに読み込む手法としてADOも使えそうなので使ってみることにした。前の記事の手法と速度的なものを比べてみたが、若干こちらの方が遅いけどあまり差異はない。
アシスタントを使ってみる (EXCEL VBA)
Officeアシスタントでちょっと遊んでみた。
ファイルの一覧をセルにセットする (EXCEL VBA)
ちょっとお遊び。

FileSystemObjectを使って、ファイルの一覧をEXCELのセルにセットしてみる。
CSVファイルを表示することなくシートに読みこみ (EXCEL VBA)
CSVはテキストで扱いやすいので別システムなどでデータをCSV形式で保存することがよくある。そのCSVを読みこみ、帳票として整形するのだが、リンクはしたくないので、マクロで一旦CSVを開き、帳票用のエクセルファイルの特定のシートに丸ごとコピーし、それを参照して使うのが私の定石である。が、不満があった。CSVを読み込む様子が表示されてしまうことである。

それは、美しくない・・・。

ということでちょっと考えてみた。
Workbook_Openをスキップ (EXCEL VBA)
仕事で帳票用のEXCELファイルを作成した。Workbook_Openで必要なCSVを開き、シートに展開し、印刷プレビューを表示する、というものだ。
で、実機は警告なしにマクロが実行されるよう、セキュリティが低く設定してある。
そうすると、そのEXCELファイルを編集しようと開いても、自動的にマクロが実行させてしまう。

それは、都合が悪い・・・。

ということで、
印刷プレビューを表示する (EXCEL VBA)
別にここに書くほどのことではないのだが、あるシステムで「印刷表示」と仕様書に書いてあり、どのようにしようか、と思ったときにこの方法を思いついた。
つまり、印刷表示ボタンを押したときにEXCELからマクロを使用して印刷プレビューを表示し、印刷プレビューから抜けたらそのまま終わる。そうすれば、印刷イメージは確認できるし、オペレータが不用意にEXCEL上のデータを書き換えてしまうことも無い。
もう一つの理由はExcel2007になって前のような方法でツールバーが消せなくなってしまったこともある。
copyright © 2004-2006 SHOJI, Powered By FC2ブログ all rights reserved.
FC2ブログ