Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2010)
ActiveX コンポーネントはオブジェクトを作成できません。
投稿日時: 18/06/13 23:54:35
投稿者: こた2

初めて投稿させて頂きます。
普段使用しているエクセルマクロがある時、下記エラー画が出ていきなり使用できなくなりました。
 
エラー:ActiveX コンポーネントはオブジェクトを作成できません。: 'Scripting.FileSystemObject'
 
エラーとなるコードは以下になります。
Set objFso = CreateObject("Scripting.FileSystemObject")
 
他のPCで実行した場合問題なく動作しました。
いろいろ調べ下記を試してみましたが、結果は変わりませんでした。
最近PCに起きた変化といえばWindowsUpdateくらいです。
 
(1)
regsvr32.exe /u scrrun.dll
regsvr32.exe scrrun.dll
このコマンド自体はエラーにならなかったのですが、結果は変わらず。
「scrrun.dll」は「Windows\systemu32\」にあります。
 
(2)
参照設定にて「Microsoft Scripting Runtime」にチェックを入れる。
実行しても結果は変わらず。
 
コードを以下のように変更した場合、
Dim fso As FileSystemobject
Set fso = New FileSystemobject  ←この行で同様なエラー
 
・環境
Windows 7 32bit
Excel2010
 
どなたか、解決方法を教えて頂けないでしょうか?
よろしくお願い致します。

回答
投稿日時: 18/06/14 09:46:19
投稿者: Suzu

こんにちは。
 
問題の発生するファイルですが、
 VBAのコンパイルは実行でき、問題なく終了しますか?
 
参照設定 で参照不可 となっている項目はありませんか?
 

引用:
他のPCで実行した場合問題なく動作しました。

その「他のPC」は、問題の発生するPCと同一の
 ・OS(bit数も含め)
 ・Office(bit数も含め)
なのでしょうか。
 
 
エラー メッセージ "ActiveX コンポーネントはオブジェクトを作成できません" が、Access を使用しているときに表示される
https://support.microsoft.com/ja-jp/help/319844/you-receive-a-activex-component-can-t-create-object-error-message-when
 
Accessのコンテンツですが、問題の根本としては変わらないです。
【ActiveX コンポーネント を作成する際に、きちんと レジストリを参照できるか】
  (無効な参照が含まれていないか 参照には、参照設定や、ウィザードやアドイン、ライブラリ等を含む)
 
 
他のマシン(問題の発生するマシンより新しいOfficeの含まれたマシン)にて VBAの上書き保存を行った場合
参照設定を行っているライブラリが そのマシンの最新の物となります。
 
最新の参照設定を行ったファイルを、その参照設先の物より古い物しかないマシンにて開いた場合
参照不可となってしまいます。
 
今回参照設定を行っている 「Microsoft Scripting Runtime」が参照不可となっていなくとも
他のライブラリが 参照不可となっている場合、問題が発生します。
 
なので、参照不可が参照設定の中にあってはダメです。

投稿日時: 18/06/14 12:57:01
投稿者: こた2

ご回答ありがとうございます。
  
まず、コンパイルについては問題なく終了しております。
また、参照設定については、現在、以下を設定しておりますが、いずれも参照不可ではないことを確認しております。
・Visual Basic For Application
・Microsoft Excel 14.0 Object Library
・Microsoft Office 14.0 Object Library
・Microsoft Forms 2.0 Object Library
・Microsoft Scripting Runtime
  
他のマシンについてはすべて以下になります。
数台で試しましたが、問題なく実行できました。
Windows7 Professional (32ビット)
Office2010 ver14.0.728.5000(32ビット)
  
今回エラーとなる端末のofficeの再インストールも実施しましたが、結果は変わりませんでした

回答
投稿日時: 18/06/15 10:24:05
投稿者: Suzu

引用:
まず、コンパイルについては問題なく終了しております。
また、参照設定については、現在、以下を設定しておりますが、いずれも参照不可ではないことを確認しております。

 
承知しました。
 
 
引用:
他のマシンについてはすべて以下になります。
数台で試しましたが、問題なく実行できました。
Windows7 Professional (32ビット)
Office2010 ver14.0.728.5000(32ビット)
  
今回エラーとなる端末のofficeの再インストールも実施しましたが、結果は変わりませんでした

 
となると、エラーとなるのは、1台のみという事でしょうか。
その1台に対し、Officeの再インストールを行っても、同様のエラーが発生する。
という事ですね。
 
