GEN MUTO'S HOMEPAGE  エクセル大事典  エクセルVBA超入門

エクセルExcel大事典 エクセル大事典TOPページへ
 ■ エクセルVBA超入門−9ステップで"Hello World!"からオブジェクト指向まで!
  シートで簡易データベース
 
■ ワークシートを簡易データベースとして使おう
 
さて、せっかく最終行、最終列を取得する方法もわかったことですし、今度はワークシートを簡易データベース的に使ってみましょう。
方法はいろいろとありますが…できるだけ簡単で汎用性の高いものをご紹介したいと思います。
まずワークシートを一つ追加してください。
そして追加したワークシートの名前を"SyainMST"に変更しましょう。


 
シートの追加と名前の変更は大丈夫ですよね。挿入>ワークシートでシートの追加、タブをダブルクリックして名前を変更です。
セルA1、B1、C1、D1、E1にSyainID、SyainNAME、Kinzoku、Syozoku、Yakusyokuと それぞれ入力してください。
実際の社員マスタはもっとたくさんの項目があると思いますが、ここはあくまでVBAの勉強用です。このくらいの項目数で十分でしょう。
5行くらいテストデータを入れてください。こんな感じです。
 
1001 鈴木一郎 20 商品部 課長
1002 小野真弓 5 経理部 一般
1003 北野 武 35 商品部 部長



データはどんなものでも結構です。あとでわかりやすくするために身近な人をデータにしたほうがいいでしょう。
データのほうの準備は出来ましたか?
では早速、VBAでプログラムしてみましょう。プログラムの動作はSheet1のA1セルに入っている社員IDのデータを拾ってきてA2、A3、A4、A5セルに名前、勤務年数、所属、役職を表示させるものとします。

Public Sub test()
Dim i As Long
Dim WrkRow As Long
Dim WrkCol As Long
Dim WrkRange As Variant
  With Sheets("SyainMST")
    WrkRow = .Cells(Rows.Count, 1).End(xlUp).Row
    WrkCol = .Cells(1, Columns.Count).End(xlToLeft).Column
    WrkRange = .Range("A1").Resize(WrkRow, WrkCol)
  End With
  For i = 1 To WrkRow
    If WrkRange(i, 1) = Range("A1") Then
      Range("A2") = WrkRange(i, 2)
      Range("A3") = WrkRange(i, 3)
      Range("A4") = WrkRange(i, 4)
      Range("A5") = WrkRange(i, 5)
    End If
  Next i
End Sub

うん。なかなかいいコードです。Sheet1のセルA1に試しに社員IDの1001を入力、実行させてみましょう。

鈴木一郎
20
商品部
課長

が表示されたと思います。パチパチパチ。
さて、コードの行っている処理を順に説明してみましょう。まず5行目のDim WrkRange As Variant ですが、Variant型というのは初めて出てきましたね。
基本のデータ型の4つにない型です。

Variantは何でも入るとても便利な型です。型宣言をしなければ自動的にこの型が割り当てられます。まずWrkRangeをこの何でも入る便利な型で宣言します。
次の行のWithですが、Sheets("SyainMST")を指定しています。データの入っているシートSyainMSTはプログラムを実行させるSheet1とは別のシートです。別のシートからデータを拾ってくるときは明示的にシート名を指定してあげる必要があります。

WrkRow = Sheets("SyainMST").Cells(Rows.Count, 1).End(xlUp).Row
WrkCol = Sheets("SyainMST").Cells(1, Columns.Count).End(xlToLeft).Column
WrkRange = Sheets("SyainMST").Range("A1").Resize(WrkRow, WrkCol)
と書いてもいいのですが、ちょっと見にくいです。Withをつかってまとめてやると、

With Sheets("SyainMST")
  WrkRow = .Cells(Rows.Count, 1).End(xlUp).Row
  WrkCol = .Cells(1, Columns.Count).End(xlToLeft).Column
  WrkRange = .Range("A1").Resize(WrkRow, WrkCol)
End With
いくぶん見やすくなりましたね。

WrkRow、WrkColに代入されるのはSyainMSTのデータが入力されている範囲の最終行と最終列です。
WrkRange = .Range("A1").Resize(WrkRow, WrkCol)
の部分で何でも入る便利な型(Variant)のWrkRangeにセルA1から(データのある)最終行、最終列のセルまでを直接代入しています。
Resize(行,列)これでRange("A1")から最終行、最終列の範囲までを指定しています。WrkRangeには指定した範囲内のデータが二次元配列として格納されます。
おお…配列の説明がまだでしたね。大丈夫です、全然難しくありませんから。

