こんにちは! 健史です。
パソコンをお使いの方の多くは、表計算ソフトExcelを利用されていると思います。
この記事は、Exceは知っているけれど
・Excel-VBAって何?
・Excel-VBAは取っ付きにくい!
・Excel-VBAって難しそう!
と言った方へ「Exce-VBAを始めるきっかけ」になればと思います。
記載したプログラムをそのままコピー・ペーストし、データを入力すれば、すぐに動作するようになっています。
見ているだけでは覚えせん。実際に自分の手を動かし、失敗しながらでもやらないと身に付きません。
やって見て、Excel-VBAの開き方、実行方法に慣れることが必要です。
そのため、手を動かしてほしいがための記事にしました。
>
ここにもう少し書きたいのですが、長くなってしまうので「3.イントロダクション(導入部)の続き」に分けました。
>
尚、当記事のExcelバージョンは「Excel2003」によるものです。
Excel2003より後のバージョンをお使いの方は、以下ご認識下さい。
・Excel起動後のシートが1つ(Sheet1)ですので、必要に応じて追加する
・Excel-VBAは動作しますが、保存するときに形式を'xslm'にする
('xlsx'形式で保存しようとするとメッセージが表示される)
プログラムの作成と実行
とにかく、Excel-VBAに触って動かしてみましょう。
初回のサンプルプログラムは
です。
実行までの手順
1.Excelを起動
2.データ入力
Book1のセル[A1]~[A10]に10~100までを入力します。
3.Excel-VBAを起動
Altを押した状態でF8キーを押します。
4.[マクロ名(M):]に'test'と入力(''は不要、''内のtestを入力)
TESTでもSUMでも構いません。
だだし指定できない文字列もあります。例えば'select'は指定できず、'select1'とかにすればOKです。
5.[作成(C)]をクリック
私はマクロ名を入力したら、そのままEnterを押します。
6.以下のプログラムをドラッグ&コピー
Dim i As Long Worksheets(1).Cells(11, 1) = 0 For i = 1 To 10 Worksheets(1).Cells(11, 1) = Worksheets(1).Cells(11, 1) + Worksheets(1).Cells(i, 1) Next
6.以下に貼り付け(ペースト)
Sub test()
ここに貼り付ける
End Sub
以下のようになればOKです。
Sub test() Dim i As Long Worksheets(1).Cells(11, 1) = 0 For i = 1 To 10 Worksheets(1).Cells(11, 1) = Worksheets(1).Cells(11, 1) + Worksheets(1).Cells(i, 1) Next End Sub
7.F5キーで実行
8.実行結果の確認
Book1に切り替えて下さい。
Altを押した状態でTabキーを押して、Book1に位置づいたらTabキーを離すことで切り替わります。
Book1のセル[A11]に「550」が表示されていればOKです。
Excelシートとプログラムの関係
まず、Excelシートとプログラム内で定義されている項目名との関係を説明します。
Cells(1,1)はセル[A1]のことです。
()内1の番目は縦の行番号、2番目は横の列番号を表します。
Worksheets(1)は、1番左のシートで、(2)は2番目のシート、(3)は3番目のシート、以降同様です。
プログラム内では「Worksheets(1).Cells(11, 1)」とシートとセルを'.’(ピリオド)で繋げれば参照できます。
>
>
プログラム内でWorksheetsの指定を(1),(2)・・と書いた場合には注意が必要です。
プログラムを書いた後に手でExcelのシート1番目と2番目を入れた場合には、プログラムで参照するシート()内を変更する必要があります。
シート名は変更してもプログラムを修正する必要はありません。
>
>
()内を名称にしたい場合には、""で囲んで記述します。
例えば、「シート名1」というシート名であればWorksheets("シート名1")と記述します。
シート名であれば、プログラムを書いた後に手でシート1番目と2番目を入れた場合でも、プログラムで参照するシート()内を変更しなくてもOKです。
その代わり、シート名を変更した場合には、プログラムで参照するシート("")内を変更する必要があります。
フローチャート
最初から最後まで、全体のフローチャートです。
イエローでマーキングした処理は「For i = 1 To 10」の部分で、マーキングした処理が内部で自動生成されます。
処理の中で例えば「i = 15」と記述すると、自動的に1がプラスされてNextの後のiは「16」になっています。
プログラムの詳細説明
Dim i As Long i という名前のデータをプログラム内に定義、長さはLongタイプ プログラム内に定義とは、「プログラム内のメモ領域」とご理解下さい Longタイプは「As Longと書いておけばOK」とご理解下さい Worksheets(1).Cells(11, 1) = 0 Worksheets(1)のCells(11, 1)にゼロをセット (11,1)の11は縦の番号、1は横の番号でA=1,B=2で、(1,2)はセル[B2]です For i = 1 To 10 i に1をセットして1づつカウントアップしてiが10を超えるまで、 Nextに囲まれた範囲までの処理を繰り返す Worksheets(1).Cells(11, 1) = Worksheets(1).Cells(11, 1) + Worksheets(1).Cells(i, 1) Cells(11,1)の値とCells(i,1)の値をプラスした結果にCells(11,1)を置き換える i=1の時は、Cells(11,1)の0とCells(1,1)の10をプラスした10にCells(11,1)を置き換えます i=2の時は、Cells(11,1)の10とCells(2,1)の20をプラスした30にCells(11,1)を置き換えます Next For の終わり
補足です。
・変数について
今回は1つだけ[i]という変数を定義しました。
使用する変数はフローチャートを作成する過程で、どんな変数が必要か分かります。
慣れてくればフローチャートを作成せずに、プログラムを書きながら必要な変数を都度定義していくようになれます。
>
>
・計算式について
Worksheets(1).Cells(11, 1) = Worksheets(1).Cells(11, 1) + Worksheets(1).Cells(i, 1)を「A = A + 1」に代え説明します。
これは、
1.右項[A + 1]をコンピュータ内の演算装置という場所で計算する
①.Aの内容を演算装置にセットして、②.1をプラス
2.その後、演算装置の内容を左項[A]にセットする
ということです。
エラーが発生したときの対処法
エラーメッセージが表示されたとき
最も発生している文法エラー
「最も発生している」というのは、私がこれまVBAでプログラムを作成・実行してきて、そして今も発生している内容です。
以下のようなメッセージが表示された場合の対処法です。
1.[OK]をクリック
2.エラー箇所を修正し再実行
この場合は、文法的な原因であることが多いと思います。
スペルミスや記述する内容の過不足です。
「記述する内容の過不足」というのは、1対1で記述しなければならないところを、例えば、
・IF文に対する[End If]が無かったり、多く書いてしまっている
・For文に対する[Next]が無かったり、多く書いてしまっている
・Do文に対する[Loop]が無かったり、多く書いてしまっている
などなどです。
尚 上記手順で再実行できますが、私は念のためリセットすなわち実行前の状態に戻すことをしています。
上記「1.[OK]をクリック」した直後に以下を行い、そして「2.エラー箇所を修正し再実行」します。
[実行(R)]-[リセット(R)]をクリック です。
マウスを使わずAltキーを押した状態でRキーを連打でできます。
エラーが発生していない状態でやっても問題ない操作ですから、練習を兼ねて操作して頂ければと思います。
引数の数が一致していません
正式には「引数の数が一致していません。または不正なプロパティを指定しています。」というエラーメッセージです。
FILECOPY関数で発生したのですが、引数は間違えていないし困りました。
上記1の[1.実行までの手順]-[4.[マクロ名(M):]に'test'と入力(''は不要、''内のtestを入力)]に「"SELECT"などVBAの関数をマクロ名にできない」旨を記述しました。
ところがマクロ名にできる関数もあり、"FILECOPY"はマクロ名にできました。
ですがそのマクロ"FILECOPY"内でFILECOPY命令を使用するとエラーがでます。
この場合は、マクロ名"FILECOPY"を"FILECOPY1"や"RENAMECOPY"など、VBAの関数にないものに変更します。
私自身マクロ名をVBAの関数に指定できてしまったことで進めてしまったのですが、このことでマクロ名に関数を使わなくなると思います。
ループ処理などで動かなくなってしまったとき
ループ処理などで動かなくなってしまったときや処理途中で強制終了したい場合の対応です。
以下のプログラムは誤ってコピー&ペーストし実行しても、5回表示されるメッセージの[OK]ボタンをクリック(もしくは)すれば処理が終了するようになっています。
Sub test() Dim cnt As Long cnt = 1 Do Until cnt > 5 MsgBox "cnt=" & cnt cnt = cnt + 1 Loop End Sub
ですが「cnt = cnt + 1」の行を削除して実行すると、永久ループし処理が終わりません。
上記「cnt = cnt + 1」のように正常に処理するコーデイングを漏らしてしまい実行すると、強制終了しなければなりません。
終了しようとExcelの右上の「X」のクリックを試みますが、クリックできず終了できたことはありませんでした。
その場合は、Excelを強制的に終了します。
1.タスクマネージャ―を起動
Windows画面のタスクバーの空白部分で右クリックし[タスクマネージャー(K)]をクリック
2.[プロセス]タグを開き、[Microsoft Office Excel」に位置付け[タスクの終了]をクリック(もしくは右クリックから[終了]をクリック)
注意点として、プログラムを作成・修正し保存していない状態で強制終了すると、最初から作成した場合には全てが、保存してあったものを修正した場合には修正した部分が失われます。
プログラムを実行する場合には保存してから、既存ファイルを修正し上書きしたくない場合でも別ファイル名で保存することをお勧めします。
そうすることで強制終了後に再度読み込めば強制終了前に戻せます。
この通りやれば動く、とにかく触ってみよう まとめ
とにかく、手を動かしてやってみて欲しいのです。
大したことはありませんから。
再度ポイントをおさらいします。
Excel-VBの起動と実行の流れ
1.Excelを起動後にExcel-VBAを起動
Altを押した状態でF8キーを押してExcel-VBAを起動し
[マクロ名(M):]にマクロ(=プログラム名)を入力して[作成(C)]をクリックする
です。
2.プログラムを記述
Sub マクロ名(=プログラム名) ()
ここにプログラムを書く
End Sub
3.F5キーを押して実行
プログラムの概要 再確認
1.プログラム内で使う変数をDim文で定義
2.参照するシートとセル、変数を使って処理を記述する
です。
>
>
参照するシートとセルの記述方法は、
Worksheets(n).Cells(x,y)
または、
Worksheets("シート名").Cells(x,y)
>
>
Worksheets(n)の'n'は、シートを左から数えた番号です。番号は数字を直接書いても変数でもOKです。
Worksheets("シート名")は、記述されているシート名、この場合は""で囲みます。
Cells(x,y)のxは、縦の行番号、yは横の列番号で、数字を直接書いても変数でもOKです。
イントロダクション(導入部)の続き
かく言う私、正直言ってExcel-VBAは、食わず嫌いでした。
Excelを15年以上使ってきて「せっかくパソコンを使っているのにデータを自由に扱えないかな?」と思い付き、あるサイトを見ながら学習しました。
そして活用してみたら、今は楽しくなりました。
>
>
そんな思いとまでいかなくても、「楽したい!」「こういう形にしたい!」、例えば、
・VLOOKUPを使って、IF関数で等しい・等しくないものに"〇,×"を入れて、そしてフィルタで"#N/A"や"〇,×"データを抽出・省いてとか、毎回面倒!
・条件が1つではなく、複数の条件を指定してデータを抽出したり省きたいんだけど
・対象シート内で加工編集・抽出するのではなく、別のシートにデータを抽出したい
など実現したい方は、一度やって頂ければと思います。
そして、慣れてくれば、現場で「こんなことできないかな?」といったことを実現できます。
自分で作ったプログラムが思い通りに動いた時は、どんな小さなことでも感動するものです。
コメント