という事は、そのマシン特有の問題。
Office再インストールで修復できなかったという事は、Windowsの再インストール。。。が早そう。。
 
っと、、その前に
メモ帳開いて
 
WScript.Echo CreateObject("Scripting.FileSystemObject").GetParentFolderName("C:\Windows")
 
をコピペして貼り付け、
TEST.vbs の名前で デスクトップに貼付、ダブルクリック実行してみてください。
 
多分。。。エラーになるのかな。。確認結果を教えてください。

投稿日時: 18/06/15 18:41:29
投稿者: こた2

度々のお返事ありがとうございます。
 

引用:
となると、エラーとなるのは、1台のみという事でしょうか。
その1台に対し、Officeの再インストールを行っても、同様のエラーが発生する。
という事ですね。

 
はい。その通りです。
 
引用:
WScript.Echo CreateObject("Scripting.FileSystemObject").GetParentFolderName("C:\Windows")
  
をコピペして貼り付け、
TEST.vbs の名前で デスクトップに貼付、ダブルクリック実行してみてください。

 
エラー:ActiveX コンポーネントはオブジェクトを作成できません。: 'Scripting.FileSystemObject'
 
とでました。
他の端末で実施した際には
ポップアップが出力し、「C:\」と表示されました。

回答
投稿日時: 18/06/16 11:46:22
投稿者: mattuwan44

http://chiroinu.freehostia.com/wordpress/?p=166
 
こういうのは、違いますかね?

回答
投稿日時: 18/06/16 17:23:20
投稿者: MMYS

以下のコードだと、どうなりますか。
 

    Option Explicit
Sub test()
    Dim o As Object
    Set o = CreateObject("new:0D43FE01-F093-11CF-8940-00A0C9054228")
    MsgBox o.GetParentFolderName("C:\Windows")
    Set o = Nothing
End Sub

 
考えられる原因は
・DLLのパスがおかしい。
・DLLが破損している。
・レジストリがおかしい。
このあたりが考えられます。
 
以下は自己責任でお願いします。
 
VBAの参照設定でDLLの場所がおかしい
http://outside6.wp.xdomain.jp/2016/08/07/post-539/
 
WSHのCreateObject関数の引数のCOM識別子「ProgID」「CLSID」(GUID)とは何なのか解説。Windows内のActiveXオブジェクトを一覧表示して確認するコマンド
http://computer-technology.hateblo.jp/entry/2016/01/06/WSH%E3%81%AECreateObject%E9%96%A2%E6%95%B0%E3%81%AE%E5%BC%95%E6%95%B0%E3%81%AECOM%E8%AD%98%E5%88%A5%E5%AD%90%E3%80%8CProgID%E3%80%8D%E3%80%8CCLSID%E3%80%8D%EF%BC%88GUID%EF%BC%89%E3%81%A8
 
WSHから見たCOMの基礎とレジストリ
https://moz-addon.g.hatena.ne.jp/ZIGOROu/20071015/1192454217
 
 
 

回答
投稿日時: 18/06/18 10:14:10
投稿者: Suzu

モジュール"scrrundll"は読み込まれましたが、
DllUnregisterServer への呼び出しはエラーコード
0x8002801c により失敗しました。
 
 

引用:
エラー:ActiveX コンポーネントはオブジェクトを作成できません。: 'Scripting.FileSystemObject'
 
とでました。
他の端末で実施した際には
ポップアップが出力し、「C:\」と表示されました。

 
了解しました。
 
もう一個だけコード実行してみてください。
 
IEを起動して、モーグを開きます。
 
TEST2.vbs
------------------------------------------------------------
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate "www.moug.net"
------------------------------------------------------------
 
これが実行できるなら、呼び出しは問題なく、
Scripting.FileSystemObject (Scrrun.dll) またはその登録に問題がありそう。。
 
登録の部分は
引用:
regsvr32.exe /u scrrun.dll
regsvr32.exe scrrun.dll
このコマンド自体はエラーにならなかったのですが、結果は変わらず。
「scrrun.dll」は「Windows\systemu32\」にあります。

で否定できそうですが。。。
 
当方テストしてみたところ登録解除で、エラーになりました。
もちろん、コマンドプロンプトは管理者で。。。
原因が判らない。。OS 7Homeだったからなのか。。
 
単体の scrrun.dll が入手できるのか。。古いのなら記事があるのですが最近のは
見つける事ができませんでした。
 
