Excel VBA質問箱 IV

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

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


6409 / 13644 ツリー ←次へ | 前へ→

【45337】セル間へのデータ入力 alco 06/12/20(水) 4:47 質問[未読]
【45338】Re:セル間へのデータ入力 かみちゃん 06/12/20(水) 7:07 発言[未読]
【45364】Re:セル間へのデータ入力 alco 06/12/20(水) 20:17 質問[未読]
【45370】Re:セル間へのデータ入力 かみちゃん 06/12/20(水) 22:06 発言[未読]
【45371】Re:セル間へのデータ入力 alco 06/12/20(水) 23:55 質問[未読]
【45372】Re:セル間へのデータ入力 かみちゃん 06/12/21(木) 0:02 発言[未読]
【45373】Re:セル間へのデータ入力 alco 06/12/21(木) 1:18 お礼[未読]

【45337】セル間へのデータ入力
質問  alco  - 06/12/20(水) 4:47 -

引用なし
パスワード
   こんばんわ。VBA初心者です。
いつも参考にさせて頂いております。
以下の様なマクロを作成しており、壁にぶち当たってしまいました。
皆様、どうか宜しくお願い致します。


 A   
----------
1  9:00 
2  9:30 
3 
4 10:00 
5
6 
7 15:00 
8 
9 20:00 
10


----------------------------
textbox1  CommandButton1
[ 時刻 ] 
----------------------------

上記の様な表があり、フォームからデータを入力するという物です。
※表のデータはデフォルトで、変化しません。
※時刻は10分単位で、9:00〜23:00です。

1.textbox1に時刻を入力し、CommandButton1をクリックしてtextbox1のデータを
 A列の空白のセルに入力させます。
2.textbox1に入力された時刻によって、入るセルを変化させたい。
 (例)
 "09:50"と入力した場合はA3へ。
 "11:00"と入力した場合はA5へ。
 "19:00"と入力した場合はA8へ。
 "23:00"と入力した場合はA10へ。
 
 という感じです。
 但し、"9:20"等、セルの間に空白が無い時刻や、同じ時刻は、直下の空白セルへ記入させます。


悩んで、以下の様なお粗末なコードを作成しましたが、
ご覧の通り、膨大なIF文が出来上がってしまいました。。。
実際に作成しようとしている物は、もっと行が多いので、これじゃ使い物になりません。

textboxに入力された時刻を、A列の時刻を読み取って、その間の空白セルへ入力する。
というマクロを作成したいと思っています。
宜しくお願い致します。


Private Sub CommandButton1_Click()

'時刻確認
  If IsDate(UserForm1.Controls("textbox1").Value) = True Then
      UserForm1.Controls("textbox1").Value = Strings.Format(UserForm1.Controls("TextBox1"), "hh:mm")
  Else
    MsgBox "時刻を入力して下さい"
    UserForm1.Controls("TextBox1").SetFocus
    Exit Sub
   End If

'---------------
  Dim r As Integer, u As Integer, v As Integer, g As Integer
  Dim atime As Date
  atime = TimeValue(UserForm1.Controls("textbox1"))
    
  If atime >= TimeValue("09:00:00") And atime < TimeValue("10:00:00") Then
      For r = 1 To 4
        If Cells(r, 1).Value = "" Then
          Cells(r, 1).Value = UserForm1.Controls("TextBox1").Value
          Exit For
        End If
      Next r

  ElseIf atime >= TimeValue("10:00:00") And atime < TimeValue("15:00:00") Then
      For u = 4 To 7
        If Cells(u, 1).Value = "" Then
          Cells(u, 1).Value = UserForm1.Controls("TextBox1").Value
          Exit For
        End If
      Next u
  
  ElseIf atime >= TimeValue("15:00:00") And atime < TimeValue("20:00:00") Then
      For v = 7 To 9
        If Cells(v, 1).Value = "" Then
          Cells(v, 1).Value = UserForm1.Controls("TextBox1").Value
          Exit For
        End If
      Next v
  
  ElseIf atime >= TimeValue("20:00:00") And atime < TimeValue("23:00:00") Then
      For g = 9 To 10
        If Cells(g, 1).Value = "" Then
          Cells(g, 1).Value = UserForm1.Controls("TextBox1").Value
          Exit For
        End If
      Next g
  
  End If


End Sub

【45338】Re:セル間へのデータ入力
発言  かみちゃん  - 06/12/20(水) 7:07 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>ご覧の通り、膨大なIF文が出来上がってしまいました。。。
>実際に作成しようとしている物は、もっと行が多いので、これじゃ使い物になりません。

Select Case ステートメントで分岐して、For〜Next開始列と終了列を指定しては
いかがでしょうか?
以下のような感じでできると思います。

