Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Excel 2013)
VBA 作成したフォームにデータを入力しセルに反映
投稿日時: 18/05/27 10:48:09
投稿者: yumaru

VBAのユーザーフォームに検索ボックスを作成。
そのボックスに数字を入れるとセルに反映したのですが、思うように動きません。
 
1以上10以下が入力されたら、A3〜C3にB15〜D17の値を反映。
11以上20以下が入力されたら、A3〜C3にB16〜D16の値を反映。
・・・
といった感じで自動反映をしたいです。
 
詳しい方、ご教示いただきたくお願いいたします。
 

Option Explicit

 Option Explicit

Private Sub OKボタン_Click()
  If ナンバー.Text = "" Then
      MsgBox "ナンバーが間違っています。"
      Exit Sub

If 1 <= ナンバー.Text <= 10 Then
    Range("A3:C3").Value = "B15:D15"
  End If

End Sub

Private Sub CommandButton1_Click()

End Sub

回答
投稿日時: 18/05/27 13:13:52
投稿者: simple

あんまり詳しいほうじゃないですが。
 
(1)
If ナンバー.Text = "" Then
に対応する End Ifが抜けています。
 
(2)
 1 <= ナンバー.Text <= 10 Then
と言う書き方はありません。
If 1 <= ナンバー.Text And ナンバー.Text <= 10 Then
とします。
 
なお、これでも良いかも知れないが、
ナンバー.Textは Val(ナンバー.Text) と数値化したほうが安全です。
 
(3)
Range("A3:C3").Value = "B15:D15"
だと、そういう文字列が記入されます。
Range("A3:C3").Value = Range("B15:D15").Value
の間違いですか?

投稿日時: 18/05/27 13:38:49
投稿者: yumaru

simple様
 
ありがとうございます。
 
コードは修正したのですが、UserFormに値をいれてコマンドボタンを押してもセルに反映がされません。
 
別の記述が必要でしょうか。
 
もしご存知でしたらご教示いただきたくお願いいたします。

回答
投稿日時: 18/05/27 13:50:26
投稿者: simple

OKボタン ですか、プロシージャがあるのは。
テキストボックスには何が入っているんですか?
プロシージャの最初にブレークポイントを設定して、
ステップ実行してみてはどうですか?
 
いわゆるデバッグという作業ですね。
こうしたことは必ず発生するものですから、対応方法を本などで確認して下さい。

回答
投稿日時: 18/05/27 16:46:28
投稿者: WinArrow
投稿者のウェブサイトに移動

>別の記述が必要でしょうか。
 
回答者側には、あなたのPCの画面は見れません。
 
見えるような文章で説明しないと、どこに問題があるか?回答者には見えませんよ!
 
コードの修正をしたら
修正したコードを掲示した方がよいでしょう。
 
また、意図する結果と、実行した結果も掲示しましょう。

回答
投稿日時: 18/05/27 18:21:17
投稿者: WinArrow
投稿者のウェブサイトに移動

>1以上10以下が入力されたら、A3〜C3にB15〜D17の値を反映。
と説明されているのに
Range("A3:C3").Value = Range("B15:D15").Value
では、説明と違いますよね?
Range("A3:C3").Value = Range("B15:D17").Value
では?
 
>11以上20以下が入力されたら、A3〜C3にB16〜D16の値を反映。10101
に対応するコードが記述されていない・・・・これは、なぜ?

回答
投稿日時: 18/05/27 23:14:39
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
1以上10以下が入力されたら、A3〜C3にB15〜D17の値を反映。
11以上20以下が入力されたら、A3〜C3にB16〜D16の値を反映。
・・・
 といった感じで自動反映をしたいです。

 
↑の中で
>といった感じ
と書いていますが、
2つの条件だけですか?
 
沢山あるのでしたら
IF 〜
ElseIf 〜
ElseIF〜



 
のように、だらだらとコードを記述するのは、読みにくくなるような気がします。
また、ボックスに入力した「値」と複写元セル範囲の法則性を探れば、
コードを単純化できると思います。
 
 
それから
説明とコードの不整合をレスしましたが、
説明文の方が間違っているような気がいたします。
誤:A3〜C3にB15〜D17の値を反映。
正:A3〜C3にB15〜D15の値を反映。
 

回答
投稿日時: 18/05/28 11:17:31
投稿者: mattuwan44

