月別アーカイブ: 2017年12月

C#、ネットワークドライブ存在チェックの不思議

ちょっとメモがてら。

Yドライブをネットワークドライブとして割り当てている。
アドレスを仮に 192.168.100.1 とする。
割り当てられているフォルダは \\192.168.100.1\common ということで。

この時、C#でディレクトリの存在をチェックを行うと、

は Ture

しかし、

は False

ここまではいい。納得。
 
 
そこで次に、前回のエントリでやってみたC#で作ったDLLをExcelから使えるようにしてみたケースで試してみる。

DLLは下記のような単純なコード。

これでExcelのVBAで下記のようにすると True が返ってくる。
Cドライブなので納得。

そして、下記のようにすると・・・

やはり True が返ってくる・・・
(違いはCheckDirectory内の文字が C か Y かだけ)

もちろん、他の未使用のドライブレターで試すとFalseが返ってくる。

Yドライブはネットワークドライブで Directory.Exists(@”Y:\”) ではFalseとなるのに、なぜこの場合はTrueと返ってくるのか・・・

用途としてはこの方が助かりはするけれども。
 
 
 

Excelで使えるDLLをC#で作る

せっかくC#を多少使えるようになってきたので、これまでExcelのマクロ(VBA)で作っていたものをDLLにしてみることに。
というのも、VisualStudioが優秀すぎてこっちで作る方が楽なので。
 
 
早速、VisualStudioを立ち上げるわけですが、今回の目的上、管理者として実行する必要がある。


 
 
次に、適当にプロジェクトを新規作成し、下記の通り設定。
 
まずはプロジェクトのプロパティを開いて、「アセンブリ情報」をクリック。


 
 
 
新たにウィンドウが開かれるので、そのなかの「アセンブリをCOM参照可能にする」にチェックを入れて「OK」


 
 
 
次は「ビルド」の項目へ移り、その中の「COM相互運用機能の登録」にチェックを入れる。


 
 
 
これで下準備が完了したので、下記のようなクラスを適当に作ってみる。
この時、
using System.Runtime.InteropServices;
を追記するのを忘れないように。
 

ポイントとしてはインターフェースの実装(7行目から)とクラスに属性を設定する(14行目)こと。

これをビルドすればDLLのできあがり。
 
 
出来上がったDLLはRegAsmを使って登録する必要があるので、DLLの置かれているディレクトリで下記を実行。

尚、登録を解除するには下記のようにする。

尚、regasm.exeは「v4.0.3019」のほか「v2.0.50727」にもある。
対象のフレームワークのバージョンに合わせる必要があるらしいが、敢えて古いものを作ることもあまりないと思うので、今回はそのまま最新のものを使用。
 
 
 
ここからはExcelでの作業。
 
 
Excelを開いてVisualBasicEditor(VBE)を立ち上げる。


 
 
VBEのメニューから「ツール」→「参照設定」と進む。


 
 
その中に「ExcelVbaExtension」とDLLの名前が出ていればOK。


 
 
あとは下記のようにすれば使えるようになる。
(これだとシートがアクティブになる度にメッセージボックスが出てきて面倒なだけだけど・・・)

 
 
こんな感じにね。