[[20181018180301]] 『ユーザー定義関数のアドインと埋め込みの併用につ』(にゅるん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザー定義関数のアドインと埋め込みの併用について』(にゅるん)

お世話になっております。

開発者自身が頻繁に使うユーザー定義関数(例えばWsSPLIT)を定義したアドインがあったとして、開発者本人はこのアドインを常駐しているとします。

あるとき第三者とWsSPLITを使ったブックを共有したいと思っため、WsSPLITだけを埋め込んでxlsm形式で公開することにしました。

しかし、開発者PCでxlsm開いて保存した時、xlsm自身の関数よりアドインの関数のほうを優先するようにリンクが貼られてしまいます。

修復のためにいきなり「データ」「リンクの編集」から切断すると、数式は消失し値に変化してしまいますので使えません。
置換を使ってアドインのパスを置換してからリンクを切断すれば回復出来るようです。

ただし、開発者のPCでxlsmを開いて上書き保存すると、再びリンクが貼られてしまいます。

 WsSPLIT関数の例(実用性は置いといて)
 Function WsSPLIT(s As String, d As String) As Variant
    WsSPLIT = Strings.Split(s, d)
 End Function

当xlsmは開発者のPCで編集する頻度が多く、そのたびにリンクの解除を意識しなければならない状況を改善したいのですが、どのような方法が良いと考えますか?

一応譲れない条件を上げると次の3点です。
・利用者には単一のxlsmだけで完結させたい。
・利用者のPCにアドインを埋め込む事はできない。(台数が多いため)

様々なアプローチがありそうですが、理由付きで教えて頂けると助かります。

< 使用 Excel:Excel2016、使用 OS: >


 他の方のレスがついたら、本件はスルーしてください。

 私は、質問の意味が呑み込めないので・・

 私は、アドイン使っていてリンクがどうこう、と言う事象自体に出会ったことがありません。

 ・アドインにリンクが張られる
 ・当xlsmにリンクが貼られる

 とは具体的にどんなリンクなんですか?

 印象としては、数式でどっちかのブックを参照している、と言う様に解釈されるのですが、
 それとユーザー定義関数はどう絡むのですか?

 切り口を換えると、一般ユーザーと開発者は、そのxlsmブックをどう使っているのですか?

 アドインファイルって普通、xlamだと思うのですが、そうじゃないことと何か関連ありますか?

(半平太) 2018/10/18(木) 19:50


Workbook_openイベントで、Thisworkbookへのリンクに強制的に変更してはどうでしょうか?

(マナ) 2018/10/18(木) 20:00


もし、↑でよければ、

[[20050826152545]] 『リンクを更新して開くというコード』

https://www.moug.net/tech/exvba/0060039.html

を参考すれば、なんとかなりませんか
変更するリンク先は、限定したほうがよいかもしれません。

(マナ) 2018/10/18(木) 20:20


半平太様

> 具体的にどんなリンクなんですか?
元々はxlamのコードにWsSPLITが記載されており、xlsmのセルに次のような数式が含まれているとします。
=WsSPLIT("a,b,c",",")
この状態でxlsmを保存して、他のPC(またはxlamの起動していない状態)で開くと、
「リンクの自動更新が無効にされました コンテンツの有効化」が表示され、
セルの数式は「='C:\Users\USERNAME\Documents\bbbbb.xlam'!WsSPLIT("a,b,c",",")」
のように変化します。

データ>クエリと接続>リンクの編集を見ると、当アドインがリストに表示されています。
で、解除ボタンを押すと、先のセルの数式は消失し、この例では「a」という文字に確定されてしまいます。

この状況から回復させるには、アドインが終了した状態で
「'C:\Users\USERNAME\Documents\bbbbb.xlam'!」

「」
に置換してから保存する必要があります。

以上、再現方法でした。
(にゅるん) 2018/10/18(木) 21:01


マナ様

ありがとうございます。
リンク先を編集することが可能なのですね!

実際に次のコードをxlsmの方に埋め込んでダミー環境でテストしたところ、今のところ問題なさそうです。

 Private Sub Workbook_Open()

    Dim V As Variant
    Dim Var As Variant

    Var = ThisWorkbook.LinkSources(xlExcelLinks)

    If Not IsEmpty(Var) Then
        For Each V In Var
            If V Like "*.xlam" Then
                ThisWorkbook.ChangeLink _
                    Name:=V, _
                    NewName:=ThisWorkbook.FullName, _
                    Type:=xlLinkTypeExcelLinks
            End If
        Next
    End If

End Sub

関数が「'=aaaaa.xlsm!WsSPLIT("a,b,c",",")」になってしまうのが気持ち悪いですが、私以外は触らないので問題はないでしょう。。。

私の出していた置換を使う方法だと全てのシートの数式を書き換えないといけないので、できれば避けたいな。と思っていたのでとても良い方法です!

また明日本番環境でテストしたいと思います。

(にゅるん) 2018/10/18(木) 21:19


 にゅるん さん

 マナさんのレスが付いたにもかかわらず、解説いただきありがとうございました。

 同名のユーザー定義がバッティングすると、こんなことが起きるとは知らなかったです。m(__)m

(半平太) 2018/10/18(木) 22:05


開発者が使っているアドインブック内の関数は WsSPLIT

WsSPLIT を、他ユーザーと共有するブック内にコピーして実装した
関数の名前を WsSPLIT2 と別名にする

共有ブックのセル関数 or ブック内マクロでは、WsSPLIT2 のみを使う

当然、開発者が共有ブックを編集する時も、そこで使われる(共有ブック内で動作する)
のは WsSPLIT2

要は、バッティングしないようにすれば良いだけです。

(AddinBox 角田) 2018/10/18(木) 22:29


角田さま

言われてみればその通りですね!
単純すぎて盲点でした。

先の件と合わせて試したいと思います。

(にゅるん) 2018/10/18(木) 23:10


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.