【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード

いつもお世話になります。
WIN8.1 エクセル2013 です。

現在下記のマクロでユーザーフォームにてデーターベースのシートに入力しています。

この時ご指導を仰ぎたいのは
'納品日 ~ 単価1 迄は最低限入力します。
そのあとの それぞれの 2 3 4 5 はその都度変化します。

一番短い入力(最低限の入力) '納品日 ~ 単価1 で単価1を終えたときの今現在は
エンターキーにて2~5を入力コマンドボタン迄飛ばします。

2 3 4 も同様の操作をします。
特に5のときはその必要性はありません。

入力の必要のないテキストボックスを入力のコマンドボタンまで飛ばすのに何かいい方法はないでしょうか。


参考
Private Sub CommandButton1_Click()
'
y = 3

Do While Cells(y, 3) <> ""
y = y + 1
Loop
Cells(y, 3) = TextBox1.Text '納品日
Cells(y, 4) = TextBox2.Text '顧客コード
Cells(y, 5) = TextBox3.Text '作業担当
Cells(y, 6) = TextBox4.Text '件名
Cells(y, 7) = TextBox5.Text '作業内容1
Cells(y, 8) = TextBox6.Text '数量1
Cells(y, 9) = TextBox7.Text '単価1
Cells(y, 10) = TextBox8.Text '作業内容2
Cells(y, 11) = TextBox9.Text '数量2
Cells(y, 12) = TextBox10.Text '単価2
Cells(y, 13) = TextBox11.Text '作業内容3
Cells(y, 14) = TextBox12.Text '数量3
Cells(y, 15) = TextBox13.Text '単価3
Cells(y, 16) = TextBox14.Text '作業内容4
Cells(y, 17) = TextBox15.Text '数量4
Cells(y, 18) = TextBox16.Text '単価4
Cells(y, 19) = TextBox17.Text '作業内容5
Cells(y, 20) = TextBox18.Text '数量5
Cells(y, 21) = TextBox19.Text '単価5

TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
TextBox7.Text = ""
TextBox8.Text = ""
TextBox9.Text = ""
TextBox10.Text = ""
TextBox11.Text = ""
TextBox12.Text = ""
TextBox13.Text = ""
TextBox14.Text = ""
TextBox15.Text = ""
TextBox16.Text = ""
TextBox17.Text = ""
TextBox18.Text = ""
TextBox19.Text = ""
TextBox1.SetFocus

End Sub

「ユーザーフォームのマクロで入力の必要のな」の質問画像

質問者からの補足コメント

  • 早速のご指導をいただきありがとうございます。
    小生の説明不足で誠に申し訳ありません。
    ユーザーフォームからDBのシートに入力して請求書に自動的に入力するようにしています。
    一つのタイトルに5件分を用意しています。
    例は一つのタイトルとして2件を示しました。DBシートには最大でC列~U列です。
    今回の質問はタイトル部分に対して詳細部分が最低は1件ですが2件から5件の範囲です。
    再度ご指導いただけるとうれしいです。
                        例
    1
    '納品日   C列 9/6
    '顧客コード D列 0041
    '作業担当  E列 高橋
    '件名    F列 マフラーの破損修理
    2
    '作業内容1 G列 溶接修理
    '数量1   H列  5
    '単価1   I列 1000
    3
    '作業内容2 J列 分解取付
    '数量2    K列 2
    '単価2   L列 10000

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/09/06 13:50
  • 試させていただきました。

    納品日 顧客コード 作業担当 件名 作業内容 数量 と順次、単価のときにエンターキーを押したとき
    かたまりその結果警告が出ます。

    下記の構文に黄色
    Private Sub CommandButton1_Click()
    下記は 「Range」 にSubが定義されていません。
    if Rnage("F" & Rows.Count).End(Xlup).Value=TextBox4.value Then

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/09/06 16:19
  • ご指導の協力感謝します。

    タイトル的は同一として
    詳細な内容、
    作業内容 数量 単価がそれぞれ2件あったとします。

    例えば
    納品日 顧客コード 作業担当 件名 (タイトル的)に入力後、

    詳細部分の1件目を 作業内容 数量 単価をコマンドボタンの入力
    詳細部分の2件目を 作業内容 数量 単価をコマンドボタンの入力
    ここまではうまくできました。

    詳細部分の2件を終えたとき新たに入力するとき

    何かの方法で例えば TextBox1.SetFocus のように
     納品日 のテキストボックス1に戻らないでしょうか。

    No.5の回答に寄せられた補足コメントです。 補足日時:2015/09/06 19:36
  • お忙しいところをご指導賜りありがとうございました。
    私なりに勉強して再度頑張ってみます。
    その時はまたお世話になるかもしれませんがよろしくお願いします。

    No.6の回答に寄せられた補足コメントです。 補足日時:2015/09/06 20:59

