アプリ版:「スタンプのみでお礼する」機能のリリースについて

セルに11時45分などを入力するのに、1145とコロンを打たずに入力していきたいのですが、どうすれば良いでしょうか?
以前この質問で答えていただいた方でこのような回答をされていてすごく助かりました、
作業を進めているうちに次の問題に引っかかりました、
下の回答が勉強になったものです



No.3

回答者:ja7awu
回答日時:2003/03/28 14:13
.
0~2359 までの数値入力に対し、時刻と認識させるためには、書式では、
出来ないと思います。

VBAが必須になりますが、もし、それで宜しかったら、操作手順を詳しく
書きますので、テストしてみてください。

・ 使用しているシートのシート名タブを右クリックし、「コードの表示」を
 選択します。
・ 表示されたコードウィンドウに下記コードをコピーして貼り付けます。
 (Option Explicit があったらその行の下に貼り付けます。)
・ コードの5行目で、時刻を入力する範囲を実情に合わせ変更します。
・ Alt + Q でウィンドウを閉じ、シートに戻ります。

時刻入力範囲の表示形式を時刻にし、種類を任意に指定します。

これで、1234 と入力すると 12:34 になります。
5 は0:05、30は0:30、123は1:23 というようになります。
567 など時刻として認識できない数字を入力した場合は、メッセージが出て、
その後消去されます。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Hani As Range
Dim i As Integer
Dim col As Integer
Set Hani = Range("A:A") ' 入力範囲指定
Set Target = Application.Intersect(Hani, Target)
If Target Is Nothing Then Exit Sub ' 範囲外無視
If Target.Count > 1 Then Exit Sub ' 複数セル無視
If Target.Value < 1 Then Exit Sub 'すでに時刻形式無視
i = Val(Target.Value)
On Error GoTo inp_err
Target.Value = TimeValue(Format(i, "#0:00"))
Set Hani = Nothing
Exit Sub
inp_err:
Target.Select
MsgBox "入力した値 " & i & " は、時刻として範囲外です。", vbCritical
Selection = vbNullString
End Sub


すると数式がはいっているところが計算されないのでこまっています、また24時いこうは入力がAM1:00なら2500と入力すると時間として認識されないのです。
どうしたら良いでしょうか?

「Excelで:(コロン)を省いた時刻入力」の質問画像

A 回答 (2件)

こんばんは!


横からお邪魔します。

基本的に他の方のコードに手を加えるのは本意ではないので、自分なりにやってみました。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim myTime As Long
If Intersect(Target, Range("A:A")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Target
On Error GoTo EH
If .Value <> "" Then
If IsNumeric(.Value) And .Value > 0 Then
If .Value - Int(.Value) = 0 And .Value Mod 100 < 60 Then
myTime = .Value
Application.EnableEvents = False
.Value = TimeSerial(Int(myTime / 100), myTime Mod 100, 0)
.NumberFormatLocal = "[h]:mm"
Application.EnableEvents = True
Exit Sub
End If
End If
End If
EH:
MsgBox "入力値が不正です。" & vbCrLf & "再入力してください。"
Application.EnableEvents = False
.ClearContents
.Select
Application.EnableEvents = True
End With
End Sub

※ 色々なエラーに対するコードを記載する必要があると思いますが、
とりあえずはこの程度で・・・m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます、なかなか難しいです、どうしても素人ですから、上手くできませんでした、
時間があるときにまた参考にしてチャレンジしてみます。
本当にありがとうございました。

お礼日時:2015/03/13 22:08

こんにちは。



人のコードは、基本的には触れないほうがよさそうです。変な恨まれ方をしてもしょうがないですからね。
でも、この前から、似たようなコードをお見かけしますが、VBAとワークシートを違うという認識でないとダメなんだろうと思いますね。こういう場合は、Excelのキャストさせればよいのですね。

この作者の方には、別に批判ではないけれども、なにはともあれ「vbNullString」これは意味が違います。この種の定数には、似たようなものがありますから、たぶん勘違いされたものだと思います。私は、単に="" とか、ClearContents を使っています。

さて、大きな違いというのは、「キャスト」といって、Excelのワークシートが勝手に書式を直してしまう機能を逆手に取った方法です。ただ、不具合があれば、また考えてみます。また、0は、0時として入るようになっています。

'//
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim n As Variant
 If Target.Column <> 1 Then Exit Sub 'A列以外は不可
 If Target.Count > 1 Then Exit Sub '貼り付けしても、1個限り
 If Target.Value = "" Then Exit Sub '空白文字は不可
 If Not IsNumeric(Target.Value) Then Exit Sub '数値でないのは不可
 n = Format(Target.Value, "0:##")
 If Val(Mid(n, InStr(n, ":") + 1)) >= 60 Then '60分以上の入力不可
  Target.ClearContents '入力間違いは消去
  Exit Sub
 End If
 Target.NumberFormatLocal = "[h]:mm"
 Application.EnableEvents = False
    Target.Value = n  '←文字列をキャスト
 Application.EnableEvents = True
End Sub
'//
    • good
    • 0
この回答へのお礼

ありがとうございます、なかなか難しいです、どうしても素人ですから、上手くできませんでした、
時間があるときにまた参考にしてチャレンジしてみます。
本当にありがとうございました。

お礼日時:2015/03/13 22:09

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