[[20190905184045]] 『拡張子を変更したらエラーが起きる』(あみ) ページの最後に飛ぶ

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

 

『拡張子を変更したらエラーが起きる』(あみ)

プログラミングの知識はほぼ無いと思ってください。

xlsmの拡張子のファイルでVBAを書いていましたがテンプレート形式のxltmで作り直そうとしましたが、xltmの拡張子だとうまく動きませんでした。
やり方としては下記になります。
・標準フォームに全てコードを書いていたのでそちらをエクスポート
・テンプレート形式のxltmを新規で作成しインポート
・コード内でFileSystemObjectのオブジェクトを使用しているためツールの参照設定から『Microsoft Scripting Runtime』のチェックを付けました。
・実行すると『vba ユーザー定義型は定義されていません』と表示されました。
・(蛇足でいらない情報かもしれないです)もともとコードを入力しており正常に動いていたxlsmの拡張子のファイルの参照先のチェックとテンプレート形式のxltmの参照先のチェックを比較すると、テンプレート側のxltmの方でチェックが付いていない部分がありましたのでチェックを付けて実行しみたらツリービューは表示されました。しかしUpdateButtonを実行すると『Set TargetNode = TreeView.Nodes.Add(, , , TargetFolder)』で型が一致しないとエラーが起きました。

コードは下記になります。
文章を書くのが下手で理解に申し訳ありませんが分かる方いらっしゃいましたら回答をよろしくお願いいたします。

Option Explicit

Private Sub UpdateButton_Click()

    Dim Fso          As FileSystemObject
    Dim TargetFolder As Folder
    Dim TargetNode   As Node
    Set Fso = New FileSystemObject

    TreeView.Nodes.Clear
    '指定のフォルダー名を取得
    Set TargetFolder = Fso.GetFolder("C:\Users\Tanaka\Desktop\フォルダ")
    '指定フォルダーのフルパスを取得
    Set TargetNode = TreeView.Nodes.Add(, , , TargetFolder)
    '指定フォルダー内のファイル及びサブフォルダーを取得
    Call sFolderSearch(TreeView, TargetNode, TargetFolder)
    Set Fso = Nothing

End Sub

Private Sub sFolderSearch(ByVal MyTreeView As TreeView, _

                          ByVal MyNode As Node, ByVal MyFolder As Folder)
    Dim mySubFolder As Folder
    Dim myFile      As File
    Dim ChildNode   As Node
    Dim filenode As Node
    'サブフォルダーを取得
    For Each mySubFolder In MyFolder.SubFolders
        'フォルダーをツリー表示
        Set ChildNode = MyTreeView.Nodes.Add(MyNode, tvwChild, , mySubFolder.Name)
        'サブフォルダーがある場合再帰的に繰り返す
        Call sFolderSearch(MyTreeView, ChildNode, mySubFolder)
    Next mySubFolder
    '現在のフォルダー内のファイルを取得
    For Each myFile In MyFolder.Files
        'ファイルをツリー表示
        Set filenode = MyTreeView.Nodes.Add(MyNode, tvwChild, , myFile.Name)
        filenode.BackColor = RGB(255, 255, 0)
    Next myFile
End Sub

< 使用 Excel:Office365、使用 OS:Windows10 >


テンプレート形式での運用をやめて、読み取り専用にしておくだけではだめですか。

(マナ) 2019/09/05(木) 19:52


Late bindingでどうなりますか。
こんな感じで。

 Dim Fso As Object
 Dim tv As Object

 Set Fso = CreateObject("Scripting.FileSystemObject")
 Set tv = UserForm1.Controls.Add("MSComctlLib.TreeCtrl")

(マナ) 2019/09/05(木) 20:45


これで試してみてください。

 Option Explicit

 Dim tv As Object

 Private Sub UserForm_Initialize()

    Set tv = UserForm1.Controls.Add("MSComctlLib.TreeCtrl")

    tv.Top = 10
    tv.Left = 10
    tv.Width = 200
    tv.Height = 400

 End Sub

 Private Sub CommandButton1_Click()
    Dim Fso          As Object
    Dim TargetFolder As Object
    Dim TargetNode   As Object

    Set Fso = CreateObject("Scripting.FileSystemObject")

    tv.Nodes.Clear
    '指定のフォルダー名を取得
    Set TargetFolder = Fso.GetFolder("C:\Users\Tanaka\Desktop\フォルダ")
    '指定フォルダーのフルパスを取得
    Set TargetNode = tv.Nodes.Add(, , , TargetFolder)
    '指定フォルダー内のファイル及びサブフォルダーを取得
    Call sFolderSearch(tv, TargetNode, TargetFolder)
    Set Fso = Nothing
 End Sub
'
 Private Sub sFolderSearch(ByVal MyTreeView As Object, _
                          ByVal MyNode As Object, ByVal MyFolder As Object)
    Dim mySubFolder As Object
    Dim myFile      As Object
    Dim ChildNode   As Object
    Dim filenode As Object
    Const tvwChild = 4
    'サブフォルダーを取得
    For Each mySubFolder In MyFolder.SubFolders
        'フォルダーをツリー表示
        Set ChildNode = MyTreeView.Nodes.Add(MyNode, tvwChild, , mySubFolder.Name)
        'サブフォルダーがある場合再帰的に繰り返す
        Call sFolderSearch(MyTreeView, ChildNode, mySubFolder)
    Next mySubFolder
    '現在のフォルダー内のファイルを取得
    For Each myFile In MyFolder.Files
        'ファイルをツリー表示
        Set filenode = MyTreeView.Nodes.Add(MyNode, tvwChild, , myFile.Name)
        filenode.BackColor = RGB(255, 255, 0)
    Next myFile

 End Sub

(マナ) 2019/09/05(木) 20:58


 >実行すると『vba ユーザー定義型は定義されていません』と表示されました。

 これは  

 >Dim TargetNode   As Node

 ここで出るのでは?

 TreeViewコントロールを追加すると、参照設定が自動的に増えますが
 新規ブックにモジュールをインポートしただけでは、参照設定が追加されないのが原因だと思います
 (今回はFSOの問題ではないと思います)

 テンプレートの作成の仕方が まずいと思いますので

 >・標準フォームに全てコードを書いていたのでそちらをエクスポート 
 >・テンプレート形式のxltmを新規で作成しインポート 

 ではなくて

 正常に動いているxlsmファイルをテンプレート形式で保存するだけでいいと思います
 参照設定もそのままですし・・

(渡辺ひかる) 2019/09/06(金) 12:33


<マナさん>
返信ありがとうございます。
オブジェクト型で宣言して使われる所に応じて変数の種類が変わるようにするやり方?という風に受け取りました。勉強になりました。
一応書いていただいたもので正常に動くことも確認できました。ありがとうございました!

<渡辺ひかるさん>
エラーが起きる所に関しては私が書かせていただいた部分で起きていると思います。見方が違い実際には指摘を頂いた部分かもしれませんが!

動いているExelからテンプレート保存で正常に動きました・・・
ありがとうございます!
(あみ) 2019/09/09(月) 17:07


コメント返信:

[ 一覧(最新更新順) ]


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