SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Access 2003 VBAではじめるクラス入門

クエリを実行し結果セットをExcelに転送するマクロの作成


  • X ポスト
  • このエントリーをはてなブックマークに追加

グラフ作成用プロシージャの作成

 グラフ作成用プロシージャCreateGraphは、ワークシートに転送されたデータのセル範囲を自動的に算出し、グラフを生成します。これには、転送されたデータのあるセル範囲を取得し、グラフ用のセル範囲に作り変えるプロシージャGetRangeを作成して、この戻り値を元にグラフを作成します。

グラフ用のセル範囲の取得

 プロシージャGetRangeは、メソッドとして公開しない、内部処理用のプロシージャとして使用しますので、Friendキーワードを付けたFunctionプロシージャにします。

Friend Function GetRange() As String

End Function

 WorksheetオブジェクトのUsedRangeプロパティで、ワークシート内で使用されたセル範囲を取得します。このプロパティは、セル範囲をRangeオブジェクトで返してきますので、RangeオブジェクトのAddressプロパティと組み合わせてセル番地を取得し、変数InDataに格納します。

InData = QryBook.Worksheets("Sheet1").UsedRange.Address
ワンポイント・アドバイス
 このとき、対象のワークシートを指定する際に、作成した新規ブックへの参照を格納しているオブジェクト変数を上位のオブジェクトに指定してください。CreateObject関数は、複数のExcelのインスタンスを作成することができますから、どのブックのワークシートなのかを明示的に指定しないと、マクロが正常に動作しません。
 

 今回使用するクエリ「商品区分別売上高」は、列1には区分コード、列2に区分名があります。グラフに使用するのは列3、列4のデータなので、この部分をセル範囲として作成します。

 Addressプロパティが返してくるアドレスは、「$A$1:$G$34」という「$」記号が付いた書式になっています。この文字列から、最下行の行番号を取り出します。

 まず、Len関数でこのアドレスの文字数を数えます。そして、Mid関数で文字列の最後尾から1文字ずつ取り出し、変数UseRowに代入します。例えば、「$A1:$G34」であれば、「4」「3」「G」「$」と取り出し、1つの文字列にします。

Cnt = Len(InData)

While Num <> "$"
    Num = Mid(InData, Cnt, 1)
    Cnt = Cnt - 1
    If Num <> "$" Then
        UseRow = UseRow + Num
    End If
Wend

 取り出す文字が「$」記号に出会った時点でループは終わり、行番号だけが逆の文字列で変数に格納されます。例えば、「$A$1:$G$34」であれば「43」が格納されます。これを、StrReverce関数で逆の順序に入れ替えます。これで、この例であれば「34」という行番号が取り出せるわけです。

UseRow = StrReverse(UseRow)

 この番号を元に、グラフに使用する列名と結合してセル範囲を作成し、プロシージャの戻り値になるようセットして出来上がりです。

GetRange = "C2" & ":D" & UseRow

グラフ作成プロシージャを作る

 グラフの元になるセル範囲ができたら、グラフ作成を行う内部処理用のSubプロシージャCreateGraphを、キーワードFriendを付けて作成します。

Friend Sub CreateGraph()

End Sub

 まず初めに、グラフの元になるセル範囲を取得し、変数InDataに格納します。Friendキーワードを付けたプロシージャを呼び出すには、キーワードMeを使用します。Meのあとに「.」をつけると、自動的に使用できるメソッドの一覧が表示されます。ここから、セル範囲を取得するプロシージャGetRangeを選択します。

InData = Me.GetRange

 このMEキーワードを付けないと、Friendキーワードを設定したプロシージャを呼び出すことができませんので注意してください。

 

 次に、ChartオブジェクトのAddメソッドを使ってグラフを組み込みます。この時も、対象のオブジェクトに作成したブックを指定しておきます。メソッドを実行しグラフが作成されるとオブジェクトへの参照を返してきますから、これをオブジェクト変数に格納します。

Set Grp = QryBook.Charts.Add

 そして、ChartオブジェクトのChartTypeプロパティとSetSourceDataメソッドで、グラフの種類と対象セル範囲を指定します。また、Locationプロパティで、ワークシート内のグラフの位置を指定します。

Grp.ChartType = xlColumnClustered
Grp.SetSourceData _
            Source:=QryBook.Sheets("Sheet1").Range(InData), _
            PlotBy:=xlColumns
Grp.Location Where:=xlLocationAsObject, _
                     Name:="Sheet1"

 これで出来上がりです。最後にセルA1を選択して、グラフの選択状態を解除します。

QryBook.Sheets("Sheet1").Range("A1").Select

作成したクラスを利用するプロシージャの作成

 作成したクラスのメソッドRecord_Transを使ったプロシージャを作成していきましょう。標準モジュールにプロシージャ「レコードを選択して転送」を作成します。

Sub レコードを選択して転送()
End Sub

 はじめに、DimステートメントにNewキーワードを付けて、クラスからオブジェクトを作成します。

Dim Qex As New clsTrans

 そして、プロパティQryNameに、クエリ「1997年 商品区分別売上高 」をセットします。

With Qex
    .QryName = "1997年 商品区分別売上高 "

 そして、メソッドRecord_Transを実行します。これで、クエリの結果セットから15項目をワークシートに転送し、このデータを元にグラフを作成します。

    .Record_Trans
End With

 最後に、使用したオブジェクト変数を開放して完成です。

Set Qex = Nothing

 なお、作成したクラスは、Excelの場合と同様、プロジェクトエクスプローラでエクスポート・インポートが行えるので、1つクラスを作成してそれを複数のプロジェクトで使うことができます。

まとめ

 これで、VBAでもクラスを作成して使えることがお分かりいただけたと思います。クラスの大きな目的は、複雑な処理を隠蔽しパッケージ化して、簡素なインターフェイスで誰もが使用できる形態にできることでしょう。サンプルの説明でもお分かりのように、クラスの作成には手間と時間がかかりますが、使うときは実に簡単です。プロパティを設定してメソッドを実行するだけです。

 今回は入門ということで、駆け足で説明しましたが、本稿を参考に他の記事と併せて、便利なクラスを作ってみてはいかがでしょう。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/504 2008/08/19 20:33

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング