VBA⇒Python書き換え

【VBA⇒Python】VBAからPythonへ移行した方がいい理由と実用的な書き換え用例10選

記事内に商品プロモーションを含む場合があります

こんにちは、hokkyokunです。

私はVBAからプログラミングのキャリアをはじめ、Python,HTML,CSSと勉強し、今はjavascriptに挑戦しています。
今はVBAを使う機会はほとんどなくなり、データ処理はもっぱらPythonを使うようになりました。

VBAはとてもいい言語で、私も実際に救われたことがたくさんあります。
でも、万能というわけではありませんので、できることが増えてきたらステップアップも考えてもいいと思います。

Pythonはプロのエンジニアの専売特許ではないですよ。
VBAを使ってお仕事をしている人こそ、覚えてほしいです。
仕事の幅が広がり、世界が変わりますよ。

大前提として、VBAは素晴らしい

誤解があるといけないので、大前提としてはっきり申し上げておきます。

VBAは素晴らしいプログラミング言語であり、私はVBAを使うことで救われたことが何度もあります。

具体的には、残業時間が三桁(休日出勤分の稼働時間も入れて)行くくらいまで業務があふれていた時、VBAで処理することで何とかこなせたこともあります。

ですので、VBAは大好きであり、VBAを覚えることで救われる人がたくさんいることも知っています。

それでもVBAには限界があります。

VBAが苦手なこと・限界点

コードが冗長・複雑化

VBAとPythonだと何となくPythonの方が難しそうと思いませんか?

実はVBAの方が処理が難しいことってたくさんあります。

例えば、二つの配列の共通要素だけを抽出するコードを書いてみます。

Sub GetCommonElementsWithoutDictionary()
    ' 配列Aと配列Bを定義
    Dim arrayA As Variant
    Dim arrayB As Variant
    arrayA = Array("A", "B", "C", "D")
    arrayB = Array("B", "C", "E", "F")
    
    ' 共通部分を格納するための新しい配列
    Dim commonArray() As Variant
    Dim commonCount As Long
    commonCount = 0
    
    Dim i As Long, j As Long
    ' 配列Aと配列Bを比較
    For i = LBound(arrayA) To UBound(arrayA)
        For j = LBound(arrayB) To UBound(arrayB)
            If arrayA(i) = arrayB(j) Then
                ' 共通部分を新しい配列に追加
                commonCount = commonCount + 1
                ReDim Preserve commonArray(1 To commonCount)
                commonArray(commonCount) = arrayA(i)
                Exit For ' 一度見つけたら次のAの要素へ
            End If
        Next j
    Next i
    
    ' 結果を表示
    If commonCount > 0 Then
        Dim result As String
        result = "共通部分: "
        For i = LBound(commonArray) To UBound(commonArray)
            result = result & commonArray(i) & " "
        Next i
        MsgBox result
    Else
        MsgBox "共通部分はありません。"
    End If
End Sub

めちゃくちゃ複雑ですよね。
これをPythonで書いてみます。

def get_common_elements(list_a, list_b):
    # セットを使って共通部分を取得
    common_elements = list(set(list_a) & set(list_b))
    return common_elements

# サンプルリスト
list_a = ["A", "B", "C", "D"]
list_b = ["B", "C", "E", "F"]

# 共通要素を取得
common_list = get_common_elements(list_a, list_b)

# 結果を表示
print("共通部分:", common_list)

関数化していますが、処理は実質一行です。
すごく、簡単ですよね!!

コードも見てわかりやすいので後から修正するのも容易です。

Excel・Outlook以外の操作は不適

VBAは基本的にマイクロソフトの一部製品を取り扱うのに特化した言語なので、基本的にはエクセル、アウトルック、ワードなど以外を動かすには不適です。

無理やり使おうと思えばできますが、かなりシステムをハックしないといけないので、Pythonを扱うよりももっともっと高度な知識が必要となります。

