質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.60%

  • C#

    6866questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • VBA

    1725questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1468questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • VB.NET

    896questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

VBA等のExcelのマクロについて、外部から呼び出したvbaで参照できませんか?

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 343

NEWBIEEBIEE

score 37

私のやりたいことは、Excelのあるbookにあるマクロを、他のbookのマクロ記述部分に移植することを自動ですることです。

Excelでc#(VB.NET)からの多言語からアクセスできるのはせいぜい「セル」ぐらいであることは知っているのですが、 

vbaをc#(VB.NET)から実行できるということを聞き(https://webbibouroku.com/Blog/Article/run-macro)、
じゃあvbaからなら「.dll」等を経由して(https://www.ka-net.org/blog/?p=5464)(こちらの事例はエクセルが不要?と書いてあるが不明 http://nami-it.net/archives/5750154.html)

他のbook内に組こまれているvbaを参照できるのではないかと単純に思い、探してみましたがないので、質問しました。

vbaを他言語からのバッチ処理として動作させる上で、実行できる範囲について教えてください。

(ここでいう実行できる範囲というのはvbaを使って、他のbookのvbaをテキストのごとく持ってきて貼り付けられることができたりするのかとか、それとも間接的に移植が可能であるような機能があるのかとかです。) 
宜しくお願いします。

他参考にしたもの
(https://stackoverflow.com/questions/40956465/vba-to-copy-module-from-one-excel-workbook-to-another-workbook)(一応マクロを別のワークブックにコピーするということで書かれているが、全く処理の内容が把握できない。これで別言語から呼び出して、別のエクセルにマクロが適用できるのか?)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/05/09 13:15 編集

    C#はタグに必要そうに思いますが、要件的にはどうなのでしょうか。 また、調べてみたこと、やってみたこと(そのソースコード)を具体的に追記してください。また参考先サイトがあればURLも質問に追記してください。既に見た先が回答についてしまうと無駄なやり取りが発生しますし、もしかしたら参考記事の理解が間違っているために解決に至れていないのかもしれません。https://teratail.com/help/question-tips#questionTips1-2

    キャンセル

回答 2

checkベストアンサー

+2

Excelに対するCOM操作で、

  • モジュール内のコードを文字列として取得・設定
  • モジュールのインポート・エクスポート

などを行うことはできます。

質問に記載されている
https://stackoverflow.com/questions/40956465/vba-to-copy-module-from-one-excel-workbook-to-another-workbook

Zuishinさんの回答にある
Excelマクロ抽出スクリプト - Qiita
がCOM経由での操作の例になります。

該当の処理を行うためのオブジェクト群のタイプライブラリはExcelとは別となっており
Microsoft Visual Basic for Applications Extensibility 5.3のライブラリを参照する必要があります。

 制限

COM経由で操作する場合は予め

  • Excelのセキュリティ設定の変更
  • VBAのプロジェクトにパスワードが設定されている場合パスワードの解除

をしておく必要があります。

上記Excelマクロ抽出スクリプト - Qiitaの記事内では
Excelのセキュリティ設定の変更の方法および、パスワード解除の自動化も記載されています。

 参考

以下PowerShellのコードですがおおよそのイメージは掴めるかと思います。

# Excel取得
# Excel.Application
$xl = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Excel.Application')

# Excel.Workbook
$wb = $xl.ActiveWorkbook

# 以降セキュリティの制限の解除が必要
# VBIDE = Microsoft Visual Basic for Applications Extensibility 5.3
# VBIDE.VBProject
$project = $wb.VBProject

# VBIDE.VBComponent = モジュール
$module1 = $project.VBComponents.Item('Module1')

# VBIDE.CodeModule = モジュールのコード部分
$codeModule = $module1.CodeModule

# System.String 全行を文字列として取得
$codeTxt = $codeModule.Lines(1, $codeModule.CountOfLines)

Write-Output $codeTxt

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/09 21:03

    わかりやすい例を有難うございます。参考にさせて頂きます。

    キャンセル

  • 2018/05/09 21:42

    色々な回答を頂き有難うございます。どれもとても貴重な意見でした。今回、基本的な事項もさることながら、自分は他処理系からの呼び出しを懸念していたため、他回答者のかたには失礼しますが、こちらのご意見を今回BAにさせて頂きます。失礼します。

    キャンセル

+1

Windows には COM オートメーションという技術があります。
これは COM オブジェクトとして OS に登録されたプログラムの公開されたメソッドとプロパティを他のアプリから使えるというものです。

Excel は COM を公開しているので C# などを使って様々な処理を行うことができます。
具体的に何ができるかは Excel オブジェクト モデルの概要 を参照してください。

ブックに含まれたマクロのコードにアクセスするメンバーはざっと見たところ見あたりませんでしたが、Excelマクロ抽出スクリプト では仮想キーコードを送ることで実際にキーボードから作業するのと同じ手順でマクロを抽出しています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/09 15:20

    回答有難うございます。リンクをちょっと見てみます。また失礼します。(全部が初学であるが故)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6866questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • VBA

    1725questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1468questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • VB.NET

    896questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。