mogmo .NET

C#/XAML/VB6たまにC++についてメモ程度に書いていく。あくまで自分用。責任は取れません。

VBA|基本①データ型,繰り返し,配列など 

こんにちは。もぐもです。
VBAを基礎から見直す機会があったので投稿します。

そもそもVBAってなに

  • Visual Basic for Applicationsの略
  • MicroSoftのOffice製品の一部(ExcelやWordなど)で利用可能なプログラミング言語
  • プログラムすることで複雑な処理を自動化できますよって機能

環境を整える

エクエルのオプションから開発タブを表示する設定に変更する。
Visual BasicあいこんからVisual Basic Editorを表示する。
挿入>標準モジュールに処理を書いていく

基本の文法

プロシージャ

関数のこと。
Sub~End Subで囲んだ内容が一つの処理として認識される。
プロシージャ名は日本語も使えるが,必ず文字始まりでなければいけない。

Sub プロシージャ名()
End Sub
プロシージャ内部の書き方
Sub Test()
    '一行ずつ処理を書く
    Range("A1").Value = 100
    Range("A2").Value = 200
    
    '一行に複数の処理を書く場合は :(コロン) をつかう
    Range("A1").Value = 100: Range("A2").Value = 200
    
    '複数行に分けるときは _(アンダーバー)をつかう
    Range("A1").Value = 100
    Range("A2").Value _
        = 200
End Sub

変数

Sub Test2()
    '変数の宣言 Dimを先頭に書くことで変数を宣言できる
    Dim name
    Dim age
    Dim level
    
    '格納するデータ型がバラバラでも,カンマで1行にまとめて宣言することもできる
    'Dim name, age, level
    
    '変数の格納: =(イコール)を用いて値を格納する
    name = "もぐも" '文字列は "(ダブルクォーテーション) で囲む
    age = 28
    level = 1
    
    '変数の値をセルに表示する
    Range("A1").Value = name
    Range("A2").Value = age
    Range("A3").Value = level
End Sub
データ型

公式文書:
データ型の概要 | Microsoft Docs

データ型の種類は以下の表のとおり。

データ型 バイト数 値の範囲
Boolean 2バイト True/False
Byte 1バイト 0 ~ 255
Collection 不明 不明
Currency(通貨型) 8バイト -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
Date 8バイト 100 年 1 月 1 日 から 9999 年 12 月 31 日
Decimal 14バイト 公式サイト参照
Dictionary 不明 不明
Double 8バイト ±double max ~ ±double min
Integer 2バイト -32,768 ~ 32,767
Long 4バイト -2,147,483,648 ~ 2,147,483,647
LongLong 8バイト -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
Object 4バイト 任意
Single 4バイト ±3.402823E+38 から ±-1.401298E-45
String(可変長) 10バイト+文字列の長さ 0~約 20 億
String(固定長) 指定した文字列の長さ 1 ~ 約 65,400
Variant(数値型) 16バイト 最大でDoubleの範囲までの任意の数値
Variant(文字列型) 22 バイト + 文字列長 (64 ビット システムでは 24 バイト) String(可変長)と同じ範囲

※ LongLong: 64ビットプラットフォームでのみ有効
※LongPtr,Typeは割愛した

数値型の場合,整数型はByte,Integer,Longがある。(64ビットではLongLongも利用可能)
浮動小数点の場合はSingle,Doubleがある。しかしこの2つのデータ型には有効桁数が決まっており計算を行えば桁落ちが発生したり,表現できない値が出てくる。正確な計算を強いられる場面ではCurrencyを用いると良い。

データ型を指定して変数を宣言

As を用いて変数のデータ型を指定できる。

Sub Test3()
    '変数の型を指定して宣言: As を用いる
    Dim name As String
    Dim age As Byte
    Dim level As Integer
        
    'カンマで1行にまとめて宣言する場合
    'Dim name As String, age As Byte, level As Integer
End Sub
日付型

#で囲むか文字列として指定する

Dim x As Date

x = "2020年10月12日"
x = #20201012日#
x = #2020/10/12#
x = #12/10/2020#
x = #12:26:39 AM#

演算子

算術演算子
Sub Test()
    Dim x As Integer
    Dim y As Single
    
    x = 5 + 2 '足し算 = 7
    x = 5 - 2 '引き算 = 3
    x = 5 * 2 '掛け算 = 10
    y = 5 / 2 '割り算 = 2.5
    x = 5 \ 2 '割り算の商 = 2
    x = 5 Mod 2 '割り算の余り = 1
    x = 5 ^ 2 'べき乗 = 25
End Sub
比較演算子

結果はBoolean型で返ってくる。
C++C#と違うのは等しい,等しくないの演算子の書き方。

Sub Test()
    Dim result As Boolean
    result = 8 < 5  'より小さい False
    result = 3 <= 5 '以下 True
    result = 8 > 5  'より大きい True
    result = 3 >= 8 '以上 False
    result = 3 = 8  '等しい False
    result = 3 <> 8 '等しくない True
    
    Range("A1").Value = 10 > 20 'セルA1にFALSEが表示される
