Excel VBA質問箱 IV

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

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


7480 / 13645 ツリー ←次へ | 前へ→

【38613】TRUEの場合にそのセルのみ値にするには にしもり 06/6/7(水) 11:08 質問[未読]
【38625】Re:TRUEの場合にそのセルのみ値にするには Kein 06/6/7(水) 16:02 回答[未読]
【38631】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/7(水) 16:38 質問[未読]
【38634】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/7(水) 16:47 発言[未読]
【38635】Re:TRUEの場合にそのセルのみ値にするには Kein 06/6/7(水) 17:02 発言[未読]
【38636】Re:TRUEの場合にそのセルのみ値にするには Kein 06/6/7(水) 17:04 回答[未読]
【38641】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/7(水) 17:28 質問[未読]
【38673】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/8(木) 12:08 質問[未読]
【38675】Re:TRUEの場合にそのセルのみ値にするには やっちん 06/6/8(木) 12:33 発言[未読]
【38678】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/8(木) 13:21 質問[未読]
【38681】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/8(木) 14:19 質問[未読]
【38686】Re:TRUEの場合にそのセルのみ値にするには Kein 06/6/8(木) 14:56 回答[未読]
【38699】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/8(木) 17:15 質問[未読]
【38701】Re:TRUEの場合にそのセルのみ値にするには Kein 06/6/8(木) 17:37 回答[未読]
【38702】Re:TRUEの場合にそのセルのみ値にするには Kein 06/6/8(木) 17:47 発言[未読]
【38704】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/8(木) 18:14 質問[未読]
【38715】Re:TRUEの場合にそのセルのみ値にするには Kein 06/6/8(木) 21:53 回答[未読]
【38730】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/9(金) 9:35 質問[未読]
【38777】Re:TRUEの場合にそのセルのみ値にするには Kein 06/6/9(金) 21:34 回答[未読]
【38823】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/11(日) 16:32 質問[未読]
【38825】Re:TRUEの場合にそのセルのみ値にするには Kein 06/6/11(日) 17:53 回答[未読]
【38835】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/12(月) 1:01 お礼[未読]
【38913】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/14(水) 11:45 質問[未読]
【38932】Re:TRUEの場合にそのセルのみ値にするには Kein 06/6/14(水) 18:21 回答[未読]
【38934】Re:TRUEの場合にそのセルのみ値にするには にしもり 06/6/14(水) 18:38 お礼[未読]

【38613】TRUEの場合にそのセルのみ値にするには
質問  にしもり  - 06/6/7(水) 11:08 -

引用なし
パスワード
   こんにちは。

出退勤表をつくっています。
D6は開始時間帯、E6は終了時間帯です。
F4には9:00と固定で入っています。
F6には=IF(AND($D6<=F4,$E6>F4),"■","")とはいっています。
D6に9:00、E6に10:00といれると、F6に■がでます。
実はそれだけでは要件をみたせず、誰が出勤したかの表出をせまられています。
つまり■のかわりに、ニシモリとか名を出したいのです。
で、C2にニシモリといれ、F6に=IF(AND($D6<=F4,$E6>F4),C2,"")としました。
でもこれでは誰が出勤してもニシモリになってしまいます。

そこで、文字が表出された場合に、当該セルのみ値化するマクロはできますか?
たとえば上の例ではF6にニシモリと出ますが、F6のみニシモリという値にし、シート上の他のセルは式のままにしておくのです。
どうかご教授ください。

【38625】Re:TRUEの場合にそのセルのみ値にするには
回答  Kein  - 06/6/7(水) 16:02 -

引用なし
パスワード
   その表を

D6は開始時間帯・E6は終了時間帯・F6以下F列には、D6:E6に規定時間内の
勤務時間を入力した場合だけ、連続して氏名を入力していくように入力フォーム
を出す。

という仕様にするとしてF4の値とF6の数式はクリアし、当該シートのシート
モジュールに以下のイベントを入れてみて下さい。

