パソコンサポート Q & A

パソコン講習会で寄せられた質問を解説しております。

オブジェクト(Object) とは

2013年06月24日 | VBA

VBAを使っていくにあたって、まず「オブジェクト」という言葉が出てきます。
では「オブジェクト」とは一体何でしょうか?
日本語に直訳すると「もの」という意味らしいのですが、そう言われても、あまりにも抽象すぎて、具体的になんのことやらよくわかりませんね。

私たちが普段Excelを使って作業をおこなうときは、オブジェクトという存在は意識しないと思います。しかし、それに相当するものを普段から無意識のうちに使用しています。Excelで使用している言葉の中に「ブック」や「ワークシート」、「セル」という用語がありますね。これらがオブジェクトなのです。
つまりオブジェクトとは、Excelを構成する各要素のことをいいます。

また、ExcelVBAでは、Excelの各要素であるオブジェクトには、それぞれのオブジェクトを表す「名前」があらかじめ割り振られています。
このオブジェクト名をVBE上にコードとして記述していくことで、自分がのぞむExcelの操作を再現していくのです。

オブジェクトはVBE上にただ名前を記述するだけでは操作を再現できません。VBAで決められた方法にしたがって扱っていく必要があります。
ExcelVBAでは、オブジェクトを扱うための具体的な方法として「プロパティ」と「メソッド」というものが用意されています。
ExcelVBAでは、オブジェクトを使ってワークシートやセルなどの目標物を示し、オブジェクトに備わっているプロパティ/メソッドを使って具体的な操作の内容を指示します。

よろしかったら・・・応援クリック・・・お願いします。励みになります。


人気ブログランキングへ


Rangeプロパティ と Cellsプロパティの違い

2013年04月26日 | VBA

RangeプロパティとCellsプロパティの違いについて質問をいただきました。


VBAでExcelを操作するにあたっては、セルやセル範囲をどのように扱うかが重要なポイントになります。


ExcelVBAでは、セルやセル範囲はRangeオブジェクトとして表されます。
Rangeオブジェクトを取得する方法はいろいろとありますが、なかでもよく使われるのがRangeプロパティとCellsプロパティです。
どちらも指定したセルのオブジェクトを扱えます。


