none
カスタムダイアログ上のリストボックスの選択状態を記憶 RRS feed

  • 質問

  • word 2010 vba です。

    カスタムダイアログにリストボックスがあります。
    リストボックスは多くのリスト項目を持ちます。
    新しく表示するときに前回選択した項目の近くを選択することが多いのですが表示項目が多いのでスクロールするのが手間です。
    毎回選択した番号を記憶しダイアログが閉じてもその番号を維持できれば、次回表示するときはその番号を選択した状態で表示できます。

    終了時にダイアログを閉じるのではなく非表示にすれば選択状態は維持されますが、閉じると選択状態を維持できません。
    コードのパブリック変数に記憶させる方法や、ダイアローグ上に非表示のラベルをつくりそのキャプションを書き換えるなどしましたが、いずれも記憶を維持できませんでした。

    2017年1月17日 14:34

回答

  • UserFormの状態をWordを閉じても維持したいということでしょうか?

    SmartTagに設定値を保存してみる。(UserFormに貼りつけ)

    Const PROP_LISTINDEX_1 As String = "USERSETTING_FORM_LISTBOX1"
    Const PROP_LISTINDEX_2 As String = "USERSETTING_FORM_LISTBOX2"
    
    Const SMARTTAG_NAME As String = "usersetting#form"
    
    Private Sub UserForm_Initialize()
        For i = 1 To 100
           Call Me.ListBox1.AddItem(i)
           Call Me.ListBox2.AddItem(i)
        Next
    
        Me.ListBox1.ListIndex = SavedListIndex(PROP_LISTINDEX_1)
        Me.ListBox2.ListIndex = SavedListIndex(PROP_LISTINDEX_2)
    End Sub
    
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        SavedListIndex(PROP_LISTINDEX_1) = Me.ListBox1.ListIndex
        SavedListIndex(PROP_LISTINDEX_2) = Me.ListBox2.ListIndex
    End Sub
    
    
    Private Property Get SavedListIndex(name As String) As Integer
        Dim tag As SmartTag
        On Error Resume Next
        Set tag = ThisDocument.SmartTags.Item(SMARTTAG_NAME)
        If Not (tag Is Nothing) Then
            Dim cp As CustomProperty
            Set cp = tag.Properties(name)
            If Not (cp Is Nothing) Then
                SavedListIndex = cp.Value
            End If
        End If
    End Property
    
    Private Property Let SavedListIndex(name As String, v As Integer)
        Dim tag As SmartTag
        On Error Resume Next
        Set tag = ThisDocument.SmartTags.Item(SMARTTAG_NAME)
        On Error GoTo 0
        If tag Is Nothing Then
            Set tag = ThisDocument.SmartTags.Add("usersetting#form")
        End If
        
        Dim cp As CustomProperty
        On Error Resume Next
        Set cp = tag.Properties(name)
        On Error GoTo 0
        If (cp Is Nothing) Then
            Set cp = tag.Properties.Add(name, v)
        End If
        cp.Value = v
    End Property

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク matushiro97 2017年1月18日 14:56
    2017年1月18日 4:00

すべての返信

  • UserFormの状態をWordを閉じても維持したいということでしょうか?

    SmartTagに設定値を保存してみる。(UserFormに貼りつけ)

    Const PROP_LISTINDEX_1 As String = "USERSETTING_FORM_LISTBOX1"
    Const PROP_LISTINDEX_2 As String = "USERSETTING_FORM_LISTBOX2"
    
    Const SMARTTAG_NAME As String = "usersetting#form"
    
    Private Sub UserForm_Initialize()
        For i = 1 To 100
           Call Me.ListBox1.AddItem(i)
           Call Me.ListBox2.AddItem(i)
        Next
    
        Me.ListBox1.ListIndex = SavedListIndex(PROP_LISTINDEX_1)
        Me.ListBox2.ListIndex = SavedListIndex(PROP_LISTINDEX_2)
    End Sub
    
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        SavedListIndex(PROP_LISTINDEX_1) = Me.ListBox1.ListIndex
        SavedListIndex(PROP_LISTINDEX_2) = Me.ListBox2.ListIndex
    End Sub
    
    
    Private Property Get SavedListIndex(name As String) As Integer
        Dim tag As SmartTag
        On Error Resume Next
        Set tag = ThisDocument.SmartTags.Item(SMARTTAG_NAME)
        If Not (tag Is Nothing) Then
            Dim cp As CustomProperty
            Set cp = tag.Properties(name)
            If Not (cp Is Nothing) Then
                SavedListIndex = cp.Value
            End If
        End If
    End Property
    
    Private Property Let SavedListIndex(name As String, v As Integer)
        Dim tag As SmartTag
        On Error Resume Next
        Set tag = ThisDocument.SmartTags.Item(SMARTTAG_NAME)
        On Error GoTo 0
        If tag Is Nothing Then
            Set tag = ThisDocument.SmartTags.Add("usersetting#form")
        End If
        
        Dim cp As CustomProperty
        On Error Resume Next
        Set cp = tag.Properties(name)
        On Error GoTo 0
        If (cp Is Nothing) Then
            Set cp = tag.Properties.Add(name, v)
        End If
        cp.Value = v
    End Property

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク matushiro97 2017年1月18日 14:56
    2017年1月18日 4:00
  • gekkaさん

    有難うございました。

    こういうやり方があるのですね。勉強になりました。

    やりたいことは文書が開いている間だけ選択したリスト番号(リストの内容は文書の見出し一覧なので文書固有情報)を保持することでした。

    文書をマクロ文書としてそのコードにパブリック変数を宣言して,それに記憶させればダイアログをunloadしても保持できました。

    あるいはnormal.dotのコードのパブリック変数に記憶することでも解決できました。

    有難うございました。

    2017年1月18日 15:03