• ベストアンサー

Excel VBAでの日付の表示形式指定について

以下のサイトを参考に、B列に入力するとC列に自動で日付が挿入されるようなVBAを作成し、日付を「07/19」という表示形式にしたかったので、Format関数で指定しました。 http://hpcgi1.nifty.com/kenzo30/b_cbbs/cbbs.cgi?mode=al2&namber=34979&rev=&no=0&P=R&KLOG=226 -----VBA------------ 'B列入力で日付自動挿入 Private Sub Worksheet_Change(ByVal Target As Range) Dim RR As Range Dim R As Range Set RR = Intersect(Target, Range("B:B")) If RR Is Nothing Then Exit Sub Application.EnableEvents = False For Each R In RR If R.Value <> "" Then R.Offset(, 1).Value = Format(Date,"mm/dd") Else R.Offset(, 1).ClearContents End If Next Application.EnableEvents = True End Sub --------------------- うまく日付が挿入されるのですが、なぜか表示形式が 「7月19日」と日本語表記になってしまいます。 「セルの書式設定」で「mm/dd」と設定すればいいのかもしれませんが、VBAで設定する方法はないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

質問者のコードの中の始めのほうに MsgBox Format(Date, "mm/dd") を入れてみました。ここを通ると 7/19(本日は7月19日)と表示される。もちろんFormat関数を使っているから、文字列だ。 シートで数字文字列(例 全角7+半角/+19でも)のつもりでも数字でも、入力すると、/が入っているので、エクセルの強烈な日付変換(解釈)機能で日付を入力したものとされて、/が1つの月日入力の場合は、シートの地の日付書式の7月19日で表示されてしまう。 この設定がどこに由来するものか小生思い出せないが。 C列の日付書式を2009/7/19の形式に設定していなくても。2009/7/19で入れるとそのまま2009/7/19になるのにね。 ーー (1)改善策はC列の書式を3/14(エクセルの場合の代表例で有るでしょ)を設定しておく。 (2)コードを下記に変える R.Offset(0, 1) = Date R.Offset(0, 1).NumberFormat = "mm/dd" にする。 エクセルでは日付はヒヅケシリアル値という正整数で、数なので NumberFormatになっていると思われる。文字列に、ろくな書式設定は無いが、それでもNumberFormatなのだが。 ーー Set RR = Intersect(Target, Range("B:B")) なんてむつかしい書き方をしなくても簡単に If Target.Column=2 Then で済むのに。

その他の回答 (2)

  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

回答は出でますが。。。 書式の表示形式は、NumberFormatプロパティですので >R.Offset(, 1).Value = Format(Date,"mm/dd") これを以下の2行に変更してみてください。 R.Offset(, 1).NumberFormatLocal = "mm/dd" R.Offset(, 1).Value = Date   以上です。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

>「セルの書式設定」で「mm/dd」と設定 の動作をマクロの自動記録で確認してみるとか。

