dポイントプレゼントキャンペーン実施中!

初心者のため、伝わるかわかりませんが、
次のような動作を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

どなたかご教授いただけたら助かります。
よろしくお願いします。

A 回答 (5件)

ANo.4です。



> 最初の説明で一部抜けていたのですが、
> L列(日付代入列)にはすでに関数が入っており、
> これを実行するためには、
> J="1"の場合"L"を一度クリア ⇒ 日付入力
> の手順にすればよいのでしょうか。

今現在は、J列の値が1でL列が空白の場合のみ、L列に日付を入れています。
現在L列に入っている関数が何をする物かわかりませんので、消して良いのかどうかの判断は私ではできません。
ご自分でよく検討してどのような場合なら日付で書き換えてしまって良いのか考え、マクロに反映してください。

そうでなければ、マクロでチェックと日付を入れる列を別な列にして、L列の関数はその列に日付が入っていれば日付を、入っていなければ今までの関数の結果を表示する様にすればよいでしょう、

この回答への補足

度々ありがとうございます。

L列の関数は日付代入の時にはクリアにして良い内容となっています。

別の列へ日付を入れ、それを参照させる方法は思いついていなかったですが
これだとスムーズにできるかもしれません。

補足日時:2012/07/24 21:37
    • good
    • 0

こんなのでやりたい事になりませんか?


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

この回答への補足

ありがとうございます。
これでやりたい事になりましたが、1点問題がありました。

最初の説明で一部抜けていたのですが、
L列(日付代入列)にはすでに関数が入っており、
これを実行するためには、
J="1"の場合"L"を一度クリア ⇒ 日付入力
の手順にすればよいのでしょうか。

試してみましたが、手段が間違っているようでしたので、
もしご存知でしたら、ご教授いただければと思います。

補足日時:2012/07/23 23:43
    • good
    • 0

方法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列が「他のセルに手で記入しなくても」勝手に計算が変わる場合は,この方法は利用できません。
    • good
    • 1
この回答へのお礼

2つの方法を教えていただきありがとうございます。

方法1についてですが、こちらではL列に日付を代入できますが
J列が"1"の場合L列すべてが変更されてしまいます。
"行"ごとに実行させる方法があればそちらを試したいと思います。

方法には、おっしゃる通り直接データ変更が必要なため
他の方法がなく、最終手段になった場合はこちらを
参考にさせていただきたいと思います。

お礼日時:2012/07/23 23:52

>J列が関数を使用しているため、Calculateにしています。


 ⇒Calculate()イベントは再計算毎にイベント発生するのでご質問者の解決にはならないと思います。
  その関数式の対象セルをChangeイベントで監視する方法ぐらいしか思いつきませんが如何でしょうか。
  
  
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/07/23 23:45

Worksheet_Calculateイベントには、Targetという引数はなく、したがって再計算されるRangeの特定はできません。


それを断わりもなく使用するのでエラーになるのです。

Worksheet_Calculateイベントで、再計算の位置で処理を分けたいという質問がよくあります。たいていの場合それはできないという回答のようです。

便宜的に特定のRangeの再計算だけのシートを別に用意して、そのシートを参照させるようにします。そのシートにWorksheet_Calculateイベントを書けば、再計算の位置が特定できたように見えて、処理を分けることができます。
    • good
    • 0
この回答へのお礼

Calculateでは無理だったようですね。
web上で探して見つからなかったのも納得できます。

別シートでの処理を最終手段として参考とさせていただきたいと思います。
ありがとうございます。

お礼日時:2012/07/23 21:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!