一階建ての平屋のアパートを連想してください。部屋が1号室から5号室まで5部屋あります。これが一次元配列です。
Dim MyApartment(4) As String
こんなふうに宣言します。この変数にはMyApartment(0)からMyApartment(4)まで5個の異なる文字列を保持できます。
大家さんが、がんばって二階建てにしたとします。部屋は101号室から205号室まで10部屋になりました。これが二次元配列です。
Dim MyApartment(1,4) As String
こんな感じになります。配列は0から数えるので(0〜1,0〜4)で10個のデータが保持できます。ちょっと変な感じですけど。
三次元配列はさらに同じアパートを別棟で建てたと考えてください、詳細は省略します。配列は大体こんな感じです。
※より詳しい配列の解説はこちらに記述していますので参照してください。
  配列(動的配列 静的配列)の中身を一気に複写

さて、WrkRangeにセル範囲が代入された時点でWrkRangeはWrkRange(行,列)の二次元配列となります。(ただし配列の開始値は0ではなく1です)
WrkRangeの配列の中身はこんな感じです。
WrkRange(1,1)="SyainID"
WrkRange(1,2)="SyainNAME"
WrkRange(1,3)="Kinzoku"
WrkRange(1,4)="Syozoku"
WrkRange(1,5)="Yakusyoku"
WrkRange(2,1)="1001"
WrkRange(2,2)="鈴木一郎"

あとは簡単ですね。For文でループさせ社員IDがセルA1と同一のときにそのほかのデータをセルA2〜A5に出力させてます。
 
 
 
ふう。でもこれならVLOOKUP関数を使ったほうが早そう…と思ってませんか?あなた。
それにFor文でデータの頭から該当IDを探しに行くのも非効率ですよね。IDで検索させて該当レコードだけを抜き出すほうが手っ取り早いと思うでしょう。
全くもってその通りです。これはこういう使い方をするためのコードではありません。
このコードの便利なところはVariantの配列をそのまま一気にセル領域に出力できるところにあります。
つまり、あるシートの大量のデータを一気に取得してプログラム内で更新処理し、元の場所のデータを一気に置き換える。このような使い方をしてこそ威力を発揮します。
たとえば上のコード、こんな風にも記述できます。

Public Sub test()
Dim i As Long
Dim WrkRange As Variant
  WrkRange = Sheets("SyainMST").UsedRange
  For i = 1 To UBound(WrkRange)
    If WrkRange(i, 1) = Range("A1") Then
      Range("A2") = WrkRange(i, 2)
      Range("A3") = WrkRange(i, 3)
      Range("A4") = WrkRange(i, 4)
      Range("A5") = WrkRange(i, 5)
    End If
  Next i
End Sub

ずいぶんあっさりしちゃいましたね。特筆すべきは4行目のUsedRangeプロパティです。これはシート内で使用されている全セル範囲を取得します。
先ほどは最終行をカウンタの上限に設定していましたが…
For i = 1 To UBound(WrkRange)
最終行だけ取得するのはバカらしいのでUBound関数を使って最終レコードを取得しちゃいましょう。
インデックスを含むデータが10行あればUBound(WrkRange)は10を返します。10は最終行と同じ値ですね。

ループの最中に各項目の値を変更(例えば勤続年数を増分)し、
Sheets("SyainMST").UsedRange = WrkRange
とすれば、変更された値が一気に元の場所に書き込まれます。
勤続年数の年度更新処理など、使い方はいくらでもあり実に汎用性の高いテクニックです。

この方法を突き進めていきますと、ワークシートでもかなりデータベース的な使い方が可能になります。

※さらにワークシートのデータベース的利用法を極めたい方はこちら!
  データベースへ接続してみよう!ワークシートへの接続

 

>> 次の話にすすむ


サイト内検索ができます

Microsoft Most Valuable Professional

Microsoft MVP Excel
武藤 玄 プロフィール
 

■■■ 執筆した書籍 ■■■
 

EXCEL VBA 業務自動化
 

Excel VBA を5日でマスターする本
 

仕事を速くする Excel VBA 入門
 

Excel VBAと業務改善のポイントがわかる本
 

Access VBA ベーシック スタンダード
 

Excel VBA アクションゲーム作成入門
 

■■■ 連載中の記事 ■■■
 

Excel VBAで業務改善!
 

実務で使うExcel VBA
 


TOPページ


■ エクセルVBA超入門

 ・9ステップで"Hello World!"
  からオブジェクト指向まで!
  1."Hello World!"を表示しよう
  2.基本はデータの入出力
  3.繰り返し処理
  4.シートで簡易データベース
  5.名前をつけよう
  6.構造化プログラムに挑戦
  7.構造体を使ってみよう
  8.フォームを使ってみよう
  9.オブジェクト指向に挑戦

