四捨五入、切り捨て(WorksheetFunction)

前半はVBA関数の話し、後半はモジュールのコードでワークシート関数を使う方法(WorksheetFunction)。

四捨五入はVBA.Round(数値)を、切り捨てはVBA.Int(数値)を使う。以下はイミディエイトウィンドウに入力する。?から始める文字列の行が入力する。他は出力行。

?vba.Int(1.3343)       'Intは符号なし数値、整数を返す
 1          '結果 
?int(-1.1)     
-2             '切り捨てといってもマイナスの場合は注意
?vba.Round(2.1)  '小数点第一位(小数点の位置から見て右方向に1個目)を四捨五入する
 2 
?vba.Round(2.6)
 3
?vba.Round(1.66,1) '第二引数に小数点以下の表示桁数を指定できる。第二引数+1の桁を四捨五入する
 1.7 
?vba.Round(16.6/10)*10   'vba.Round関数は第二引数にマイナスが使えない
 20 

セルで表示する場合は、セルの表示形式で小数点の位置が決まる。セルの表示形式でも四捨五入はできるが表示が変わるだけでデータは変わらない。

一方、セルの中で使うワークシート関数のRoundは、第二引数にマイナスも使える。VBAからワークシート関数を使う場合は、WorksheetFunctionで「.」ドットを使う。同じRound関数ですが、VBAのコードで単にRoundとするとVBAのライブラリのRound。ワークシート関数関数のRound関数を使う場合はWorksheetFunctionがいる。

?excel.WorksheetFunction.Round(16.6,-1)    'ワークシート関数のRoundはマイナスが使える
 20

セル内で使うワークシート関数には、切り捨て、切り上げてもある。 ?から始める文字列の行が入力する。他は出力行。

?excel.WorksheetFunction.RoundDown(2222,-3)
 2000 
?excel.WorksheetFunction.RoundUp(2222,-3)
 3000
カテゴリー: 3 習熟のためにイミディエイウィンドウを使う | コメントする

マクロ記録で保存されないコード

マクロ記録は、操作の結果だけをコードにする。以下のコードは得られない。以下を覚える必要は無い。「マクロの記録」を見ていればわかる。

  1. Excel 以外操作( Word の操作など)
  2. ダイアログボックスやメニューの選択の過程(結果だけが入る)
  3. マウス操作軌跡
  4. 操作を完了する前に取り消した
  5. ファイル/オプションの設定
  6. エラーメッセージなどのダイアログボックス

「マクロの記録」を常に動かしてオブジェクトやプロパティ、メソッドに慣れましょう。業務ファイルではなく、コピーしたファイルでマクロ記録(常)をやりましょう。

「マクロの記録」では探せない例として、ダイアログです。

ユーザーに設定してもらう場合は、 Application.Dialogs を使う。次図は、印刷のダイア ログの表示をする。

Show メソッドで印刷時に見るプリンタの設定画面になる。

カテゴリー: 4 マクロ記録でオブジェクトを調査する | コメントする

イミディエイトウィンドウ内で一時的に使う変数

イミディエイトウィンドウ内では変数の宣言は必要無い。 バリアント型なのでどんな型やオブジェクトでも使える。

もし、標準モジュールのGeneral-Declarationsに書いたPublic宣言した変数名をイミディエイトウィンドウで使うとイミディエイトウィンドウで新たに作ったヴァリアント型の変数ではなく、その宣言した変数で、型もその型になる。標準モジュールにPublic宣言した変数名とは違う名前を使うとバリアント型のイミディエイトウィンドウ内で使える変数になる。

適当な名前を入れるとバリアント型の変数として使える。以下はイミディエイトウィンドウ。

?aaaaa
         '初期値のままなので空白
?vba.TypeName(aaaaa)
Empty                 'バリアント型の初期値はEmpty
dd=123  'dd変数に123という数値を入れる
?typename(dd)
Integer
?dd+2    '計算する
 125     '計算結果 
dd=1.3
?vba.TypeName(dd)
Double
?12a+1    '入力ミスだが、何とかPrintする
 12  1 
?1+12a    '先頭が数字があると数値にして計算する
 13 
aaa="abc"    '文字列は、””で囲む。aaaは変数。
?aaa
abc 
?aaa & "ccc"
abcccc
?aaa & 111
abc111
?aaa + "1111"
abc1111

数値は、そのまま入力、文字列は””で囲む。用語として文字は1文字、文字が複数連続して並ぶと文字列という。また、数値とは演算対象になる、数字は1から0までの文字のことをいう。

カテゴリー: 3 習熟のためにイミディエイウィンドウを使う | コメントする

マクロ記録のコードの特徴と修正のポイント

マクロ記録は、ユーザーの操作をそのまま記録しようとする。これを実現するために、ActiveとかSelectなどユーザーが選んでいるオブジェクトを使う。Excel本体を動かすとApplication。よく見るのはActiveCell、Selection、ActiveSheetなどがある。これらのオブジェクトは、どれもApplicationオブジェクトの直下にある。オブジェクトブラウザのグローバルなメンバーです。

マクロ記録では、Application直下というかグローバルなメンバーが使いやすいでしょうね。

VBEでF2。オブジェクトブラウザのExcelライブラリのグローバルなメンバー

さて、マクロ記録の結果の一部ですが以下は変換/修正しやすい。

  1. ActiveSheet:Worksheetクラス(型)
  2. ActiveCell:Rangeクラス(型)

ActiveSheetは、Sheet1やSheet2に変える
ActiveCellは、Sheet1.Rnage(“??”)やSheet1.Cells(2,4)のように変える。

しかし、

Selection:Objectクラス/型(オブジェクトの型なら何でもSetできる汎用的なクラス/型)

SelectionはObject型なのでどんなオブジェクトでも私達がマウスであるものを選択すればそれがSelectionとして使えるのでマクロを記録するシステムからすると利用範囲が広い。だから、マクロを読む場合は、何を選択したか流れを読む必要がある。例えば、以下はマクロ記録の一部。行を選択して削除(行削除)をしている。

    ActiveCell.Offset(3, 0).Rows("1:1").EntireRow.Select
    Selection.Delete Shift:=xlUp

この場合は、Selectionは、.EntireRow.Selectで行を選択していることがわかる。つまり、Selectionは前の行でSelectしているオブジェクトをチェックする。

記録したマクロ/Macro1()を以下の手順で修正する。

  1. 欲しいメンバー(プロパティやメソッド)を探す
  2. そのメンバーを持つオブジェクトが修正の対象になる
  3. どんな流れでそのオブジェクトを取り出すか手順を探す
  4. 記録したマクロのコードをメモ帳にコピーしておく
  5. Macro1()などのコードを修正してF8(デバッグのステップイン)で動作を確認する
  6. 引数を追加して汎用的に使えるようにする。
カテゴリー: 4 マクロ記録でオブジェクトを調査する | コメントする

マクロ記録だけですぐに使える例

「相対参照で記録」を使うとマウス操作で同じ繰り返しの作業が記録できるのでそのまま使える。

例えば、A1のセルのデータを1行おき下にコピーする。

カテゴリー: 4 マクロ記録でオブジェクトを調査する | コメントする