電子書籍の厳選無料作品が豊富!

Excel2016でユーザー定義関数を作成し、アドイン登録して利用しています。
これを他のPCでも使用したく、そちらのPCにも同じアドインファイルを保存してその関数を使用できるようにしました。(どちらのPCでも正常に計算結果が表示されます。)

ここで一方のPCでユーザー定義関数を使用した数式を組み、それをもう一方のPCにメールで送った場合、数式の中のユーザー定義関数の前に、送信元のPCのアドインファイルのパスが表示され、そちらのアドインファイルを参照しようとしてしまいます。

パスの部分を消せば、自PCのアドインを参照してくれるかと思いきや、一度アドインのチェックマークを外してOKし、再度チェックマークを入れて初めて計算結果が表示されます。

また、複数セルにユーザー定義関数を使用している場合は、置換などで全ての数式のパスを消す必要があり面倒です。

できれば自動で自PCのアドインを参照させたいのですが、そのような事はできますでしょうか。
そもそも何か手順が間違っていますでしょうか。

どうぞ宜しくお願いします!

質問者からの補足コメント

  • HAPPY

    色々と試行錯誤しましたが、この使い方ではいずれエラーが起きる可能性があるのと、それぞれのPCのライブラリにアドインを保存する際、社内の管理部門へその都度管理者権限付与の申請が必要なことなど、不便なことが多いため一旦諦めることにしました。

    代替案として、各Excelファイルにユーザー定義関数のマクロを保存することで、ファイルの共有(メール送信含む)時にもエラーなく使用できるようにしました。めっちゃ原点に戻った感ありますが(汗)

    また、まっさらなExcelファイルにユーザー定義関数を仕込んでおいて、それを原紙として使用してみようと思います。

      補足日時:2024/06/27 21:16

A 回答 (2件)

こんばんは


>パスの部分を消せば、自PCのアドインを参照してくれるかと思いきや、一度アドインのチェックマークを外してOKし、再度チェックマークを入れて初めて計算結果が表示されます。

ブックリンクなのでパスを消してもダメ

①リボン・データ・ブックのリンクからソースブックを変更すれば出来ると思います
ブックのリンクを管理する
https://support.microsoft.com/ja-jp/office/%E3%8 …

また、Officeのインストール場所が同じPCならば・・・
LIBRARYフォルダにアドインを設置して登録し(\AddInsの古いものは削除して再セット)
アドインのユーザー定義関数を使い 
配布してもリンクアドレスは同じになるので使えると思います
(未検証)
これには条件がありますが
バージョンや32bit 64bit LIBRARYフォルダの場所が同じ
aPC
C:\Program Files\Microsoft Office\root\Office16\LIBRARY\アドイン名.xlam
bPC
C:\Program Files (x86)\Microsoft Office\Root\Office16\LIBRARY\アドイン名.xlam
aPC,bPCの場合は違うのでうまくいかない

>自動で自PCのアドインを参照させたいのですが
そのようなオプションがあれば良いのですが 詳しくはありません

対象のブックがマクロ有効ブックならVBAでリンクを書き換えることも出来ますが・・・

アドイン内にリンクアドレス書き換えのコードを入れリボンなどにマクロ呼び出しボタン(更新)を設置し押させるのも出来るかな・・
これなら C:\Users\ユーザー名\AppData\Roaming\Microsoft\AddIns
内に設置してもユーザー名を書き換えればOKなので通常ブックから実行できる

第三のブックから対象のブックのブックリンクを書き換える処理を書いてみましたが ①で対応できると思いますのであまり意味が無いように思えます
以下は趣味の範疇です

第三ブックの標準モジュール

Option Explicit

#If Win64 Then
Private Declare PtrSafe Function GetInputState Lib "USER32" () As LongPtr 'DoEvents
#Else
Private Declare Function GetInputState Lib "USER32" () As Long
#End If

Sub add_inLinkSources_Change()
'ユーザー定義関数アドインリンクアドレス
'C:\Users階層のログオンユーザー名フォルダ名を変更
'通常インストール環境を想定
Dim adinName As String
Dim i As Long, j As Long
Dim targetBook As Workbook
Dim vLinks As Variant
Dim strLinkName As String
Dim NewLinkPath As String

adinName = "アドインファイル名" '実アドインファイル名に変更

With Application.FileDialog(msoFileDialogOpen)
.Filters.Clear
.Filters.Add "Excelファイル", "*.xls*"
.InitialFileName = ThisWorkbook.Path
.AllowMultiSelect = False
If .Show = True Then
Set targetBook = Workbooks.Open(Filename:=.SelectedItems(1), UpdateLinks:=0)
Else
Exit Sub
End If
End With

