Square Beat Engine

Blog for variety of things…

MS-Office

[Excel][VBA] ブックの手動計算とValue(xlRangeValueXMLSpreadsheet)の危険な関係

投稿日:2015-10-16 更新日:

VBAを使ってExcelで複雑なツールを作ろうとすると、いろいろと細かい部分でつまずくものだ。

今回は、ブックの計算を手動にしていても、特定の条件下で自動に戻ってしまうという現象に遭遇した。

Value(xlRangeValueXMLSpreadsheet)のワナ

こちらの記事で紹介した通り、VBAでValueプロパティを使うと、値だけでなく書式もコピーできる。
コピー&ペースト操作でクリップボードを経由する必要がないため、予期せぬ誤動作を防げる便利なメソッドである。

そんな便利なメソッドだが、いくつか問題点を抱えている。

xlRangeValueXMLSpreadsheetは手動計算から自動計算に戻す

どうやらValue(xlRangeValueXMLSpreadsheet)で転記を実行すると、その時点から手動計算が自動計算に設定が変更されてしまうようだ。

理由はよくわからないが、おそらく計算結果を正確に転記させるような仕組みになっているのだろう。

コード例

 xlRangeValueXMLSpreadsheetはスピードが遅い

実行速度が遅いのも重大な欠点となっている。
スピードが重要になる処理であれば、別途書式設定用のプロシージャを作成して、Valueで値のみ転記した後に書式設定プロシージャを実行する方がいいだろう。

コード例 実行速度が遅いパターン(xlRangeValueXMLSpreadsheet)

コード例 実行速度が速いパターン(値の転記と書式設定を分ける方法)

なお、値の転記と書式設定は以下のようにも書くことができる。

まとめ

Valueプロパティの引数にxlRangeValueXMLSpreadsheetを取れば書式ごとコピーできるが、スピードが遅いという欠点があるのが残念。
利便性と欠点を理解して、適切な場面で使っていきたい。

以上!

-MS-Office

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

[Excel][VBA] クリップボードを経由しないコピーを勧める理由

自分の作ったエクセルマクロには、クリップボード経由のコピーは皆無だ。 その理由はいたってシンプルだ。 クリップボードを使わない理由 自分がマクロでクリップボードを使わない理由はたった1つ。 「ほかの作 …

[Excel][VBA] ピボットテーブルの生成時にメモリ不足(リソース不足)が発生する問題と解決方法

エクセルで、ピボットテーブルを生成するマクロを使っていたのだけど、データが大きいとメモリ不足で動作しないことがあったため、改善した。 同じ問題で困っている人のために、自分の解決方法を記載しておくことに …

[PowerPoint VBA] テーブルの各行の高さを揃える

パワーポイントのテーブルには、「高さを揃える」という機能があるが、VBAにはそれに該当するメソッドが存在しない。 そこで、以下のプロシージャを自作した。 コード [crayon-5bf53052f0b …

[PowerPoint VBA] PowerPoint.Shapes.Chart エラー発生

パワーポイント2007のVBAで、予想外のエラーに遭遇し、解決できたのでメモ。 いきなり結論 パワーポイント2007は、インストール直後はPowerPoint.Shapes.Chartを実装していない …

[VBA] ユーザー定義型の使い方

VBAでは、自分で型を定義することができる。 異なる値をひとまとめに扱いたいときに使うと、取り扱いがぐっと楽になる。 ユーザー定義型の構文 宣言部分(モジュール内の冒頭、Optionalのすぐ後)に、 …