• ベストアンサー

日付が変わります。その2

下記のアドレスで「hallo-2007」さんにご指導いただいた内容が余りできの良くない私には何とか良いと思い挑戦していますが この場合、例えば「B4」のセルに入力があれば「G4」のセルに日付が表示されその後は日付が変更がないと言うことはできないでしようか http://oshiete1.goo.ne.jp/qa4485723.html?ans_count_asc=20 マクロの機能を使います。 下部にあるシート名のタブを右クリック=>コードの表示 で VBエディターが起動します。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 3 Then Target.Offset(0, 4).Value = Date End If End Sub をコピィして閉じます。 C列にセルで、値に変更があれば、そのセルの右へ4列目(G列)にその時の日付を入れる 詳しくない私をどうかご指導いただけませんか。 宜しく御願いします。

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

  • ベストアンサー
  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.4

こんにちは、 取合えず、新しいブックを作成して、試してもらうと良いと思います。 マクロでは計算式とは違い直接値を入れる事が出来ます。 Private Sub Worksheet_Change(ByVal Target As Range) ↑は、このシートのセルの値に変更があったら以下を実行する。 If Target.Column = 3 Then ↑更新されたセル(Target)が3列目の場合に下を実行する。(この場合はC列です) Target.Offset(0, 4).Value = Date ↑更新されたセルの4つ右の列の値に今日の日付を入れる。 End If ↑IFで指定した内容はここまで End Sub ↑Private Subで指定した内容はここまで 簡単に説明すればこんな感じです。 >例えば「B4」のセルに入力があれば「G4」のセルに日付が表示されその後は日付が変更がないと言うことはできないでしようか If Target.Column = 3 Then Target.Offset(0, 4).Value = Date  の部分を If Target.Column = 2 Then Target.Offset(0, 5).Value = Date に変更すれば B列です。 もしB4セル限定であれば If Target.Address = "$B$4" Then と変更してください。 B列にセルに変更があったら同じ行のG列に日付が入ります。 その後、翌日にファイル開いてもそのままです。 日付を手入力で変更は出来ます。 ファイルを開く時にマクロを有効にする必要があります。 ツール=>オプションで マクロセキュリティが 高 であれば 中 または 低 に下げて開きなおしてください。

dorasuke
質問者

お礼

本当に有難うございました。 こんな私に懇切丁寧にご指導有難うございました。 試行錯誤の上何とか思い通りになりました。 この感激を忘れずに頑張ります。 今後ともご指導宜しく御願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

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

>B4」のセルに入力があれば「G4」のセルに日付が表示されそ の後は日付が変更がないと言うことはできないでしようか Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address ="$B$4" Then Target.Offset(0, 5).Value = Date End If End Sub でよいのでは。 ただしB4セルの値を変えると、その日の日付に変更になるが、それも都合が悪いのかな。 そうするとどういうロジックで考えるか難しいよ。一例としてG4が空白なら日付をセット、空白でないなら変えないとか、セルの保護とか。 B列全体に考えるなら、前回等の通り If Target.Column = 3 Then 本質問のとおりなら Target.Offset(0, 5).Value = Date は Range("G4")=Date なぜ今回は単一セルの質問になったのかな。 質問を連発するより、VBAの基礎的なことを先に勉強すべきでは。 回答もらっても、使いこなせないと思う。 イベントとは。Targetとは。VBAで値をセットしたときはどうなる、Date関数の特殊性とか。

dorasuke
質問者

お礼

本当に有難うございました。 こんな私に懇切丁寧にご指導有難うございました。 試行錯誤の上何とか思い通りになりました。 この感激を忘れずに頑張ります。 今後ともご指導宜しく御願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

回答で示されたマクロが理解できないと言う事と判断しましたので、解説します。 内容を理解した上でご自分で修正してください。 Private Sub Worksheet_Change(ByVal Target As Range)  'ワークシートが変更された時に動くマクロです。  '引数Targetには変更されたセルやセル範囲が入ってきます。  If Target.Column = 3 Then  '変更されたのがC列(3番目の列)かどうかをチェック  '固定のセルアドレスをチェックしたいなら Target..Address = "$C$5"  'の様にすることでチェック可能   Target.Offset(0, 4).Value = Date   '変更されたセルから右に4つ目のセル(G列)に日付を入れる  End If End Sub

dorasuke
質問者

お礼

本当に有難うございました。 こんな私に懇切丁寧にご指導有難うございました。 今後ともご指導宜しく御願いします。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

以下のコードでB4に入力すると、g4に今日の日付が表示される。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 And Target.Row = 4 Then Target.Offset(0, 5).Value = Date End If End Sub

