[[20180412165944]] 『コンボボックスの選択によってテキストボックスを』(まーこ) ページの最後に飛ぶ

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

 

『コンボボックスの選択によってテキストボックスを制御したい』(まーこ)

初めて質問します。過去ログでいつも勉強させていただいておりますが、今回は過去ログでもわからなかったので質問させていただくことにいたしました。
よろしくお願いします。

印刷費や郵送費を請求するための請求リストを作成するフォームを作成し、
やりたいことはできているのですが、入力作業を別の担当にさせるために
制御をかける方法を知りたいです。

やりたいことは2点です

郵送代、印刷代が入っている単価リストがあり、
コンボボックス1で郵送代、印刷代の単価リストのタイトルをセレクト出来、
コンボボックス2でその単価リストを選択できるようになっていまして、
選択したものの単価がラベル13とテキストボックス9に入り、
テキストボックス6、7に入れた数字とテキストボックス9の数字を
掛けた数字がラベル15に表示されるようになっています。

1、コンボボックス1で単価リストM列の印刷代を選んだときにだけ
 テキストボックス6(ページ数)が入力できるように制御をかけたいです。

2、コンボボックス2で単価リストのうち"両面"の文字が入っているものが
 セレクトされた時、テキストボックス6を「2」以上の数字をいれないと
 エラーメッセージが出るようにしたいです。

現在の具体的なコードは以下の通りです。

Private Sub ComboBox1_Change()
Dim c, r As Long
Dim sh As Worksheet
Set sh = Sheets("単価リスト")

If ComboBox1.ListIndex = 2 Then

End If

'単価リストの1行目のリストタイトルを選択
'単価リストはJ列に郵送代、K列に単価、L列空白、M列に印刷代、N列に単価…です

c = Application.Match(ComboBox1.Value, sh.Range("1:1"), 0)
If IsNumeric(c) Then
r = sh.Cells(Rows.Count, c).End(xlUp).Row
ComboBox2.List = sh.Range(sh.Cells(2, c), sh.Cells(r, c)).Value
End If
End Sub

Private Sub ComboBox2_Change()

Dim sh As Worksheet
Set sh = Sheets("単価リスト")
Label13.Caption = "単価 : " & Application.SumIf(sh.Range("J:V"), ComboBox2.Value, sh.Range("K:W"))
TextBox9.Text = Application.SumIf(sh.Range("J:V"), ComboBox2.Value, sh.Range("K:W"))

If ComboBox2.ListIndex = 1 Then
Label13.Caption = "単価 : " & Application.SumIf(sh.Range("J:V"), ComboBox2.Value, sh.Range("K:W"))

End If

End Sub

Private Sub TextBox6_Change()
Dim sh As Worksheet
Set sh = Sheets("物件リスト")
On Error Resume Next
Label15.Caption = "金額: " & Val(TextBox6.Value) * Application.SumIf(sh.Range("J:V"), ComboBox2.Value, sh.Range("K:W")) & " 円"

End Sub

Private Sub TextBox7_AfterUpdate()
Dim sh As Worksheet
Set sh = Sheets("物件リスト")
On Error Resume Next
Label15.Caption = "金額: " & Val(TextBox7.Value) * Application.SumIf(sh.Range("J:V"), ComboBox2.Value, sh.Range("K:W")) & " 円"
Label15.Caption = "金額: " & Val(TextBox7.Value) * Val(TextBox9.Value) & " 円"

End Sub

ちなみに単価リストM列のリストは以下の通りとなっています。


2 A4 カラ― 片面
3 A4 カラ― 両面
4 A3 カラ― 片面
5 A3 カラ― 両面
6 A4 モノクロ 片面
7 A3 モノクロ 両面
8 A4 モノクロ 片面
9 A3 モノクロ 両面

お力をお貸しくださいよろしくお願いいたします。

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


深く考えていませんし、
何をしようとしているかも理解できていませんが

1,EnabledとかVisileプロパティを使えませんか。

2.テキストボックス6は、コンボボックスにしたら駄目なのですか。
で、必要に応じて、リストをセットし直せばよいのでは。

(マナ) 2018/04/12(木) 20:30