With targetBook
vLinks = .LinkSources(xlExcelLinks) 'EXCEL(アドイン)リンク
'LinkSourceが無い場合抜ける
If Not IsArray(vLinks) Then Exit Sub
On Error Resume Next
For i = 1 To UBound(vLinks)
strLinkName = vLinks(i)
'リンクアドレスにアドインファイル名が有ったらリンクアドレスを変更
If InStr(strLinkName, adinName) > 0 Then
Dim tmp
tmp = Split(strLinkName, "\")
'2番目のフォルダ名をログオンユーザー名に置き換え
NewLinkPath = Replace(strLinkName, tmp(2), Environ("USERNAME"))
.ChangeLink Name:=strLinkName, NewName:=NewLinkPath
End If
Next i
Err.Clear
If GetInputState() Then DoEvents
.Close SaveChanges:=True
End With
Set targetBook = Nothing

End Sub

コードを第三ブックでなく アドインブックに入れた場合の例
右クリックボタンで実行
 
アドインブックThisWorkbookモジュール

Option Explicit
Const conAddinName As String = "Addin更新"
'アドインファイルが開かれた際に実行
Private Sub Workbook_Open()
Call Check_Addin
With Excel.Application
'セルの右クリックメニューへの登録
With .CommandBars("Cell").Controls.Add(Temporary:=True)
.FaceId = 59 'ボタンアイコン
.BeginGroup = True
.Caption = conAddinName '表示
.OnAction = "add_inLinkSources_Change" '実行するマクロ
End With
End With
End Sub

Private Sub Check_Addin() '既にコマンドがあればそれを削除
Dim objCC As CommandBarControl
With Excel.Application.CommandBars
With .Item("Cell")
For Each objCC In .Controls
If objCC.Caption = conAddinName Then .Controls.Item(conAddinName).Delete
Next
End With
End With
End Sub

Private Sub Workbook_AddinUninstall() 'アドインの組み込み解除時に実行
Call Check_Addin
End Sub

標準モジュール(第三のブックからの添削)
Sub add_inLinkSources_Change()
Dim adinName As String
Dim i As Long, j As Long
Dim targetBook As Workbook
Dim vLinks As Variant
Dim strLinkName As String
Dim NewLinkPath As String

adinName = ThisWorkbook.Name
Set targetBook = ActiveWorkbook
With targetBook
vLinks = .LinkSources(xlExcelLinks)
'LinkSourceが無い場合抜ける
If Not IsArray(vLinks) Then Exit Sub
On Error Resume Next
For i = 1 To UBound(vLinks)
strLinkName = vLinks(i)
If InStr(strLinkName, "Program Files") = 0 Then
If InStr(strLinkName, adinName) > 0 Then
Dim tmp
tmp = Split(strLinkName, "\")
NewLinkPath = Replace(strLinkName, tmp(2), Environ("USERNAME"))
.ChangeLink Name:=strLinkName, NewName:=NewLinkPath
End If
End If
Next i
Err.Clear
End With
Set targetBook = Nothing
End Sub
    • good
    • 0
この回答へのお礼

ありがとう

ご回答ありがとうございます!

>アドインの保存先をユーザーフォルダではなくライブラリにするとパスが付かないという情報があったので移動させてみましたが、関数入力時はうまくいってもExcelを開き直すとまたパスが付いているという同じ現象です。

これはやはりバグなんでしょうか?
他のアドインを削除してやり直すのも何度も試みたのですがダメでした。

リンクを書き換える処理、ありがとうございます。
素晴らしいですね。私にはここまで作れないです。
参考にさせていただきます!

お礼日時:2024/06/27 21:06

私は詳しくなく、回答ではありませんが…


>送信元のPCのアドインファイルのパスが表示され、
自身のアドインファイルのパスと異なりますか?
もし異なるなら合わせてみる価値は有りますね。

>できれば自動で…
>そもそも何か手順が間違っていますでしょうか。
想定されていない使い方のようなので、模索しないといけないですね。
    • good
    • 0
この回答へのお礼

ありがとう

コメントありがとうございます!
現在まだまだ模索中です。

アドインファイルのパスは間違っておらず、試しにパス部分を消すと#NAME?エラーになります。

アドイン設定も正しくアドインを参照してそうなのですが、「参照」からもう一度繋ぎ直してみると、パスが消えて正常に動きます。

しかしExcelを一度閉じて開き直すとまたパスが表示されてリンクエラーを起こしてしまいます。

アドインの保存先をユーザーフォルダではなくライブラリにするとパスが付かないという情報があったので移動させてみましたが、関数入力時はうまくいってもExcelを開き直すとまたパスが付いているという同じ現象です。

バグってるのかよくわかりませんが、もう少し模索してみます。

お礼日時:2024/06/25 12:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A