ラベル VBA の投稿を表示しています。 すべての投稿を表示
ラベル VBA の投稿を表示しています。 すべての投稿を表示

2016年4月22日金曜日

Excel 2013のPlotAreaオブジェクトのInsideWidth,InsideHeightプロパティは整数値しか設定できない

背景

グラフのプロットエリアの枠の大きさを,InsideWidth,InsideHeightプロパティで設定しようとしたときに,期待どおりにならないことがある。

そこで,設定値と設定結果の関係を調べた。


検証環境

  • OS: Windows 10 Pro(64bit)
  • アプリケーション: Excel 2013(64bit)
  • CPU: Core i7 2.4GHz
  • RAM: 16GB
  • 仮想メモリ: OFF


検証方法

以下の手順で検証した。
  1. 適当な散布図を作成する。
  2. ChartAreaの大きさをPlotAreaに対して十分に大きくしておく。
  3. このグラフのPlotAreaのInsideLeft,InsideTop,InsideWidth,InsideHeightの各プロパティの値を適当に設定する。
  4. 設定後,InsideLeft,InsideTop,InsideWidth,InsideHeightの各プロパティの値を取得する。
  5. 手順3の結果と手順4の結果を比較する。


結果

結果は以下のとおり。
  • InsideLeft,InsideTopプロパティは設定値どおりに設定されていた。
  • InsideWidth,InsideHeightプロパティは整数値に切り捨てられていた。例えば,
    • 設定値: 100.11pt → 結果: 100pt
    • 設定値: 100.99pt → 結果: 100pt

・・・ということは,PlotAreaのサイズをmm単位で正確に指定することはできないということである。

なお,https://msdn.microsoft.com/ja-jp/library/ff837610.aspx によればDouble型で設定できることになっている。


2016年4月19日火曜日

Excel 2013で画面更新を抑止したときの効果

背景

Application.ScreenUpdating = False とすることによって画面更新を抑止すれば,処理速度が向上することはよく知られている。

一方,Excel 2013でSDIになったためか,この方法が悪さをするケースも時々あり,Application.Visible = False とすることで解決できたケースもあった。

そこで,画面更新を抑止して処理速度向上を狙う場合の,各種方法の効果を評価した。


検証環境

  • OS: Windows 10 Pro(64bit)
  • アプリケーション: Excel 2013(64bit)
  • CPU: Core i7 2.4GHz
  • RAM: 16GB
  • 仮想メモリ: OFF


検証方法

以下の手順で検証した。
  1. VBAで,20000個のセルを1個ずつ選択するプログラム(下記)を作成する。

        For I = 1 To 20000 Step 1
            Cells(I, 1).Select
        Next
     
  2. このプログラムを実行する際に,下記の各方法で画面更新を抑止し,処理時間をtimeGetTime関数で計測する。
    • 対策なし
    • Application.Top = 2000(ExcelウィンドウをPC画面の表示可能領域の外側に移動)
    • Application.Visible = False(Excelウィンドウを非表示化)
    • Windows(ThisWorkbook.Name).Visible = False(ウィンドウを非表示化)
    • ThisWorkbook.IsAddin = True(ブックを一時的にアドイン状態にしてウィンドウを非表示化)
    • Application.WindowState = xlMinimized(Excelウィンドウを最小化)
    • Application.ScreenUpdating = False
  1. なお,キャッシュなど様々な影響があると思われるが,それらの影響が対等になるようにいろいろとりまぜて,計10回ずつ測定する。


結果

結果は下図のとおり。エラーバーは十分に小さいので,省略した。
  • 定番の Application.ScreenUpdating = False が最も高速であった。
  • Application.Visible = False は,なにも対策しないときの2倍高速だが Application.ScreenUpdating = Falseよりは圧倒的に遅い。



2016年4月18日月曜日

Fortran DLLをVBAから呼び出す場合の関数名はAliasを利用すべし

背景

Fortranの関数名は,大文字/小文字の区別はされない。

VBAからFortran DLL内の関数(例: testfunction)を呼び出す場合に,VBA側で大文字/小文字を区別しておきたい場合(例: TestFunction)は,
Declare PtrSafe Sub TestFunction Lib "パス~" Alias "testfunction" (引数・・・)

のように宣言すべし。


検証環境

  • OS: Windows 10 Pro(64bit)
  • アプリケーション: Excel 2013(64bit)
  • CPU: Core i7 2.4GHz
  • RAM: 16GB
  • 仮想メモリ: OFF


2013年8月29日木曜日

ExcelのApplication.Runメソッドの速度

例えば,Book1というブックに,Testというプロシージャがある場合,このプロシージャを呼び出すには,

    Call Test

または

    Application.Run "Test"

とやればよい。

では,どちらの方法が速いか?


    Sub Test()
        '    中味はなし
    End Sub

というテスト用コードを作成し,別のプロシージャから Test を呼び出してみたところ,
Call Test のほうが,Application.Run "Test" よりも約200倍速かった。

・・・とはいうものの,

1回あたりの呼び出し時間は Application.Run "Test" でも10ns(ナノ秒)オーダなので,
ループで何万回も使用するのでなければ,状況に応じて便利なほうを使えばよい。


Application.Runは,ほかのブックのプロシージャを参照設定なしで呼び出せるので便利。
しかも,Privateプロシージャさえも呼び出すことができる。

ただし,ほかのブックのプロシージャを参照設定してCallで呼び出す場合と,参照設定せずにApplication.Runで呼び出す場合とでは,速度差はさらに大きく,前者のほうが800倍速かった。

よく知られているように,あらかじめ参照設定(事前バインディング)したほうがよいということであろう。

確認環境

Excel 2013(64bit) + Windows 7 Professional(64bit)

2013年4月17日水曜日

Excel 2013で取扱い可能なファイル名の文字数は218文字

Microsoftのサポート情報によれば,パスと拡張子まで含めたファイル名の文字数の上限は

  • Microsoft Word,PowerPoint,Access: 259 文字。
  • Microsoft Excel:218文字。


Excel 2013で,VBAのテストプログラムを作成し,実際に試したところ,全角,半角を問わず,パスと拡張子まで含めたファイル名は218まで問題なく保存できた。

ファイル名が219文字になると,保存しようとするときにエラーとなる。

ファイル名218文字のファイルを,Explorer上で手動でコピーすると,「 - コピー」という文字列が付加されるので,ファイル名の合計が218文字を超えてしまう。このファイルをダブルクリックしてExcelで開こうとすると,警告メッセージが表示されて,ファイルを開くことはできなかった。



確認環境

Excel 2013(64bit) + Windows 7 Professional(64bit)