教育関連リンク集 画像・素材 コンピュータマニュアル集 ソフト集 本・情報 特 集 みんなで話そう 研究会概要 会員登録 TOP

ExcelのVBAに挑戦しよう



 Excelで表を作り自動で処理するには関数が多く使われますね。関数を覚えてしまえばほとんどのことが処理できてしまいます。でも、中には簡単な処理にもかかわらず関数で処理できない、または処理しにくいものもあります。

 処理の仕方は、何となくわかるのにそれにあった関数がない。悔しいですよね。
 そのようなあなたのために今回はVBAに挑戦してみましょう!

 最初からすべてを理解しようとするとくじけます(私の場合(^_^;))ので、今回のものを一部換えていろいろなものに応用してみてはいかがでしょうか。

緑のセルに項目を入れると黄色の表から対応した項目等をブルーの表に転記したい


関数でいけちゃうのでは?
関数を使ったことがある方は、「おっ、これはVLOOKUPが使えそうだ!」と気づくかもしれません。
ですが、VLOOKUP関数で取り出せるデータは下図のピンク色の部分それも1行分です。
項目の列の左のデータも取りたい、しかし既存の表はそのまま生かしたい・・・。

それなら、ちょっと勇気を出してVBAに挑戦してみましょう!

1.VBAの下準備
     
1)Excelで[表示]→[ツールバー]→[Visual Basic]の順でVisual Basicツールバーを表示させる
2)Visual Basicツールバーが表示される
3)Excelで[ツール]→[オプション]の順でオプションを表示させる
4)オプション画面で[全般]→[設定]で[R1C1参照形式を使用する]にチェックを入れる
5)Excelのシートの列の表示が「A,B,C・・・」から「1,2,3,・・・」に変わる

2.まずはボタンを作ろう
     
1)Visual Basicツールバーの[コントロールツールボックス]をクリック
2)[コントロールツールボックス]で[コマンドボタン]クリック
3)シート上でドラッグし「コマンドボタン」を作成する
4)[コントロールツールボックス]で[プロパティ]クリック後[プロパティ]画面の[Caption]を変更します。ここでは、「転記」という名のボタンにします。   

3.ボタンを押したときの処理(コード)を記入しよう
1)2で作成した[コマンドボタン]をダブルクリックすると下図の画面が現れます。ここにコードを記入します。
2)コードを記入する(ここでは貼り付け)

Private Sub CommandButton1_Click()
 ここに下の青文字の部分をコピーして貼り付ける
End Sub

'***********************************************************************************************
Dim i As Integer, j As Integer '変数の宣言文
Dim CellData As Variant

i = 2 '項目を拾い出す行 例…ピアノ等
j = 17 '拾い出した項目を入力する行

Application.ScreenUpdating = False '画面のちらつきを止める処理、画面の再表示をOffにする

Worksheets("Sheet1").Range(Cells(17, 1), Cells(22, 7)).Select '入力する範囲を空欄にする処理
Selection.ClearContents

Do
i = i + 1
CellData = Worksheets("Sheet1").Cells(i, 4) '検索するセルの内容をCellDataに代入する
If CellData = "" Then 'もしCellDataが空欄ならば終了
Exit Do
End If

If CellData = Worksheets("Sheet1").Cells(15, 1) Then 'CellDataが検索する内容と一致したときの処理
Worksheets("Sheet1").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1) '伝票No
Worksheets("Sheet1").Cells(j, 2) = Worksheets("Sheet1").Cells(i, 2) '月
Worksheets("Sheet1").Cells(j, 3) = Worksheets("Sheet1").Cells(i, 3) '日
Worksheets("Sheet1").Cells(j, 4) = Worksheets("Sheet1").Cells(i, 4) '項目
Worksheets("Sheet1").Cells(j, 5) = Worksheets("Sheet1").Cells(i, 5) '内訳
Worksheets("Sheet1").Cells(j, 6) = Worksheets("Sheet1").Cells(i, 6) '数量
Worksheets("Sheet1").Cells(j, 7) = Worksheets("Sheet1").Cells(i, 7) '支出額
j = j + 1
End If
Loop While CellData <> "" '空欄でないかぎり繰り返す
Application.ScreenUpdating = True '画面の再表示をOnにする

'***********************************************************************************************

4.コードの解説
ここでの解説は多少の応用できる程度にとどめます。興味がある方はネット上に多くのVBAに関するサイトがありますので探してみて下さい。

1)Worksheets("Sheet1").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1)
  上のコードは「Sheet1という名のシートのセル(i , 1)Sheet1という名のシートのセル(j , 1)に代入(転記)する」という意味です

  Cells(j, 1)は「j 行の1列目のセル」を意味します。
  Excelでは初期の状態ではセルは”A1”のように「列」「行」の順で表します。1行目の1列のセルは、「マクロの記録」では Range("A1") のように表示されます。
  VBAを使うにはいささか不便が出てきますので Range("A1") ではなく Cells(1, 1)のように記述しました。
  VBAの下準備で[R1C1参照形式を使用する]としたのにはこのような訳があったのです。

5.いざ実行
1)[コントロールツールボックス]の[デザインモード]をクリックします

2)項目を入力して[コマンドボタン]を押すと?



6.エラー(デバッグ)がでたら
1)あわてず「デバッグ」ボタンをクリック

2)下図の画面の[リセット]ボタンを押します。
  黄色で示されている部分に不具合があります。

いろいろなシートで応用してみよう!
今回のコードは、いろいろな既存のシートに応用できると思います。
i = 2 '項目を拾い出す行 例…ピアノ等
j = 17 '拾い出した項目を入力する行

Worksheets("Sheet1").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1) '伝票No
等の数値をいじれば自分のやりたいコードに変身するのではないかと・・・。

ご質問等ありましたら、掲示板またはメールでお願い致します。