こんにちは。
予想した以上に難しいですね。
とりあえず自宅の環境(64Win7/64XL2010)でようやく結果が出るもの
が書けたので参考として上げておきます。
しかし、やはり検証するだけの体力、時間、環境がありません。
私の感覚では10%程度の出来ですが、継続的に開発するのは難しいので、
ヒントにでもなれば、という思いで提示するものです。
私のこのレスは前スレへのレスです。
(#1の補足欄に書かれていることを文面通りに捉えると協力しにくい印象はありますね)
今のところ私はレジストリを書き換える以外の方法は考えられていません。
いつかパッと閃いて呆気ない程簡単な方法が見つかることを夢見たりする程冗長ですが、
部分的なパーツは色々流用できるかと思うので、参考になれば幸甚です。
' ' 〓〓〓〓〓〓〓〓〓〓標準モジュール専用〓〓〓〓〓〓〓〓〓〓
Option Explicit
Sub MoveAddInC()
Const S_ADD_IN_NAME = "MyAdd"
Const S_NEW_PATH = "移動先パス\" ' ←指定
Const S_FNM_SCRIPT = "AMover.vbs"
Dim arrLinks
Dim curAddIn As Excel.AddIn
Dim adn As Excel.AddIn
Dim wbk As Workbook
Dim sCurFullName As String
Dim sNewFullName As String
Dim sAppVer As String
Dim sScript As String
Dim i As Long
Dim nFf As Integer
Dim flgEsc As Boolean
' ' ========== Workbooks の準備 ==========
' ' ==================== ご自分で書いてください =================
' ' "AddInを参照しているブック"を すべてを開きます。
' ' Excel.Application の終了準備の為、
' ' 開いているブック(アドイン含む)(当マクロを登録したブック含む)
' ' すべて、.Saved = True の状態にしてください。
' ' ここで開かずに漏れてしまった"AddInを参照しているブック"
' ' については、後から手作業でリンクを書き直さなければなりません。
' ' なので、ここの記述、重要!!です。(他人には書けませんし)
' ' 尚、実行後、AddInを元のフォルダに戻すように再実行する前提なら、
' ' 当マクロを登録したブックが"AddInを参照しているブック"ならば、
' ' ブック単独でテスト可能です。
' ' → Const S_NEW_PATH = "元あったフォルダパス\"
' ' ===============================================================
On Error Resume Next
Set curAddIn = AddIns(S_ADD_IN_NAME)
On Error GoTo 0
If Err.Number Then
MsgBox "アドイン見つからないよ!"
Exit Sub
End If
sCurFullName = curAddIn.FullName
sNewFullName = S_NEW_PATH & curAddIn.Name
If sCurFullName = sNewFullName Then
MsgBox "引越済?"
Exit Sub
End If
' ' ========== AddIn コピー(外部からの操作で 原本を残したまま移動) ==========
CreateObject("Scripting.FileSystemObject").CopyFile sCurFullName, sNewFullName
' ' ========== AddIn アンインストール ==========
curAddIn.Installed = False
' ' ========== 各ブック毎にリンク先を新しいAddInに変更して保存 ==========
For Each wbk In Workbooks
arrLinks = wbk.LinkSources(xlExcelLinks)
If Not IsEmpty(arrLinks) Then
For i = 1 To UBound(arrLinks)
If arrLinks(i) = sCurFullName Then Exit For
Next i
' ' リンクされているブックだと確認できたら
If i <= UBound(arrLinks) Then
wbk.ChangeLink sCurFullName, sNewFullName, xlExcelLinks
wbk.Save
End If
End If
Next
' ' ========== AddIn インストール ==========
curAddIn.Installed = True
Set curAddIn = Nothing
' ' ========== Application.Version 取得 ==========
sAppVer = Format(Val(Application.Version), "0.0")
' ' ========== VBScript 作成 ==========
' ' ----- スクリプト合成 -----
sScript = "Dim cn" & vbCrLf & "Dim sRtn" & vbCrLf & _
"Const sRoot = ""HKEY_CURRENT_USER\Software\Microsoft\Office\" _
& sAppVer & "\Excel\Options\OPEN""" & vbCrLf & _
"GetObject(, ""Excel.Application"").Quit" & vbCrLf & _
"WScript.Sleep 100" & vbCrLf & _
"On Error Resume Next" & vbCrLf & _
"With CreateObject(""WScript.Shell"")" & vbCrLf & _
"cn = 0" & vbCrLf & _
"Do" & vbCrLf & _
"If cn > 0 Then" & vbCrLf & _
"sRtn = .RegRead(sRoot & cn)" & vbCrLf & _
"If Err <> 0 Then Exit Do" & vbCrLf & _
"If sRtn = """"""" & sCurFullName & """"""" Then" & vbCrLf & _
".RegWrite sRoot & cn, """"""" & sNewFullName & """""""" & vbCrLf & _
"Exit Do" & vbCrLf & "End If" & vbCrLf & "End If" & vbCrLf & _
"cn = cn + 1" & vbCrLf & "Loop" & vbCrLf & "End With" & vbCrLf & _
"MsgBox """ & sCurFullName & """ & vbLf & "" ↓"" & vbLf & """ & _
sNewFullName & """ & vbLf & "" 引越完了"" & vbLf & vbLf & ""Comments as U Like""" & vbCrLf & _
"CreateObject(""Scripting.FileSystemObject"").DeleteFile """ & sCurFullName & """" & vbCrLf & _
"CreateObject(""Scripting.FileSystemObject"").DeleteFile """ & S_FNM_SCRIPT & """"
' ' ----- VBSファイル出力 -----
nFf = FreeFile()
Open S_FNM_SCRIPT For Output As #nFf
Print #nFf, sScript;
Close #nFf
' ' ========== VBScript 実行 ==========
Shell "wscript """ & S_FNM_SCRIPT & """"
End Sub
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
VBSの内容は、前スレで紹介したリンク先のコードの応用です。
レジストリを操作するものですから、扱いは慎重に。
ご相談やご質問があればお応えするつもりですが、
次に手を加えるのはだいぶ先になることと思います。
頑張ってください。それでは、また。
補足
何度もありがとうございます。 いただいたコードを理解するには私も膨大な時間が必要そうです。 ただ、レジストリを書き換えるとなると腰が引けてしまいます。対象となる環境は OSが Xp/Win7 Excelが 2003/2010 と組合せが4通りありますので。 既存ブックのリンク切り替えについては、メニューにアドインを組み込むことで対応できると思うのですが、とにかくアドインを引っ越さないことには、それも無理な話です。 > いつかパッと閃いて呆気ない程簡単な方法が見つかることを夢見たりする 色々と試してはみているのですが...手動でできることなのになんでマクロでできないのか。そもそもなんで Addins.Add と逆の動作をするメソッドが準備されていないのでしょうね(きっと複雑な事情があるんでしょうが)。