Python

【VBAとPythonどっちがいい?①】2次元データ処理プログラミングの違いを解説

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

こんにちは、hokkyokunです。

VBAはそこそこできるようになったけど
Pythonってどうなんだろ?
便利なのかしら?

VBA学習者向けに
「Pythonいいって聞いたけど実際どうなの?」
という疑問に具体的な目的を処理するコードで比べてみます

結論言うとPythonは強力な業務効率化ツールです
また、充実したライブラリがあるため
エクセル以外にもWeb操作やメール(Outlook以外も)、自作RPAなど
初心者でも簡単にできます。

私がそうだったのですが、VBA使いにとって
VBAでのコードがPythonでどうなるか気になると思います。

アイコン名を入力

同じ処理をVBAとPythonで
コーディングしていきます。

この記事では表形式のデータ処理をプログラミングしていきます。

すなわち
エクセルVBAでのテーブルに相当するもの
PythonではPandasライブラリを用いたデータフレームに相当するもの

これらを操作していきます。

VBAからPythonにチャレンジしたいという方はぜひ参考にしてみてください。

目的 S&P500連動ETFのデータ分析を行うプログラム

先ず目的について
ざっくりご説明します。

上記は米国のインデックス(S&P500)連動ETFのVOOの株価です。

VOOの株価データを題材に、
以下のような処理をVBAとPythonで書いてみます。

  1. 2次元データを扱うオブジェクトを取得
  2. 2022年3月~2023年2月までの絞り込み
  3. 月末月初の値を取得
  4. 各月の月利(月当たりの価格変動)を計算して表で取得する
  5. 取得したデータで簡単なグラフを作成する

プログラムが非常に長く、複雑になるので
何回かに区切ってプログラムしたいと思います。

今回は以下を処理します。

  1. 2次元データを扱うオブジェクトを取得
    VBA→テーブル
    Python→データフレーム
  2. 2022年3月~2023年2月までの絞り込み

うまく絞り込めていることを確認するためそれぞれ最終行の日付を出力します。

VBAでのコード

Sub VBA()
    Dim ws As Worksheet
    Dim table As ListObject
    Dim maxRow As Long
    
    'シートの取得
    Set ws = Workbooks("VOO.csv").Worksheets(1)
    
    '表をテーブル化して取得
    '既にテーブル化している場合は、再度テーブル化するとエラーが出るので回避
    Set table = ws.Cells(1, 1).ListObject
    If table Is Nothing Then
        Set table = ws.ListObjects.Add(xlSrcRange, ws.Cells(1, 1).CurrentRegion, , xlYes)
    End If
    
    '絞り込み
    table.Range.AutoFilter field:=1, Criteria1:=">=2022/3/8", Operator:=xlAnd, Criteria2:="<=2023/2/28"
    
    '最終行を取得し、値取得
    maxRow = table.ListColumns("Date").DataBodyRange.SpecialCells(xlCellTypeVisible).Count
    Debug.Print (table.ListColumns("Date").DataBodyRange(246))
    '>>2023/02/28
End Sub
テーブル化して絞り込みできました。

実質6行で絞り込みをしています。
(コード行を減らすことだけが目的であればもう少し減らすことができます)

Pythonでのコード

import pandas as pd
import datetime as dt

#ファイルを開いてデータフレームを取得
df=pd.read_csv("./VOO.csv")

#日付のデータ型を日付型に変える
df["Date"]=pd.to_datetime(df["Date"],format="%Y-%m-%d")

#日付をインデックスにして検索や絞り込みをしやすくする
df=df.set_index("Date",drop=True)

#日付で絞る
df=df.loc[dt.datetime(2022,3,8):dt.datetime(2023,2,28)]

#絞り込めたか確認
print(df.index[-1])
df.tail()

こちらは実質4行です。

コーディングの違いは?

それぞれの違い(と共通点)に関する個人的な感想です。

  • VBAはデータ型に寛容
    • 文字列で日付を指定しても柔軟に対応してくれる
    • 一方Pythonはきちんとデータ型を変換しないとエラーが起きる
  • Pythonの方が可読性(コードを後から見て読み解く)が高い
    • Pythonはすっきりしていて読みやすい
    • VBAは一つ一つのフレーズが冗長
  • PythonもVBAも直感的なコーディングができる

まだ、処理の初歩なのでそこまでの違いはありませんが、
ここからPythonの方がコーディングは楽になっていきます

一方VBAはエクセルの操作に慣れている人には
直感的な操作ができて楽です。

次回

次回は月毎に月末月初の値を取得して
利益率を計算していきます。