• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA 特定セル変更時に指定セルに日付代入方法)

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

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

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

  • ベストアンサー
  • 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/7941)
回答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