午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

Excel-DNAの導入、最初の設定メモ、VisualStudioでユーザー定義関数、エクセルアドイン

2019/10/19追記

このときだけしか使っていない

なんかエクセル2007だと、あれも対応していない、これも対応していないとかでてくるからいまいち、2007より新しいエクセルを使いたい

追記ここまで

 

 

面白そうなのを見つけた

Excel-DNAっていうの
よくわかっていないけど動いたのでメモ
 
VisualStudioを使って
エクセルのマクロを作ってアドインで連携
ユーザー定義関数を作ってアドインで管理
うまく表現できないけどマクロを書くのにVisualStudioを使えるようなの
 
 
参照したところは
 
即効!Officeを操る実用技 - [外部アプリ連携].NET FrameworkExcelアドインを開発:ITpro
 
Excel-DNA | supermab's blog
 
この辺りの解説を見て何とか準備ができたので
その準備のメモ
 

f:id:gogowaten:20191022095433p:plain

Excel-DNA - Home
Excel-DNAを公開している本家からダウンロード
 

f:id:gogowaten:20191022095446p:plain

今(2015/06/27)の最新バージョンは0.32
ExcelDna-0.32.zipをダウンロードする
 
必要なファイルをアドインフォルダにコピーする

f:id:gogowaten:20191022095457p:plain

ExcelDna-0.32.zipを解凍して
その中にあるDistributionフォルダの中にある
ExcelDna.dnaとExcelDna.xllを
エクセルのアドインフォルダにコピーする
64bit版のエクセルを使っている場合はそれぞれ64が付いているファイルで
OSが64bitでもエクセルが32bitなら無印のファイルってことかな
 
アドインフォルダの場所は
C:\Users\waten\AppData\Roaming\Microsoft\AddIns
watenのところはユーザー名
 
ユーザー名の確認は

f:id:gogowaten:20191022095515p:plain

コントロールパネルからできる
 

f:id:gogowaten:20191022095527p:plain

C:\Users\waten\AppData\Roaming\Microsoft\AddIns
AppDataフォルダは隠しフォルダになっていて見えないけど
表示設定の隠しフォルダにチェックを入れると見えるようになる

 
VisualStudioの準備

f:id:gogowaten:20191022095536p:plain

新しいプロジェクトからクラスライブラリを選択
名前はわかりやすいのをつける
今回はExcelDnaWatenにした
OK押すと

f:id:gogowaten:20191022095549p:plain

この画面
 
必要なファイルを参照設定する

f:id:gogowaten:20191022095559p:plain

ソリューションエクスプローラーを開いて
プロジェクト名を右クリックして
追加→参照
 

f:id:gogowaten:20191022095615p:plain

この画面で参照を押して
 

f:id:gogowaten:20191022095625p:plain

さっき解凍したExcelDna-0.32.zipのDistributionフォルダの中にある
ExcelDna.Integration.dllを選択して追加ボタン押すと
 

f:id:gogowaten:20191022095634p:plain

この画面に戻る、チェックが入っているの確認してOK
これで参照設定完了
 
参照設定したのを使いやすいようにImportsする

f:id:gogowaten:20191022095644p:plain

1行目に
Imports ExcelDna.Integration
これでVisualStudioの準備ができた
イメージ 33
 
 
関数を書く
イメージ 13
Imports ExcelDna.Integration
Public Class Class1

End Class

Public Module Module1
    Function Kakezan(x, y)
        Return x * y
    End Function
End Module

Public Module Module1ってのはわかっていないコピペしただけ、おまじない
End Module、これもおまじない

Public Class Class1
 
End Class
これも要らなそうだけど、害がなさそうなのでそのまま
 
関数は
    Function Kakezan(x, y)
        Return x * y
    End Function
この3行
名前がKakezanって名前の関数にした
受け取ったxとy、2つの値を掛け算した値を返す関数
 
書いたらビルド…の前に
イメージ 14
構成?をDebugからReleaseに変更してから
 
イメージ 15
ビルド!
 

f:id:gogowaten:20191022095706p:plain

ビルドに成功すると下にある出力画面に
1 正常終了の表示
 
------ ビルド開始: プロジェクト:ExcelDnaWaten, 構成:Release Any CPU ------
  ExcelDnaWaten -> c:\Users\waten\Documents\Visual Studio 2013\Projects\ExcelDnaWaten\ExcelDnaWaten\bin\Release\ExcelDnaWaten.dll
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
できあがったファイルの場所はオレンジ色のところにあるので
これをエクセルのアドインフォルダにコピーする
 

f:id:gogowaten:20191022095719p:plain

できあがったファイル(Excelgogowaten.dll)を
アドインフォルダにコピー(移動でも同じ)する
 
 
アドインフォルダのExcelDna.dnaの中を書き換える

f:id:gogowaten:20191022095732p:plain

コピーしたExcelDna.dnaをテキストエディタで開いて
2行目から19行目を
<ExternalLibrary Path="ExcelDnaWaten.dll" />
これに書き換える
 
ExcelDnaWaten.dll
のところはVisualStudioでビルドして作成したファイル名にする
上書き保存して閉じる
 
エクセルのアドインとして導入する
このへんみて
イメージ 19
アドインの名前はExceldnaになっている
この名前を変えたいときは
ExcelDna.dnaとExcelDna.xllを変えればいいみたい
 
チェックを入れてOKでさっき書いたKakezanの関数が使えるようになっている
イメージ 20
=kaを打った時点で候補として出てくる
 
イメージ 21
2つの値、もしくは数値の入ったセルをを指定して決定すると
 
イメージ 22
できた!
 

f:id:gogowaten:20191022095745p:plain

ここに説明を入れるのとかもできるみたい
 
他にも関数を書いてみる
イメージ 24
Function ISPRIME(x As Integer) As Boolean
    Dim i As Integer
    For i = 2 To x / 2
        If x Mod i = 0 Then
            Return False
            Exit Function
        End If
    Next
    Return True
End Function
VisualStudioに戻って
 
Excel-DNA で XLL をつくる(その6) | supermab's blog
ここを参照(丸パクリ)して
受け取った値が素数かどうかの判定を返す関数を書く
ピンクの四角のところが書き加えた関数ISPRIME
書く場所はModule Module1としたところの中でいいみたい
 
書いたらビルドしてできあがったファイルを
アドインフォルダにコピーするんだけど
そのまま上書きしようとしてもエラーになるので
 
イメージ 25
エクセルのアドインの設定でExceldnaのチェックを外してOKしてから
ビルドしたファイルExcelgogowaten.dllを上書きする
上書きできたらチェックを入れる
めんどくさいけどチェックを入れている間はエクセルが
Excelgogowaten.dllを使用中ってことで上書きできないみたい
 

f:id:gogowaten:20191022095809p:plain

コピー
 
イメージ 27
ファイルを置き換えるで上書きコピー
 
イメージ 28
再びチェックを入れてOK
 
イメージ 29
候補にも出てくる
 
イメージ 30
できたー
 
イメージ 31
Function ISSOSUU(x As Integer) As String
    Dim i As Integer
    For i = 2 To x / 2
        If x Mod i = 0 Then
            Return "(´・ω・`)"
            Exit Function
        End If
    Next
    Return "٩(๑❛ᴗ❛๑)۶素数!"

End Function

同じ素数判定の関数だけどBooleanじゃなくて文字列を返す関数
 
イメージ 32
渡すのが数値とかの値だけじゃなくてRangeとかセルそのものの受け渡しもできるのかしら