Help us understand the problem. What is going on with this article?

悲運のVBA入門

More than 5 years have passed since last update.

前書き

人生には不運がつきもので、そのなかでもExcelをVBAでいじらなきゃいけないというのはなるべく遭遇したくない類いの不運ですよね?
前にそんな境遇になったときにVBAについて調べたやつを転記しておきます。クッソ初歩的な内容です。qiitaでは全角で赤四角表示になるようですが直すのも面倒なので各自読み進めて頂きたく。

Visual Basic for Application

1. 全般


命名

  • VBAはケースセンシティブである。変数Varと変数varは別々の変数として定義される。
  • 変数名・関数名は文字で始まらなければいけない。
  • 変数名・関数名にスペースは使えない。
  • 変数名・関数名に記号は使えない。ただし、アンダースコア(_)は例外。


型(変数・定数)

数値    Integer 整数
数値    Long    小数
数値    Double  倍精度少数
文字    String  文字列。""で囲まれた
真偽    Boolean TrueもしくはFalseを取る。

その他、Class を用いた型の定義が可能。


変数の宣言

構文

Dim name As type

例1

Dim i As Integer


定数の宣言

構文

Const name As type

例1

Const ci As Integer


算術演算子

+   加算 
-   減算 
*   乗算 
/   除算
^   べき乗算 

比較演算子

=   左項と右項の値が等しい
>   左項の値が右項の値より大きい
<   左項の値が右項の値より小さい
>=  左項の値が右項の値以上
<=  左項の値が右項の値以下
<>  左項と右項の値が等しくない

論理演算子

And 左項と右項の両方が真、ならば真
Or  左項と右項のどちらかが真、ならば真
Not 論理値反転


2. 関数

Sub Procedure

構文

Sub name
 Code
End Sub

Sub PM_MyFirstSub 
 MsgBox ("Hello World") 
End Sub 

3. フローコントロール

3-1.条件分岐

If...Then...Else文

構文

If condition Then 
 Code 
Else 
 Code 
End If

Sub PM_TestingIfThenElse 
 Dim Number As Integer 
 Number = Inputbox (“Give a number:”) 
 If Number > 500 Then 
  MsgBox (“The number you gave is greater than 500.“) 
 Else 
  MsgBox (“The number you gave is less than 500.”) 
 End If
End Sub 

Select...Case文

構文

Select Case value
 Case condition
   Code
 Case condition
   Code
 Case condition
   Code
 Case Else
   Code
End Select

例1

Select Case value
  Case 1
   myColor = 3 '赤
 Case 2
   myColor = 6 '黄
 Case 3,4
   myColor = 8 '水色
 Case Else
   myColor = 10 '緑
End Select

例2

Select Case value
 Case Is < 10
   myColor = 3 '赤
 Case Is < 20
   myColor = 6 '黄
 Case Is < 30
   myColor = 8 '水色
 Case Else
   myColor = 10 '緑
End Select

例3

Select Case value
 Case 1 To 9
   myColor = 3 '赤
 Case 10 To 19
   myColor = 6 '黄
 Case 20 To 29
   myColor = 8 '水色
 Case Else
   myColor = 10 '緑
End Select

3-2.繰り返し

For...Next文

構文

For counter = beginValue To endValue [step Value] 
 Code
Next counter

Sub PM_TestingForNextLoop 
 Dim Counter As Integer 
 For Counter = 10 To 0 Step -2 
  MsgBox (Counter) 
 Next Counter 
End Sub 

Do While...Loop文

構文1

Do While condition 
 Code 
Loop

構文2

Do 
 Code 
Loop While condition 

例2

Sub PM_TestDoWhileLoop1 
 Dim Number As Long
 Do While Number<500 
  Number = InputBox("Give a number:") 
 Loop 
End Sub

3-3.例外処理

On Error GoTo

構文

Code
On Error GoTo label
Code
label:
Code

Sub test()
  Dim x
  On Error GoTo ErrorHandler
    x = Range("A1").Value / Range("B1").Value
    Range("c1").Value = x
    MsgBox "計算が終わりました"
  Exit Sub
  ErrorHandler:
    MsgBox "エラーが発生しましたので終了します"
End Sub

Errオブジェクト

Err.Number  エラーを指定する数値を設定
Err.Source  最初にエラーを発生させたオブジェクトまたはアプリケーションの名前を示す文字列式を設定
Err.Description エラーを説明する文字列を取得または設定
Err.HelpFile    ヘルプ ファイルへの絶対パスを含む文字列式を設定
Err.HelpContext ヘルプ ファイルのトピックを表すコンテキストIDを含む整数を設定
Err.LastDLLError    DLLの呼び出しにより作成されたシステムエラーコード

エラーコードとメッセージ

エラーコード    エラーメッセージ
3   Return に対応する GoSub がありません。
5   プロシージャの呼び出し、または引数が不正です。
6   オーバーフローしました。
7   メモリが不足しています。
9   インデックスが有効範囲にありません。
10  宣言が重複しています。 (バージョン 5.0 および 7.0)
10  この配列は固定されているか、または一時的にロックされています。 (バージョン 97)
11  0 で除算しました。
13  型が一致しません。

satour
そのへんの文系サラリーマン
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away