■ エクセルVBA中級編

 ・VBAでいろんなテクニック
  変数・関数のスコープ
  引数の参照方法を明示
  配列の中身を一気に複写
  識別子がよいコードを作る
  データ定義型をもっと知ろう
  定数と列挙型を活用しよう
  エラー処理の重要性1
  エラー処理の重要性2
  いろいろな条件分岐
  いろいろな繰り返し処理
  演算子について知ろう
  文字列操作 連結 変換 置換
  文字列操作 検索 比較 書式
  日付操作関数を知ろう
  数値操作・評価・その他関数
  並び替えソートをマスター
  いろいろな検索をマスター
  VBEditorを使いこなそう
  マクロの記録を活用しよう1
  マクロの記録を活用しよう2
  VBAからVBEを操作しよう1
  VBAからVBEを操作しよう2
  VBAからVBEを操作しよう3
 ・ワークシートを使いこなす
  セルの参照をマスターしよう
  セルの選択をマスターしよう
  セルの操作をマスターしよう
  セルの書式設定をマスターしよう
  行・列の操作をマスターしよう
  シートの参照をマスターしよう
  シートの操作をマスターしよう
  ブックの操作をマスターしよう
  ウィンドウの操作をマスターしよう
  イベントプロシージャを活用しよう
  ワークシートを印刷しよう1
  ワークシートを印刷しよう2
  音声(読み上げ)機能を操作しよう
  グラフを操作しよう
 ・ユーザーフォームを使いこなす
  ユーザーフォームを使おう
  UserFormsオブジェクト
  Labelコントロール
  TextBoxコントロール
  ComboBoxコントロール
  ListBoxコントロール
  CheckBoxコントロール
  OptionButtonコントロール
  ToggleButtonコントロール
  CommandButtonコントロール
  ScrollBarコントロール
  SpinButtonコントロール
 ・VBA関数の一覧
  Aから始まる関数の一覧
  Cから始まる関数の一覧
  Dから始まる関数の一覧
  Eから始まる関数の一覧
  Fから始まる関数の一覧
  Gから始まる関数の一覧
 
■ エクセルVBAを極める
 VBAスーパーテクニック
 
 ・データベースへ接続してみよう!
  CSVファイルへの接続
  ワークシートへの接続
  mdbファイルへの接続
  SQL Serverへの接続
  ADOレコードセットの操作1
  ADOレコードセットの操作2
 ・ファイルを操作してみよう!
  FileSystemObjectの操作
  Drive File Folderの操作
  TextStream ダイアログ
  ステートメントでファイル操作1
  ステートメントでファイル操作2
 ・他アプリと連携してみよう!
  ActiveXオートメーションの操作
 ・ゲーム技でマクロを超える
  エクセルで音を鳴らす1
  エクセルで音を鳴らす2  
  スクリーン座標を取得
  様々なイベント取得
  リボンUIを制御しよう1
  リボンUIを制御しよう2
  シート上でアニメを動かそう
 
■ 一歩上行くエクセル
 基本操作の完全マスター!

 
 ・あなたはいったい
  エクセルで何をしたいのか?
  エクセルで業務効率化
  エクセル関数を使いこなす
  エクセルの便利技
  エクセルは最高の帳票ツール
 ・エクセル基本操作上級編!
  セル選択、コメント、シリアル値
  オート機能を使いこなそう!
  参照、条件付書式、入力規則
  関数をもっと理解しよう!
  配列数式を有効利用しよう!
  データの正規化をしよう!
  ショートカットキーを利用しよう1
  ショートカットキーを利用しよう2
  Office用アプリを作成しよう!
  PowerPivotとExcelで簡単BI!
 ・世間の誤ったエクセルの
  べからず集
  エクセルで文章を書くべからず
  エクセルで図形を描くべからず
  エクセルでシステムをつくるな
 
■ エクセル関連その他

 ・エクセルコミニュティにあなたも
  参加しませんか?
  Excel関連リンク・コミニュティ
 ・VBの理解がVBAをマスターする
  最短距離!
  VB関連の老舗・大家サイト
 ・エクセルExcel大事典掲示板
 ・プライバシーポリシー

2000アイテムを超えるラベルを販売
送料無料、即納対応の優良ショップ
今買っているラベルより確実に安い!
OAラベルの販売専科グラフトラベル




エクセルExcel大事典ははリンクフリーです エクセル大事典Excel大事典
お問い合わせはこちら gengengen@yahoo.co.jp

Copyright© Gen Muto 武藤 玄 All Rights Reserved,