- ベストアンサー
3桁または4桁の数値を時刻に変換したい
- Excel2003でマクロ作成の初心者です。3桁または4桁の数字を時刻に変更したいです。
- ネットで捜したら、見つかりましたが、実行時エラーが発生しています。
- さらに、数値を入力したセルを削除すると型の不一致のエラーが発生します。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
表示だけの事なら 書式設定で#0":"00でいいと思います。 あえてマクロにするなら Private Sub Worksheet_Change(ByVal Target As Range) If Application.Intersect(Target, Range("A1,C1:D2")) Is Nothing Then Exit Sub Target.NumberFormatLocal = "#0"":""00" End Sub 質問者さんのマクロに追加するならば Private Sub Worksheet_Change(ByVal Target As Range) Dim t As String On Error Resume Next (1) t = Target.Value If Application.Intersect(Target, Range("A1,C1:D2")) Is Nothing Then Exit Sub If Len(t) = 3 Then t = "0" & t (2) If Len(t) = 2 Then t = "00" & t (3) If Len(t) = 1 Then t = "000" & t (4) If Len(t) <> 4 Then Exit Sub With Target .NumberFormatLocal = "h:mm;@" .Formula = Left(t, 2) & ":" & Right(t, 2) End With End Sub (1)~(4)を追加します。
その他の回答 (7)
- ytsg
- ベストアンサー率58% (7/12)
No.1です。 一応全コード表示しておきます。 **************************************************************** Private Sub Worksheet_Change(ByVal Target As Range) Dim t As String t = Target.Value '時間に変換する場所を制限します。 'デフォルトでは「A1」と「C1からD2」に入力した場合のみ処理が実行されます If Application.Intersect(Target, Range("A1,C1:D2")) Is Nothing Then Exit Sub If Len(t) < 4 Then t = "0" & t '追加1 '入力された数値が4桁以外の場合ははじかれます。 If Len(t) <> 4 Then Exit Sub With Target 'セルの書式を時間に設定します。 .NumberFormatLocal = "h:mm;@" '四桁の数字に「:」を追加します。 'この部分はほかにもいろいろな方法があると思います。ので変えてください。 Application.EnableEvents = False '追加2 .Formula = Left(t, 2) & ":" & Right(t, 2) Application.EnableEvents = True '追加3 End With End Sub ************************************************** No.6の方が書いておられるように、試行錯誤している段階でセルがおかしな状態になっているのでは? A1、,C1:D2のセルの書式を標準に戻して試してみてはいかがでしょうか。
お礼
まったくマクロの入ってないシートで試したところ、見事にできました。 ということは、私のシートに何らかの原因があることがはっきりしてきました。 これまで大変お世話になりました。あとは自分で原因究明するしかないので 質問をいったん締め切りたいと思います。本当にありがとうございました。
- hidetora1900
- ベストアンサー率15% (2/13)
エクセルって、そんな長いプログラムが必要なんですか? (-.-)
- tom04
- ベストアンサー率49% (2537/5117)
No.3です! 補足を読ませていただきました。 ん~~~ 原因が判りかねますが、変数「t」をString型でなく、Variant型かLong(長整数)型で宣言してみてはどうでしょうか? せっかくコードをお考えなので、余計なお世話かもしれませんが・・・ こちらでコードを作ってみました。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1,C1:D2")) Is Nothing Then Exit Sub Dim t As Variant t = Target If t > 2400 Or t Mod 100 >= 60 Then MsgBox ("入力値が不正です、" & vbCrLf & "再入力してください。") With Target .ClearContents .Select .NumberFormatLocal = "G/標準" End With Exit Sub Else Application.EnableEvents = False With Target .NumberFormatLocal = "h:mm" .Value = Int(t / 100) & ":" & t Mod 100 End With Application.EnableEvents = True End If End Sub ※ 入力値が24時を超えたり、分の部分(下二桁)が60以上にした場合はメッセージボックスを表示させ、再入力するようにしてみました。 ※ 一旦エラーが出てしまった場合何らかの残骸が残っているかもしれませんので、別Sheetで試してみてください。 余計なお世話だったらごめんなさいね。m(_ _)m
お礼
まったくマクロの入ってないシートで試したところ、見事にできました。 ということは、私のシートに何らかの原因があることがはっきりしてきました。 これまで大変お世話になりました。あとは自分で原因究明するしかないので 質問をいったん締め切りたいと思います。本当にありがとうございました。
補足
教えていただいたとおり、書き直し740と入力してエンターを押したとたん 実行時えらー1004 Rangeクラスの NumberFormatLocalプロパティ設定できません。となります。
- ytsg
- ベストアンサー率58% (7/12)
No1の者です。 >そして、今偶然きがついたのですが、600→0.:25 1200→00:.5 1800→0.:75 という風にこの3つは >おかしなことにできませんでした。なぜなんでしょうか? .Formula = Left(t, 2) & ":" & Right(t, 2)の時にWorksheetのChangeイベントが起こってしまっているので 値がおかしくなってしまっています。 下記3行目の「Application.EnableEvents = False」と5行目の「Application.EnableEvents = True」を追加してください。 ********************************** '四桁の数字に「:」を追加します。 'この部分はほかにもいろいろな方法があると思います。ので変えてください。 Application.EnableEvents = False .Formula = Left(t, 2) & ":" & Right(t, 2) Application.EnableEvents = True ********************************** Application.EnableEvents = False とすることでマクロで処理している置き換えではChangeイベントを起こさないということです。 正しい値を書き込み終わったら「Application.EnableEvents = True」でイベントを復活させます。
補足
教えていただいたとおり、書き直し740と入力してエンターを押したとたん 実行時えらー1004 Rangeクラスの NumberFormatLocalプロパティ設定できません。となります。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 一案です。 With Target .NumberFormatLocal = "h:mm" .Value = WorksheetFunction.RoundDown(t / 100, 0) & ":" & Right(t, 2) End With といった感じにしてみてはどうでしょうか?m(__)m
補足
今実験しましたら 600→0:25 1800→0.0520833 1200→ 実行時エラー 型が一致しません という不思議な現象になりました。
- DIooggooID
- ベストアンサー率27% (1730/6405)
表示形式に拘っていらっしゃるのでしたら、 VBAなどは使用せずに、 単にそのセルの表示形式を 【ユーザ定義】で、 00":"00 にする手段でも良いと思います。
- ytsg
- ベストアンサー率58% (7/12)
修正を一番少なくするには >'デフォルトでは「A1」と「C1からD2」に入力した場合のみ処理が実行されます >If Application.Intersect(Target, Range("A1,C1:D2")) Is Nothing Then Exit Sub と >'入力された数値が4桁以外の場合ははじかれます。 >If Len(t) <> 4 Then Exit Sub の間に '4桁未満なら前に0を追加 If Len(Target) < 4 Then t = "0" & t を追加します。 マクロ内ですでに数値を文字列として保持している(Dim t As String)ので 結果として'0820と入力したのと同じことになります。
補足
今早速教えていただいたとおりやってみました。3桁でもうまくできました。 そして、今偶然きがついたのですが、600→0.:25 1200→00:.5 1800→0.:75 という風にこの3つは おかしなことにできませんでした。なぜなんでしょうか?
お礼
まったくマクロの入ってないシートで試したところ、見事にできました。 ということは、私のシートに何らかの原因があることがはっきりしてきました。 これまで大変お世話になりました。あとは自分で原因究明するしかないので 質問をいったん締め切りたいと思います。本当にありがとうございました。 貴方様のコードは3件以外完璧にできましたので、これを参考にして原因究明したいとおもいます。
補足
パートに時間計算に使用しているので、VBAでやりたいです。 教えていただいたコードを自分のセルに修正し実行してみました。エラー処理もできて ほぼ近づいてきました。しかし原因不明の処理ができません。この3件だけです。 600→0.:25 1200→00:.5 1800→0.:75 この3件が正常にできるようにしたいです。 私のD63:O93,AF63:AL93は4列とも横方向にセルの結合をしています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim t As String On Error Resume Next t = Target.Value If Application.Intersect(Target, Range("D63:O93,AF63:AL93")) Is Nothing Then Exit Sub If Len(t) = 3 Then t = "0" & t If Len(t) = 2 Then t = "00" & t If Len(t) = 1 Then t = "000" & t With Target If Len(t) <> 4 Then Exit Sub .NumberFormatLocal = "h:mm;@" .Formula = Left(t, 2) & ":" & Right(t, 2) End With End Sub