Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3097 / 13646 ツリー ←次へ | 前へ→

【64261】Application.Inputboxの利用で質問 Yoshi 10/1/28(木) 21:09 質問[未読]
【64263】Re:Application.Inputboxの利用で質問 ponpon 10/1/28(木) 23:21 発言[未読]
【64264】Re:Application.Inputboxの利用で質問 neptune 10/1/28(木) 23:23 発言[未読]
【64267】Re:Application.Inputboxの利用で質問 Yoshi 10/1/29(金) 8:30 質問[未読]
【64272】Re:Application.Inputboxの利用で質問 ponpon 10/1/29(金) 13:27 発言[未読]
【64279】Re:Application.Inputboxの利用で質問 Yoshi 10/1/29(金) 16:18 発言[未読]
【64273】Re:Application.Inputboxの利用で質問 neptune 10/1/29(金) 13:34 発言[未読]
【64274】Re:Application.Inputboxの利用で質問 neptune 10/1/29(金) 13:39 発言[未読]
【64283】Re:Application.Inputboxの利用で質問 Yoshi 10/1/29(金) 21:56 発言[未読]

【64261】Application.Inputboxの利用で質問
質問  Yoshi  - 10/1/28(木) 21:09 -

引用なし
パスワード
   データを4列に入力するに当たり、Application.Inputboxを利用しました。
キャンセルやOKを釦押したときに対応するコードを使ったのですが、いちれる単位に同じコードを4回使っていますが、これを1回で済ませることはできないでしょうか。
また、最初のA列には”X月Y日”をコードで規定したいのですが、どのようにコードを書けば良いでしょうか。
全般的にもっとスマートなコードがあれば、ご指摘いただければ幸いです。
よろしくお願いします。

Sub データ入力()

Dim md As Variant
Dim hn As Variant
Dim ln As Variant
Dim pn As Variant
 
With Sheets("sheet1").Range("A65536").End(xlUp).Offset(1, 0)
 
 md = Application.InputBox("月日を入力してください", "日付", "1/1")
 If VarType(md) = vbBoolean Then
   MsgBox "キャンセルされました"
 Else
   If md = "" Then
    MsgBox "何も入力せずOKが押されました"
   Else
   .Value = md
   End If
 End If

 hn = Application.InputBox("データ1を入力してください", "hnデータ")
 If VarType(hn) = vbBoolean Then
   MsgBox "キャンセルされました"
 Else
   If hn = "" Then
    MsgBox "何も入力せずOKが押されました"
   Else
   .Offset(, 1).Value = hn
   End If
 End If

 ln = Application.InputBox("データ2を入力してください", "lnデータ")
 If VarType(ln) = vbBoolean Then
   MsgBox "キャンセルされました"
 Else
   If ln = "" Then
    MsgBox "何も入力せずOKが押されました"
   Else
   .Offset(, 2).Value = ln
   End If
 End If

 pn = Application.InputBox("データ3を入力してください", "pnデータ")
 If VarType(pn) = vbBoolean Then
   MsgBox "キャンセルされました"
 Else
   If pn = "" Then
    MsgBox "何も入力せずOKが押されました"
   Else
   .Offset(, 3).Value = pn
  End If
 End If
 
End With

End Sub

【64263】Re:Application.Inputboxの利用で質問
発言  ponpon  - 10/1/28(木) 23:21 -

引用なし
パスワード
   ユーザーフォームを利用されたらいかがでしょう?
もちろん未入力やデータチェックも必要ですが。。

【64264】Re:Application.Inputboxの利用で質問
発言  neptune  - 10/1/28(木) 23:23 -

引用なし
パスワード
   ▼Yoshi さん:
userformを使ってuserに入力してもらいましょう。
その方が、userも使い易いと思います。
>データを4列に入力するに当たり、Application.Inputboxを利用しました。
>キャンセルやOKを釦押したときに対応するコードを使ったのですが、いちれる単位に同じコードを4回使っていますが、これを1回で済ませることはできないでしょうか。
出来ます。同じ処理を別プロシージャにすれば良い。
研究してみて下さい。

>また、最初のA列には”X月Y日”をコードで規定したいのですが、どのようにコードを書けば良いでしょうか。
セルの書式で設定すればどうですか?

【64267】Re:Application.Inputboxの利用で質問
質問  Yoshi  - 10/1/29(金) 8:30 -

引用なし
パスワード
   ▼ponponさん neptune さん:

ご指摘頂き有難うございます。
Userformを使った方が入力がシンプルですね。
ピント来ませんでした。

同じ処理を別のプロシージャにする、言葉の理解はできますが
コードのイメージが湧いてきません。もう少し勉強してみます…
日付をセルの書式設定を…これをコードで、っと考えていたのですが

