LoginSignup
7
4

More than 1 year has passed since last update.

VBAは言語なのか?VBAでアルゴリズムを書いてみた

Last updated at Posted at 2022-12-14

デフエンジニアの会アドベントカレンダー15日目の記事です。

デフエンジニアの会はデフ(=ろう・難聴)のエンジニア、また、聴者(=耳が聴こえる人)エンジニアで構成されているグループです。
WEB分野はエンジニアだけでなくデザイナーも兼任している人もいることからデザイナーも一部います。

そして私は今はVBAで仕事をしています。
その中でVBAを通して色々と思うことがあるので今日はこれについて書いていこうと思います。

VBAは言語なのか?

これはよく言われるのですが、「VBAはプログラミングとは言えない」「そもそも言語なのか」という・・・いわゆるプログラミング界でもVBAへの「見下し」みたいなことがあるようです。
そして実は私も、かつては「VBAなんて・・」という気持ちがありました。
C言語やPHPやPythonの方がかっこいい、VBAはダサい・・なんて思っていた時期もありました。

ですが、今はそうは思っていません。
その理由を書いていきます。

VBAが見下されがちな理由

そもそもなぜ見下されがちなのか書いていきます。
まず、VBAは「Excelのめんどくさい作業をちょっと補うためだけにコードを書いている」と思われてしまいがち、またExcelでしか使えないためそこから「VBAはちょっと勉強すれば簡単に身に着く」「だからVBAはプログラミングとは言えない」という考え方に繋がるのではと思いました。(しつこいですが私も前はそう思っていました・・)

しかし、本当にそうでしょうか?

VBAは意外と複雑である

そもそもVBAはExcelに特化した言語で、主にExcelを使った作業を自動化させるために使うものです。
そしてそこから実に様々なことができるのです。

例えば

  • ExcelからPDF・Outlook・Word文書を出力可能
  • ExcelからAccessに繋げてデータ出力、更にSQLを使ってデータ調整もVBA内で可能
  • 複数ファイルを添付したOutlookメールを作成し送信も可能
  • VBAでDiff比較ツールみたいなものも作れる

など、Microsoft系アプリケーションとも連携してあらゆることができます。
また他にも

などなど、実に色々なことができるようになっています。

また、コーディングも多岐にわたり本当にいろいろな知識も必要になってきます。
もちろん配列にしても多次元配列、二次元配列、などがありそれもVBAで書くことができます。

ここまでくれば、もう「VBAは言語ではない」「VBAはプログラミングではない」とは言えないのではと思います。

VBAのメリット

そしてVBAのメリットは、何よりも「作業の効率化ができる」ということです。
また「データ分析」も勉強しておけば、VBAとデータ分析を連携させてあらゆるデータ分析も可能になってきますし、業務の幅も広がっていきます。

これを知ってから、私はもう他の言語をうらやましいと思うことなくVBAを究めてみようと思うようになりました!

折りしも今はRPAや業務自動化系の仕事も増えてきているので、これを機にVBAに挑戦するのも良いかと思います!
おすすめです。

それでもVBAは言語ではないというのなら

基本的に、どんなプログラミング言語にも「アルゴリズム」は存在します。
言い換えれば、アルゴリズムが組み立てられないと「言語とは言えない」のではと思っています(私の勝手なこじつけです・・)

そこで、VBAでアルゴリズムが書けるかどうかに挑戦してみることにしました!
(強引な書き方ですみません)

VBAでアルゴリズムを書いてみた

では前置きが長くなってしまいましたが、最後にVBAでアルゴリズムを書くことに挑戦してみます!

以前、デフエンジニアの会では「輪読会」という企画で「Pythonではじめるアルゴリズム入門」という本を使ってアルゴリズムの勉強をしたことがあります。

その本をもとにVBAでアルゴリズムを書いてみる、というのをやってみます。
ここではアルゴリズムの中でも有名な「探索アルゴリズム」を取りあげていきます。

VBAで探索アルゴリズムを書いてみよう

