Visual C#.NETでVBA用ライブラリを作成する

2020年3月17日

  • Visual Studio 起動、Visual C# クラスライブラリを選択しプロジェクト作成。
  • クラスを作成する。下記のコードでは指定したディレクトリ内のファイル一覧を返すメソッドを作成。
  • GUIDの追加が必要。ツール→GUIDの作成→レジストリ作成で結果に表示されている"{}"を除いた部分をコピー下記ソースコードのように記述する。
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace IOUtils
{
[ProgId("IOUtils.DirectoryWalker")]
[Guid(DirectoryWalker.ClassId)]
public class DirectoryWalker
{
public const string ClassId = "7CA1C2CD-3E24-4b65-B247-51700DFE5DDF";
///
/// 検索条件に合致したファイル
/// 
private List files;
///
/// 検索するルートディレクトリからの階層。ルートディレクトリ自身を1とする。
/// 
private int maxDepth = -1;
///
/// 引数で指定したディレクトリ以下にある全ファイルの絶対パスを格納したstring配列を返す。
/// 
///ファイル検索開始のルートディレクトリ
/// 引数で指定したルートディレクトリ以下にある全ファイルの絶対パスを格納したstring配列
public string[] getAllFiles(string rootDirectory)
{
files = new List();
walk(rootDirectory, "*.*", 1);
return files.ToArray();
}
///
/// 引数で指定したディレクトリ以下にあり、ファイル名が指定したパターンに合致する全ファイルの絶対パスを格納したstring配列を返す。
/// 
///ファイル検索開始のルートディレクトリ
///ファイル名のパターン
/// 引数で指定したルートディレクトリ以下にありファイル名が指定パターンに一致したファイルの絶対パスを格納したstring配列
public string[] getFilesByNamePattern(string rootDirectory, string fileNamePattern)
{
files = new List();
walk(rootDirectory, GetFileNamePattern(fileNamePattern), 1);
return files.ToArray();
}
///
/// 引数で指定したディレクトリ以下にあり、ファイル名が指定したパターンに合致する、かつ、ルートディレクトリから指定階層内にある全ファイルの絶対パスを格納したstring配列を返す。
/// 
///ファイル検索開始のルートディレクトリ
///ファイル名のパターン
///ルートディレクトリ空の階層、ルートディレクトリ内を1とする
/// 一致したファイルの絶対パスを格納したstring配列
public string[] getFilesByNamePatternWithMaxDepth(string rootDirectory, string fileNamePattern, int maxDepth)
{
files = new List();
this.maxDepth = maxDepth;
walk(rootDirectory, GetFileNamePattern(fileNamePattern), 1);
return files.ToArray();
}
///
/// ディレクトリ階層を再帰的に探索する。
/// 
///現在のディレクトリ
///ファイル名のパターン
///ルートディレクトリからの深さ
private void walk(string directory, string fileNamePattern, int depth)
{
// カレントディレクトリ内のファイル名パターンに一致するファイルを取得
string[] files = Directory.GetFiles(directory, fileNamePattern);
this.files.AddRange(files);
int childDepth = depth + 1;
if (this.maxDepth > 0 && childDepth > this.maxDepth)
{
return;
}
// カレントディレクトリ内の全ディレクトリを取得
string[] directories = Directory.GetDirectories(directory);
foreach (string d in directories)
{
// 各ディレクトリ内を再帰的に探索
walk(d, fileNamePattern, childDepth);
}
}
///
/// ファイル名パターンがnullまたは空の場合"*.*"を返す。
/// 
///検索対象のファイル名パターン
/// ファイル名パターン
private string GetFileNamePattern(string fileNamePattern)
{
return string.IsNullOrEmpty(fileNamePattern) ? "*.*" : fileNamePattern;
}
}
}
build_conf3.jpg

ビルド設定。VBAで使用できるようビルド設定を行う。

  • ソリューションのプロパティ→アプリケーション→アセンブリ情報→「アセンブリをCOM参照可能にする」にチェック。
  • ソリューションのプロパティ→ビルド→「COMの相互運用機能の登録」にチェック

ビルド実行。

build_conf1.jpg
build_conf2.jpg

これで、VBAのツール→参照設定で作成したライブラリが選択可能になる。

C#, VBA

Posted by fanfanta