関連するQ&A

  • Excel VBA の件で質問です

    照合システムを作ろうとネットを閲覧していたら次のコードが見つかりました。 Private Sub Worksheet_Change(ByVal Target As Range) Dim rr As Range If Not Intersect(Target, Range("C1:D10")) Is Nothing Then For Each rr In Intersect(Target.EntireRow, Range("C:C")) If Not IsEmpty(rr) And Not IsEmpty(rr.Offset(, 1)) Then Application.EnableEvents = False If rr.Value <> rr.Offset(, 1).Value Then Beep rr.Offset(, 2).Value = "NG" Else rr.Offset(, 2).Value = "OK" End If Application.EnableEvents = True End If Next End If End Sub このコードでいくと、C列とD列が同じであればE列にOK、間違っていればNGなのですが、C1とC2が同じであればE1にOK、間違っていればNG。次にC3とC4が同じであればE3にOK、間違っていればNG。…というふうにしたいのですが、どうすれば良いのでしょうか?

  • 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

  • VBA(エクセル)での条件付日付表示について

    A列に数字を入力、A25でA列の合計をするべく「=SUM(A1:A24)」という計算式の入ったシートがあるとします。(以下、B、C…と同じような列が続く) A列に入力されている数字が変更され、A25の合計値が変わった場合、その下のセル(A26)に日付と時刻を表示させたいのですが、うまくいきません。 ネットで検索したら、特定のセルの値が変更された時に日付と時刻を表示させる方法は何となくわかったのですが、この場合だと、直接A25のデータ変更された時のみA26に日付が表示されるだけで、A25の合計値がいくら変わったところで最新の時刻を表示させる事が出来ません。 どうすれば、A26に時刻を表示出来るのでしょうか? EXCEL、VBA初心者共に初心者で、あまりよくわかっていなくて申し訳ないのですが、どうぞご教授よろしくお願いします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myRng As Range Dim i As Range Set myRng = Me.Application.Intersect(Target, Me.Range("25:25")) If Not myRng Is Nothing Then Application.EnableEvents = False For Each i In myRng If IsEmpty(i.Value) Then i.Offset(1, 0).ClearContents Else i.Offset(1, 0).Value = Now End If Next i Application.EnableEvents = True End If End Sub

  • VBA(エクセル)でのCOUNTAについて

    エクセルのSheet1のB列にSheet2の内容をコピーして、(ここまではできました) Sheet1のB列に入ってきたデータの横(A列に)連番を振りたいと思っています。 そのため、以下のように作ってみたのですが、 A列に表示される連番が現在のB列の最後の数“54”をA列全て(B列にデータがあるところ)に表示してしまいます。 どの部分が悪いのかさっぱりわからず、どのように修正すべきかもわからず・・・困ってしまっています。 よろしくお願いします。 Dim i As Range Dim mycount As Range Set mycount = Application.Intersect(Target, Me.Range("b:b")) If mycount Is Nothing Then Exit Sub End If Application.EnableEvents = False For Each i In mycount If IsEmpty(i.Value) Then i.Offset(0, -1).ClearContents Else i.Offset(0, -1).Value = Application.WorksheetFunction.CountA(Range("b2:b200")) End If Next i Application.EnableEvents = True End Sub

  • エクセル 数値結果の値によって日付を入れたい

    シート2の2列目にOKが入ると、シート1のC列にOKが入り、更新された日がB列に表示されるようにしたいです。 C列に手入力でOKと入力すればB列に日付が表示されるのですが、C列をVLOOKで呼ぶようにしたら表示されなくなってしまいました。 どのように修正していいのか分かりません。 お教えいただければと思います。よろしくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Dim TgRng As Range Set TgRng = Intersect(Range("C1:C2000"), Target) If Not TgRng Is Nothing Then Application.EnableEvents = False For Each Rng In TgRng If Rng.Value = "OK" Then Rng.Offset(, -1).Value = Date End If Next Application.EnableEvents = True End If Set TgRng = Nothing End Sub

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

    A1をA2に、B1をB2に、C1をC2に・・・ A1に入力したらA2に更新日付が入るという様に行いたいのですが、 ---------------- Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim r As Range For Each r In Target If r.Column = 1 Then r.Offset(0, 1).Value = Format(Now, “yyyy/mm/dd”“ ”“hh:mm:ss”) End If Next r 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に日付と時間が自動入力される という作りです。 よろしくお願いします。

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

    エクセルで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の書き方で教えてください。

    エクセルで、 「A列にデータを入力した日付をB列に自動で入れる」 (A列のデータを消したときは、B列のデータも消える)ということをするのに、 他の質問を参考にして、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then   '対象の列が1列目(A列)なら If Target.Value <> "" Then   '入力された値がブランクでなければ Target.Offset(0, 1).Value = Date   '0行ずれた(同じ行)の1列右隣に日付を入れる Else       'そうでなければ(Deleteキーで消されたら) Target.Offset(0, 1).Value = ""   '同行右隣をブランクすなわち""として消す End If      '入力された値の処理終り End If      '1列目(A列)の処理終り、従ってB列以降はチェックしない End Sub と、入力して、うまく動きました。 ところが、「A列に入力」→「B列に自動で日付」だけでなく、 「D列に入力」→「E列に自動で日付」 「H列に入力」→「I列に自動で日付」と、1つのエクセルシートの中で いくつかの同じ条件のことを繰り返そうと思うとうまくいきません。 この場合、どのようにVBAを記入したら良いのか、教えてください。 よろしくお願いします。

  • 2つのVBAを組み合わせる方法

    お世話になります、2つのVBAを組み合わせる方法で迷っています。 1つ目が Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True End Sub です。 2つめが Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = True If Intersect(Target, Range("R8:R38")) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End Sub です。2つのPrivate Sub Worksheet_Change(ByVal Target As Range)イベントのVBAですが、どのようにして組み合わせれば良いのでしょうか?