探索アルゴリズム
データの中から条件に合った要素を取り出してくる操作のこと。
そしてこの探索アルゴリズムには2種類あり、1つが「線形探索」でもう一つが「2分探索」です。

1. 線形探索

例えば以下画像内で数字が色々と入っているとします。
image.png

その中で「5」がどこにあるか探したい、とします。

すると通常は上から順番にセル内の値を参照し、5であるかどうかを1つずつ探していきます。
これと同じ考えで作られたアルゴリズムが探索アルゴリズムの種類の1つ、「線形探索」です。
1つずつ順番に探していくということで単純なアルゴリズムとして知られています。

ではこれをコードで実現してみましょう。

Option Explicit

Sub test1()

Dim ws As Worksheet
Dim iLast As Integer
Dim icnt As Integer
Dim strValue As String

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    strValue = 5
    
    '最終行チェック
    iLast = ws.Cells(Rows.Count, 1).End(xlUp).Row

    'Forループで上から1行ずつセル内の値を参照しながら「5」があるかチェック
    '「5」があればセルの場所をメッセージに出して終了
    For icnt = 1 To iLast
        If ws.Cells(icnt, 1).Value = strValue Then
            Debug.Print "("; ws.Cells(icnt, 1).Address(False, False); ")にありました"
            Exit Sub
        End If
    Next
    
    Debug.Print "見つかりませんでした。"
    
End Sub

解説

このコードはこの順序で処理を指示しています。

①シート取得
②探索したい値をセット
③最終行取得
④Forループで上1行目から順番に1つずつ値を参照
⑤もし見つかれば、値が存在した場所をメッセージ出力
もし見つからなければ、「見つかりませんでした」というメッセージ出力
⑥処理終了

という流れです。

この書き方だと線形探索が可能です。
では次に二分探索ではどう書くのかを書いてみます。

2. 二分探索

先ほどの線形探索では、上から1つずつ値を探して・・ということでしたが、二分探索はざっくりと2つに割って、まず1つ目で対象値を探します。
そしてそこになければ2つ目で対象値を探していくというものです。

二分探索のメリット

まず「データ量が多い時」に探す手間が省けるというものですが、
特に2つに分けて最初の1つ目ですぐデータが見つかればその分処理も早くなる、という大きなメリットがあります。

従ってこのやり方も覚えておいて損はないアルゴリズムだとも言えます。

では実際にコードを書いてみます。

Sub test2()

Dim ws As Worksheet

Dim icnt As Integer
Dim strValue As String
Dim istart As Integer
Dim imiddle As Integer
Dim iLast As Integer

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    strValue = 5
    
    '最終行チェック
    iLast = ws.Cells(Rows.Count, 1).End(xlUp).Row
    
    istart = 1
    Do
        If imiddle = istart + ((iLast - istart) \ 2) Then
            Debug.Print "みつかりませんでした。"
            Exit Do
        End If
        
        imiddle = istart + ((iLast - istart) \ 2)
        If ws.Cells(imiddle, 1).Value > strValue Then
            iLast = imiddle
        ElseIf ws.Cells(imiddle, 1).Value < strValue Then
            istart = imiddle
        Else
            Debug.Print "("; ws.Cells(imiddle, 1).Address(False, False); ")にありました"
            Exit Do
        End If
    Loop
End Sub

解説

①シート取得
②探索したい値をセット
③最終行取得
④まず真ん中で割って真ん中のセル行数を取得
⑤最初の行数から真ん中の行数までの値をチェックし、見つかればセルの場所をメッセージ出力し処理終了
もし見つからなければ、真ん中の行数から最後の行数までの値をチェック
⑥見つかれば、セルの場所をメッセージ出力
⑥処理終了

という流れです。

この書き方だと二分探索が可能です。

まとめ

VBAでもアルゴリズムが書けることが分かったので、VBAは言語である、と言えます(強引ですが・・)
ともかく、VBAを仕事としている身としては、VBAは甘く見てはいけないと思っていますし、実際私自身まだまだ勉強が必要だと思っています。

それでは長くなりましたが、これで終わります。

あとデフエンジニアの会応援してもらえると嬉しいです!!

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4