2017年10月13日金曜日
2017年10月11日水曜日
2017年10月8日日曜日
VBA 自動化
1. VBAとは何か
VBAは、Microsoftが提供する「イベント駆動型のVisual Basic 6系言語」を、アプリケーション側に内蔵して実行できるようにした仕組みです。ExcelやWordなどのアプリケーションに対して、「手作業を自動化するマクロ」や「独自の処理・ダイアログ」を追加できます。Microsoft Learn
VBAはもともとのVisual Basic 6(VB6)をベースにしていますが、VBAはアプリケーションに組み込まれた形で今も更新され、Officeの新機能への対応などは継続しています。コードはイベント(ブックを開いた、セルが変わった、メールを受信した等)に反応して動きます。Wikipedia+1
VBAは「アプリに貼りつく拡張言語」という位置づけなので、単体のコンパイラやランタイムをユーザーが別途インストールする、というよりは、ホスト(Excel等)に最初から同梱されているという考え方になります。Wikipedia
2. インタプリンタの場所・実行の仕組み
実行モデル(内部で何が起きているか)
VBAのコード(モジュールやフォームのコード)は、そのままテキストで走っているわけではありません。保存時にいったんMicrosoft独自の「P-Code(中間コード、疑似コード)」にコンパイルされ、Officeアプリ側にある仮想マシンがそれを実行します。WordやExcelなどのファイル形式(.docm / .xlsm 等)には、このP-Codeがドキュメント内部の別ストリームとして埋め込まれています。Wikipedia
つまり「VBAはインタプリタ式か?」というと、正確には「VBAエディタがコードをP-Codeに変換 → Office内蔵のVBAランタイム(仮想マシン)がそのP-Codeを実行する」という構造です。純粋な行単位インタプリタよりは、JITなしのVM実行に近いイメージです。Wikipedia
実行エンジン(VBE7.DLLなど)
Office製品にはVBAエディタ(VBE: Visual Basic Editor)とランタイムをまとめたDLLが含まれており、代表的なのが VBE7.DLL(VBA7系)。ExcelやAccessなどを起動すると、このDLLが読み込まれ、そこでVBAコードの編集・実行・デバッグが行われます。Stack Overflow+2Microsoft Learn+2
このDLLはWindows上では通常、次のような場所に置かれています(32bit Officeか64bit Officeかで若干異なりますが、どちらも「Microsoft Shared\VBA\VBA7.1」のようなフォルダ配下です):
-
例(32ビット版 Office の一例):
C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA7.1\VBE7.DLL -
例(Click-to-Run版 Office や64ビット環境):
C:\Program Files\Common Files\Microsoft Shared\VBA\VBA7.1\VBE7.DLL
または、Office内部の仮想化フォルダ配下として
...\Microsoft Office\Root\VFS\ProgramFilesCommonX64\Microsoft Shared\VBA\VBA7.1\VBE7.DLL
のようなパスで参照されるケースもあります。Microsoft Learn+2Stack Overflow+2
ポイントとしては、VBAは「外部に独立したexe」ではなく、Excel.exeやWinWord.exeなどホスト側が VBE7.DLL(等)をロードして、その中のVBA仮想マシンでP-Codeを走らせている、ということです。Wikipedia+2Microsoft Learn+2
3. 言語仕様(ざっくり)
VBAの文法はおおむねVB6と同じで、モジュール単位・手続き(プロシージャ)単位で書きます。よく出てくる要素は次のとおりです。Wikipedia+2Microsoft Learn+2
-
Subプロシージャ / Functionプロシージャ
Sub 名前(引数...) ... End Sub
Function 名前(引数...) As 型 ... End Function
Subは戻り値を返さない手続き、Functionは値を返す手続きです。イベントハンドラ(例:Workbook_Open)もSubとして書きます。Microsoft Learn -
Dim宣言
変数を宣言するときにDim x As Integerのように書きます。
Dimは「この名前の変数を用意し、型はこれです」という宣言です。型を省略するとVariantという「何でも入り得る型」になります。Microsoft Learn+1
Option Explicitをモジュール先頭に書くと、宣言していない変数名の使用を禁止でき、タイプミスによるバグを防げます。Stack Overflow -
型システム
Integer,Long,Double,String,Boolean,Date,Object,Variantなどの基本型があります。配列 (Dim arr() As Long) やユーザー定義型 (Type … End Type) も使えます。Microsoft Learn+1
VBAは静的型付けと動的型付けの両方を許す「ハイブリッド」です。Variantを多用すれば動的的に扱えますが、明示的にAs Longなどと書けばより型安全になります。VBA全体としては「強い/弱い型付けの両方を許す」混合的な性格と言われます。Wikipedia+2Microsoft Learn+2 -
オブジェクトモデルへのアクセス
一番大きい特徴は、ホスト(ExcelやOutlookなど)が公開しているオブジェクトに直接アクセスできることです。
例:Application.Workbooks("Book1.xlsx").Sheets("Sheet1").Range("A1").Value = 123のように、Excelが持つオブジェクトを直接操作します。これはOLE Automation / COMの型ライブラリを通じて公開されています。Wikipedia+2Microsoft Learn+2 -
イベント駆動
「ブックを開いた」「新しいメールを受け取った」といったイベント名に一致するSubを書くと、そのイベント発生時に自動実行されます。Outlookの受信イベントに反応するマクロなどが典型です。Microsoft Learn+1
4. どこで使われているか・現在の主な用途
Microsoft Office製品
VBAは主に次のデスクトップ版Officeアプリに組み込まれています。
-
Excel
-
Word
-
Access
-
Outlook
-
PowerPoint
-
Visio
(Mac版Officeにも基本的に搭載されています。例外的に古いOffice for Mac 2008では一度外されましたが、その後は復活しています。)Wikipedia+2Microsoft Learn+2
これらのアプリごとに「ホストのオブジェクトモデル」が違います。たとえばExcelではワークブック/ワークシート/セルが中心、Outlookではメールアイテムや受信イベントが中心、AccessではDAO/レポート/フォームが中心、というようにAPIが異なります。そのため、VBAの文法そのものは同じでも、同じコードがそのまま別アプリで動くとは限りません。GitHub+2Microsoft Learn+2
Microsoft以外の製品
VBAエンジンは、AutoCAD、ArcGIS、SolidWorksなどの一部のサードパーティ製デスクトップアプリにも組み込まれ、同じように自動化・拡張のスクリプト言語として使われています。つまり「業務用CADにVBAマクロを入れてボタン1つで社内レポートを生成する」といった使い方がいまも現役で存在します。Wikipedia+1
なぜ今でも使われるのか
-
ExcelやAccessと密着しているので、非エンジニアの業務担当者でも社内向けツールを素早く作れる
-
既存の膨大な業務マクロ資産(20年以上分)が動き続けており、互換性が非常に重視されている
-
データの整形・帳票出力・メール送信など、日々のオフィスワークを「ボタン一発」にできる
といった理由から、2025年現在も企業内業務フローで多用されています。Microsoft Learn+1
まとめ
-
VBAは Officeなどに内蔵されたVB6系の拡張・自動化言語です。Excel等の「中」で動き、イベント駆動でタスクを自動化します。Microsoft Learn+1
-
インタプリンタ(実行エンジン)は
VBE7.DLLなどのランタイムDLLとして各ホストアプリに同梱され、ソースをP-Code化したものをその仮想マシンが実行します。場所は...Microsoft Shared\VBA\VBA7.1\VBE7.DLLといった共通フォルダ配下(32/64ビットでパスが多少異なります)。Microsoft Learn+2Stack Overflow+2 -
言語仕様は VB6スタイル(
Sub,Function,Dim,Option Explicit等)で、静的型・動的型を両方許します。ホストのオブジェクトモデルに直接アクセスできるのが最大の特徴です。Wikipedia+3Microsoft Learn+3Microsoft Learn+3 -
利用場所は Excel / Word / Access / Outlook / PowerPoint / VisioなどのOffice製品、および一部の業務向けアプリ(CAD等)。社内業務の自動化・帳票化などで今も現役です。alooba.com+3Microsoft Learn+3Wikipedia+3
2017年10月7日土曜日
アセンブラ入門
「アセンブラ入門」を、学部上級から研究者・実務家まで(諸学者向け)に耐える粒度で選んだ書籍リストです。目的別に並べています。
1) まず“教科書”として押さえる(体系理解)
-
『独習アセンブラ 新版』大崎博之(翔泳社, 2021)
数表現・CPU/メモリ・スタックから入り、GASとx86命令、さらに仮想機械やAVRまで扱う、講義用にも使える厚い標準テキスト。 -
Computer Systems: A Programmer’s Perspective(CS:APP, 3rd ed.)Bryant & O’Hallaron
「Cコードがどう機械語へ落ち、性能や正しさにどう効くか」を、x86-64を軸に体系化。アセンブリは“目的”ではなく“理解の中核”として出てきます。 -
Computer Organization and Design: RISC-V Edition(2nd ed., 2020)Patterson & Hennessy
命令セットとマイクロアーキテクチャの対応を、RISC-Vで学べる定番(研究室の輪読にも乗る)。
2) x86/ x86-64で“読む力”を作る(PC・OS・低レベル実務)
-
『デバッガによるx86プログラム解析入門【x64対応版】』Digital Travesia管理人 うさぴょん(秀和システム, 2014)
デバッガ(OllyDbg)で実バイナリを追い、32/64bit Windowsアプリの解析手順を学ぶ系。セキュリティ・RE寄りにも接続しやすい。 -
『x86アセンブラ入門』大貫広幸(CQ出版, 2006)
x86系アセンブリを正面から学ぶ日本語入門。版は古いので、現代OS/ABIは別資料で補う前提で。
3) ARMで“組み込み寄り”に入る(マイコン・SoC)
-
『ARMで学ぶ アセンブリ言語入門』出村成和
ARMの基礎だけでなく、組み込み機器や割り込み、開発環境まで含めて実務導線がある入門。
4) RISC-Vで“教育向けISA”から理解する(読み替えが利く)
-
『RISC-Vから学ぶC言語 ポインタ理解のためのアセンブリ入門』レ点(2024)
Cのポインタを、RISC-Vアセンブリへ落として追う設計。短めでも狙いが明確で、講義補助にも使いやすい。
5) “名著枠”と歴史的視点(古典だが示唆が多い)
-
『はじめて読むアセンブラ』村瀬康治(1985)
古典(Z80/8080系の時代背景)ですが、低レイヤを「道具の原点」として掴む読み物として価値があります。 -
The Art of Assembly Language Programming(Randall Hyde)
高級言語経験者に向けて、アセンブリを“高級言語の視点”で整理する大部の解説(Web公開の公式ページあり)。
6) 最適化・性能(入門後の“研究者向けリファレンス”)
-
Agner Fog “Optimizing subroutines in assembly language”
x86/x86-64最適化の定番マニュアル(最新版更新が継続)。コンパイラ屋・性能屋の共通語彙になります。
使い分けの目安
-
教養として体系を作る:『独習アセンブラ 新版』+ CS:APP
-
実バイナリを読めるようにする:『デバッガによるx86…』+(必要に応じて)x86入門
-
組み込み・SoCに寄せる:ARM入門
-
講義・輪読・読み替え力重視:RISC-V本+Patterson&Hennessy(RISC-V版)