愚者の経験

「また今度」はほとんどこない

日別アーカイブ: 6月 24, 2012

VBAのWithステートメントは便利

Withステートメントは主に修飾パスが長い場合に省略するために用いられることが多いような気がします。
しかし場合によってWithステートメントで「オブジェクト変数の宣言を省略できる」ことがあります。

前の投稿などでも利用した使い方です。Object変数を用意せず「With New ADODB.Command ~ End With」とします。
今までのコードの書き方はこんな感じでした。

Public Function Test() As Long
    Dim i As Long
    Dim int1 As Long,int2 As Long

    Dim cnn As ADODB.Connection
    Set cnn = New ADODB.Connection
    cnn.ConnectionString = _
            "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
            "Data Source=C:\test.accdb;"
    cnn.Open

    Dim cmd As ADODB.Command
    Dim rst As ADODB.Recordset
    Set cmd = New ADODB.Command
    Set rst = New ADODB.Recordset

    With cmd
        Set .ActiveConnection = cnn
        .CommandText = "select * from test1"
        .CommandType = adCmdText
        .CommandTimeout = 0
        Set rst = .Execute
    End With

    With rst
        If (.RecordCount > 0) Then
            int1 = .Fields("int1").Value
            int2 = .Fields("int2").Value
        End If
    End With

    Set rst = Nothing
    Set cmd = Nothing

    Test = int1 + int2
End Function

こんな感じのコードが短くできます。

Public Function Test() As Long
    Dim i As Long
    Dim int1 As Long,int2 As Long

    Dim cnn As ADODB.Connection
    Set cnn = New ADODB.Connection
    cnn.ConnectionString = _
            "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
            "Data Source=C:\test.accdb;"
    cnn.Open

    With New ADODB.Command
        Set .ActiveConnection = cnn
        .CommandText = "select * from test1"
        .CommandType = adCmdText
        .CommandTimeout = 0
        With .Execute
            If (.RecordCount > 0) Then
                int1 = .Fields("int1").Value
                int2 = .Fields("int2").Value
            End If
        End With
    End With

    Test = int1 + int2
End Function

本来Newしたオブジェクトは即変数に代入するのがもはや定番の書き方になっているようですが、
With New~とすることでほぼ同等のコードにできます。明らかなデメリットといえば
ほかのオブジェクト変数に代入できないこととぐらいでしょうか…。またWithで指定するオブジェクトが
明示的な型指定を受けていない場合は「.」を入れてもヒントが出ません。例えばフォームのレコードセットで見ると

    Dim rst As DAO.Recordset
    
    Set rst = Me.Recordset
    With rst
        .AddNew
    End With

この「With rst」はヒントが出ます。ですが変数を省略して

    With Me.Recordset
        .AddNew
    End With

のようにしてもヒントは出ません。(もちろん実行はできます。)

このようにWithステートメントは.NetでいうところのUsingと似たような使い方ができます。
With~End Withまでの一時的なオブジェクトという感じですね。

広告

FaceBookをようやくタイムライン化できた

FaceBookをタイムラインにするにはhttps://www.facebook.com/about/timelineにアクセスし、
「タイムラインの利用を開始」みたいなボタンが出てくるのそれをクリックでOK。

みたいなことが言われていますが、そもそもボタンが出ずにタイムラインにできないユーザーの方々がいるようです。
私もそのひとりでしたがやっとタイムライン化できました。

私の場合はおもむろにタイムライン化している友達のページを見たら画面上部に「タイムラインに切り替える」みたいな
ボタンが表示され、クリックすることで切り替えができました。

その時の私のFaceBookはまだFaceBook自体を始めたばかりなので
友達6人
いいね!10個
写真8枚
でした。他の方の参考になれば幸いです。