[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
(隠居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.