質問以外の部分で気になったんですが、ご自身は別に平気なのかもしれないけど
インデントついてないと見づらいですし、コード提示する(誰かに見てもらうつもり)
ならインデント付けたほうがよいように思います。

    Private Sub ComboBox1_Change()
        Dim c, r As Long
        Dim sh As Worksheet: Set sh = Sheets("単価リスト")

        If ComboBox1.ListIndex = 2 Then
        '●記述忘れ?●
        End If

        '単価リストの1行目のリストタイトルを選択
        '単価リストはJ列に郵送代、K列に単価、L列空白、M列に印刷代、N列に単価…です
        c = Application.Match(ComboBox1.Value, sh.Range("1:1"), 0)
        If IsNumeric(c) Then
            r = sh.Cells(sh.Rows.Count, c).End(xlUp).Row
            ComboBox2.List = sh.Range(sh.Cells(2, c), sh.Cells(r, c)).Value
        End If
    End Sub

    Private Sub ComboBox2_Change()
        Dim sh As Worksheet: Set sh = Sheets("単価リスト")
        Dim buf As Variant

        buf = Application.SumIf(sh.Range("J:V"), ComboBox2.Value, sh.Range("K:W"))

        Label13.Caption = "単価 : " & buf
        TextBox9.Text = buf

        If ComboBox2.ListIndex = 1 Then
            Label13.Caption = "単価 : " & buf
        End If

    End Sub

    Private Sub TextBox6_Change()
        Dim sh As Worksheet: Set sh = Sheets("物件リスト")
        Dim buf As Variant

        On Error Resume Next
        buf = Application.SumIf(sh.Range("J:V"), ComboBox2.Value, sh.Range("K:W"))

        Label15.Caption = "金額: " & Val(TextBox6.Value) * buf & " 円"
    End Sub

    Private Sub TextBox7_AfterUpdate()
        Dim sh As Worksheet: Set sh = Sheets("物件リスト")
        Dim buf As Variant

        On Error Resume Next
        buf = Application.SumIf(sh.Range("J:V"), ComboBox2.Value, sh.Range("K:W"))

        Label15.Caption = "金額: " & Val(TextBox7.Value) * buf & " 円"
        Label15.Caption = "金額: " & Val(TextBox7.Value) * Val(TextBox9.Value) & " 円"
    End Sub

ちなみに、「On Error Resume Next」でエラートラップしてる部分ですけど、せっかく「Application.SumIf」としてエラー値を返せるようにしているので、戻り値がエラーだったらプロシージャを抜けるようにしてみたらどうでしょうか?
(もこな2) 2018/04/12(木) 22:42

自己解決できました。

もこなさん、コードを整理していただきありがとうございました。

マナさん、何をしたいか理解できないような質問で申し訳ありませんでした。
アドバイス通りEnabledプロパティで制御できました。
考えが浅くてすみませんでした。

1、コンボボックス1で単価リストM列の印刷代を選んだときにだけ
 テキストボックス6(ページ数)が入力できるように制御をかけたい

↓これで制御できました。


Private Sub ComboBox1_AfterUpdate()

 If Me.ComboBox1.Value = "印刷代" Then
   Me.TextBox6.Enabled = True
   Else
   Me.TextBox6.Enabled = False
 End If

End Sub


2、コンボボックス2で単価リストのうち"両面"の文字が入っているものが
 セレクトされた時、テキストボックス6を「2」以上の数字をいれないと
 エラーメッセージが出るようにしたい

コマンドボタンで入力チェックをかける方法としました。


Private Sub CommandButton1_Click()

 If InStr(ComboBox2.Value, "両面") > 0 Then
    If TextBox6 = 1 Then
    MsgBox "2ページ以上を設定してください"
     Exit Sub
    End If
  End If

'両面をセレクトしないときも1以上を設定してほしいので、空欄と0にもエラーを出す

 If TextBox6.Enabled = True Then

   If TextBox6.Value = "" Then
     MsgBox ("ページ数を入力してください")
     TextBox6.SetFocus
   Exit Sub 
   End If
 End If

 If TextBox6.Enabled = True Then

   If TextBox6.Value = 0 Then
     MsgBox ("ページ数を入力してください")
     TextBox6.SetFocus
   Exit Sub 
   End If
 End If

End Sub


おそらくもっと簡素にできるのでしょうが、
実力不足のため似たコードを重ねることでしが解消できませんでしたが、
したいことはできるようになりました。

おかげで解決できました
ありがとうございました。

(  まーこ) 2018/04/16(月) 09:35


コメント返信:

[ 一覧(最新更新順) ]


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