2007年04月26日
Excel VBAのSpecialCellsメソッド
Excel VBAの中、位置取得などのために、なかなか有用なメソッドがあります。
それは、WorkSheet.Cells.SpecialCells()メソッドです。
詳細はGoogle先生に聞いてね。
- Permalink
- by
- at 01:57
- Comments (1)
- Trackbacks (0)
2007年04月26日
Excel VBAの中、位置取得などのために、なかなか有用なメソッドがあります。
それは、WorkSheet.Cells.SpecialCells()メソッドです。
詳細はGoogle先生に聞いてね。
2006年12月24日
■ 概要 ■
VBAでは変数やフィールドに値が無い状態を表すキーワードが、Null・Empty
Nothing・""(ZeroLengthString/長さ0の文字列)と、いくつも存在します。
今回はそれぞれのキーワードの意味と相違点、使用上の注意について説明し
ていきます。
■ 詳細 ■
【Null】
その変数やフィールドに有効なデータが格納されていないことを示します。
別の言い方をすると、明示的にNullを代入された変数や、フィールド・コント
ロールが完全に未定義の状態を示します。ですから数値の0やスペースはNullで
はありません。なぜなら0やスペースという「値」が定義されているからです。
なお、変数の場合Null値を格納できるのはVariant型だけです。
変数やフィールド・コントロールにNull値が取得されるのは、変数に明示的
にNullを代入した時や、Null値を含む計算を行った時、未入力のフィールド・
コントロールです。特に、データとバインドしていない(非連結)コントロール
のフィールドがNullであることを覚えておくと、役に立ちます。
また、Nullは0と同じように計算相手をNullにしてしまうのですが、Nullが未
定義状態を示すことを理解していれば、話は簡単。未定義の要素を含む式(計算)
の結果が未定義状態(=Null)になるのは当然ですね。
なお、C言語のNullとVBのNullは若干違う部分があり、Win32APIの呼び出しの
際などにCの長さ0の文字列タイプのNullを使う時には「vbNullChar」を使用し
ます。
変数やフィールド・コントロールがNull値を含んでいるかをチェックするに
は、IsNull関数を使用します。
----------------------------------------
Dim Var As Variant
Var = Null
Debug.Print IsNull(Var)
----------------------------------------
この例ではVariant型の変数VarにNullを明示的に代入した後、IsNull関数で
調査していますので、イミディエイトウィンドウには「True」が表示されます。
注意しなくてはいけない点は、決して「If Var = Null」や「If Var <> Null」
という形で比較してはいけないということです。なぜなら、他の状況ではTrue
と評価される式でも、Nullを含む式では式全体がFalseになってしまい、Falseと
評価されてしまうからです。
【Empty】
Variant型の変数に格納される特殊な値の1つであり、変数が初期化されてい
ないことを表すキーワードです。
しかし、数値型の変数ではEmptyは「0」と評価され、文字列型の変数では
Empty値は「""(長さ0の文字列)」と評価されるため、明示的にVariant型を宣言
した変数以外ではなかなかお目にかかる機会も無いでしょう。
ただ、数値型 (日付/時刻型もシリアル値という数値で管理されていますので、
大きな意味での数値型です) や文字列型は、デフォルトで「0」や「""」が与え
られているのではなく、VBAのコンパイラが型宣言を判断して自動的に値を代入
しているのだ、ということを覚えておいたほうが良いでしょう。
変数がEmptyであるかどうかをチェックするためには、IsEmpty関数を使用し
ます。
----------------------------------------
Dim Var As Variant
Debug.Print IsEmpty(Var)
----------------------------------------
この例ではVariant型の変数Varが初期化されないままIsEmpty関数によって調
査されていますので、イミディエイトウィンドウには「True」が表示されます。
【Nothing】
Object型の変数に格納される特殊な値であり、Object型の変数が特定のオブ
ジェクトと関係付けられていないことを表します。通常はSetステートメントと
同時に使われ、Object型の変数と特定のオブジェクトとの関係を無効にするた
めに使われます。
----------------------------------------
Set MyObject = Nothing
----------------------------------------
Object方の変数にNothingを代入したときに、ほかの変数がそのオブジェクト
を参照していなければ、それまでに参照していたオブジェクトに割り当てられ
ているすべてのシステムリソースとメモリが解放されます。この処理は、必ず
モジュールの適用範囲(スコープ)内で行う習慣を付けておきましょう。
複数のオブジェクト変数が同じオブジェクトを参照している場合、Setステー
トメントを使ってすべての変数に明示的にキーワードNothingを設定するか、ま
たはNothingに設定した最後のオブジェクト変数が、暗黙のうちに適用範囲 (ス
コープ) 外になった後でなければ、各変数が参照するオブジェクトに関連付け
られたメモリとシステムリソースは解放されません。
変数がNothingであるかどうかを確認するためには、オブジェクト変数を比較
するための演算子、Isを使って以下のように判別します
----------------------------------------
If obj Is Nothing Then
Set Obj = Fomrs![フォーム1]
End If
----------------------------------------
この例では、Object型変数Objが特定のオブジェクトと関連付けられていない
場合は、Objにフォーム1を割り当てています。
【""(長さ0の文字列)】
文字を1つも含まない文字列 ("") です。文字列型変数の場合、前述のように
初期値がこの長さ0の文字列になります。レコードセットの場合は対象がテキス
ト型のフィールドであっても、明示的に長さ0の文字列を代入しない限りNullと
評価されます。
------------------------------------------------------------
Dim Rst As DAO.Recordset
Set Rst = CurrentDb.OpenRecordset("Select * From テーブル1")
Rst.MoveFirst
Debug.Print Rst![フィールド1]
Rst![フィールド1].Edit
Rst![フィールド1] = ""
Rst![フィールド1].Update
Debug.Print Rst![フィールド1]
------------------------------------------------------------
上のフィールド1が未入力の場合、イミディエイトウィンドウには最初「Null」
が表示されます。しかし、明示的に「""(長さ0の文字列)」を代入したあとは空
白が表示されるようになります。ただ、フィールドのAllowZeroLength/空文字
列の許可プロパティをTrueにしておかないと、このサンプルはエラーが出ます。
【最後に】
このように、変数やフィールド・コントロールが空であることを示すキーワー
ドが何種類も存在します。特に「Null」と「""(長さ0の文字列)」の区別は重要
です。同じテキスト型のフィールドの場合でも、レコードセットの場合とレコー
ドとバインド(連結)したコントロールの場合、フィールドの値を代入した変数
の場合で得られる結果が違うことなど、慣れと注意が必要です。
【転載】http://www.moug.net/tech/acvba/0050010.htm
VBAの中、
「=」 を使う場合
配列は値渡しになります。
オブジェクトは参照渡しになります。そのため、Set VarName = オブジェクト、「Set」が必要です
.ListIndexは現在Activeになっている行;
.Selected() = Trueは現在選択されている行;
複数選択の時は区別する必要がある。
2006年11月19日
CInt("") --> エラー
IsNumeric("") --> False
Split("", ":") --> array( 0 To -1)
Split(":", ":") --> array("", "")
2006年11月12日
Sub Main()
On Error GoTo Err_Han
Exit Sub(Function)
Err_Han:
例外処理
End Sub(Function)
例外のThrow
Err.Raise Err.Number, , Err.Description
例:Err.Raise 1, , "エラーメッセージ"
Workbookを閉じる前のEvent@ThisWorkbook
Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub
Workbookを保存する前にのEvent
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
End Sub
Workbookを開く時のEvent
Private Sub Workbook_Open()
End Sub
Sheetを切り替えるEvent
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
End Sub
WindowをActiveする/切り替えるEvent
Private Sub Workbook_WindowActivate(ByVal Wd As Window)
End Sub
WindowをDeActiveする/切り替えるEvent
Private Sub Workbook_WindowDeactivate(ByVal Wd As Window)
End Sub
2006年10月31日
文字列型
Dim str As String ' 0 - 2GB
Dim str As String * 10 ' 長さは10文字の文字列
整数型
Dim i As Integer ' -32,768 - 32,767の整数
Dim l As Long ' -2,147,483,648 - 2,147,483,647の整数(32bit)
実数型
Dim s As Single ' -3.402823E38 - -1.401298E-45
' 1.402398E-45 - 3.402823E38
Dim d as Double ' -1.79769313486232E308 - -4.94065645841247E-324
' 4.94065645841247E-324 - 1.79769313486232E308
通貨型
Dim cur As Currency ' -922,337,203,685,477.5808 - 922,337,203,685,477.5807
バイト型
Dim b As Byte ' 0 - 255
ブール型
Dim boo As Boolean ' True Or False
日付型
Dim da As Date ' 100/1/1 - 9999/12/31
バリアント型
Dim var As Variant ' 型を明示しない (パフォーマンスが良くない!!)