処理が遅い

VBAは基本的にエクセルに記載された情報を加筆・修正しながら処理していくことが多いと思われますが、処理がかなり遅いです。

Pythonの場合はPandasなどのデータ処理に特化したライブラリを使うことができるので、VBAで数分かかる処理も、数秒で終わることもざらにあります。

VBAからPythonへ移行した方が4つのいい理由

VBAで表現できることはだいたいPythonでもできる

例えばエクセルで請求書の作成プログラムを作る場合、VBAではもちろん作ることができますよね。

Pythonでも同じように作成可能です。

なぜなら、Pythonからエクセルを操作するコード集(ライブラリといいます)を先人の天才たちが作ってくれているからです。

openpyxlというライブラリを使うことで、エクセルをスムーズに操作できます。

代表的なコード集に関しては下記で表示してあります

コードが簡潔で読みやすい

VBAが俗人化する理由の一つとしてコードが長く、読みにくい点が挙げられますが、Pythonを使うと簡単に何をやっているかの把握ができます。

以下はVBAとPythonのコードの違いを解説したシリーズ記事です。

株価データから月当たりの価格変動率を計算し、
グラフ化するプログラムをVBAとPythonで書いてみました。

拡張性が高くなる

VBAは優れたプログラミング言語ですが、そのパフォーマンスを十分に発揮できるのはエクセルやアウトルックなどoffice製品に限られてきます。

もちろん、chromeを動かすことも可能ではありますが、コーディング技術が高度になり、おすすめはしません。

一方でPythonであれば数行でchromeを自動で動かし、ウェブページをクリックしたり、文字入力したりが可能です。

インターネットから情報を取得する作業をスクレイピングと呼んだりしますが、
スクレイピングの記事も掲載しています。

こちらから記事を確認できます。

他にもRPAやPDFの文字読み取り、機械学習によるデータ予測など、事務処理を数段階高度なものに変貌させることができます。

キャリアアップにつながる

正直に申し上げますと、VBAを習得したての当時の私はこれでキャリアアップを目指そうと思いました。

不都合な真実を申し上げますと、VBAでのキャリアップはいばらの道です。まず不可能と思った方がいいです(これは社内での出世という意味でも同様です)。

求人サイトをみればわかりますが、ほぼ非正規雇用しかありません。時給も通常の事務に毛が生えた程度です。とても習得にかかった労力に見合った給与とは思えません。

VBAユーザーにとってはつらいですが、世間はそこまでVBAを求めてはいません。すごく便利なんですけどね。

Pythonを習得すればプロのエンジニアへの道が開けます。昨今はAIブームもあり、Pythonの需要はこれからますます高くなるでしょう。AIで事務職は駆逐されるかもしれませんが、そのAIを作る側に回れば、逆に大きな恩恵を受けることができます。

では、「お前はどうなんだ」というと、私の場合はキャリアを夢見ましたが、年齢の点で諦めました。俗にいうエンジニア35歳定年説です。

もし20代から30代前半でVBAをある程度習得出来た方は、プログラミングの素質が大ありですので、将来のキャリアアップを狙うなら、是非Pythonを勉強してみてください。

キャリアアップがかなわなかったものからの老婆心です。

VBAからPythonへのコード変換10選

本題ですが、VBAでよく使うコードをPythonで置き換えた場合どうなるのか、実例を示していきたいと思います。

Excelファイルを開く

VBAコード

Dim wb As Workbook
Dim filepath As String
filepath = "ファイル名"
Set wb = Workbooks.Open(filepath)

Pythonコード

import openpyxl
filepath = "ファイル名"
wb = openpyxl.load_workbook(filepath)

新しいExcelファイルを作成し、保存する

VBAコード

Dim wb As Workbook
Set wb = Workbooks.Add
Dim filepath As String
filepath = "ファイルパス"
wb.SaveAs filepath

Pythonコード

