C言語で書いたマクロはExcelでそのまま使える?Cの#defineとExcel VBAマクロの違いをわかりやすく解説

C言語関連

C言語を学んだあとにExcelの「マクロ」という言葉を見ると、「C言語で作ったマクロをExcelへコピーすれば動くのでは?」と思うことがあります。しかし、C言語のマクロとExcelのマクロは、同じ「マクロ」という名前でも基本的に別の仕組みです。そのため、C言語で記述したマクロをExcelへそのまま貼り付けて実行することは通常できません。

特にC言語の#defineで作るマクロは、C/C++のソースコードがコンパイルされる前にプリプロセッサによって処理されるものです。一方、デスクトップ版Excelで一般に「マクロ」と呼ばれるものは主にVBA(Visual Basic for Applications)で記述します。

ただし、「Cで実現していた処理をExcelでも行いたい」という意味なら、処理内容に応じてVBAやExcel関数へ書き換えたり、より高度なケースではC/C++で作成した外部プログラムやDLLなどと連携したりする方法があります。この記事では、それぞれの違いと移植方法を具体例とともに解説します。

結論:C言語のマクロをExcelでそのまま実行することはできない

C言語で書いたマクロをExcelのVBAエディターへそのまま貼り付けても、基本的には動作しません。CとVBAでは言語の文法も実行環境も異なるからです。

例えばC言語では#define TAX 1.1のように定義できますが、VBAにはCプリプロセッサの#defineをそのまま使う仕組みはありません。単純な定数ならVBAのConst TAX As Double = 1.1など、VBAの文法へ置き換えて考えます。

したがって、「CのコードをExcelへコピーする」のではなく、Cで何をしていたのかを確認し、その処理をExcelで使える仕組みに置き換えるのが基本です。

C言語の「マクロ」とExcelの「マクロ」は意味が違う

C言語のマクロは一般にプリプロセッサ機能を指します。代表例が#defineです。ソースコードをコンパイルする前の前処理段階で、指定したトークンを置換するなどの働きをします。

例えば#define MAX 100と定義しておけば、その後のCソース内に現れるMAXを前処理によって100へ置き換えられます。また#define SQUARE(x) ((x) * (x))のような関数形式のマクロもあります。

これに対してExcelのマクロは、表計算上の一連の操作を自動化する意味で使われます。WindowsやMacのデスクトップ版ExcelではVBAによるマクロが代表的で、セルへの入力、計算、シート操作、ファイル処理などをプログラムとして実行できます。

同じ「マクロ」と呼ばれるのはなぜ?

「マクロ」という言葉は、特定の一つのプログラミング言語を意味する名称ではありません。コンピューター分野では、処理や命令をまとめたり展開したりして利用する仕組みに対して広く使われてきた言葉です。

そのため「C言語のマクロ」「Excelマクロ」という表現があっても、両者に互換性があるという意味ではありません。例えば「JavaとJavaScript」の名前が似ていても別の言語であるのと同様に、名称だけで互換性を判断しないことが大切です。

Excelで「マクロを作ってください」と言われた場合は、多くの場合、Cの#defineではなくVBAなどを利用したExcel操作の自動化を意味していると考えると分かりやすいでしょう。

Cの#defineをExcelへ置き換える具体例

単純な定数マクロなら、考え方をVBAへ移すことは比較的簡単です。例えばC言語で次のような定義を使用していたとします。

#define DISCOUNT_RATE 0.9

VBAなら、用途に応じて次のような定数として表現できます。

Const DISCOUNT_RATE As Double = 0.9

ただし、これはCの#defineをExcelが直接解釈しているわけではありません。同じ目的をVBAの文法で書き直しているだけです。この違いは重要です。

関数形式のCマクロもVBAのFunctionなどへ書き換える

Cでは関数のような形をしたマクロも作れます。例えば#define DOUBLE(x) ((x) * 2)というマクロなら、指定した値を2倍する形で展開されます。

Excel VBAで同じような結果を得たいなら、例えばFunction DoubleValue(x As Double) As Double: DoubleValue = x * 2: End Functionのように関数として実装する方法があります。

この場合も内部動作は同じではありません。Cの関数形式マクロはプリプロセッサによる展開であり、VBAのFunctionは実際の関数です。「結果として同じことをするコードへ移植する」と理解すると混乱しにくくなります。

Excelのセル計算だけならVBAすら不要な場合がある

Cで書いた処理をExcelへ移したいからといって、必ずExcelマクロを作る必要があるわけではありません。単純な計算ならExcelのワークシート関数や数式だけで実現できる場合があります。

例えばC側で「価格を10%引きにする」だけなら、A1セルに価格が入っている場合、Excelでは=A1*0.9のような数式で済みます。大量のデータに同じ計算を適用する場合も、Excelの表計算機能そのものが適しています。

一方、「特定条件の行を別シートへ移す」「ボタンを押したら複数シートを加工する」「決まった形式でファイルを出力する」など、複数の操作を自動化したい場合はVBAマクロが候補になります。

C言語のプログラム本体もVBAへコピーしては動かない

マクロだけでなく、C言語で書いた通常のプログラムもVBAへそのまま貼り付けて実行することはできません。例えばprintf、ポインタ、Cの配列処理などを含むコードは、そのままVBAとして解釈されません。

