トップ回答者
カスタムダイアログ上のリストボックスの選択状態を記憶

質問
-
word 2010 vba です。
カスタムダイアログにリストボックスがあります。
リストボックスは多くのリスト項目を持ちます。
新しく表示するときに前回選択した項目の近くを選択することが多いのですが表示項目が多いのでスクロールするのが手間です。
毎回選択した番号を記憶しダイアログが閉じてもその番号を維持できれば、次回表示するときはその番号を選択した状態で表示できます。
終了時にダイアログを閉じるのではなく非表示にすれば選択状態は維持されますが、閉じると選択状態を維持できません。
コードのパブリック変数に記憶させる方法や、ダイアローグ上に非表示のラベルをつくりそのキャプションを書き換えるなどしましたが、いずれも記憶を維持できませんでした。
回答
-
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
すべての返信
-
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