Private Sub Worksheet_Change(ByVal Target As Range)
  With Target
   If .Address <> "$E$6" Then Exit Sub
   If .Count > 1 Then Exit Sub
   If IsEmpty(.Value) Then Exit Sub
   If InStr(.Text, ":") < 2 Or _
    InStr(.Offset(, -1).Text, ":") < 2 Then
     MsgBox "開始時間・終了時間を" & vbLf & _
     "0:00:00 の時刻形式で入力して下さい", 48
     GoTo ELine
   End If
   If .Offset(, -1).Value <= TimeValue("9:00:00") And _
    .Value > TimeValue("9:00:00") Then
     Do
      MyNm = InputBox("お名前を入力して下さい")
     Loop While MyNm = ""
     If IsEmpty(.Offset(, 1).Value) Then
      .Offset(, 1).Value = MyNm
     Else
      Range("F65536").End(xlUp).Offset(1).Value = MyNm
     End If
   Else
     GoTo ELine
   End If
  End With
  Exit Sub
ELine:
  Application.EnableEvents = False
  Range("D6:E6").ClearContents
  Application.EnableEvents = True
End Sub

【38631】Re:TRUEの場合にそのセルのみ値にするには
質問  にしもり  - 06/6/7(水) 16:38 -

引用なし
パスワード
   ▼Kein さん:
まことにありがとうございます。
シートモジュールとはワークシートのシート見出しを右クリックして、コードの表示をさすやつですね。そうすればワークシートの機能でも十分なAPPLの構築ができるということですね。
わかったようでわからないのでおしえてください。
>D6は開始時間帯・E6は終了時間帯・F6以下F列には、D6:E6に規定時間内の
>勤務時間を入力した場合だけ、連続して氏名を入力していくように入力フォーム
>を出す。
ここでおっしゃっている入力フォームとは、ユーザーフォームのことでしょうか?すみません。イメージが湧きません。

【38634】Re:TRUEの場合にそのセルのみ値にするには
発言  にしもり  - 06/6/7(水) 16:47 -

引用なし
パスワード
   ▼Kein さん:
すみません。わかりました。入力フォームとはInputBoxのことですね。もっとトレースさせていただきます。たぶんその後でまた質問すると思います。

【38635】Re:TRUEの場合にそのセルのみ値にするには
発言  Kein  - 06/6/7(水) 17:02 -

引用なし
パスワード
   少し改良しておきます。
>   Else
>     GoTo ELine
>   End If
>  End With


   Else
    MsgBox "その勤務時間は規定時間外ですので" & _
    "入力されたデータはクリアします", 48: GoTo ELine
   End If
  End With

【38636】Re:TRUEの場合にそのセルのみ値にするには
回答  Kein  - 06/6/7(水) 17:04 -

引用なし
パスワード
   あと冒頭に変数の宣言↓も追加して下さい。

Dim MyNm As String

【38641】Re:TRUEの場合にそのセルのみ値にするには
質問  にしもり  - 06/6/7(水) 17:28 -

引用なし
パスワード
   ▼Kein さん:
すみません。私の説明不足でした。
F4に9:00と固定で入っているといいましたが、G4にも9:15と入っています。H4には9:30、・・・AP4に18:00と入っています。これは当初D6にFromの9:00、E6にToの10:00といれると、F6,G6,H6,I6のセルにニシモリと表出させようとしたためです。
またD6にFromの12:00、E6にToの13:00といれると、R6,S6,T6,U6のセルにニシモリと表出させようとしたためです。From、Toに入力されたそれぞれ開始、終了時間は、そのように展開させたいのです。たとえばPGM中のxlUpが、xlRightになるイメージでしょうか。ただしD7に12:00、E7に13:00といれると、R7,S7,T7,U7のセルにニシモリと表出したい、つまり下にも展開しています。自分でもKein様のPGMを加筆修正してみようと思いますが、かなり厳しいと思われます。ぜひ適切なアドバイスをお願い申し上げます。
なおD6、E6ともに15分単位なので、入力規制のリストで9:00,9:15,9:30,9:45,10:00....18:00からしか選べないようにいたしました。

【38673】Re:TRUEの場合にそのセルのみ値にするには
質問  にしもり  - 06/6/8(木) 12:08 -