UserFormで検討しました。こんな感じでしょうか。

Private Sub CommandButton1_Click()
  Range("A" & Rows.Count).End(xlUp).Offset(1).Value = TextBox1.Value
  TextBox1 = ""
  Range("B" & Rows.Count).End(xlUp).Offset(1).Value = TextBox2.Value
  TextBox2 = ""
  Range("C" & Rows.Count).End(xlUp).Offset(1).Value = TextBox3.Value
  TextBox3 = ""
  Range("D" & Rows.Count).End(xlUp).Offset(1).Value = TextBox4.Value
  TextBox4 = ""
  TextBox1.SetFocus
End Sub

【64272】Re:Application.Inputboxの利用で質問
発言  ponpon  - 10/1/29(金) 13:27 -

引用なし
パスワード
   A,B,C,D列の書き込む行は、それぞれバラバラですか?
それとも同じ?

同じならば、Range("A" & Rows.Count).End(xlUp).Offset(1)を
resizeして、TEXTBOXの値を配列で入れてもいいかな?
または、For Nextで列と"TEXTBOX" &iで回しても良いかと思います。

あと、未入力のチェックも必要かと。

日付は、セルの書式設定をマクロの記録を取れば、すぐに出来るかと。

【64273】Re:Application.Inputboxの利用で質問
発言  neptune  - 10/1/29(金) 13:34 -

引用なし
パスワード
   ▼Yoshi さん:

>同じ処理を別のプロシージャにする、言葉の理解はできますが
>コードのイメージが湧いてきません。もう少し勉強してみます…
例えば、こんな感じ
※何の検証も確認もしてないです。Yoshi さんのコード見て書いてみただけです。
戻り値が欲しければFunctionにすればよい。
'//////////////////////////////////////////////
'引数:
'Target (Range):基点となるセル
'lngOffset (Long):Targetからの列方向のオフセット値・・
'arg (Variant):入力したい値
'//////////////////////////////////////////////
Sub Sample1(ByRef arg1 As Range, ByRef arg2 As Long, ByRef arg3 As Variant)
Const strCancelMsg = "キャンセルされました"
Const strNULLMsg = "キャンセルされました"

  If VarType(arg3) = vbBoolean Then
    MsgBox strCancelMsg
  Else
    If arg3 = "" Then
     MsgBox strNULLMsg
    Else
    arg1.Offset(, arg2).Value = arg3
    End If
  End If
End Sub

【64274】Re:Application.Inputboxの利用で質問
発言  neptune  - 10/1/29(金) 13:39 -

引用なし
パスワード
   ▼Yoshi さん:
おっと書き忘れ。
Yoshi さんの新しいコードが良いのか悪いのかは判断できません。
どうなれば正しいのかが不明なので。

それと、
>コードのイメージが湧いてきません。もう少し勉強してみます…
>日付をセルの書式設定を…これをコードで、っと考えていたのですが
考えても知識にないものは出てきませんからね。(あるかないか知りませんが)
ponponさんも書かれていますが、マクロの記録という強力なヘルプ機能
があるので、それを積極的に利用しましょう。

【64279】Re:Application.Inputboxの利用で質問
発言  Yoshi  - 10/1/29(金) 16:18 -

引用なし
パスワード
   ▼ponpon さん:

有難うございます。

>A,B,C,D列の書き込む行は、それぞれバラバラですか?
>それとも同じ?

行は同じですが、最初の列は日付、後3列はデータ(数字です)
>同じならば、Range("A" & Rows.Count).End(xlUp).Offset(1)を
>resizeして、TEXTBOXの値を配列で入れてもいいかな?
>または、For Nextで列と"TEXTBOX" &iで回しても良いかと思います。
なんとなく分かりますが…一度コード考えます。自信は無いですが。

>あと、未入力のチェックも必要かと。
そうですね、4項目がTestBoxに埋まっていないと、CommandBoxが使えないと
言うことですね。意味合いが異なりますが、次のようなコードを加えました。
Private Sub TextBox4_Change()
  Me.CommandButton1.Enabled = Me.TextBox4.TextLength > 0
End Sub

Private Sub UserForm_Initialize()
   TextBox4_Change
End Sub
これはText4が埋まらないと、CommandButtonがアクティブにならないように
しています。(見よう見まねでつくりましたが、4項目が埋まらないとは
未だ、できていません。

>日付は、セルの書式設定をマクロの記録を取れば、すぐに出来るかと。
有難うございました。マクロの記録ですね。有難うございます。

【64283】Re:Application.Inputboxの利用で質問
発言  Yoshi  - 10/1/29(金) 21:56 -

引用なし
パスワード
   ▼neptune さん:
ご指摘有難うございました。
マクロの記録に気がつきませんでした。

3097 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free