VBAで特定のセル変更時に指定セルに日付を代入する方法

このQ&Aのポイント
  • VBAを使用して、特定のセルの値が変更された場合に、指定のセルに日付を入力する方法について困っています。
  • 現在のVBAコードでは、セルの値が変更された場合に日付を表示する変更を行っています。
  • しかし、特定のセルが関数を使用しているため、コードの一部を修正する必要があります。エラーが発生している部分について教えていただけると助かります。
回答を見る
  • ベストアンサー

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 どなたかご教授いただけたら助かります。 よろしくお願いします。

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.5

ANo.4です。 > 最初の説明で一部抜けていたのですが、 > L列(日付代入列)にはすでに関数が入っており、 > これを実行するためには、 > J="1"の場合"L"を一度クリア ⇒ 日付入力 > の手順にすればよいのでしょうか。 今現在は、J列の値が1でL列が空白の場合のみ、L列に日付を入れています。 現在L列に入っている関数が何をする物かわかりませんので、消して良いのかどうかの判断は私ではできません。 ご自分でよく検討してどのような場合なら日付で書き換えてしまって良いのか考え、マクロに反映してください。 そうでなければ、マクロでチェックと日付を入れる列を別な列にして、L列の関数はその列に日付が入っていれば日付を、入っていなければ今までの関数の結果を表示する様にすればよいでしょう、

shick222
質問者

補足

度々ありがとうございます。 L列の関数は日付代入の時にはクリアにして良い内容となっています。 別の列へ日付を入れ、それを参照させる方法は思いついていなかったですが これだとスムーズにできるかもしれません。

その他の回答 (4)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.4

こんなのでやりたい事になりませんか? J列の値が1から変化してもL列の日付は消えませんし、再度1になっても更新しません。 Private Sub Worksheet_Calculate()   For i = 1 To 100     If (Cells(i, "J") = 1) And (Cells(i, "L") = "") Then       Cells(i, "L") = Now()     End If   Next i End Sub

shick222
質問者

補足

ありがとうございます。 これでやりたい事になりましたが、1点問題がありました。 最初の説明で一部抜けていたのですが、 L列(日付代入列)にはすでに関数が入っており、 これを実行するためには、 J="1"の場合"L"を一度クリア ⇒ 日付入力 の手順にすればよいのでしょうか。 試してみましたが、手段が間違っているようでしたので、 もしご存知でしたら、ご教授いただければと思います。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

方法1:アナタがやりたかったこと private sub Worksheet_Calculate()  dim h as range  application.enableevents = false  for each h in range("J1:J100")   if h = 1 then    h.offset(0, 2) = now   else    h.offset(0, 2).clearcontents   end if  next  application.enableevents = true end sub 方法2:正攻法 通常のエクセルの作り方では,J列に並んだ計算式が実際に計算される前,まずどこか別のセルに「元の値」を手で記入し,それを受けてJ列の該当するセルが1なりナンなりに変わります。 例: J1に =H1 であれば,H1が元のセル(H1に記入すると,J1が計算される)です。 例: J1に =SUM(E1:H1) であれば,E1からH1のどれか(一つ又は複数同時に)が編集されると,J列が変わります 例: J1は =H1 だけど,そのH1は =Sheet2!G1 になっているなら,シート2のG1が計算の出発点セルです calculateイベントではなくchangeイベントを使い,これらの出発点セルに対して,そのセルを変えたらどのJセルが変わるのかに応じて,変わるJ列セルが1になったか否か調べてL列に日付時刻を記入します。 #参考: 言わずもがなですがJ列が「他のセルに手で記入しなくても」勝手に計算が変わる場合は,この方法は利用できません。

shick222
質問者

お礼

2つの方法を教えていただきありがとうございます。 方法1についてですが、こちらではL列に日付を代入できますが J列が"1"の場合L列すべてが変更されてしまいます。 "行"ごとに実行させる方法があればそちらを試したいと思います。 方法には、おっしゃる通り直接データ変更が必要なため 他の方法がなく、最終手段になった場合はこちらを 参考にさせていただきたいと思います。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

>J列が関数を使用しているため、Calculateにしています。  ⇒Calculate()イベントは再計算毎にイベント発生するのでご質問者の解決にはならないと思います。   その関数式の対象セルをChangeイベントで監視する方法ぐらいしか思いつきませんが如何でしょうか。      

shick222
質問者

お礼

No1の方もおっしゃられていた通り、 CalculateではTargetが使用できないなど 浅い解釈をしてしまっていたようです。 みなさんのご意見を聞きながら再度試してみたいと思います。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

Worksheet_Calculateイベントには、Targetという引数はなく、したがって再計算されるRangeの特定はできません。 それを断わりもなく使用するのでエラーになるのです。 Worksheet_Calculateイベントで、再計算の位置で処理を分けたいという質問がよくあります。たいていの場合それはできないという回答のようです。 便宜的に特定のRangeの再計算だけのシートを別に用意して、そのシートを参照させるようにします。そのシートにWorksheet_Calculateイベントを書けば、再計算の位置が特定できたように見えて、処理を分けることができます。