引用なし
パスワード
   自力で加筆中ですが、下の Loop Until .Value = Range(m + 5, 4).Valueで止まってしまいます。文法が間違っているでしょうか。

<加筆中>
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim m As Integer
  
  With Target
   If .Address <> "$E$6" Then Exit Sub
   If .Count > 1 Then Exit Sub
   If IsEmpty(.Value) Then Exit Sub
   
' 入力規制したので不要?
'   If InStr(.Text, ":") < 2 Or _
'    InStr(.Offset(, -1).Text, ":") < 2 Then
'     MsgBox "開始時間・終了時間を" & vbLf & _
'     "0:00:00 の時刻形式で入力して下さい", 48
'     GoTo ELine
'   End If

   If .Offset(, -1).Value <= TimeValue("9:00:00") And _
    .Value > TimeValue("9:00:00") Then
     Do
      MyNm = InputBox("お名前を入力して下さい")
     Loop While MyNm = ""
    
    m = 0
    Do
    m = m + 1
    If IsEmpty(.Offset(, m).Value) Then
      .Offset(, m).Value = MyNm
    Else
      MsgBox "すでに入力があります"
'        Range("F65536").End(xlUp).Offset(1).Value = MyNm
    End If
    Loop Until .Value = Range(m + 5, 4).Value
   Else
     GoTo ELine
   End If
  End With
  Exit Sub
ELine:
  Application.EnableEvents = False
  Range("D6:E6").ClearContents
  Application.EnableEvents = True
End Sub

【38675】Re:TRUEの場合にそのセルのみ値にするには
発言  やっちん  - 06/6/8(木) 12:33 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは。
>自力で加筆中ですが、下の Loop Until .Value = Range(m + 5, 4).Valueで止まってしまいます。文法が間違っているでしょうか。
そのときのmの値は何になっていますか?
列の数には限りがあります。

【38678】Re:TRUEの場合にそのセルのみ値にするには
質問  にしもり  - 06/6/8(木) 13:21 -

引用なし
パスワード
   ▼やっちん さん:
>そのときのmの値は何になっていますか?
Loop Until .Value = Range(m + 5, 4).Valueに茶色の●を付け、ローカルウインドウでみたところm=1でした。できるだけがんばりますが他におかしな点はありますか?どうかご指摘ください。

【38681】Re:TRUEの場合にそのセルのみ値にするには
質問  にしもり  - 06/6/8(木) 14:19 -

引用なし
パスワード
   Do
 m = m + 1
 xxxx
Loop Until .Value = Range(m + 5, 4).Value

これはExcel.Rangeの値とRange(m + 5, 4)の値が等しくなるまでxxxx処理を回せ、ということですよね。
今eventが発生しているのはE6で、値は9:15:00だとします。
初回のLoopではm=1ですから右辺はRange(6, 4)でF4を指しますよね。
F4には9:00:00がはいっているので、さらにLoopします。
2回目のLoopでm=2ですから右辺はRange(7, 4)でG4を指しますよね。
G4には9:15:00がはいっているので、Loopは終了するはずなのに・・。
どこがおかしいのでしょうか。

【38686】Re:TRUEの場合にそのセルのみ値にするには
回答  Kein  - 06/6/8(木) 14:56 -

引用なし
パスワード
   えっと遅くなりましたが、そーいう仕様ならたぶんこんなコードになります。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Stm As Single, Etm As Single
  Dim Sc As Variant, Ec As Variant
  Dim Flg As Boolean
  Dim i As Long
  Dim Unm As String 

  With Target
   If .Address <> "$E$6" Then Exit Sub
   If .Count > 1 Then Exit Sub
   If IsEmpty(.Offset(, -1).Value) Then Exit Sub
   If Not .Validation.Value Then
     Flg = True: GoTo ELine
   End If
   Stm = CSng(.Offset(, -1).Value)
   Etm = CSng(.Value)
  End With
  If Stm >= Etm Then
   Flg = True: GoTo ELine
  End If
  i = 6
  With Application
   Sc = .Match(Stm, Rows(4), 1)
   Ec = .Match(Etm, Rows(4), 1)
   If IsError(Sc) Or IsError(Ec) Then
     Flg = True: GoTo ELine
   End If
   Do
     If .CountA(Cells(i, 6).Resize(, 37)) = 0 Then Exit Do
     i = i + 1
   Loop
   Do
     Unm = InputBox("氏名を入力して下さい")
   Loop While Unm = ""
