[[20210908131448]] 『ユーザーフォームで動的にコマンドを追加した後の』(マナ) ページの最後に飛ぶ

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

 

『ユーザーフォームで動的にコマンドを追加した後の保持方法』(マナ)

ユーザーフォームでユーザーが動的に作成したコマンドをユーザーフォームを閉じた後も保持したいです。

ユーザーフォーム上には(追加)(削除)(編集)(実行)という4つのラベルがあり、(追加)のラベルを押すとインプットボックスが現れ、そのインプットボックスの入力したcaptionのcheckboxがユーザーフォーム上に追加される仕様になっています。

現在checkboxの追加をするコードは作成出来ているのですが、一度ユーザーフォームを閉じると、追加したコマンドがすべて消えてしまう状態です。

某質問掲示板なども参考にしましたが答えに至らず、ここに書かせていただきました。お時間ありましたらなにかアドバイスのほどよろしくお願いいたします。

現在のコード↓(フォーム)
Private Sub Label追加_Click()

Dim dt As Integer

kakutyoushi = ""

addkm = InputBox("追加するファイル名を入力してOKを押して下さい。", "ファイル名の末尾には拡張子も入力してください(例:ファイル名.xls)")

 If Right(addkm, 4) = ".xls" Then
 kakutyoushi = ".xls"

 ElseIf Right(addkm, 5) = ".xlsx" Then
 kakutyoushi = ".xlsx"

 Else
 kakutyoushi = ""

 End If

If kakutyoushi <> "" Then
dt = MsgBox(addkm & "を" & vbLf & "リストに追加しますか?", vbOKCancel, "追加項目の確認")

Else

MsgBox ("拡張子を含めた正しいファイル名を入力してください。")
GoTo shut1

End If

Select Case dt

  Case vbOK

  Call fileの追加

  Case vbCancel

  GoTo shut1

End Select

shut1:
End Sub

Private Sub fileの追加()

   Static myCollection As New Collection
    Dim myChkBtn As MSForms.CheckBox
    Dim myClass As Class1
    Dim myCnt
    Set myChkBtn = Controls.Add("Forms.CheckBox.1")
    myCnt = myCollection.Count
    With myChkBtn
        .Left = 18 + (myCnt \ 5) * 72
        .Top = 18 + (myCnt Mod 5) * 24
        .Caption = addkm
    End With
    Set myClass = New Class1
    Set myClass.Btn = myChkBtn
    myCollection.Add myClass
    myCnt = myCnt + 1

End Sub

現在のコード↓(クラス)

Option Explicit

Private WithEvents myBtn As MSForms.CheckBox

Public Property Set Btn(ByVal myNewBtn As MSForms.CheckBox)

    Set myBtn = myNewBtn
End Property

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


'Module1
 Type myType
    Caption As String
    Value   As Boolean
 End Type

 Public ChB() As myType

'Userform1

 Dim CheckBoxes() As MSForms.CheckBox

 Private Sub CommandButton1_Click()
    Dim msg As String
    Dim cnt As Long
    Dim buf As Boolean
    On Error Resume Next
    cnt = UBound(CheckBoxes)
    If Err.Number = 0 Then buf = True
    On Error GoTo 0
    If buf Then
        ReDim Preserve CheckBoxes(cnt + 1)
        ReDim Preserve ChB(cnt + 1)
    Else
        ReDim CheckBoxes(0)
        ReDim ChB(0)
    End If
    On Error GoTo 0
    Set CheckBoxes(UBound(CheckBoxes)) = Me.Controls.Add("Forms.CheckBox.1")
    With CheckBoxes(UBound(CheckBoxes))
        .Left = 18 + (UBound(CheckBoxes) \ 5) * 72
        .Top = 18 + (UBound(CheckBoxes) Mod 5) * 24
        .Caption = UBound(CheckBoxes) + 1
        ChB(UBound(ChB)).Caption = .Caption
    End With
 End Sub

 Private Sub UserForm_Initialize()
    Dim buf As Boolean
    Dim i As Long
    On Error Resume Next
    ReDim CheckBoxes(LBound(ChB) To UBound(ChB))
    If Err.Number = 0 Then buf = True
    On Error GoTo 0
    If buf Then
        For i = LBound(ChB) To UBound(ChB)
            Set CheckBoxes(i) = Me.Controls.Add("Forms.CheckBox.1")
            With CheckBoxes(i)
                .Left = 18 + (i \ 5) * 72
                .Top = 18 + (i Mod 5) * 24
                .Caption = ChB(i).Caption
                .Value = ChB(i).Value
            End With
        Next
    End If
 End Sub

 Private Sub UserForm_Terminate()
    Dim i As Long
    On Error Resume Next
    For i = LBound(ChB) To UBound(ChB)
        ChB(i).Value = CheckBoxes(i).Value
    Next
 End Sub

ラフな試作ですが、Module1にコントロールそのものではなくコントロールに含まれる情報を保管する案です。
(めざめるパワー) 2021/09/08(水) 15:32


 ユーザーフォームをいったん閉じても、再度開いたら再現する → Unloadしない
 ブックををいったん閉じても、再度開いたら再現する → 情報を非表示シートに保存する
 のかな?と思いますが、どっちでしょうか
(´・ω・`) 2021/09/08(水) 17:01

(めざめるパワー)様
丁寧なご返信ありがとうございます!
初心者ゆえ分からない部分もありますので一文ずつ
解釈しながら参考にさせて頂きます。
本当にありがとうございます!
(マナ) 2021/09/08(水) 20:40

(´・ω・`)様
丁寧なご返信ありがとうございます!
初心者ゆえそのような二つの具体的な手法も考え付いていない
漠然とした質問でした、、、
unloadしないやり方もあるのですね!
後々のバグが起こりづらい方がいいのですがそれは後のコード次第ですよね、、、
アドバイス本当にありがとうございます!
(マナ) 2021/09/08(水) 20:44

マナさん?
() 2021/09/08(水) 20:49

()様
なにか至らない点がありましたでしょうか、、、
(マナ) 2021/09/08(水) 21:20

(めざめるパワー)様
コードを一度そのまま使わせて頂いた所出来ました!
やはりプロの方からすると朝飯前なんですね、、、
コードの意味や工夫の仕方をしっかり学習させてもらいます
ありがとうございました。
(マナ) 2021/09/08(水) 21:26

 余談になります。
 >なにか至らない点がありましたでしょうか、、、
 回答者として有名なマナさんという方がいるのでもしやと思った次第です。
 回答者の方投稿者の質問内容だけ見てニックネーム見ていませんね。
 ニックネーム変更した方がいいかと。
 名無し
() 2021/09/08(水) 22:01

()様
ご忠告ありがとうございます!
ニックネーム変更いたします。
元マナ
(田舎の初心者) 2021/09/09(木) 07:00

コメント返信:

[ 一覧(最新更新順) ]


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