>といった感じで自動反映をしたいです。
こういった場合はSelect Case ステートメントを利用すると便利です。
 
Option Explicit
 
Dim mflgClose As Boolean
 
Private Sub CommandButton1_Click()
    Dim rngTable As Range
    Dim ix As Long
     
    Set rngTable = ActiveSheet.Range("B15:D15")
    Select Case CInt(Me.TextBox1.Text)
        Case Is < 1: ix = -1
        Case Is < 11: ix = 0
        Case Is < 21: ix = 1
        Case Else: ix = 2
    End Select
    ActiveSheet.Range("A3:C3").Value = rngTable.Offset(ix).Value
End Sub
 
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If mflgClose Then Exit Sub
     
    If IsNumeric(Me.TextBox1.Value) Then
        With Me.CommandButton1
            .Enabled = True
            .SetFocus
        End With
    Else
        Me.CommandButton1.Enabled = False
        Cancel = True
        MsgBox "数値を入力してください。"
    End If
End Sub
 
Private Sub TextBox2_Enter()
    Me.TextBox1.SetFocus
End Sub
 
Private Sub UserForm_Initialize()
    Me.CommandButton1.Enabled = False
End Sub
 
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    mflgClose = True
End Sub
 
Select Case ステートメントは、
上から条件をチェックして行って、1回該当の条件を見つけたらそれ以降の条件はチェックしないので、
 
1 <= ナンバー.Text <= 10
↑こういう条件の時はSelect Case ステートメントの方が、
スッキリ表現できます。
ただ、エクセル的にはVlookup関数で表引きするのもありかとは思いますが。。。
 
あと、数値かどうかのチェックはテキストボックスからフォーカスを移動するときにしてしまいましょう。
そして、コマンドボタンを押してはいけない時は、無効化しておいて押せないようにすると、
間違いが防げます。メッセージボックスを出したところで、
マウスで間違ってクリック出来る状態では、メッセージを出す意味はありません。
そもそも押せなければメッセージがあろうがなかろうが押せませんので、
そこは開発者が気を利かせてユーザーの操作を上手く制御してあげましょう。
メッセージを出すのは一見親切な気がしますが、
クリックでOKボタンを押すことを強要しますので、
大きなお世話にならないよう、本当に必要かどうか考えてみましょう。
場合によっては表示スペース確保し、ラベル等に補足情報を表示してあげるのもありかも知れませんね。
この辺は、開発者の気持ちになってエクセルはもちろん他の市販ソフトではどのようにユーザーを
誘導しているかを注意してみて大いに参考にしたらいいと思います。
 

回答
投稿日時: 18/05/28 11:22:40
投稿者: mattuwan44

あ、↑のサンプルではダミーでTextbox2を用意してます。
これはTextbox1しか選択できるコントロールが無い場合、
フォーカスの移動が出来ない為、
Exitイベントが発生しないため、とりあえず移動できるようテキストボックスを配置してます。
これは、今回のサンプルでは選択出来ないように制御しているため、
邪魔な場合は、大きさを限りなく小さくするとか、入力欄の背景をユーザーフォームの色にする
などして、見えないようにするといいと思います。

回答
投稿日時: 18/05/28 13:02:15
投稿者: Suzu

説明そのままで考えると、
条件分岐は、Select Case のみで良さそうな・・
 

引用:
正:A3〜C3にB15〜D15の値を反映
だとして。
 
Select Case Me![ナンバー].Value
  Case ""
     MsgBox "ナンバーが間違っています。"
  Case 1 To 10
     Range("A3:C3").Value = Range("B15:D15").Value
  Case 11 To 20
     Range("A3:C3").Value = Range("B16:D16").Value
End Select
 
もっとも、 WinArrowさんが、仰る様にこれだけの条件/動作では無さそうなきがしますが
何もわからないので、その辺は質問者さんが対応していただくしかないのかな。
 
以下、質問の内容とは関係なく個人的な意見です。
ユーザーの立場で考えた時、たった一つの入力の為に別にユーザーフォームを開かせられると
「ユーザーフォーム必要?」と言う気分になってしまいます。
 
入力対象
・InputBox
・入力セルを決めておく
 
入力契機
・リボンにそのマクロの起動ボタン配置
・シート上にボタン配置

トピックに返信