
sheet1に下記のように商品のデータ一覧が入っており、
価格の改定があった時に[単価]に新しい価格をいれ、
当初[単価]に入っていた価格を[旧単価]に入れるようを作っています。
コード 商品名 単価 旧単価 改定日
1111 商品A 1000
1112 商品B 1500
1113 商品C 1200
↓
コード 商品名 単価 旧単価 改定日
1111 商品A 1100 1000 2008/5/2
1112 商品B 1500
1113 商品C 1200
<UserForm>
コード [コードのTextBox]
商品名[商品名のLabel]
単価 [単価ののLabel]
新単価[新単価のTextBox]
改定日[改定日のTextBox]
ユーザーフォムでテキストボックスにコードを入れたら、
コードを商品のデータ一覧から検索して商品名と単価を
ユーザーフォムのLabel Captionに自動で表示されるようにしたいのです。
1.コードの入力
2.商品名、単価が表示される
3.新単価、改定日の入力
4.元のデータ(Sheet1)の書き換え
上記のような順序で考えていたのですが、
どうしてもコード入力からの検索表示が上手くいかないのです。
どうすれば良いのでしょうか?
※ユーザーフォームで[商品名][単価]をLabelにしてるのは、
数値・文字列として書き換えの必要がないので動かせないほうがいいのでは
とういう個人的な思い込みからですので、特にこだわりはございません。
相当な初心者のため、少しばかり注釈をつけてくださる大変ありがたいです。
上記のよう順番でなくても、よい方法があれば教えて下さい。
よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
コードのテキストボックスのChangeイベントで検索すればいいのでは
たとえば
コードテキストボックス : CodeText
新単価テキストボックス : NewPriceText
改定日テキストボックス : UpdateDateText
商品名ラベル : NameLabel
単価ラベル : PriceLabel
データの記述してあるシート: 商品マスター
といった名前だとします
Sub CodeText_Change()
' 検索二一致したセルを記憶する変数
dim r as Range
Set r = Worksheets("商品マスター").Range("A:A"). _
Find( CodeText.Text, MatchCase = False )
if r is nothing then
' 検索したが コードが見つからなかった場合
Name.Label.Caption = "---"
PriceLabel.Caption = "---"
NewPriceText.Text = ""
UpdateText.Text = ""
else
' 該当コードがある場合
' 見つかったセルの隣のセルの内容をコントロール設定
' この場合に Rangeオブジェクトの Offsetメソッドで指示
Name.Label.Caption = r.Offset(0,1).Value
PriceLabel.Caption = r.Offset(0,2).Value
NewPriceText.Text = r.Offset(0,2).Value
UpdateText.Text = r.Offset(0,4).Value
end if
End Sub
といった具合で検索出来るともいます
改訂 などのボタンを準備しておいて
Sub Kaitei_Click()
dim r as Range
Set r = Worksheets("商品マスター").Range("A:A"). _
Find( CodeText.Text, MatchCase = False )
if r is Nothing then
MsgBox "コードが見つかりません"
Exit Sub
end if
' 単価を更新
r.Offset(0,2).value = NewPriceText.Text
' 旧単価列を更新
r.Offset(0,3).Value = PriceLabel.Caption
' 改訂日を更新
r.Offset(0,4).Value = DateValue( UpdateText.Text )
End Sub
# エラー処理を何もしていないので 適宜書き加えてください
# 日付がありえない日付であるとか、単価が金額として意味を成さない文字列であるとか
# 必要な箇所のデータが入力されていないなど
この回答への補足
素早いご返答ありがとうございます。
まさに改定ボタンを作って書換えしようと試みておりました。
そのため、検索するコードの行位置が欲しかったのです。
セル位置を検索して、Offsetを使うことは大変勉強になりました。
教えていただいたのをコピーして試したところ
Set r = Worksheets("商品マスター").Range("A:A"). _
Find( CodeText.Text, MatchCase = False )
のところで"型が一致しません”というエラーになるのです。
商品の追加のsheet1の商品のコードは数値の指定をして入ってる為かと思い、
Find の後の「CodeText.Text」をValやCIntやCLngでくくってみましたがどれも失敗しました。
どうしたらいいのでしょうか?
またChangeイベントでコードが見つからなければ、変更のユーザーフォムは終了なのですが、
一文字入力するごとにイベントが発生するわけですからメッセージをだすと面倒になりますよね?
変更する商品のコードが見つからなければ、
商品追加のユーザーフォームをロードできたらと思っているのですが、
メッセージボックスと同じ理由で難しいのかなとあきらめています。
まずは、最初の所を何とかしなければなりませんのでお力を貸してください。
よろしくお願い致します。
※補足ですが、sheet1のA~E列の商品のデータが入ってる部分には”商品一覧”と名前を入れてあります。
No.3
- 回答日時:
ANo.3です。
すみません、質問をよく読まなかったので、現在の単価を旧単価にする部分が抜けていました。
また、ANo.3ではApplication.Matchを使いましたが、ANo.2さんのFindの方がいいと思います。
>ControlSourceのプロパティが便利な理由を教えていただけると嬉しいです。
ControlSourceを設定すると、そのTextBoxが、指定したセルへの窓のようになり、テキストボックスの内容を変更すると同時にセルの値が変更され、同様にセルの値を変更するとテキストボックスの値が変わります。
なので、単純な登録や変更なら便利なんですが、今回のような場合では、フォーム上で旧価格と新価格を入れ替える作業を行うと、その時点でセルの内容も変わってしまうので、その回避を考えるとあまりいい方法ではありませんでした。
ありがとうございました!!
No.2さんのを参考に何とかできました。
そして、ControlSource、便利ですね。
違うところで上手く使えて大満足です。
最後まで相談にのってくださりありがとうございました。
No.2
- 回答日時:
こんな方法はどうでしょうか?
まず、LabelはやめてすべてTextBoxにします。
コード[TextBox1]
商品名[TextBox2]
単価 [TextBox3]
新単価[TextBox4]
改定日[TextBox5]
だとします。
これはControlSourceという便利なプロパティを使うためです。
一応、商品名[TextBox2]と単価[TextBox3]は、編集禁止と自動的に移動しなくなるようにします。
商品名[TextBox2]と単価[TextBox3]のプロパティで、
Locked=True
TabStop=False
にします。
データがSheets("Sheet1")にあるとします。
後は以下のコードをユーザーフォームのモジュール部にコピーしてください。
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim r As Variant '検索結果の行(エラー対応のためVariantにする)
With Sheets("Sheet1")
'TextBox1の値をASheet1のA列で探す
r = Application.Match(Val(TextBox1.Value), .Columns(1), 0)
'A列に見つからない場合
If IsError(r) Then
'エラーメッセージ
MsgBox TextBox1.Value & " はありません"
'TextBox1の文字列を全選択状態にする
TextBox1.SelStart = 0
TextBox1.SelLength = Len(TextBox1.Text)
'更新中止
Cancel = True
Exit Sub
End If
'各TextBoxのValueプロパティにリンクさせるセル(ControlSource)を設定(シート名付きで)
TextBox2.ControlSource = .Name & "!" & .Cells(r, 2).Address
TextBox3.ControlSource = .Name & "!" & .Cells(r, 3).Address
TextBox4.ControlSource = .Name & "!" & .Cells(r, 4).Address
TextBox5.ControlSource = .Name & "!" & .Cells(r, 5).Address
End With
End Sub
p.s.
ControlSourceを設定すると指定したセルをダイレクトに変更するため、全部入力してから[変更実行]みたいな事ができません。
この回答への補足
素早いお返事ありがとうございます。
ControlSourceのプロパティが便利な理由を教えていただけると嬉しいです。
おっしゃるように表示はこれでできるようになりました。
Tabキーで入力項目に行くときに表示されました。
ユーザーフォームへは希望の値がテキストボックスに返ってくるので、そのまま下に
Sheets("Sheet1").Cells(r, 3) = TextBox4.Text
Sheets("Sheet1").Cells(r, 4) = TextBox3.Text
Sheets("Sheet1").Cells(r, 5) = TextBox5.Text
と付け足したのですが、旧単価と新単価をリンクとは入れ替えて表示したいため無理でした。
ですので、r = Application.Match(Val(TextBox1.Value), .Columns(1), 0)
を別のボタンクリックの所で使用して行位置を取得しようとしましたが
オブジェクトが指定されていないと、エラーになってしました。
頂いた回答を参考にしてなんとかならないものかと自分なりやっては見たのですが
やはり知識が少なく上手くいきません。
なにか他にアレンジできる方法があれば教えて下さい。
よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel 関数 vlookupなどの使い方について質問です。 シート1に品番、商品名、単価、発注条 6 2022/06/15 19:16
- 飲食店・レストラン かつやさん値上げしましたか?今日、ロースカツとアジフライの単品買ったんですがあれと?(´・ω・`) 1 2023/03/11 21:05
- Excel(エクセル) グループの最後の行に書式、計算式なども同じ行を追加するマクロを教えてもらえませんか。 7 2022/05/18 10:13
- Excel(エクセル) Excel関数 情報引用する方法 4 2022/07/31 20:59
- Visual Basic(VBA) EXCEL関数LOOKUPとFILTERについての質問です 1 2022/12/21 05:53
- スーパー・コンビニ 一斉値上 スーパーの食料品 値上や単価の仕組みは? 4 2022/06/01 16:18
- Visual Basic(VBA) VBAで質問があります 1 2022/10/19 10:32
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Excel(エクセル) IFERROR、SMALL関数について 2 2022/08/22 23:40
このQ&Aを見た人はこんなQ&Aも見ています
-
最速怪談選手権
できるだけ短い文章で怖がらせてください。
-
エクセルで顧客毎に単価が違う場合の入力
Excel(エクセル)
-
テキストボックスの番号を使ったFor~Next文について
Visual Basic(VBA)
-
エクセルVBA テキストボックスに3桁ごとにコンマ
Visual Basic(VBA)
-
-
4
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
5
入力済み、選択したセルに連動した行のデータをユーザーフォームで呼び出すには
Excel(エクセル)
-
6
エクセル 数量顧客ごとに異なる単価について
Excel(エクセル)
-
7
数量・会社ごとに異なる単価表から、関数を使って抽出したい
会計ソフト・業務用ソフト
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
特定の色のついたセルを削除
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
Excel UserForm の表示位置
-
【Excel VBA】一番右端セルまで...
-
【ExcelVBA】値を変更しながら...
-
CellEnterイベント仕様について
-
Excel VBAでCheckboxの名前を変...
-
【VBA】写真の貼り付けコードが...
-
QRコード作成マクロについて
-
C# DataGridViewで複数選択した...
-
入力規則のリスト選択
-
Excel VBA でFunctionプロシジ...
-
データグリッドビューの結合セ...
-
[Excel VBA] このコードでは行...
-
EXCEL VBA 文中の書式ごと複写...
-
VBA にて、条件付き書式で背景...
-
Excel 範囲指定スクショについ...
-
昨日、質問した件『VBA にて、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
特定の色のついたセルを削除
-
【Excel VBA】一番右端セルまで...
-
【VBA】【ユーザーフォーム_Lis...
-
EXCEL VBA 文中の書式ごと複写...
-
VBA:日付を配列に入れ別セルに...
-
C# DataGridViewで複数選択した...
-
Excel UserForm の表示位置
-
入力規則のリスト選択
-
Excel 範囲指定スクショについ...
-
エクセル、マクロで番号を読込...
-
DataGridViewでグリッド内に線...
-
Excel VBAで特定の範囲の空白セ...
-
CellEnterイベント仕様について
-
Excel VBAでCheckboxの名前を変...
-
【ExcelVBA】値を変更しながら...
-
データグリッドビューの結合セ...
-
下記のマクロの説明(意味)を...
おすすめ情報