プロシージャ内で自分のセルの番地 ThisCell

以下の関数を標準モジュールに書いて、ワークシート関数のようにセルの中に書く。

ThisCellプロパティは、ユーザー定義関数内で使うことで自分セル位置を取得できる。使う場合は、Excel.Application.ThisCellまたはApplication.ThisCellとApplicationを付ける必要がある。型はRangeなのでRow、CollumnやOffsetも使える。

Function myAddress()
    myAddress = Excel.Application.ThisCell.Address(0, 0) '0はFalseでも同じ。0が無いと絶対表示$A$1になる
End Function

Function myCells()
    myCells = "Cells(" & Excel.Application.ThisCell.Row & "," & Excel.Application.ThisCell.Column & ")"
End Function

Rowは行、Columnは列のこと。

AceitveCellやSelectionもアドレスを表示することができるが、これらは選択しているセルの位置であり、ユーザー定義関数が入っているセルの位置ではない。もし、ActiveCellやSelectionを使うと上図の場合は、セルA1を選択しているので左のmyAddress()は、A1:D5のすべてがA1に、右もすべてCells(1,1)になる。

ユーザー定義関数を作る時に自分のセルを扱いたい場合はThisCellを使う。

カテゴリー: 9 セルの中で使うユーザー定義関数の作成 <VBA> | コメントする

配列の()?コレクションの()?関数の()?

VBでは、配列、コレクション、プロシージャも同じ記号の()を使う。ややこしいですね。他の言語では配列は[ ]を使う。

VBAの()の使い方3つ。

  1. 配列変数(要素番号)
  2. コレクション(名前またはインデックス番号) Range
  3. プロシージャ名(引数1,引数2)

ここでは、とりあえず2番目のRangeを説明します。

まず、XXXX(??, ??,??)とカッコを付けると戻り値がある。つまり、変数名=XXXX(??, ??,??)やDebug.Print XXXX(??, ??,??)( Debug.Print の出力が値)ができる。配列も関数も同じような書き方をする。イミディエイトで?とする場合は、戻り値を期待しているので()がいる。「変数=」の右辺に書く場合も変数に代入したいのだから()がいる。

ExcelのオブジェクトであるRange(“A1”)()のカッコは、配列ように見えるがItemの省略。Item関数は感覚的には配列のように考えればいい。以下は、イミディエイトウィンドウで、?はPrintのこと。?から始まる行は入力。次の行は出力結果。

set kk=range("a1:b2")
?vba.TypeName(kk)
Range
?kk(1)
A1
?kk(2)
B1
?kk(3)
A2
?vba.TypeName(range("a1:b2"))
Range
?range("a1:b2").Item(1)=range("a1:b2")(1)
True
?range("a2:b3")(1)
A2

配列でもオブジェクトでも関数でも()のカッコは、戻り値を受け取るためと理解すればいい。最もよく使うのがコレクションの中の一つを取り出すために使う()。

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

VBA.Now関数とVBA.Date関数の違い

VBAの関数の話しです。

Date関数は時間が無いことがイミディエイトで実行するとわかる。関数の調査ができると例えばHour(Date)は常に0になることが確認できる。 ?から始める文字列の行が入力する。他は出力行。

?vba.Now
2018/08/26 1:16:41 
?date
2018/08/26 
?vba.Hour(date)
 0 
?hour(now)
 1

Now、Date関数どちらも引数が無い。セルの中で使うワークシート関数のDateは引数がいる。

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

四捨五入、切り捨て(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 マクロ記録でオブジェクトを調査する | コメントする