[[20230120143344]] 『Userform内のtextboxの値に変更があった時のみ入浴x(らっこ) ページの最後に飛ぶ

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

 

『Userform内のtextboxの値に変更があった時のみ入力したい』(らっこ)

Userform内のtextboxの値に変更があった時のみ入力したい

いつも勉強させてもらっています。

エクセルで一覧表を作りデータを管理しているのですが、VBAを使ってユーザーフォームで作った入力フォームで入力しています。
入力のチェックもする必要があるので、すでに入力済みの行の場合入力フォームを開くと入力済みのデータが反映されるようになっています。

例でいうと

   A   B   C   D   ・・・
1 りんご 100円  3個 購入済み 
2 みかん  80円 10個 
3 バナナ 150円 12個 購入済み

というシートに対し、行ごとにダブルクリックするとテキストボックス1・2・3…のあるユーザーフォームが開き

(1)1行目で入力フォームを開いた時
 A1→テキストボックス1、B1→テキストボックス2、C1→テキストボックス3、…に値が移る。

(2)入力フォーム内の更新ボタンを押した時
 テキストボックス1→A1、テキストボックス2→B1、テキストボックス3→C1、…に値が移る。

という感じで作ったのですが
(2)の部分を、テキストボックス内の値に変更があった場合のみセルの値を変更させたいと思っています。

理由としては、シートに関数を入力してある程度自動入力にして、変更があった箇所のみ手入力したいと思っているのですが
このやり方の場合、一度入力フォームを開いてしまうと全てのセルの関数が消えて値のみを入力した状態になってしまいます。
できれば変更点以外は関数をキープしたいと思っています。

自分で考えた対策としては、入力フォームを開いた状態のテキストボックス内の値を一時保管しておき、更新ボタンを押したタイミングでテキストボックス内の値と保管した値を比較し、変更があった場合となかった場合で処理を分けようかと思っていたのですが、もっと簡潔にできる方法はないか探しています。

どなたかアイデアをお借りできないでしょうか?
よろしくお願いします。

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


 >自分で考えた対策としては、入力フォームを開いた状態のテキストボックス内の値を一時保管しておき、更新ボタンを押したタイミングでテキストボックス内の値と保管した値を比較し、変更があった場合となかった場合で処理を分けようかと思っていたのですが、もっと簡潔にできる方法はないか探しています。
 これで十分だと思いますよ。
(稲葉) 2023/01/20(金) 15:15:29

返事遅くなりました
ありがとうございます

初歩的な質問なのですが、sub 〜 endの中で変数を格納した時って、別のsub 〜 endには持ち越せませんよね?
どこか別のシートとかに保管したほうがいいのでしょうか?
(らっこ) 2023/01/21(土) 12:47:32


他のプロシジャーで値を変化させる事なら
出来ますですよ。^^v
(隠居Z) 2023/01/21(土) 12:56:54

失礼致しました。↑、意味をはき違えておりましたら、お許しを
>>どこか別のシートとかに保管したほうがいいのでしょうか?
で、宜しいのでは
あと
大域変数[オブジェクトも可能]←消える危険性絶無とは言えないらしいです。^^;
iniファイル
只のテキストファイル
レジストリ等々
m(__)m

(隠居Z) 2023/01/21(土) 13:10:01


 >初歩的な質問なのですが、sub 〜 endの中で変数を格納した時って、別のsub 〜 endには持ち越せませんよね?
 ユーザーフォーム直下のスコープで保持しておけば、ユーザーフォームが生きている間は保持しますよ。
 A1:C10が対象だとして、ダブルクリックでユーザーフォームを開き、テキストボックスに値を取得

 シートモジュール
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
        If Target.CountLarge > 1 Then Exit Sub
        If Intersect(Target, Range("A1:C10")) Is Nothing Then Exit Sub
        With UserForm1
            Cancel = True
            .FormIni Range(Target.EntireRow.Columns("A:C").Address)
        End With
    End Sub

 ユーザーフォーム
    Option Explicit
    'UserForm1
    Private rng保持 As Range
    Public Sub FormIni(ByVal xRange As Range)
        Dim i As Long
        Set rng保持 = xRange
        For i = 1 To xRange.Count
            tb(i).Value = xRange(i).Value
        Next i
        Me.Show vbModal
    End Sub

    Private Function tb(ByVal n As Long) As MSForms.TextBox
        Set tb = Me.Controls("TextBox" & n)
    End Function

    Private Sub CommandButton1_Click()
        Dim i As Long
        For i = 1 To rng保持.Count
            With rng保持(i)
                If .Value <> tb(i).Value Then
                    .Value = tb(i).Value
                End If
            End With
        Next i
        Unload Me
    End Sub

(稲葉) 2023/01/21(土) 13:26:46


 だったらもう一つづつテキスとボックスを増やして退避させておけば?
 Range("A1").HasFormula とかで数式かの判別できるし
 退避させるテキストボックスは非表示でも良いし。
(疑心) 2023/01/21(土) 15:39:51

なるほど!
みなさん、ありがとうございました

みなさんのアイデアをお借りして、改めて挑戦しようと思います
お世話になりました
(らっこ) 2023/01/21(土) 18:13:09


コメント返信:

[ 一覧(最新更新順) ]


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