Scrrun.dll は IEのインストール時に一緒にインストールされます。
IEのバージョンは何でしょうか? IE古いのであればアップグレードしてみてはどうでしょう。

投稿日時: 18/06/19 09:03:20
投稿者: こた2

mattuwan44 さんの引用:
http://chiroinu.freehostia.com/wordpress/?p=166
 
こういうのは、違いますかね?

 
mattuwan44様
 
ありがとうございます。
試してみましたが、結果は変わりませんでした。
 
 
MMYS さんの引用:
以下のコードだと、どうなりますか。
 
    Option Explicit
Sub test()
    Dim o As Object
    Set o = CreateObject("new:0D43FE01-F093-11CF-8940-00A0C9054228")
    MsgBox o.GetParentFolderName("C:\Windows")
    Set o = Nothing
End Sub


 
 
 
MMYS様
ありがとうございます。
結果は同様なエラーでした。
 
レジストリについて少し調べてみましたが、他のマシンと比べて異なる点がありました。
まず、問題なく動作する他のマシンですが、
@HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}  データ「FileSystem Object」
AHKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228} データ「FileSystem Object」
 
 それぞれこの下に4つのキーがあり、
 InprocServer32  データ:「C:\Windows\system32\scrrun.dll」
 ProgID データ:「Scripting.FileSystemObject」
 TypeLib データ:「{420B2830-E718-11CF-893D-00A0C9054228}」
 Version データ:「1.0」
 
 このような状態です。 
 
 
しかし、私のマシンではこの様になっておりました。
 
@HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}  データ「FileSystem Object」
AHKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228} データ「FileSystem Object」
 
 ここまでは一緒ですが、この下にはキーがありませんでした。
 代わりに
 
BHKEY_LOCAL_MACHINE\SOFTWARE\Volatile\00\MACHINE\SOFTWARE\Classes\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228} データ「FileSystem Object」
 
 この下に1つだけキーがありました。
 InprocServer32  データ:「C:\Windows\system32\scrrun.dll」
 
 
なぜこの様になっているかはわからず、
また、レジストリについてはよく理解していないので、問題あるかどうかはわかりませんでした。
 
 
Suzu様
 
ありがとうございます。
TEST.vbsは問題なく起動します。もちろん全て管理者権限で実施しております。
やはりscrrun.dllの登録の状態が良くないのではと思っておりますが解決には至らず。。。
なおIEのバージョンは11です。他のマシンも同じです。
 
 

回答
投稿日時: 18/06/20 00:14:59
投稿者: MMYS

先に掲示したリンク先に下記の記述があります。
 
>(5)ProgIDからCLSIDに変換し,それをさらにDLLのファイルパスに変換する
>
> プログラム中で「ProgID」をまず指定してやれば,
> それを手がかりにしてレジストリの情報を辿ってゆき,
> 呼び出すべきDLLのファイルパス(COMの実体のありか)を知ることができる。
> というわけだ。

つまり、レジストリに参照すべきDLLの記述がなければエラーになると思います。
また、レジストリ情報を見る限り、
  
regsvr32.exe /u scrrun.dll
regsvr32.exe scrrun.dll
  
は正常にレジストリに登録出来ていない可能性が高いです。
  
  
レジストリが2箇所ある理由は
参照設定とCreateObjectは参照するレジストリが別物みたいです。
http://thom.hateblo.jp/entry/2016/01/31/044639
  
  
.Net系言語でCOMインターフェイスを自作が出来ます。(ExcelVBAなどから使う)
そのあたりを勉強されるとなんとなくそのあたりの仕組みがわかりますし、
今回のエラーの原因も推測出来かも。

投稿日時: 18/06/22 19:32:57
投稿者: こた2

本件解決いたしました。
 

引用:

@HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}  データ「FileSystem Object」
AHKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228} データ「FileSystem Object」
  
 それぞれこの下に4つのキーがあり、
 InprocServer32  データ:「C:\Windows\system32\scrrun.dll」
 ProgID データ:「Scripting.FileSystemObject」
 TypeLib データ:「{420B2830-E718-11CF-893D-00A0C9054228}」
 Version データ:「1.0」

 
このキーが私の端末にはなかったのですが、
この部分追加しました。権限がなかったので、権限を与えたうえで。
 
そうしましたら、エラーとなっていたプログラムが無事に動きました。
いろいろとご教授くださりありがとうございました。