A 回答 (6件)

パソコンに、今回は作業内容が2件と云う事とどうやって知らせる事が出来るでしょうか。


キー操作だけで行うのであれば、作業内容5までエンターキーを押すしかないと思います。
もし、2件で終了であれば、マウスを使って入力ボタンを使って、パソコンに終わりを知らせる事になります。

後は、考え方です。全てをキーボード入力にするか
マウス操作にするかです。
時代の流れで云えば、マウス操作です。
顧客コード、件名、作業内容などすべてのリストを準備します。
TextBoxも全て、コンボボックスにします。
操作を全てマウスにしてしまえば、今回の問題も解決すると思います。

他、先に回答しましたように、作業内容を1件入力したら、
そのたびに入力ボタンへ移動して、エンターキーを押して登録させていくかですね。


先に回答に
RnageとRangeのスペルミスが多数ありますので編集の上、ご確認ください。
この回答への補足あり
    • good
    • 0

失礼しました。

スペルミスでした
if Rnage("F" ・・・は
if Range("F" ・・・でした。
この回答への補足あり
    • good
    • 0

NO1です。

何度もすみません。
ただ単に配置の問題で
作業内容2などを、右側に
作業内容3更に、右側に配置

入力ボタンを右上に配置ではダメでしょうか。
    • good
    • 0

NO,1です。

コメントのDBであることはわかって上ですが。
請求書を作成するにあたっても、縦方向にデータを持った方が良いと思います。

現在のDBの構成をそのままとして
ユーザーフォームは
納品日
顧客コード
作業担当
件名
作業内容
数量
単価
だけのテキストボックスを配置
ボタンを押して、最終行が同じ件名であれば、右側に移動して登録する方法は如何でしょうか
Private Sub CommandButton1_Click()
if Rnage("F" & Rows.Count).End(Xlup).Value=TextBox4.value Then
y=Rnage("C" & Rows.Count).End(Xlup).Row
x=Range("C" & y).End(xlToRight).Column
Else
y=Rnage("C" & Rows.Count).End(Xlup).Row+1
X=6
End If

Cells(y, 3) = TextBox1.Text '納品日
Cells(y, 4) = TextBox2.Text '顧客コード
Cells(y, 5) = TextBox3.Text '作業担当
Cells(y, 6) = TextBox4.Text '件名
Cells(y, x+1) = TextBox5.Text '作業内容
Cells(y, x+2) = TextBox6.Text '数量
Cells(y, x+3) = TextBox7.Text '単価

TextBox5.Text = ""
TextBox6.Text = ""
TextBox7.Text = ""
TextBox5.SetFocus
End Sub
この回答への補足あり
    • good
    • 0

NO,1です。

何度もすみません。
TextBox5.Text = ""

TextBox5.Text = TextBox5.Text + 1
だと便利と思います。
    • good
    • 0

> 入力の必要のないテキストボックスを入力のコマンドボタンまで飛ばすのに何かいい方法はないでしょうか。


一般的には、
  C    D     E     F   G    H    I  J
 納品日 顧客コード 作業担当者 件名 作業番号 作業内容 数量 単価
と云った様に作業番号の列(G)を準備して、縦方向にデータを登録していきます。

Private Sub CommandButton1_Click()
y=Rnage("C" & Rows.Count).End(Xlup).Row+1
Cells(y, 3) = TextBox1.Text '納品日
Cells(y, 4) = TextBox2.Text '顧客コード
Cells(y, 5) = TextBox3.Text '作業担当
Cells(y, 6) = TextBox4.Text '件名
Cells(y, 7) = TextBox5.Text '作業番号
Cells(y, 8) = TextBox6.Text '作業内容
Cells(y, 9) = TextBox7.Text '数量
Cells(y, 10) = TextBox8.Text '単価

TextBox5.Text = ""
TextBox6.Text = ""
TextBox7.Text = ""
TextBox8.Text = ""
TextBox5.SetFocus
End Sub
の様にします。
件名も重複を避けるために、別途 件名番号を追加した方が良いかと思います。

y = 3
Do While Cells(y, 3) <> ""
y = y + 1
Loop

y=Rnage("C" & Rows.Count).End(Xlup).Row+1
で最終行の番号が得られます。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!