import openpyxl
wb = openpyxl.Workbook()
filepath = "ファイルパス"
wb.save(filepath)

Excelのセルに値を書き込む

VBAコード

Sheets("Sheet1").Cells(1, 1).Value = "Hello World"

Pythonコード

wb["Sheet1"].cell(row=1, column=1).value = "Hello World"

Excelファイルから値を取得

VBAコード

Dim val As String
val = Sheets("Sheet1").Cells(1, 1).Value

Pythonコード

val = wb["Sheet1"].cell(row=1, column=1).value

メッセージボックスを表示する

VBAコード

MsgBox "Hello World"

Pythonコード

import tkinter as tk
from tkinter import messagebox

root = tk.Tk()
root.withdraw() # ルートウィンドウを表示しない
messagebox.showinfo("Message", "Hello World")

Excelシートを新規作成する

VBAコード

Sheets.Add After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "NewSheet"

Pythonコード

wb.create_sheet(title="NewSheet")

Excelシートを削除する

VBAコード

Dim sheetName As String
sheetName = "SheetToDelete"
Sheets(sheetName).Delete

Pythonコード

sheetName = "SheetToDelete"
wb.remove(wb[sheetName])

ファイルをコピーする

VBAコード

FileCopy "C:\path\to\source\file.xlsx", "C:\path\to\destination\file.xlsx"

Pythonコード

import shutil
shutil.copy("C:/path/to/source/file.xlsx", "C:/path/to/destination/file.xlsx")

フォルダ内のファイルリストを取得する

VBAコード

Dim file As String
file = Dir("C:\path\to\folder\*.*")
While file <> ""
    Debug.Print file
    file = Dir()

Pythonコード

import os
for file in os.listdir("C:/path/to/folder"):
    print(file)

フォルダの作成

VBAコード

Dim folderPath As String
folderPath = "C:\path\to\newFolder"

MkDir folderPath

Pythonコード

import os
folder_path = "C:/path/to/newFolder"
os.makedirs(folder_path)

VBA⇒Pythonにはコツがいる

VBAとPythonは似ている?

さて、正直どう思いましたか?

思ったよりもVBAとPythonは似ていると思いませんか?

上記でも書きましたが、これはVBAにコードを寄せていったopenpyxlというライブラリを使っているからです(ファイル操作などは除く)。

ちなみに私はopenpyxlはほとんど使いません。
データ処理はPandasというライブラリを使います。
その方がはるかに簡単に複雑な処理が可能だからです。

VBAをそのままPythonコードに変換しない方がいい理由

今回はVBAユーザーがPythonに親しみを持ってもらえるように変換コード集を作りましたが、VBAで作ったコードをそのままPythonコードで表現することできるけどやめた方がいいです。

理由は得意な表現が異なるからです。

もし私がVBAで作った請求書プログラムをPythonで自動化させるとしたら

pandasを使ってデータを処理し、値を取得して、最後にopenpyxlで特定の位置に代入する方法をとります。

今度、別記事でPythonとVBAで請求書作成のコード比較をやってみます。

何がいいたいかというと、

VBAで表現できることはPythonでも同じようなコードで表現ができるが、Pythonに合った表現方法に合わせる必要もある。ただし、Pythonはできることの範囲がとんでもなく大きいのでメリットがデメリットをはるかに上回る。

ということです。

失敗例から学ぶPythonを効率的に学習する方法

私の失敗例

私は学習の第一歩として書籍を買いました。
私が買った書籍は以下のものです。

ちょっと引くぐらい買ってますね(笑)

でも、これは一部で、まだまだここにはない本もたくさん買っています。
自己投資と称して散財していますね。

なぜこんなにたくさん買ったかというとPythonは覚えても覚えてもやることが無限に湧き出るからです。

しかし、英語の公式ドキュメントを見ながら学習するのはハードルが高く、結局書店で新しいPythonの本を見つけては「このコードは知らないやつ!」と思って買っちゃうんですよね。

