2016-10-31 3 views
1

ファイルパス(ファイル名の最初の単語である「プロジェクト名」)を追跡するグローバル辞書オブジェクトを設定しました。このプログラムの仕組みは、ユーザーがファイルダイアログボックスを開いてファイルをリストボックスに追加できるフォームが開きます。これが完了したら、辞書に名前とパスを追加する必要があります。ユーザフォームに表示されないグローバル変数

プライマリコード:

Public project_dict As Scripting.Dictionary 

Public Sub excelToPPT() 
Set project_dict = New Scripting.Dictionary 
... 
Dim u As UserForm1 
Set u = New UserForm1 
u.Show 
... 
End Sub 

ユーザーフォームのコード:project_dictがIオブジェクトではありませんので、

Private Sub cmdAddProject_Click() 
    Dim project_fd As FileDialog 
    Set project_fd = Application.FileDialog(msoFileDialogFilePicker) 
    Dim it As Variant 
    Dim path_split() As String 
    Dim f_split() As String 
    Dim f As String 

    With project_fd 
     .AllowMultiSelect = True 
     .Title = "Select project excel file(s)" 
     .Filters.Clear 

     If .Show = -1 Then 
      For Each it In .SelectedItems 
       path_split = Split(it, "\") 
       f_split = Split(path_split(UBound(path_split))) 
       f = f_split(0) 

       ' WHERE ERROR OCCURS 
       project_dict.Add f, it 

       Me.ListBox1.AddItem f 
      Next it 
     End If 
    End With 
End Sub 

これを実行すると、エラーが

project_dict.Add f, it 
を言っているには良いではありませんこの場合、スコープの問題があるとします。何か案は?

+1

なぜユーザーフォームにプロパティを追加し、グローバルフォームを使用する代わりに明示的に渡すのはなぜですか。 – Comintern

+1

あなたは何のエラーも言及していません。それを推測する必要がありますか?興味深い。 –

+1

私はプロジェクトを(PowerPoint 2016 PCで)設定し、メインのサブを実行し、ボタンをクリックしてファイルダイアログを開き、2つのExcelファイルを選択し、ListBoxに表示されたことを確認した後、フォームのXをクリックしてディクショナリ内の項目は2として出力されます(Debug.Print行を追加しました)。どこにもエラーはありません! –

答えて

0

問題は、以下のプロパティをUserFormコードに置き、グローバル変数を使用する代わりにフォームに辞書を渡すことで解決しました。

Dim project_dict As Scripting.Dictionary 

Public Property Get ProjectDictionary() As Scripting.Dictionary 
    Set ProjectDictionary = project_dict 
End Property 

Public Property Let ProjectDictionary(ByVal pd As Scripting.Dictionary) 
    Set project_dict = pd 
End Property 
関連する問題