ELine:
   .EnableEvents = False
   If Flg Then
     Range("D6:E6").ClearContents
   Else
     Range(Cells(i, Sc), Cells(i, Ec)).Value = Unm
   End If
   .EnableEvents = True
  End With
End Sub

【38699】Re:TRUEの場合にそのセルのみ値にするには
質問  にしもり  - 06/6/8(木) 17:15 -

引用なし
パスワード
   ▼Kein さん:
まことにありがとうございます。正直わたしには難解でした。
CSng関数で単精度浮動小数点にする、Resizeで或るセルからxx列まで指定範囲を大きくする・・すべて初めて見ました。
Sc = .Match(Stm, Rows(4), 1)で、どのような値がScに代入されるのですか?
またIf .CountA・・・のピリオドの前には何が省略されているのですか?

それはともかく、もっと大きな問題として、わたくしの願っているものと少々違っております。わたくしの説明不足がいけないのですが。
このコードではE6のみにeventが発生することになっておりますが、さきの投稿で書きましたようにeventが発生するセルはその下にもあります。
D7に12:00、E7に13:00といれると、R7,S7,T7,U7にニシモリと表出、
D8に12:00、E8に13:00といれると、R8,S8,T8,U8にニシモリと表出、
D9に12:00、E9に13:00といれると、R9,S9,T9,U9にニシモリと表出、
D10に14:00、E10に15:00といれると、Z10,AA10,AB10,AC10,AD10にニシモリと表出、
D11に12:00、E11に13:00といれると、R11,S11,T11,U11にニシモリと表出、
という具合です。

そのように自分でコードを直してみようと思ってはいますが百年くらいかかりそうです。どこをどうすればよいかご教示ください。

【38701】Re:TRUEの場合にそのセルのみ値にするには
回答  Kein  - 06/6/8(木) 17:37 -

引用なし
パスワード
   入力規制が設定されている範囲は、D:E列の6行目から11行目までに
限定しても良いのですね ? それなら

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Stm As Single, Etm As Single
  Dim Sc As Variant, Ec As Variant
  Dim Flg As Boolean
  Dim Rc As Long
  Dim Unm As String

  If Intersect(Target, Range("E6:E11")) _
  Is Nothing Then Exit Sub
  With Target
   If .Count > 1 Then Exit Sub
   If IsEmpty(.Offset(, -1).Value) Then Exit Sub
   If Not .Validation.Value Then
     Flg = True: GoTo ELine
   End If
   Rc = .Row
   Stm = CSng(.Offset(, -1).Value)
   Etm = CSng(.Value)
  End With
  If Stm >= Etm Then
   Flg = True: GoTo ELine
  End If
  With Application
   Sc = .Match(Stm, Rows(4), 1)
   Ec = .Match(Etm, Rows(4), 1)
   If IsError(Sc) Or IsError(Ec) Then
     Flg = True: GoTo ELine
   End If
   Do
     Unm = InputBox("氏名を入力して下さい")
   Loop While Unm = ""
ELine:
   .EnableEvents = False
   If Flg Then
     MsgBox "入力した値は間違っています。" & _
     "クリアして終了します", 48
     Cells(Rc, 4).Resize(, 2).ClearContents
   Else
     Cells(Rc, 6).Resize(, 37).ClearContents
     Range(Cells(Rc, Sc), Cells(Rc, Ec)).Value = Unm
   End If
   .EnableEvents = True
  End With
End Sub

【38702】Re:TRUEの場合にそのセルのみ値にするには
発言  Kein  - 06/6/8(木) 17:47 -

引用なし
パスワード
   >Sc = .Match(Stm, Rows(4), 1)で、どのような値がScに代入されるのですか?
