• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA/エクセルの日付入力でYYYYMMDD)

VBA/エクセルの日付入力でYYYYMMDD

cj_moverの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.12

こんにちは。お邪魔します。 色んなアプローチがあっていいと思いますけれど、自分は、 Excelに備わっている日付判定をそのまま活用することを最初から考えていました。 試しに書いてみたら、とても面白かったので、回答してみることにしました。 想定している"日付擬き値"が十分かどうか判りませんけど、結構マジで保守よりの回答(のつもり)です。 まずは、テスト用サンプル。 ========= 20140712 2014/7/12 7月12日 2014年7月12日 H26.7.12 2014/7/12 22:06 0 -1 ABC '20140712 '2014/7/12 '2014/07/12 '7/12 '7月12日 '14年7月12日 '2014年7月12日 'H26.7.12 '14-7-12 '2014-7-12 ========= ※ 先頭の6行は何れも日付値、 ※ 空行は空セルの意、 ※ 日付に変換しようがない数値と、文字列値、 ※ ' は文字列値を想定したプレフィックスなので、   コピペした後に、普通にトリミングしてから、F2、Enter、で確定し直します。 #実体験として日付を文字列値で入力されている場面を何度も見かけたので、一応。 ※ エラー値セルがあると(メッセージと共に)処理が失敗するように書いてます。 早速、実コード。 ' ' ====================================================================== Private Sub Worksheet_Change(ByVal Target As Range) ' 8675020 Dim vBuf Dim rMark As Range, rWork As Range, c As Range Dim sRef As String   Set rMark = Intersect(Columns(3), Target)   If rMark Is Nothing Then Exit Sub   Application.EnableEvents = False   Set rWork = Cells(1, Columns.Count).End(xlToLeft)(1, 2) ' 作業セルを指定 On Error GoTo ErrOut_   rMark.NumberFormatLocal = "yyyy/m/d" ' 先に表示形式を決めておく   For Each c In rMark     If Not IsEmpty(c) Then 'Debug.Print c.Row,       sRef = c.Address(0, 0)       rWork.Formula = "=""""&iferror(--" & sRef & "," & sRef & ")"       vBuf = rWork.Value       Select Case vBuf       Case 1 To 2958465 ' 「日付」または「Excel数式が日付と判断できる値」(1900/1/1-9999/12/31)         vBuf = Format$(vBuf, "yyyy/mm/dd") ' 〓 As String★  時刻値が混じっている場合の為に日付で丸める       Case 19000101 To 99991231  '  「8桁表記の日付」。「Excelが日付として扱える整数値」に限る         vBuf = Format$(vBuf, "####/##/##") ' 〓 As String★  整数を日付値に纏める       Case Else ' 以上の条件で日付ではないと判断された場合は、#VALUE! エラーを返す         vBuf = CVErr(xlErrValue) ' 〓 As Error '        Range(sRef & "," & c.EntireColumn.Address & "," & c.EntireRow.Address).Select '        MsgBox c.Formula & vbLf & "違っ!"       End Select 'Debug.Print RegDate, TypeName(RegDate)       c = vBuf     End If   Next ErrOut_:   rWork.ClearContents ' 作業セルを値消去   Debug.Print Me.UsedRange.Column ' 作業セルによってUsedRangeが変更された場合、元に戻す為のダミー処理   Application.EnableEvents = True If Err.Number Then MsgBox "失敗"   Set rMark = Nothing:  Set rWork = Nothing End Sub ' ' ====================================================================== (C列を対象に)For Each で書いたのは複数のサンプルで確認するのが容易だからです。 単セル仕様にするにはColumns(3)をRange("D2,F2,C4")とか書き換えるだけでも対応は可能です。 セルに返すVariant変数vBufの最終的なデータ型は、Variant/StringまたはVariant/Errorにしてあります。 日付型にしないと気持ち悪いという場合は(結果は変わりませんが)★印の行でCDate()関数などで処理することになります。 その場合は、c = vBuf、に代えて、c.Value = vBuf、とした方が記述としては一貫性がある(理解され易い)と思います。 ワークシート関数のIFERROR()関数を使っていますので、Excelバージョンのよっては書換えが必要です。 作業セルを使っているのは、Excelワークシートの機能としてのデータ型の変換機能を使う為です。 当初は数式だけでなんとか出来るかと思いEvaluateメソッドでトライしてみたのですが、 実際にセルで数式の戻り値を吐かないと型のキャストをして貰えないことに気づき、諦めようかと思いました。 しかし、試しに、作業セルで数式を計算させてみると、汎用的に型の変換をしてくれることに驚きました。 作業セルを使うなんてもっての他、という考えもあるでしょうし、勿論できれば使いたくないですけれど、 この方が簡単で確実なように思えて、敢えて採用してみました。 偶然の恩恵として、Select Case にて、入力できる日付期間を比較的簡単に制限できるようになっています。 ここまでの経緯だけでも私はやってて楽しかったのですが、もう一つ、 特に意図した訳ではないのですが、軽く書き上げようと進めていたら、 Variant型変数での型のキャスト、型の変化が目まぐるしくて、というか、Variant型って本当に凄いです。 と、こんなこと書くとプログラマー志向の高いVBA開発者には敬遠されるかも、ですが、 Excel VBAらしく一般機能の活用を図ると避けて通れないのがVariant型だったり型のキャストだったりもしますね。 #ぃゃすみません勝手に一人で楽しんじゃって。質問あげてくれたことに感謝します。 > もう1点、日付をYYYYMMDDの連続数字で入力することは普通、エクセルではあまり見たことないですが、これって一般的な方法なのでしょうか? Excelで一般的かというと、やや特殊に近いかも知れませんが、同じExcelでもデータベース扱う機会が多いと一般的でしょうね。 私自身も8桁数字で日付を扱うことの方がやや多いです。手書きの帳票でも中にはそういうフォーマットがあったりしますし、、、。 ですから、YYYYMMDDで入力してしまう人にとっては、それは癖だったりする場合もある訳で、決して変わったことをしている訳ではないですね。 ちなみに6桁や7桁という場合は、単なるタイプミスですから、ご安心を。 お邪魔しました。それではまた。