End Sub
論理演算子
Sub Test()
    Dim result As Boolean
    '論理積 And
    result = (3 < 5) And (2 < 5) '=True
    '論理和 Or
    result = (3 > 5) Or (2 > 5) '=Flase
    '論理否定 Not
    result = Not (3 < 5) '=False
End Sub

文字の結合

& と +が使えるが,&のほうがケアレスミスが減るかも。

Sub Test()
    Dim hello As String
    Dim name As String
    Dim a As Integer
    Dim b As Integer
    
    hello = "こんにちは"
    name = "もぐも"
    a = 10
    b = 12
    
    Range("A1").Value = hello & name '=こんにちはもぐも
    Range("A2").Value = hello & a '=こんにちは10
    Range("A3").Value = a & hello '=10こんにちは
    Range("A4").Value = a & b '=1012
    
    Range("A5").Value = hello + name 'こんにちはもぐも
    'Range("A6").Value = hello + a 'Error: 型が一致しません
    'Range("A7").Value = a + hello 'Error: 型が一致しません
    Range("A8").Value = a + b '=22
End Sub

オブジェクト

  • データ型の1つ
  • ブックやシート,セルなどVBAで何か操作をしようとする対象となるもの
  • 値の格納にはSetを先頭に書かなければならない
Sub Test()
    'オブジェクト: VBAで何か操作しようとする対象となるもの
    
    'オブジェクトの宣言
    Dim app As Application 'アプリケーション
    Dim book As Workbook 'ブック
    Dim sheet As Worksheet 'シート
    Dim cell As Range 'セル
    Dim books As Workbooks '開いている全てのブック
    Dim sheets As Worksheets 'ブックに含まれる全てのワークシート
    
    '値を格納する: Setを使って格納すること
    Set cell = Range("A1")
    cell.Value = "cellにA1のセルを格納しました"

    'オブジェクトのプロパティやメソッドは.(ドット)を用いて利用することが可能
    cell.Value = "プロパティを変更" 'プロパティ値を変更
    
    Dim test As String 'プロパティ値を取得
    test = cell.Value
    
    cell.Delete 'メソッドを利用
End Sub

条件分岐

If と Select(C++C#ではswitchに相当する) が使える。

Sub test()
    Dim cell As Range
    Set cell = Range("A1")
    
    '条件分岐①: If 条件式 Then ~ ElseIf 条件式 Then ~ Else ~ End If
    If (cell.Value = "") Then '空白なら
        cell.Value = "あ"
    ElseIf (cell.Value = "あ") Then
        cell.Value = "い"
    Else
        cell.Value = "う"
    End If
    
    '条件分岐②-1: Select
    Select Case cell.Value
        Case ""
            cell.Value = "あ"
        Case "あ"
            cell.Value = "い"
        Case Else
            cell.Value = "う"
    End Select
    
    '条件分岐②-2: 比較演算子の省略
    Dim x As Integer
    x = 10
    
    Select Case x
        Case Is > 20
            cell.Value = "20より大きい"
        Case Is > 5
            cell.Value = "5より大きい"
        Case Else
            cell.Value = "5以下の値です"
    End Select
End Sub

繰り返し

Sub test()
    Dim sum As Integer
    
    '繰り返し①: Do While ... Loop
    Dim sum As Integer
    Dim x As Integer
    sum = 0
    x = 1

    Do While x <= 10 '条件式 xが10以下 がTrueなら繰り返す
        sum = sum + x
        x = x + 1
    Loop
    
    '繰り返し②: Do Until ... Loop
    sum = 0
    x = 1
    Do Until x > 10 '条件式 xが10より大きい がFalseの場合は繰り返す
        sum = sum + x
        x = x + 1
    Loop
    
    '繰り返し③: Do ... Loop While
    '処理を行った後に条件式の判定を行う。つまり必ず1度は繰り返し処理を行う。
    sum = 0
    x = 1
    Do
        sum = sum + x
        x = x + 1
    Loop While x <= 10 '条件式 xが10以下 がTrueなら繰り返す
        
    '繰り返し④: For a To b ~ Next
    sum = 0
    For x = 1 To 10
        sum = sum + x
    Next i
    
    Range("A1").Value = sum
End Sub

配列

配列の宣言は

Dim 変数名(要素数-1) As データ型

と行う。
変数名(3 To 6)と宣言する方法もあるが,保守しやすいとは思わないので割愛する。

サンプル

Sub Test()
    '配列の宣言: 配列数10個
    Dim collection(9) As Integer
    
    collection(0) = 1
    collection(1) = 2
    collection(2) = 3
    collection(3) = 4
    collection(4) = 5
    collection(5) = 6
    collection(6) = 7
    collection(7) = 8
    collection(8) = 9
    collection(9) = 10
    'collection(10) = 11 '要素数を超えたらエラーとなる
    
    Dim i As Integer
    For i = 0 To 9
        Range("A1").Value = collection(i)
    Next i
End Sub

参考

Excel VBA入門 ~基本的な使い方から高度な利用方法までサンプルを使って解説します~
こちらのサイトをもとに学習しています。

ではまた(`・ω・´)
もぐも