開始時刻を4行目で検索し、見つかったらその列番号を返し、見つからなかったら
#N/A エラー値を返します。この場合検索の形を指定する引数を 1 にしていれば、
エラー値が返ることは無いのですが。
>またIf .CountA・・・のピリオドの前には何が省略されているのですか?
そのコードはもう不要になりましたが、先のコードでは With Applicatin 〜 End With
の括りの中に入れてあったので、Applicationオブジェクトを省略していたことに
なります。Excel97以降ではワークシート関数をVBAコード内で使うとき、
WorksheetFunction.〜 と書きますが、Excel95以前の Application.〜でも
動作します。ものによっては返り値が違う場合もありますが CountA は同じなので
Application の括りの中に入れました。

【38704】Re:TRUEの場合にそのセルのみ値にするには
質問  にしもり  - 06/6/8(木) 18:14 -

引用なし
パスワード
   ▼Kein さん:
D11に限定してるわけではないですがそこのところは自分でD31とかに直します。
ところでstart timeを9:30に、end timeを10:00にするとH列、I列に入るが必要なJ列に入りません。
が、start timeを9:15に、end timeを10:00にするとF列、G列、H列、I列に(不要なF列まで)入ってしまいます。

また、これも申し訳ないのですが、すでに文字列の入ったセルは上書きしないで”すでに入力されています”みたいなMSGを出したいのです。

あと、ためしにstart timeを9:45に、end timeを9:30にしたら、実行時エラー91 オブジェクト変数またはWITHブロク変数が設定なしとでて、MSG BOXが生かされません。
ぜひご指導よろしくお願いします。
なお、特段急いでいませんのでお気になさらないでください。

【38715】Re:TRUEの場合にそのセルのみ値にするには
回答  Kein  - 06/6/8(木) 21:53 -

引用なし
パスワード
   諸点を修正して以下のようなコードで、うまくいくと思います。
>D11に限定してるわけではないですがそこのところは自分でD31とかに直します
これはコードを書き換えなくても、入力規制を設定した範囲を自動的に取得
するように修正しました。ただし、D:E列の6行目以下に1つも入力規則を設定
したセルが無いとエラーで中断してしまいます。ご注意下さい。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Stm As String, Etm As String, Unm As String
  Dim Sc As Integer, Ec As Integer, Rc As Long
  Dim Flg As Boolean
  Dim C As Range
 
  If Intersect(Target, Range("E6:E65536").SpecialCells(-4174)) _
  Is Nothing Then Exit Sub
  With Target
   If .Count > 1 Then Exit Sub
   If IsEmpty(.Offset(, -1).Value) Then Exit Sub
   If Not .Validation.Value Then
     Flg = True: GoTo ELine
   End If
   Rc = .Row
   If WorksheetFunction _
   .CountA(Cells(Rc, 6).Resize(, 37)) > 0 Then
     Flg = True: GoTo ELine
   End If
   If .Offset(, -1).Value >= .Value Then
     Flg = True: GoTo ELine
   End If
   Range("D6:E65536").SpecialCells(-4174).NumberFormat = "h:mm"
   Stm = .Offset(, -1).Text
   Etm = .Text
  End With
  For Each C In Range("F4:AP4")
   If C.Text = Stm Then
     Sc = C.Column
   ElseIf C.Text = Etm Then
     Ec = C.Column: Exit For
   End If
  Next
  If Sc = 0 Or Ec = 0 Then
   Flg = True: GoTo ELine
  End If
  Do
   Unm = InputBox("氏名を入力して下さい")
  Loop While Unm = ""
ELine:
  Application.EnableEvents = False
  If Flg Then
   MsgBox "入力した値は条件に一致しません。" & _
   "クリアして終了します", 48
   Cells(Rc, 4).Resize(, 2).ClearContents
  Else
   Cells(Rc, 6).Resize(, 37).ClearContents
   Range(Cells(Rc, Sc), Cells(Rc, Ec)).Value = Unm
  End If
  Application.EnableEvents = True
End Sub

【38730】Re:TRUEの場合にそのセルのみ値にするには
質問  にしもり  - 06/6/9(金) 9:35 -