shick222
質問者

お礼

Calculateでは無理だったようですね。 web上で探して見つからなかったのも納得できます。 別シートでの処理を最終手段として参考とさせていただきたいと思います。 ありがとうございます。

関連するQ&A

  • Excel VBA で1時的に右クリックを使いたい

    30枚ほどのシートの表を一挙に変更したいです。ところが、各シートに次のコードが入っているため、右クリックしてコピーとか一切使えません。各シートの変更ができるまで、右クリック使いたいです。何か方法ありませんでしょうか? ' 画面の一番上表示 Dim hr As Range Set hr = Range("A1") '左上隅セルを設定 ActiveWindow.ScrollRow = hr.Row '行の一番上にスクロール ActiveWindow.ScrollColumn = hr.Column '列の一番左にスクロール End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Cancel = True 'プロシージャ終了後に表示されるショートカットメニューの非表示 If Target.Row > 14 And Target.Row < 45 And Target.Column > 13 And Target.Column < 15 Then 明細入力フォーム.Show End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 1 And Target.Column < 3 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 3 And Target.Column < 5 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 5 And Target.Column < 7 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 8 And Target.Column < 10 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 2 And Target.Column < 4 Then UserForm3.Show End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 4 And Target.Column < 6 Then UserForm3.Show End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 6 And Target.Column < 8 Then UserForm3.Show End If If Target.Row > 36 And Target.Row < 44 And Target.Column > 9 And Target.Column < 11 Then UserForm3.Show End If End Sub

  • シート内の特定のセルの範囲が変化した時、

    シート内の特定のセルの範囲が変化した時、 まずA列の最大値を求めて、その後A列とD列のそれぞれの条件にあった行のA列に 最大値+1を表示させるようにしたいのですが動作しません。 なぜ動かないか教えて下さい。 参考までに、そのプログラムを記載します。 宜しくお願いします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row <= 3 Or Target.Row > 65000 And Target.Column = 4 Then Dim i, j, max As Integer max = 0 For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row If max < Range("A" & i).Value Then max = Range("A" & i).Value End If Next i For j = 3 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(j, 1) = "" And Not Cells(j, 4) = "" Then Cells(j, 1) = max + 1 End If Next j End If End Sub

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

    エクセル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 どなたか、どこがおかしいのかお教えください。

  • エクセル2003 VBAでセル移動

    いつもお世話になります。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row > 9 Then If Target.Column = 3 Then Cells(Target.Row, 4).Select ElseIf Target.Column > 5 Then Cells(Target.Row + 1, 1).Select End If End If End Sub これで、B列からC列を飛ばしてD列にセル移動して取りあえずの目的は達成しているのですが、 D列からB列には方向キー移動してくれません。Target.Columnが3になるんで当たり前なんですが・・・ B列の入力ミスがあるときマウスで移動させるか、A列まで戻ってから方向キーで上に上がるかです。 何かいい方法ありませんでしょうか。D列から方向キーで戻るときも、出来ればC列を飛ばしてほしいです。 よろしくお願いします。

  • Excel VBA セルの値を変更後にVBA作動

    Excel VBAを活用して、特定のセルの値が変更されたときに、VBA処理を発動させることになりました。 処理といたしましては、C列(3列目)の4行目以下の空白セルに数値を入力するか、セルに入力されている数値を変更した場合にVBAを発動させたいです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 And Target.Row >= 4 Then MsgBox "セルの値が更新されました" End If End Sub 上記のコードを実行してみたところ、3列目(C列)の4行目を選択した段階でVBAが作動してしまいます。 セルの値変更後に作動するようにするには、どう修正すればよろしいでしょうか?

  • 続・VBAでセルに値が入ったときにイベントを起こしたい

    http://oshiete1.goo.ne.jp/qa4650025.htmlで教えていただきありがとうございました。大変分かりやすい解説でした。 こういうことが出来るんだーとわかりもっと使いやすいように仕様を変えた方がいいと気づき新たに書き込んでみました。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long ' 変更したセルに値が入った場合条件成立 If Trim(Target.Value) <> "" Then ' 行番号が10以上65530以内のとき条件成立 If Target.Row >= 10 And Target.Row <= 65530 Then ' BCD列で、5の倍数の行のとき条件成立 If (Target.Column = 2) And (Target.Row Mod 5) = 0 Then If Target.Value <> "" Then For i = 0 To 4 Target.Copy Target.Offset(i, 10).PasteSpecial Paste:=xlPasteValues Next Worksheets("Sheet4").Range("A2:K6").Copy Target.Offset(5, -1) End If ElseIf (Target.Column = 3) And (Target.Row Mod 5) = 0 Then If Target.Value <> "" Then For i = 0 To 4 Target.Copy Target.Offset(i, 10).PasteSpecial Paste:=xlPasteValues Next End If ElseIf (Target.Column = 4) And (Target.Row Mod 5) = 0 Then If Target.Value <> "" Then For i = 0 To 4 Target.Copy Target.Offset(i, 10).PasteSpecial Paste:=xlPasteValues Next End If Else Exit Sub End If End If End If End Sub ここまでは何とか出来たのですが問題点があります・・・ ・複数セルを選択してDELすると実行時エラー13が出ます。(別の回答にあったやつですが・・・) ・別シートより範囲指定したセルをコピーして張り付けるときも出ます。 ・B列には6桁の整数値しか入らないようにしたいけど整数値限定は可能?・・・その整数値を貼り付ける際日付型へのフォーマットが難しい などあります。ヒントをいただけないでしょうか?

  • エクセルVBAでクリックしたセルのみ書式を変えたいのです。

    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Target.Row <= 11 And Target.Column <= 11 Then With Selection .Interior.ColorIndex = 3 .Font.ColorIndex = 2 .Font.Bold = True End With End If End Sub これで出来るのですが、問題は別のセルに移動しても書式は変ったままなのです。(当り前ですが) 書式を変えるのはあくまで選択されている間だけにしたいのです。 どのようにすればよいのでしょうか? エクセル97です。

  • シングルクリックでフォームが表示されない

    windowsXP  Excel2000 でマクロを作成している超初心者です。 あるサイトの暦で日付を入力するマクロですが、1枚のシートに 1)と 2)を併記して実験したところ正常に表示できました。 2)をシングルクリックで表示したいのですができません。なぜでしょうか? 2)はいかにも稚拙です。もっと整理したいのですが方法が分かりません。以上2点よろしくご指導ください。 -------------------------------------------------------------------- 1)シングルクリックで UserForm1を正常に起動できました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'シングルクリックで表示 Cancel = True 'プロシージャ終了後に表示されるショートカットメニューの非表示 If Target.Row > 22 And Target.Column > 2 And Target.Column < 4 Then UserForm1.Show End If If Target.Row > 22 And Target.Column > 13 And Target.Column < 15 Then UserForm1.Show End If End Sub ------------------------------------------------------------------------- 2)ダブルクリックでしか正常に表示されません。 'Private Sub Worksheet_SelectionChange(ByVal Target As Range)’ 起動しない Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) '起動した Cancel = True 'プロシージャ終了後に表示されるショートカットメニューの非表示 If Target.Row > 23 And Target.Column > 1 And Target.Column < 3 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 23 And Target.Column > 12 And Target.Column < 14 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 12 And Target.Row < 21 And Target.Column > 12 And Target.Column < 14 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 12 And Target.Row < 21 And Target.Column > 14 And Target.Column < 16 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 12 And Target.Row < 21 And Target.Column > 16 And Target.Column < 18 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 12 And Target.Row < 21 And Target.Column > 18 And Target.Column < 20 Then Call ShowCalendarFromRange2(Target) End If End Sub ----------------------------------------------------------------------- 3)'これがサイトにあった例で、これを元に上のスクリプトを作りました。 'Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' 複数セル選択時は無視 ' If Target.Count <> 1 Then Exit Sub ' A列以外は無視(今回サンプルの例) ' If Target.Column <> 1 Then Exit Sub ' カレンダーフォームを起動する ' Call ShowCalendarFromRange2(Target) 'End Sub ---------------------------------------------------------------

  • エクセルのVBAで、音をならす方法

    こんばんは。私はエクセル2000を使用しています。 現在やろうとしていることは、 実験の測定データをエクセルに取り込み(測定データは文字列としてエクセルに取り込まれます)、D列の数字が100以上になったら音をならして知らせるようにしたいと考えております。 それで、以下のマクロを組んでやってみました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 4 Then If IsNumeric(Target) And Target.Value > 100 Then Beep    MsgBox "範囲外です" End If End If End Sub しかし、If IsNumeric(Target) And Target.Value > 100 Thenのところで、型が一致しませんとエラー?がでてしまいます。 まだ、VBAを勉強しはじめて2週間くらいなので、なにぶんわからないことだからで、もしわかる方がいらしたら教えてください。

  • セルの内容更新時に実行される処理ができない

    以下のように関数を設定し、実行してみたのですがCall CommonModule.testの部分で 実行時エラー '424': オブジェクトが必要です。 と表示され関数が実行されません。 初心者なので知識が浅く、初歩的なミスかもしれませんがご教示いただければ幸いです。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal target As Range) If target.Count = 1 Then Dim column As Integer Dim row As Integer column = target.column row = target.row If row >= 3 Then If ((column - 3) Mod 5) = 2 And column > 3 Then Call CommonModule.test 'エラー '424' オブジェクトが必要です。 End If End If End If End Sub Function test() MsgBox "test" End Function

専門家に質問してみよう