emaxemax
質問者

お礼

cj_moverさん、またお世話になります。 とても勉強になる回答をありがとうございます。 ただ今回は、コピペ入力や時間まで入るケースは想定しなくてよいので、もっと簡単(というか、後任者が見てもすぐわかるようなコード)にやってみました。 回答8のお礼に書いたコードです。 ありがとうございました。 これからもよろしくお願いいたします。

関連するQ&A

  • エクセル 加算 

    1つのセルに数字を入力すると加算されているマクロを探していたら 以下の回答がありました Dim memo Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value <> "**" And IsNumeric(Target.Value) = False Then Exit Sub Application.EnableEvents = False If Target.Value = "**" Then memo = 0 Else memo = memo + Target.Value End If Target.Value = memo Application.EnableEvents = True End Sub このマクロですがA1に入力した場合に適用しますが、このマクロをたとえばA1からC1の範囲で使用した1場合にどのようなマクロをすればよいかわかりません それか、このマクロではそのようなことができるのかもわかりませんので教えて頂けないでしょうか

  • EXCEL VBAについて教えてください

    はじめまして。 過去ログに私のやりたいような内容を探していたらこのような下記のエクセルVBAがあったので、教えて頂きたいです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value = "" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With With Cells(ActiveSheet.Rows.Count, "C").End(xlUp) .Offset(1, 0).Value = x .Offset(1, 1).Value = Time() End With End Sub A1に入力するたびに同一セルに加算。 A1をクリアできる。 C列に入力履歴、D列に入力時間を記録。 If Target.Address <> "$A$1" Then Exit Sub の$A$1を変えることによって他のセルにも設定できる。 と、いう内容なのですが、これをたとえば同一シートのA1~E10のセルとA12~E22にも同じよう別々に処理できるように設定したいのですが、どのようにすればいいのでしょうか?ちなみにA11~E11とA23~E23は合計を表示するセルにしたいです。 Excelのバージョンは2003です。 よろしくお願い致します

  • Excel 置換? VBA

    先ほども質問したんですが、 A1に010と入力すると田中、020入力で鈴木と出来るように、 ------------------------------------------------------ Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Select Case Target.Value Case "010": myStr = "田中" Case "020": myStr = "鈴木" Case "030": myStr = "岡田" Case "": myStr = "" Case Else: myStr = "非該当" End Select Application.EnableEvents = False On Error GoTo line Target.Value = myStr line: Application.EnableEvents = True End Sub ---------------------------------------------------- を教えていただきました! が、A2でも同じようなことを行いたいのです! VBAの知識が乏しいのでコピペでいろいろやってみたのですが、エラーで出来ませんでした…。 A1 A2 ・ ・ ・ と同じように入力できるようにするにはどのようにすればよいのでしょうか?もう一度教えて下さい。よろしくお願いします。

  • VBAの日付チェックでオーバーフローを回避したい。

    VBAの日付チェックでオーバーフローを回避したい。 ExcelのG列のセルに入力されたものが日付型であるかどうかのチェックかけたいと思います。 以下のコードだと、数字2958466以上の入力でオーバーフローが発生します。 これを回避する方法はありますか? セルを日付型に設定しているため、2958465(2999/12/31)までしか判別できないのでしょうが、 利用者が2958466以上を入力してしまう可能性はあります。 オーバーフローではなく、エラーメッセージが出せたら・・・と思います。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 8 Then Application.EnableEvents = False If Target <> "" And Not IsDate(Target) Then MsgBox "日付型で入力してください。" & vbCrLf & "(例:2010/10/31)", vbCritical, "入力エラー" Target = "" Target.Select End If Application.EnableEvents = True End If End Sub こんなコードも試しましたが、結果は同じでした。 ↓ Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 8 Then Application.EnableEvents = False If Target > 2958466 Then MsgBox "日付型で入力してください。" & vbCrLf & "(例:2010/10/31)", vbCritical, "入力エラー" Target = "" Target.Select Else If Target <> "" And Not IsDate(Target) Then MsgBox "日付型で入力してください。" & vbCrLf & "(例:2010/10/31)", vbCritical, "入力エラー" Target = "" Target.Select End If End If Application.EnableEvents = True End If End Sub On Error Resume Next や On Error GoTo ... での対処も考えましたが、同じ結果でした。 何か良い方法がありましたら、お願いいたします。

  • Excel 2000です。VBAを改造していただきたいのですが

    入荷品のチェックシートです。B列に受領数を入力するとA列に年月日が記録されるVBAを作っていただき必要なブックのシートごとにコピーして使っていました。全品入荷完了後 別のロットにシートタブの名目を書き換えて再利用します。  ('複数セルが選択された場合、動作をキャンセル  がなぜ必要かも理解できないVBAの勉強を挫折の高齢者です) B列のセル一個づつ選択削除でないとB列が空白になるだけでA列には日付が残ります。複数のセル選択で一気に日付を削除したいのです。 お助けください。 Private Sub Worksheet_Change(ByVal Target As Range) '複数セルが選択された場合、動作をキャンセル If Target.Count <> 1 Then Exit Sub If Intersect(Target, Range("B5:B1000")) Is Nothing Then Exit Sub 'B5:B1000"の範囲外は除外 Application.EnableEvents = False If Target.Value <> "" Then If IsDate(Target.Offset(, -1).Value) Then GoTo EXIT_LABEL '日付が記入済の場合は実行しない Target.Offset(, -1).Value = Format$(Now, "mm/dd hh:mm") Else 'セルを空白にした場合、日付を削除 Target.Offset(, -1).Value = "" End If EXIT_LABEL: Application.EnableEvents = True End Sub

  • エクセルで日付と時間を自動入力する

    エクセルでF13~P13に何か入力したら、その下のセルの F14~P14に日付と時間が自動入力される という質問、回答を見つけました。 これで日付を削除するかどうかのメッセージボックスを出さずに 入力するセルのデータを削除した時に日付も削除するには どの部分を削除すれば良いですか? Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim mRng As Range Application.EnableEvents = False For Each mRng In Target If Not Intersect(mRng, Range("F13:P13")) Is Nothing Then If mRng.Value = "" Then If MsgBox("日付も削除しますか?", vbYesNo + vbDefaultButton2) = vbYes Then mRng.Offset(1, 0).Value = "" End If Else mRng.Offset(1, 0).Value = Format(Now, "yyyy/mm/dd"" ""hh:mm:ss") End If End If Next mRng Application.EnableEvents = True End Sub

  • VBAの時間入力について

    先日、時間を文字列で、HH:mmのフォーマット入力するPGを教えて頂き、 内容理解をしているのですがわからない部分があります。 ★の部分の条件で、00:00も入力したいです。 ご存知か方がおられましたら教えてください。 よろしくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から 'Intersect:http://officetanaka.net/excel/vba/tips/tips118.htm 'Is Nothing:nullではない 'Selection.Count <> 1:選択数が1以下ではない(<> :等しくない) ' Not IsNumeric(Target):数値ではない If Intersect(Target, Columns(12)) Is Nothing Or Selection.Count <> 1 _ Or Not IsNumeric(Target) Then Exit Sub ' 'Target:セルの値は24:00以下 '2つの数値の除算を行いし,その剰余を返す 'Mod:2つの数値の除算を行いし,その剰余を返す '★ここで00:00時も入力したい。 If Target <= 2400 And Target Mod 100 < 60 Then ' Application.EnableEvents = False ' With Target ' If Len(Target) = 3 Then .Value = 0 & ":" & Right(Target, 2) ElseIf Len(Target) = 3 Then .Value = Left(Target, 1) & ":" & Right(Target, 2) Else .Value = Left(Target, 2) & ":" & Right(Target, 2) End If .NumberFormatLocal = "hh:mm" ' End With ' Application.EnableEvents = True ' Else MsgBox "入力値が不正です。" ' With Target ' .Value = "" .Select End With Exit Sub ' End If End Sub 'この行まで

  • エクセルでデータ入力された日付と時間を自動入力する

    前回ご質問にて 1行目に何か入力したら2行目に日付と時間を自動入力する というVBAを教えて頂きました。 ------------------------ Private Sub Worksheet_Change(ByVal Target As Excel.Range) Application.EnableEvents = False If Target.Row = 1 Then Target.Offset(1, 0).Value = Format(Now, "yyyy/mm/dd"" ""hh:mm:ss") End If Application.EnableEvents = True End Sub ------------------------ これを1行目に何か入力したら2行目に日付と時間ではなく セル指定を行いたいのです。 例)F13~P13に何か入力したら、その下のセルの F14~P14に日付と時間が自動入力される という作りです。 よろしくお願いします。

  • エクセルで数字を入力すると隣のセルに特定の文字に変換する方法

    Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count <> 1 Then Exit Sub Application.EnableEvents = False Select Case Target.Value Case 93 Target.Value = "アフガニスタン" Case 971 Target.Value = "アラブ首長国連邦" Case 967 Target.Value = "イエメン共和国" End Select Application.EnableEvents = True End Sub 国別電話番号の表を作りたいのですが、VLOOKUP関数を使用せずに上記のプログラムを利用して数字を入れたセルの隣のセルに特定の文字を反映させたいのですが、初心者の為に苦労しております。 どのようなプログラムを付け加えたら良いのかお教えください。 よろしくお願いいたします。

  • エクセルのVBAについて教えてください。

    エクセルのVBAについて教えてください。 下記のような構文で、Dの行にAやBの文字が入力された時、その都度 セルの色が変わるようにはできたのですが、本当は、「C5」セルに文字が 入力された時、「C5」だけでなく「B5:J5」の範囲でセルの色を変えたい のですが、どうすれば良いのでしょうか。 ご存知の方是非教えてください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myColor As Integer If Target.Count > 1 Then Exit Sub If Target.Column <>4 Then Exit Sub Select Case Target.Value Case "A" myColor = 34 '水色 Case "B" myColor = 40 '肌色 Case Else myColor = xlNone End Select Target.Interior.ColorIndex = myColor End Sub