引用なし
パスワード
   ▼Kein さん:
まことにありがとうございます。
といいますかおんぶにだっこで恐縮至極です。
で、私が一度に言わなかったのが悪いのですが、次のようなことは可能でしょうか。

D6に9:15、E6に9:30と入力し、名前も入力したとします。
次に、D6に9:45、E6に10:00と入力しようとしたとき、書き込み可にしたいのです。しかしもし、D6に9:30、E6に9:45と入力しようとしたときは、"入力した値は・・云々"を出したいのです。(9:30のコマがダブることになるので。)

あと、うまく入力できたとき、D列とE列を消してしまいたいのです。
(前略)
  Loop While Unm = ""
     Range("D6:E65536").ClearContents 
 ELine:
(後略)
でよいでしょうか?

まことに恐れ入りますがご指導よろしくお願いします。

【38777】Re:TRUEの場合にそのセルのみ値にするには
回答  Kein  - 06/6/9(金) 21:34 -

引用なし
パスワード
   これで、どうでしょーか ?

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Stm As String, Etm As String, Unm As String
  Dim Sc As Integer, Ec As Integer, Rc As Long
  Dim Flg As Boolean
  Dim C As Range
 
  If Intersect(Target, Range("E6:E65536").SpecialCells(-4174)) _
  Is Nothing Then Exit Sub
  With Target
   If .Count > 1 Then Exit Sub
   If IsEmpty(.Offset(, -1).Value) Then Exit Sub
   If Not .Validation.Value Then
     Flg = True: GoTo ELine
   End If
   Rc = .Row
   If WorksheetFunction _
   .CountA(Cells(Rc, 6).Resize(, 37)) > 0 Then
     Flg = True: GoTo ELine
   End If
   If .Offset(, -1).Value >= .Value Then
     Flg = True: GoTo ELine
   End If
   Range("D6:E65536").SpecialCells(-4174).NumberFormat = "h:mm"
   Stm = .Offset(, -1).Text
   Etm = .Text
  End With
  For Each C In Range("F4:AP4")
   If C.Text = Stm Then Sc = C.Column
   If Sc > 0 And Not IsEmpty(Cells(Rc, Sc).Value) Then Exit For
   If C.Text = Etm Then Ec = C.Column: Exit For
  Next
  If Sc = 0 Or Ec = 0 Then
   Flg = True: GoTo ELine
  End If
  If CBool(Sc) Xor CBool(Ec) Then
   MsgBox "その時間帯は入力済みです", 48
   Flg = True: GoTo ELine
  End If
  Do
   Unm = InputBox("氏名を入力して下さい")
  Loop While Unm = ""
ELine:
  Application.EnableEvents = False
  If Flg Then
   MsgBox "入力した値は条件に一致しません。" & _
   "クリアして終了します", 48
  Else
   Range(Cells(Rc, Sc), Cells(Rc, Ec)).Value = Unm
  End If
  Cells(Rc, 4).Resize(, 2).ClearContents
  Application.EnableEvents = True
End Sub

【38823】Re:TRUEの場合にそのセルのみ値にするには
質問  にしもり  - 06/6/11(日) 16:32 -

引用なし
パスワード
   ▼Kein さん:
こんにちは。
まことにありがとうございます。
使わせていただきましたが確かめていただきたい点がございます。

D6に9:00、E6に9:15と入力し、名前も入りました。
が、次にD6に9:30、E6に9:45と入力しようとするとすると、 ダブっていないのに入力できず、"入力した値は条件に一致しません"に行ってしまうようでございます。又、D6に9:15、E6に9:30と入力しようとすると、 "その時間帯は入力済みです"に行ってほしいのに、"入力した値は条件に一致しません"に行ってしまうようでございます。あと、これも説明不足で伝わらなかったかもしれませんがDxに9:15、Exに9:15と入れると、名がGxのみに入るという具合にしたいのでございます。

助力を仰ぐというのが質問箱の主旨だとおもいますが、おんぶにだっこ状態となっております。申し訳ございません。