dorasuke
質問者

お礼

本当に有難うございました。 こんな私に懇切丁寧にご指導有難うございました。 今後ともご指導宜しく御願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • セルの値を変更した時に日付けが入るマクロ

    エクセル2010を使っている者です。 19行以内、19列以内の範囲において変更があった場合は、変更のあった行の 20列目に日付けが入るようしたくて、以下のVBAを書いたつもりなんですが、 うまく動きません。 セルの値を変えたり、セルをダブルクリックして編集可能な状態にすると、 日付けは入るのですが、そのセルより右の19列目までのセルが全て 「41602」といった数字に変わってしまいます。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = Target.Row > 19 Then Exit Sub If Target.Column > 19 Then Exit Sub Target.Offset(0, 1).Value = Date End Sub なお、上記のVBAは以下のサイトを見て作ったものです。 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html どなたか、どこがおかしいのかお教えください。

  • 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 ... での対処も考えましたが、同じ結果でした。 何か良い方法がありましたら、お願いいたします。

  • 日付の自動表示がうまくできません。

    VBAを使って、EXCELで日付を自動表示するマクロを作ったのですが、うまく動作しません。 設定の条件は、(対象の行は6~31行目で) D列に入力があった場合、G列に日付を表示、 M列に入力があった場合、N列に日付と時間を表示 です。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Integer, c As Integer 'r 行番号 'C 列番号 r = Target.Row c = Target.Column If Target.Count > 1 Then Exit Sub If c <> 13 Or r < 6 Or r > 31 Then End If Cells(r, c) <> "" Then If c = 13 Then Cells(r, c + 1) = Format(Now, "m/d hh:mm") Else Cells(r, c + 1) = "" End If If Target.Count > 1 Then Exit Sub If c <> 4 Or r < 6 Or r > 31 Then End If Cells(r, c) <> "" Then If c = 4 Then Cells(r, c + 3) = Format(Now, "m/d hh:mm") Else Cells(r, c + 3) = "" End If End Sub 作っているうちに、どこがおかしいのかわからなくなってしまいました。 助けて頂ければと思います。

  • マクロについて

    WINDOWS XP EXCELL 2003です。 C2のセルに入力すれば A2のセルに今日の日付が入力されるのみのマクロが下記です Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$2" Then Target.Offset(0, -2).Value = Date End If End Sub 御指導を仰ぎたいのは C3 に入力されたら A3 今日の日付 C4 に入力されたら A4 今日の日付 C5 に入力されたら A5 今日の日付 という具合になにかを追加すればと良いと考え調べましたが分かりませんでした。 御指導いたたければ幸いです。 よろしく御願いします。

  • メッセージボックスを表示させるエクセルマクロ

    こんにちは。マクロ初心者です。 エクセル(Excel2003)でメッセージボックスを 表示させるマクロが思うようにいかず困っています。 B列に「○○会社」と入力されれば、 「取引先です。」 とメッセージボックスを表示させたいと思い、 次のとおりマクロを作成しました。 -------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 And Target Like "*会社" Then MsgBox "取引先です。" End If End Sub -------------------------------- しかし、コピーなどで複数のセルを貼り付ける(入力)行為をすると、 「実行エラー'13': 型が一致しません」と出てしまいます。 Worksheet_Change(ByVal Target As Range)を使っているので、 -------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Target.Column = 2 And Target Like "*会社" Then MsgBox "取引先です。" End If End Sub -------------------------------- と、「If Target.Count > 1 Then Exit Sub 」を入れれば、 メッセージは出なくなるのですが、 これだと、A列セルに、コピー&ペーストで複数セルを貼り付けた場合、 「○○会社」があっても、マクロが効いてきません。 複数セルの貼り付けにも対応させるには、 どのようにすればよろしいでしょうか? 基本的なところが理解できていないのだと自覚しておりますが、 どうかご教授願います。 長々とわかりづらい文章ですみません。よろしくお願いします。

  • エクセル マクロ 初心者です

    エクセルマクロ初心者です。 以下の2つの Private Sub Worksheet_Change(ByVal Target As Range)を1つのシートで実行させたいのですが、 当方、初心者なので組み合わせ方が分かりません。 よろしくお願いします。 ===No1=== Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target = StrConv(Target, vbUpperCase) Application.EnableEvents = True End Sub ===No2=== Private Sub Worksheet_Change(ByVal Target As Range) Dim Ans As Integer If Target.Count = 1 Then Ans = MsgBox("コピーは禁止!!", vbCritical) MsgBox "データを消去します。" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If If Target.Count = 1 Then Exit Sub Else MsgBox “複数セルのコピー禁止!" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End Sub ------------ 上記の2つを1つのシートで動作させたいのですが、うまくいきません。 単体では、動作します。

  • 日付を入れるとセルがおかしくなります。

    http://okwave.jp/qa/q7495702.html 以前の質問で、空白になった行を詰めていくような マクロをおしえていただき、mt2008さんのコードを利用しているのですが、新たにB列に、C列に何かが入力されたら日付を挿入する以下のマクロをいれました。 Private Sub worksheet_change(ByVal Target As Excel.Range) Dim h As Range On Error Resume Next For Each h In Application.Intersect(Target, Range("C:C")) If h <> "" Then Cells(h.Row, "B") = Date End If Next End Sub このマクロはちゃんと動いたのですが、実はここで困ったことが発生しました。空白行を詰めた時、 日付が詰めた日付に更新されてしまうのです。これは、B列の文字列が変わるのでしょうがない現象なのですが、詰める時に、どうしても日付だけはそのままにして上に詰めたいのです。 そんなことは可能でしょうか・・

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

    エクセル2013です。 特定のセルに日付を入力してもらうのですが、人によりさまざまな入力をされてしまいます。 どんな入力でも日付であれば、シリアル値なのであとからなんとかなるのですが、困るのはYYYYMMDDの連続数字、例えば今日なら20140712と入力されてしまうことです。 入力規則で排除したいのですが、それは許されず、20140712も日付として扱わなければならなくなりそうです。 そこでマクロで対処しようと以下のコードを書きました。 Private Sub Worksheet_Change(ByVal Target As Range)   Select Case Target.Address(0, 0)     Case "D2", "F2", "C4"       If Target.Value = "" Then Exit Sub       If IsDate(Target.Value) Then         Target.NumberFormatLocal = "yyyy/m/d"       Else         Application.EnableEvents = False         Target.Value = CDate(Format(Target.Value, "@@@@/@@/@@"))         Application.EnableEvents = True       End If     Case Else       Exit Sub   End Select End Sub これで最初はうまくいき、20140712と入力されても、ちゃんと2014/7/12になります。 ところが、同じセルに再度YYYYMMDD数字形式で入力すると、実行時エラー「オーバーフローしました」になってしまいます。多分セルが、YYYYMMDDの数字をシリアル値として見てありえない日付と判断したのだと思います。 どのようにコードを修正したらよろしいでしょうか? もう1点、日付をYYYYMMDDの連続数字で入力することは普通、エクセルではあまり見たことないですが、これって一般的な方法なのでしょうか?

  • VBA 特定セル変更時に指定セルに日付代入方法

    初心者のため、伝わるかわかりませんが、 次のような動作をVBAで行えなくて困っています。 ・行いたい事 (※前提として"行"ごとに実行します) J列が"1"だった場合、 L列にJ列が"1"になった日付(yyyy/mm/dd)を入力する ただし、J列には関数を使用し"1"と表示されているため セルの値変更ではありません。 ・現在のVBA Private Sub Worksheet_Calculate() If Target.Row >= 1 And Target.Row <= 100 And Target.Column = 10 Then With Target.Offset(, 2) .Value = Now() .NumberFormatLocal = "yyyy/mm/dd" End With End If End Sub ※J列が関数を使用しているため、Calculateにしています。 2行目の↓の部分でエラーになってしまっています。 > If Target.Row >= 1 And Target.Row <= 100 And Target.Column = 10 Then どなたかご教授いただけたら助かります。 よろしくお願いします。

  • VBA:Callステートメントでいつでもイベント発生可能な準備をしたい。

    タイトルどおり、Callステートメントでいつでもイベント発生可能な準備ができるようにしたいと考えています。しかし、Sub 実行準備SUBでエラーが出ています。どこをどう直せばよいのか教えて頂きたいです。 Private Sub Auto_Open() MsgBox "Ctrl + t でイベント実行準備を行います。" Application.OnKey "^{t}", "実行準備SUB" End Sub '--------------------------------------------------- Sub 実行準備SUB() Dim Target As Range Target = Range(Cells(1, 1), Cells(100, 100)) Call Worksheet_Change(ByVal Target) End Sub '--------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim r As Range For Each r In Target If r.Column = 2 Then r.Offset(0, -1).Value = Now End If Next r End Sub イベントは、シートの2列目のセルに変更があれば、1列目に日付時刻を記入するというものです。宜しくお願い致します。

専門家に質問してみよう