Rangeプロパティの書式は、
Range(セル番地
のように、文字列でセル番地を指定します。


Cellsプロパティの書式は
Cells(行、列)
であるように、セルの指定方法は[行]と[列」で指定します。
[行]と[列]には数値を指定します。
[行]と[列」を指定することで、目的のセルのオブジェクトを扱えるのです。
この点がCellsプロパティの特徴であり、文字列でセル番地を指定するRangeプロパティとの大きな違いです。
[行]は、ワークシートの行番号と同じ数値を指定します。
[列]は、ワークシートの列番号「A」を「1」とする数値で指定します。
したがって、C列なら「3」になります。よってC4セルは、「Cells(4,3)」と記述することになります。
また、Cellsプロパティは変数も使えます。そのため、Cellsプロパティを用いれば、行や列の指定にループのカウンタ変数を使って、複数のセルに対して同じような処理を繰り返し実行できるのです。
さらに、Cellsプロパティは、指定したオブジェクトを基点として、そこから相対的に行と列を指定することでセルを指定することもできます。

書式は
オブジェクト名.Cells(行、列)


例:
B3セルを基点とし、そこから3行、2列離れたセルを指定するとします。
B3セルのオブジェクトは「Range(”B3")ですから、次のように記述します。
Range("B3").Cells(3,2)
このように記述すると、B3セルから見た3行目、2列目のセルということで、C5セルを示すことになります。

なお、Cellsプロパティは基点となるオブジェクトの記述を省略することができます。
省略すると、自動的に現在のワークシートのA1セルが基点となります。

Cellsプロパティで注意する点は、セル範囲は指定できないことです。単一のセルか、ワークシート上のセルすべてしか指定できません。
RangeオブジェクトとCellsプロパティの両者の違い、得意/不得意を把握し、目的に応じて使い分けてください。

さらに、VBAではほかにも行/列を数値または変数で指定できる方法としてOffset」プロパティ」が用意されています。
これは、アクティブセルから相対的にセル番地を返します

書式は
基点となるオブジェクト.Offset(行方向への移動,列方向への移動)

「行列方向への移動」は数値で指定します。
ただし、行列の指定で注意しなければならないのが、基点セルが「0」になることです。

これらを使って、「E4」セルから「E8」にかけてセルの値をクリアし、文字の色を黒に設定するというプロシージャを記述すると以下のようになります。

Cellsプロパティを使って記述すると、次のようになります。

Sub サンプル1()
    For i = 4 To 8
        Cells(i, 5).ClearContents
        Cells(i, 5).Font.Color = vbBlack
    Next i
End Sub
__________________________________________

E4」セルを基点としてCellsプロパティを用いて記述すると、次のようになります。

Sub サンプル2()
    For i = 4 To 8
        Range("E4").Cells(i, 1).ClearContents
        Range("E4").Cells(i, 1).Font.Color = vbBlack
    Next i
End Sub    
___________________________________________

「サンプル1」をCellsプロパティではなく、Offsetプロパティで記述すると次のようになります。

Sub サンプル3()
    For i = 4 To 8
        Range("E4").Offset(i, 0).ClearContents
        Range("E4").Offset(i, 0).Font.Color.vbBlack
    Next i
End Sub
___________________________________________
Rangeオブジェクトでも記述できます。

Sub サンプル4()
    For i = 4 To 8
        Range("E" & i).ClearContents
        Range("E" & i).Font.Color = vbBlack
    Next i
End Sub

このようにVBAでは、同じ機能を実現するのに複数の方法が使えるケースがあります。
コードの見やすさや後々の仕様の追加・変更への対応のしやすさなどを考慮して選びましょう。

 

よろしかったら・・・応援クリック・・・お願いします。励みになります。

    
人気ブログランキングへ


MsgBox関数で( )を使う時と使わない時

2013年04月24日 | VBA

MsgBox関数で括弧を使う時と使わない時の違いはなにかとの質問をいただきました。

MsgBox関数は、ダイアログボックスにメッセージとボタンを表示し、どのボタンが押されたかを示す整数型の数値を返します。

VBAで括弧が必要かどうかは、戻り値を使うかどうかで決まります。
戻り値とは、ある命令が、その結果として返す値のことです。
例えばワークシート関数のSUM関数を思い浮かべてみましょう。
SUM関数は、引数として渡されたデータを計算した結果を返します。
このようにある命令が、その結果として返す値のことを戻り値といいます。

たとえば次のようなマクロがあったとします。

Sub sample()
    Dim Rei As String
     Rei = MsgBox("合格ですか?", vbYesNo)
     If Rei = vbYes Then
        MsgBox "おめでとうヽ(^。^)ノ"
    End If
End Sub

このマクロでは、2つのMsgBox関数が使われています。
しかし、最初のMsgBox関数は括弧を使っているのに対し、2つ目のMsgBox関数は括弧を使っていません。

MsgBox関数は、関数であるからには、何らかの結果を返します。
では、MsgBoxは何を返す関数なのでしょうか?
実は、MsgBox関数は、「ユーザーがどのボタンを押したか」という結果を返します。


最初の
Rei = MsgBox("合格ですか?", vbYesNo)


は、ユーザーがどのボタンを押したかという戻り値を、変数「Rei」に格納しています。
これは、その後のIfステートメントで判定するためです。
このようにMsgBoxの戻り値を使っていますから、引数は括弧で囲まなければなりません。

それに対して、2つ目の
MsgBox "おめでとうヽ(^。^)ノ"


は、ユーザーがどのボタンを押したかという戻り値は使っていません。
そもそも「OK」ボタンしか表示していないので、どのボタンが押されたかを判定する必要はありませんね。押されたのは「OK」ボタンに決まっています。
これはただユーザーにメッセージを表示しただけです。
つまり、戻り値を使っていませんから、引数を括弧で囲ってはいけないのです。

このように、関数の戻り値を何かに使うときは、引数を括弧で囲まなければならないのです。

 

よろしかったら・・・応援クリック・・・お願いします。励みになります。

    
人気ブログランキングへ


DLOOKUP関数

2012年11月02日 | VBA

Access VBAの授業で 「DLookup 関数」の使用例について質問を受けました。

以下の例は、DLookup関数を使用して、テーブルやクエリの値を検索または取得する方法です。

●抽出条件を指定しない場合

この例では、抽出条件を一切指定しない最も単純な形式で DLookup 関数を使用する方法を示します。この例は、[顧客] テーブルにある最初のレコードの [顧客名] フィールドに含まれる値を返します。

=DLookup("[顧客名]", "顧客")

●数値抽出条件を指定する場合

顧客コードが 7 である顧客名を検索するには、次のように、使用するレコードの範囲を限定する抽出条件を指定します。

=DLookup("[顧客名]", "顧客", "[顧客員コード] = 7")

●フォーム上のフィールドによる数値抽出条件を指定する場合

先の例では式の中に特定の値を指定しましたが、抽出条件でパラメータを使用することもできます。次の例は、現在のフォーム上にある別のフィールドから抽出 条件を指定する方法を示したものです。

=DLookup("[顧客名]", "顧客", _

"[顧客コード] = Form![顧客コード]")

=DLookup("[顧客名]", "顧客", _

"[顧客コード] = " & [顧客コード])

=DLookup("[顧客名]", "顧客", _

"[顧客コード] = " & Forms![受注]![顧客コード])

上記 3 つの例は、同じ結果を返します。
また、以上の例はすべて、数値抽出条件と一緒に DLookup 関数を使用する方法を示したものです。

 ●テキスト抽出条件を指定する場合

抽出条件フィールドがテキストの場合は、次の例に示すように、単一引用符でテキストを囲みます。

=DLookup("[Title]", "社員", "[氏名] = '鈴木 一郎'")

単一引用符の使用を推奨しますが、単一引用符の代わりに二重引用符も使用できます。単一引用符 1 つを置き換えるには、2 つの二重引用符を使用します。次の例は二重引用符を使用したもので、上記の例と等価です。

=DLookup("[Title]", "社員", "[氏名] = ""鈴木 一郎""")

●フォーム上のフィールドによるテキスト抽出条件を指定する場合

次の例は、[受注] フォームの得意先に対応する得意先名を検索する方法を示したものです。"得意先コード" フィールドは抽出条件のテキスト キー フィールドであるため、ステートメントは次のようになります。

=DLookup("[得意先名]", "[得意先]", _

"[得意先コード]='" & [得意先コード] & "'")

または

=DLookup("[得意先名]", "[得意先]", _

"[得意先コード]='" & Forms![受注]![得意先コード] & "'")


よろしかったら・・・応援クリック・・・お願いします。励みになります。


人気ブログランキングへ


On Error ステートメントについて

2012年10月16日 | VBA

エラーの発生が予期される場合、それに対処するための処理をあらかじめプロシージャ内に設けておきます。これをエラートラップといいます。

エラーを回避するテクニックとして「On Error ステートメント」があります。

構文: On Error Resume Next

エラーが発生するとエラーの発生した次の行から処理を続行します。

構文: On Error Go To 0

エラー処理を無効にします。

使用例;
On Error Resume Next

エラーの発生するコード

On Error Go To 0

のようにはさみます。

構文: On Error Go To (行ラベル)

エラーが発生すると、指定した行ラベル(または行番号)に処理が移ります。

行ラベルは、行頭から任意の文字列を書き、行末にコロン「:」をつけます。注意しなければならないのは、エラーが発生しなかった場合を想定することです。
エラーが発生しない(行ラベルに処理を移さない)ときは、行ラベルの手前に「Exit Sub」と「Subプロシージャを終了させる」コマンドを忘れずに記述しましょう。

 

 よろしかったら・・・応援クリック・・・お願いします。励みになります。


人気ブログランキングへ


Ifステートメントの書式について

2012年10月16日 | VBA

「Ifステートメント」で、「End If」を使う場合と使わない場合の違いを質問されました。

「Endステートメント」は、ブロック(命令の集まり)を終わらせる働きがあります。
従って、1行だけのステートメントには End If は使いません。

「Ifステートメント」の書式は次のようになります。

例1
If 条件 Then 処理

※1行だけの「If 条件 Then 処理」はブロックではないから「End If」は必要ありません。


例2
If 条件 Then

   処理

End If


例3
If 条件 Then

   処理1

Else

   処理2

End If

※Endステートメントは、ブロックを終わらせる働きがあります。

 

 よろしかったら・・・応援クリック・・・お願いします。励みになります。


人気ブログランキングへ


VBEで「プロパティ」ウィンドウを既定の位置に動かしたい

2012年10月01日 | VBA

VBEは、「プロジェクトエクスプローラ」、「プロパティウィンドウ」、「コードウィンドウ」で構成されています。
通常、「プロパティウィンドウ」は、「プロジェクトエクスプローラ」の下に配置されていますが、それがコードウィンドウ領域に表示されてしまったので戻したいというご質問でした。

以下の操作を行います。

1.「プロパティウィンドウ」を右クリックします。

2.「ドッキング可能」をクリックします。

3.これで、戻ります。

「ドッキング可能」とは、ウィンドウを一定の位置にドラッグすると、自動的に適切な位置やサイズに設定される状態のことです。

VBEの各ウィンドウをドッキング可能にするかどうかは、以下の手順で設定できます。

1.「ツール」をクリックします。

2.「オプション」をクリックします。

3.「ドッキング」タブを選択し、必要な項目にチェックをつけます。

 

 よろしかったら・・・応援クリック・・・お願いします。励みになります。


人気ブログランキングへ


VBEコードウィンドウ内でのフォントサイズ変更

2012年10月01日 | VBA

ExcelVBEコードウィンドウ内のフォント及びサイズは、以下の設定で変更できます。

【手順】

1.VBEの「ツール」をクリックします。

2.「オプション」をクリックします。

3.「オプションダイアログボックス」が表示されますので、「エディタの設定」タブをクリックします。

4.「標準コード」を選択し、「フォント名」及び「サイズ」から任意のものを選択します。

5.以上で、フォントやフォントサイズを変更できます。

 

 よろしかったら・・・応援クリック・・・お願いします。励みになります。


人気ブログランキングへ


エラー ユーザー定義型は定義されていません

2012年07月13日 | VBA

下記のようなコードを記述したところ、エラーが表示されたとのことです。

Sub ドライブ数表示()
    Dim MyFSO As New FileSystemObject
    MsgBox MyFSO.Drives.Count
    Set MyFSO = Nothing
End Sub

回避方法は以下の通りです。

1.VBEで「ツール」をクリックします。

2.「参照設定」をクリックします。

3.≪参照可能なライブラリファイル≫の一覧から[Microsoft Scripting Runtime]にチェックをつけ、「OK」をクリックします。

このあと、コードを記述すればエラーは回避できます。

フォルダやファイルを操作したり、テキストファイルへ入出力したりするためのオブジェクトが「FileSystemObject(ファイルシステムオブジェクト)」です。これを使うと、フォルダやファイルなどをオブジェクトとして取得し、メソッドやプロパティを使って操作できます。

また、FileSystemObjectはVBAとは独立したオブジェクトです。したがって、VBAからFileSystemObjectを利用するためには、ライブラリファイル[Microsoft Scripting Runtime]への参照を設定します。

参照設定の有効範囲は、参照を設定したブック内です。FileSystemObjectを利用するブックごとに[Microsoft Scripting Runtime]への参照を設定します。

よろしかったら・・・応援クリック・・・お願いします。励みになります。


人気ブログランキングへ


Visual Basic Editor の主なショートカットキー

2012年06月22日 | VBA

主としてコードウィンドウの操作に関連したショートカットキーです。

▼【編集】関連のショートカットキー

キー 説明 
 Ctrl + C  コピー
 Ctrl + X  切り取り
 Ctrl + V  貼り付け
 Del  削除 
 Ctrl + De l  単語の最後まで削除
 Ctrl + Y  現在行を削除
 Ctrl + Z  元に戻す 
 Ctrl + P  印刷 
 Tab  インデントする
 Shift +Ta b   インデントを戻す  
 Ctrl + F  検索する 
 Ctrl + H  置換をする 
 F3  次を検索する
 Shift + F 3  前を検索する 
 Ctrl + M  ファイルをインポートする  
 Ctrl + E  ファイルをエクスポートす る 

▼【表示】関連のショートカットキー

キー 説明 
 F7  コードウィンドウを表示  
 F2  オブジェクトブラウ ザを表示
 Ctrl + G    ミディエイトウィンドウ を表示 
 Ctrl + R  プロジェクトエクスプロー ラを表示 
 F4  プロパティウィンドウを表 示 
 Shift + F 10   ショートカットメニューを 表示 
 Ctrl + J  プロパティメソッドを表示  
 Ctrl + Sh ift + J  定数の一覧を表示  
 Shift + F 9  クイックウォッチを表示  
 Ctrl + I  クイックヒントを表示  
 Ctrl + Sh ift + I  パラメータヒントを表示  
 Ctrl +  Space  入力候補を表示 

▼【実行】関連のショートカットキー

 キー説明 
 F5  Sub/ユーザーフォーム を実行 
 Ctrl + Br eak  中断 
 F8  1行ずつ実行(シングルス テップ) 
 Shift + F 8  1つのプロシージャを実行 (プロシージャステップ) 
 Ctrl + F8  カーソルの前まで実行  
 F9  ブレークポイントを設定/ 解除 
 Ctrl + Sh ift + F9  べてのブレークポイント を解除 

▼【移動】関連のショートカットキー

 キー説明 
 Ctrl + ↓  次のプロシージャへ移動す る 
 Ctrl + ↑  前のプロシージャへ移動す る 
 Shift + F 2  定義を表示 
 Ctrl + Pg Dn  1画面下へスクロールする  
 Ctrl + Pg Up  1画面上へスクロールする  
 Ctrl + Sh ift + F2   直前の場所に戻す  
 Ctrl +  Home   モジュールの先頭に移動す る 
 Ctrl + En d   モジュールの最後に移動す る
 Ctrl + →    右の単語に移動する  
 Ctrl + ←    左の単語に移動する  
 End   行末に移動する 
 Home   行頭に移動する 

 

よろしかったら・・・応援クリック・・・お願いします。励みになります。


人気ブログランキングへ