【38825】Re:TRUEの場合にそのセルのみ値にするには
回答  Kein  - 06/6/11(日) 17:53 -

引用なし
パスワード
   こちらでテストしたかぎり、以下のコードでうまくいきました。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Stm As String, Etm As String, Unm As String
  Dim Sc As Integer, Ec As Integer, Rc As Long
  Dim Flg As Boolean
  Dim C As Range

  If Intersect(Target, Range("E6:E65536").SpecialCells(-4174)) _
  Is Nothing Then Exit Sub
  With Target
   If .Count > 1 Then Exit Sub
   If IsEmpty(.Offset(, -1).Value) Then Exit Sub
   If Not .Validation.Value Then
     Flg = True: GoTo ELine
   End If
   Rc = .Row
   If .Offset(, -1).Value > .Value Then
     Flg = True: GoTo ELine
   End If
   Range("D6:E65536").SpecialCells(-4174).NumberFormat = "h:mm"
   Stm = .Offset(, -1).Text
   Etm = .Text
  End With
  For Each C In Range("F4:AP4")
   If C.Text = Stm Then Sc = C.Column
   If Sc > 0 Then
     If Not IsEmpty(Cells(Rc, Sc).Value) Then
      MsgBox "その時間帯は入力済みです", 48: Exit Sub
     End If
   End If
   If C.Text = Etm Then Ec = C.Column: Exit For
  Next
  If Sc = 0 Or Ec = 0 Then
   Flg = True: GoTo ELine
  End If
  Do
   Unm = InputBox("氏名を入力して下さい")
  Loop While Unm = ""
ELine:
  Application.EnableEvents = False
  If Flg Then
   MsgBox "入力した値は条件に一致しません。" & _
   "クリアして終了します", 48
  Else
   Range(Cells(Rc, Sc), Cells(Rc, Ec)).Value = Unm
  End If
  Cells(Rc, 4).Resize(, 2).ClearContents
  Application.EnableEvents = True
End Sub

【38835】Re:TRUEの場合にそのセルのみ値にするには
お礼  にしもり  - 06/6/12(月) 1:01 -

引用なし
パスワード
   ▼Kein さん:
使わせていただきましたところ完璧でございました。
まことにありがとうございました。

ひとつ前に投稿にも書いたのですが、おんぶにだっこ状態となってしまい申し訳なさのほうが大きいです。これだけのコードを自力で書くことは不可能でありました。出退勤表のセルをひとつひとつ入力をしていたのでは手書きと変わりませんので、なんと申し上げていいかわかりません。

今後おんぶにだっこ状態になるかもしれないことを考えるとひきつづき質問箱に投稿してよいものか悩んでいる状況です。

【38913】Re:TRUEの場合にそのセルのみ値にするには
質問  にしもり  - 06/6/14(水) 11:45 -

引用なし
パスワード
   こんにちは。
性懲りもなく質問させていただきます。
申し訳ございません。

"氏名を入力してください"というInput boxがありますよね。
たとえば、Start timeとEnd timeを入れたまではよかったが、入れた直後にEnd timeを間違ったことに気づケースもあると思います。
そんなとき、Input boxの右肩のx(閉じる)を押せるようにできますか?
xを押すことによって元に戻ってEnd timeを入れなおすことができるようにしたいのです。
Input boxのあとにType:=8と記述するようなのですが正直わかりません。

ご教示よろしくお願いします。

【38932】Re:TRUEの場合にそのセルのみ値にするには
回答  Kein  - 06/6/14(水) 18:21 -

引用なし
パスワード
   キャンセルボタンか×ボタンを押したとき、マクロを終了したいのなら
>Do
>  Unm = InputBox("氏名を入力して下さい")
>Loop While Unm = ""


Unm = InputBox("氏名を入力して下さい")
If Unm = "" Then Exit Sub

と、変更して下さい。

【38934】Re:TRUEの場合にそのセルのみ値にするには
お礼  にしもり  - 06/6/14(水) 18:38 -

引用なし
パスワード
   ▼Kein さん:
キャンセルできるようになりました!
深く感謝申し上げます。

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