Private Sub CommandButton1_Click()

 Dim atTime As Date
 Dim intCol As Integer
 Dim intStartCol As Integer
 Dim intEndCol As Integer
 

 '時刻確認
 If IsDate(UserForm1.Controls("textbox1").Value) = True Then
  UserForm1.Controls("textbox1").Value = Strings.Format(UserForm1.Controls("TextBox1"), "hh:mm")
 Else
  MsgBox "時刻を入力して下さい"
  UserForm1.Controls("TextBox1").SetFocus
  Exit Sub
 End If
 
 atime = TimeValue(UserForm1.Controls("textbox1"))
 
 Select Case Hour(atTime)
  Case 9
   intStartCol = 1
   intEndCol = 4
  Case 10 To 14
   intStartCol = 4
   intEndCol = 7
  Case 15 To 19
   intStartCol = 7
   intEndCol = 9
  Case 20 To 22
   intStartCol = 9
   intEndCol = 10
  Case Else
   intStartCol = 0
   intEndCol = 0
   MsgBox "範囲外の時刻です" & atTime
 End Select
 If intStartCol <> 0 And intEndCol <> 0 Then
  For intCol = 9 To 10
   If Cells(intCol, 1).Value = "" Then
'    Cells(intCol, 1).Value = UserForm1.Controls("TextBox1").Value
    Exit For
   End If
  Next intCol
 End If

End Sub

【45364】Re:セル間へのデータ入力
質問  alco  - 06/12/20(水) 20:17 -

引用なし
パスワード
   かみちゃんさん、返信有難う御座いました。

なるほど、select case を使うと簡略できますね。
有難う御座いました。

表のデータはデフォルトで、変化しません。
と記載しましたが、もし変わる事があった場合に現在のコードですと、
書き換える箇所が多いのですよね。(興味本意なのですが)

>textboxに入力された時刻を、A列の時刻を読み取って、その間の空白セルへ入力する。
>というマクロを作成したいと思っています。

勉強の為、上記の様な文を考えていましたが、全く思いつきません。
いいアドバイスありましたら、宜しくお願い致します。

【45370】Re:セル間へのデータ入力
発言  かみちゃん  - 06/12/20(水) 22:06 -

引用なし
パスワード
   こんにちは。かみちゃん です。

私、もしかしたら、勘違いしていたかもしれません。

>>textboxに入力された時刻を、A列の時刻を読み取って、その間の空白セルへ入力する。
>>というマクロを作成したいと思っています。
>
>勉強の為、上記の様な文を考えていましたが、全く思いつきません。

申し訳ありませんが、どういう処理をしたいのかまったくわかりません。

> 但し、"9:20"等、セルの間に空白が無い時刻や、同じ時刻は、直下の空白セルへ記入させます。

具体的には、どこですか?9:30の下ですか?
順番に並べたいだけということではないのでしょうか?

【45371】Re:セル間へのデータ入力
質問  alco  - 06/12/20(水) 23:55 -

引用なし
パスワード
   かみちゃんさん、長々と付き合わせてしまい申し訳御座いません。
そして説明がわかりにくくてすみません。

拡張性の為に、textboxの時刻を、A列の相応しいセルに入力できないかと。

○時だったら、A○〜A○の間に入力
     ↓
○時だったら、A列に記載されている○時と○時の間なので、そこへ入力


という様に書き換えられないかなと思った次第です。


>具体的には、どこですか?9:30の下ですか?
>順番に並べたいだけということではないのでしょうか?

順番に並べたいのですが、セルが空いていなければ下の空白セルでも構わない
という事です。
重ね重ねとなりますが、宜しくお願い致します。

【45372】Re:セル間へのデータ入力
発言  かみちゃん  - 06/12/21(木) 0:02 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>拡張性の為に、textboxの時刻を、A列の相応しいセルに入力できないかと。
>
>○時だったら、A○〜A○の間に入力
>     ↓
>○時だったら、A列に記載されている○時と○時の間なので、そこへ入力

何が「拡張性」なのかよくわかりませんが、
入力するセルがなかったらどうするのですか?

>順番に並べたいのですが、セルが空いていなければ下の空白セルでも構わない

「構わない」と言われてもコードがそうなっていない・・・
時刻によって、入力する行番号の範囲が決められてしまっているので、その間に
空白セルがなければ、入力されないのではないでしょうか?

本当は、何がしたいのかを整理されたほうがいいのではないでしょうか?

【45373】Re:セル間へのデータ入力
お礼  alco  - 06/12/21(木) 1:18 -

引用なし
パスワード
   かみちゃんさん、返信有難う御座います。

そうですね。整理した方が良さそうです。
伝えられない様では、まだまだ勉強不足でした。
もう一度勉強し直します。
本当に有難う御座いました。

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