いったん解決したと思ったのですが、何度もテストしている間にグチャグチャになってしまっていたらしく、再起動してからクリーンな状態で検証するとダメでした。
http://oshiete.goo.ne.jp/qa/8026813.html
申し訳ありませんが、再掲いたします。
Excelのアドインファイルを移動する必要が出てきたのでVBAで移動させようとしています。
VBAは、アドインとは別のExcelファイルにコーディングしています。
アドインファイル名は MyAdd.xla とします。
MyAdd.xla を新フォルダに移動させることはできましたが、参照元の変更がうまくできません。
設定するPCの台数が多いので、自動で処理したいのです。
よろしくお願いします。
AddIns("MyAdd").Installed = False
AddIns.Add Filename:= "新フォルダパス\MyAdd.xla"
AddIns("MyAdd").Installed = True
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
すみません。
編集ミスに気が付きました。VBAコード冒頭の
On Error GoTo 0
は、直後の
End if
の下の行にあるべきですね。
失礼しました。
No.4
- 回答日時:
こんにちは。
予想した以上に難しいですね。
とりあえず自宅の環境(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 と逆の動作をするメソッドが準備されていないのでしょうね(きっと複雑な事情があるんでしょうが)。
No.3
- 回答日時:
>Excelのアドインファイルを移動する必要が出てきたのでVBAで移動させようとしています。
できないとは言わないけれども、インストールプログラムを作ると同じことではありませんか?
つまり、物理的にファイルを移動して、その後で、VBAでレジストリを書き換えるという意味ですよね。それよりも、インストールした後、手動でしたほうが楽だと思いますが。
前回の紹介されていたサイト(http://www.excel.studio-kazu.jp/kw/2011092118361 …にも、削除する側が出ていますから、逆をすればよいのは分かります。しかし、Excelのアプリ側に、手動ですが、移動して見失うとメッセージが出て、表示を削除し再登録ができたはずですね。
なお、ユーザーアドインの場所は、一般的には規定の位置にきまっているはずです。
Win7 でしたら、
Application.UserLibraryPath
ということで、
C:\Users\[UserName]\AppData\Roaming\Microsoft\AddIns\
のはずです。レジストリ未登録とか、違ったままでもできるとは思うですが、使うたびに、アドインを、Run で呼び出しをするのは、かなり面倒ではないかと思うのです。
以下のリンク先は、どうも中途半端な内容で要領を得ませんでしたが、カスタム・アドインのインストール方法が出ていますが、この文章だけでは終わらないようです。
http://msdn.microsoft.com/library/office/aa16495 …
アプリケーションの固有のアドインの配置について(英語)
(Deploying Application-Specific Add-ins)
SHGetSpecialFolderLocation,
SHGetPathFromIDList,
SHGetMalloc
Sampleファイルが、VB6にはあるように書かれています。
この3つのWin APIとDLLを使えというようです。
http://office.microsoft.com/ja-jp/excel-help/HP0 …
ここでは、手動の説明しかありませんしね。
>アクセス権限を変更することも管理者から許可されていません
#2さんが先にかかれてしまいましたが、それでは、もともと無理なのではありませんか?
この回答への補足
ありがとうございます。
最悪手動も考えているのですが、XL2010 では開発環境を表示するところから説明しなければならず、末端ユーザには荷が重いのです。
末端ユーザは、アドインに収録されたユーザ定義関数を使った帳票を使うだけなのです。
No.2
- 回答日時:
回答しましたBIGNISHIです。
回答に対する返信で、質問の内容が理解できました。
先程回答した内容は的外れで申し訳ありませんでした。
質問の内容は、”アドインモジュールをローディングする際に、Excel規定外のホルダーからローディングするための
方法はどうするのか”とのことだと思います。
御社の情報管理規則から推測しますには、自作・他作を問わず認可されていないモジュール(プログラム)をインストール
する事は、出来ないのではないかと思います。
ご質問案件を実現するには先ず、インストールするアドインモジュールのインストール許可を受けることが最善と考えます。
例え、別手順でインストール対応のプログラム(方法)を準備したとしても、セキュリティの上からも認可されていない
プログラムやアドインモジュールをインストールすることは出来ないのではないでしょうか。
以上
この回答への補足
ありがとうございます。
アドインには業務に使用するユーザ定義関数をまとめてあります。
XpのExcel規定フォルダは C:\Documents and Settings\ユーザーアカウント名\Application Data\Microsoft\Addins ですが、ここにアドインを保存すると、ユーザ定義関数を使ったブックを他の人に配布した時にリンクが切れてしまいます(配布先にもアドインが設定されているという前提で)。
それを回避するため C:\Program Files\Microsoft Office\Office12\Library に保存することを検討していたのですが、Win7ではこのフォルダもシステム管理下になっているとわかり、打つ手がなくなった次第です。
調べたところ、隠しフォルダですが Win7の C:\ProgramData の下は書き込み可能と判りました。
Xp側には C:\ProgramData を作成し、双方で同じフォルダ名を使用できる環境を作るのが目的です。
No.1
- 回答日時:
回答例
単にアドインファイル(Excel)をコピー(移動)するのであれば、下記の方法で問題無くコピーできると思います。
但し、
質問内容に記載されている、Addins("My.......)・・・・とコピーの関連及び運用方法やExcelのバージョン等が
不明の為、参考例として記載しております。
------------<>--------------------------------------
Option Explicit
Dim SndNM, RcvNm As String
Sub CopyTest()
SndNM = "d:\????????????.xla" :コピー元のファイルを指定
RcvNm = "c:\----------.xla" :コピー先のファイルを指定
'--
FileCopy Source:=SndNM, Destination:=RcvNm
End Sub
以上
この回答への補足
ありがとうございます。
MyAdd.xla の移動まではできていますが、Excel側でアドインの参照先を変更するのがうまくできません。
現在 Xpですが Win7 に移行するため、アドインの保存先を変更しなければなりません。現在のアドインフォルダが C:\直下にあるのですが、Win7 ではそこへのアクセスが許可されていません。
アクセス権限を変更することも管理者から許可されていません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Excel(エクセル) ファイル一覧表を使ったファイルの移動 5 2022/08/10 15:37
- Excel(エクセル) 【マクロ】フォルダAからダBへファイルを、ファイルの更新日時の条件で、1つづつ移動するには? 3 2022/08/25 09:56
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) VBAでArrayListを使う為の「mscorlib.tlb」の参照設定について 3 2022/03/23 19:45
- Excel(エクセル) フォルダAから1つのファイルだけを、フォルダBへを移動するVBAについて 2 2022/07/25 11:45
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Excel(エクセル) 【VBA】フォルダAにある2つのファイルの内1つを、フォルダBへ。もう1つを、フォルダBへ移動したい 6 2022/07/26 08:51
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでArrayListを使う為の「msc...
-
発行元:不明???
-
ExcelCreatorについて
-
VBの文字化け
-
VB.NET で作られたソフト...
-
Excelがインストールされてない...
-
VB.NETでSPREADの設定方法
-
VB6(SP5)+OO4OでCreateObjectが...
-
ビルドした.exeファイルは.NE...
-
CGIをわかりやすく作成できるソ...
-
Microsoft Visual C++ をアンイ...
-
う~ん…。
-
[VB.net] ExcelへのQRコード出...
-
chatgpt 4oを使っています。あ...
-
vba 時間の引き算 例えば 15:00...
-
アウトルックが起動しているか...
-
VB.Net リビルド 意味不明なメ...
-
VBAでOutlookを終了させたい Ex...
-
意味不明の実行時エラーで困っ...
-
Windows PowerShellでC言語を実...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでArrayListを使う為の「msc...
-
VB6(SP5)+OO4OでCreateObjectが...
-
[VB.net] ExcelへのQRコード出...
-
VB.NETでSPREADの設定方法
-
う~ん…。
-
Product Codeの変更法は?
-
発行元:不明???
-
次のクラスは登録されていませ...
-
ビルドした.exeファイルは.NE...
-
ListViewで文字化けしてしまい...
-
MSDNのセットアップ方法(ヘル...
-
VB6.0で作成したexeファイルが...
-
VB6で作成したアプリを配布する...
-
VB.NET で作られたソフト...
-
VB.NET(2017)で インストーラを...
-
OLEPRO32.DLLが見つかりません
-
accessがインストールされてい...
-
Excel 12.0とExcel 10.0両方を...
-
Excelがインストールされてない...
-
VB6のアプリケーションの配布
おすすめ情報