処理を移植する場合は、Cのアルゴリズムを読み取り、VBAの変数、条件分岐、ループ、配列、Excelオブジェクトなどを使って書き直します。計算ロジック自体は再利用できても、ソースコードの記述をそのまま流用できるとは限りません。

例えばCのfor (int i = 0; i < 10; i++)に相当する繰り返しをVBAで行うなら、For i = 0 To 9からNext iまでのようなVBA文法へ変更します。

C/C++とExcelを連携させる方法はある

「そのまま使えない」ことと「CとExcelは連携できない」ことは別です。高度な用途では、C/C++で作成したネイティブコードをExcelと連携させることも可能です。

例えばWindows環境ではC/C++でDLLを作成し、VBAから適切に宣言して呼び出す設計があります。またMicrosoftは、C APIを利用したXLLについて、Excelワークシートから呼び出せる高性能なワークシート関数をC/C++で作成する用途などを案内しています。[参照] Microsoft Learn・Excel XLL SDK

ただしDLLやXLLによる連携は、VBAを初めて学ぶ段階で必要になる方法ではありません。単純なExcel作業の自動化なら、まず数式やVBAで実装できないか検討する方が簡単です。

Excelマクロを作るなら基本はVBAから学ぶ

デスクトップ版Excelで従来型のマクロを作りたい場合は、VBAの基礎を学ぶのが分かりやすい方法です。Microsoftのドキュメントでも、Office VBAは繰り返し行う操作を自動化する用途などに利用できると説明されています。[参照] Microsoft Learn「Office VBA の基礎知識」

最初は変数、If、For、Sub、Functionなどを覚え、その後Range、Cells、WorksheetといったExcel固有のオブジェクトを学ぶと理解しやすくなります。

C言語の経験があれば、変数、条件分岐、ループ、関数といったプログラミングの基本概念は共通しているため、VBAを学ぶ際にもその知識は役立ちます。ただし文法は別物として覚える必要があります。

ExcelにはOffice Scriptsという別の自動化手段もある

現在のExcelにはVBAだけでなく、対象環境ではOffice Scriptsを利用した自動化もあります。Office ScriptsはExcel on the web、Windows、Macなどの対応環境で利用され、TypeScriptベースのスクリプトによって繰り返し作業を自動化できます。[参照] Microsoft Learn「Excel の Office Scripts」

したがって「Excelマクロ=どんな場合でもVBAしかない」という理解も現在では正確ではありません。使用しているExcelの環境、Microsoft 365の契約、目的、既存システムとの連携方法などによって適切な選択肢が変わります。

ただし、C言語の#defineがOffice Scriptsでそのまま動くわけでもありません。Office Scriptsを使う場合も、その環境に合ったコードへ書き換える必要があります。

「Cで作ったマクロをExcelで使いたい」ときの判断方法

実際に移植するときは、元のCコードが何をしているかによって方法を選びます。

元のC側の処理 Excel側の主な候補
#defineで固定値を定義 VBAのConst、セル、名前の定義など
単純な四則演算 Excel数式・関数
関数形式マクロ Excel数式、VBAのFunctionなど
条件分岐・繰り返し処理 VBA、Office Scriptsなど
セルやシートの自動操作 主にVBA、Office Scriptsなど
既存の高速なC/C++処理を活用 DLL・XLLなどの連携を設計

例えば「Cで書いた計算式をExcelの1000行に適用したい」なら、最初からDLLを作るよりExcel数式へ置き換える方が簡単なことがあります。反対に大規模な既存C/C++ライブラリをExcelから利用したいなら、単純なVBAへの書き換えより外部コードとの連携を検討する価値があります。

マクロ有効ブックの拡張子にも注意

VBAマクロを含むExcelブックを保存する場合、通常の.xlsxではなく、用途に応じてExcelマクロ有効ブックの.xlsmなどを使用します。VBAを作成したのに通常の.xlsxとして保存しようとすると、マクロを保持できないため注意が必要です。

また、インターネットやメールから入手した不明なExcelファイルについて、「マクロを有効にしてください」と表示されたからといって安易に有効化するのは危険です。VBAは便利な自動化機能である一方、悪意あるコードにも利用されるため、作成者やファイルの入手元を確認することが重要です。

自分でCからVBAへ移植したマクロを利用する場合でも、元ファイルをバックアップしたうえでテスト用ブックから動作確認すると、誤ってデータを上書きするリスクを減らせます。

まとめ:C言語のマクロはExcel用に書き換える必要がある

C言語で書いたマクロをExcelへコピーして、そのまま使うことは基本的にできません。Cの#defineなどはC/C++のプリプロセッサで処理される仕組みであり、ExcelのVBAマクロとは別物だからです。

ただし、Cで実現していた処理そのものをExcelへ移すことは可能です。固定値ならVBAのConst、簡単な計算ならExcel数式、関数や自動操作ならVBA、対応環境ではOffice Scriptsといったように、目的に応じて書き換えます。

また、既存のC/C++コードをどうしても活用したい高度な用途では、DLLやXLLなどを利用してExcelと連携する方法もあります。「Cのコードが使えるか」ではなく、「Cで行っている処理をExcelでは何で実装するのが適切か」と考えるのがポイントです。

C言語の経験は無駄にはなりません。条件分岐、繰り返し、変数、関数といった考え方はVBAでも役立つため、Excelで自動化したいのであれば、元のCコードの目的を整理したうえでVBAやExcel関数へ置き換えていくのが現実的です。

コメント

タイトルとURLをコピーしました