あと、本は、内容が多そうに見えて、実はそうでもないです。

2~3時間で終わってしまうくらいの内容しか載せていない場合もあります。それがいい悪いではなく、紙媒体で表現するには限界があるということだと思います。

失敗から学んだお勧めの学習方法

私の学習の反省点を踏まえ、以下のような方法をお勧めします。

まず、書籍を一つ買ってください。内容が簡単かつ環境構築が載っているものが良いですね。

インスタントに環境構築しているものはダメです。例えばGoogle Colaboratoryでコードを動かそうとしている書籍はNGです。

きちんとPythonをインストールさせ、エディターの設定まで書いているものが望ましいです。

こちらがおすすめですね。
Pythonのインストール方法が載ってあります。

それでまずは自分が楽しいと思えるかどうかを大事にしてください。

基礎学習はそれでおしまいにし、次はメンターを見つけて学習を進めてください。

つまり、現役のプロエンジニアに教わることをお勧めします。

上記で書いたようにPythonはできることが無限にあり、わからないことも無限に湧いて出てきます。

書籍を買っていると逆に割高になることもありますので、高額ではないオンラインスクールでメンターに直接指導をもらった方がコストパフォーマンスは高くなります。

安価かつ、月額性のおすすめのオンラインスクールは以下のものです。

侍エンジニア

VBAを扱っている人はおなじみではないでしょうか。
VBAコード検索でよく見かけますよね。

Freeks

もっと本格的にかつ、キャリアアップを真剣に考えるならこちらがお勧めです。

私も副業でココナラやブログをやっていますが、実務経験がないというのはかなり大変です。なんせ足がかりがないんですから。

月額10,780円のサブスク料金です。

Freeksは副業案件を紹介してもらえます。未経験でも仕事を受けることができるので、キャリアアップは独学よりもしやすいです。

また、FreeksはPython以外の言語も同じ料金で学び放題です。
Pythonをやっているとわかるのですが、HTMLやCSSの知識も必要になりますし、javascriptも理解しておくと、できる幅がさらに広がります。

ちなみには私はHTMLやjavascriptの本も買いました(笑)
はっきり言ってオンラインスクールに行くよりも使っています。

PyQ

Pythonに特化したオンラインスクールです。

機械学習や統計分析、Webアプリなどの実務的な使い方の学習カルキュラムも充実しています。

こちらもサブスク費用でして、月額3,040円のライトプラント月額8,130円のスタンダードプランがあります。

おすすめはスタンダードプランです。なぜなら、現役エンジニアへの質問が可能だからです。

学習する速度の差は質問できる環境があるかどうかにかかってきます。

とはいえ、(比較的安価なスクールといえど)安い買い物ではないので、ご自身の立場や今後のキャリアを考えてご決断ください。

VBAの知識は資産です

私個人の感想ですが、VBAを学んできたことは資産であると思います。

当初はこれで転職をするとか、会社で社内SE的立場で会社の業務効率化を加速させてやろうと思っていました。

この二点は見事に外れました。私が思っているほどVBAの価値を世間は認めていないようです。この点はVBAユーザーは直視しないといけません。

それでもVBAをやってきてよかったと思います。なぜならVBAはプログラミング言語だからです。言語が違っても根本的な思考や文法に共通点はたくさんあります。

少なくともPythonはVBAのプログラミング的思考が応用できるので、実現したいことに対するアプローチの理解は無学者よりも格段に速かったと思います。

英語を勉強した後に、ドイツ語を勉強するような感覚です。

私は年齢的にプロのエンジニアという立場で働くことはあきらめましたが、ブログという主戦場でプログラミングの知識を生かしたいと思います。

誰も雇ってくれないなら自分が事業主になるという、のび太君的発想です。

一緒にプログラミング頑張っていきましょう。

ではでは。