プロが教えるわが家の防犯対策術!

過去ログにあったQNo.2827109を参考に、マクロをコピーさせていただき、行の最終更新日を求めるように設定してみたのですが、上記の質問者の方はうまくいったとのことなのですが、私の場合「Findメソッドは失敗しました:'Range'オブジェクト」といったエラーが出てしまい、エクセルも固まったような状態になってしまいます。

ど素人質問で本当に申し訳ないのですが、全く何を施してよいのかわからない状態です。

どなたか解決策を教えてください!

コピーさせていただいたマクロは次の通りです。

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim MyRng As Range, R As Range, L As Range
 Dim LastUpdated As Integer
 Set MyRng = Intersect(Target, Range("B2:D6"))
 If MyRng Is Nothing Then Exit Sub
 
 Set L = Rows(1).Find("最終更新日")
 If L Is Nothing Then Exit Sub
 LastUpdated = L.Column
 
 For Each R In MyRng.Rows
  Cells(R.Row, LastUpdated) = Now
 Next
End Sub

1列目に項目がある表で、「最終更新日」と言う項目を設け、マクロ4行目の()内は表に合わせて("A2:AF500")と変更して設定しました。

エクセルは2007です。

A 回答 (7件)

こんにちは。



>表現とは難しいものですね・・・
私は、いろんなパターンに出会っているし、逆に、早合点して違うといわれることもあるからです。「更新日時」で検索したときに、かなり違う内容のものがあったはずです。

お話だけだと、このような内容になりそうですね。ただし、B列を挿入して、AF ->AG なるなら、>33 というところを >34 にしなければなりません。それから、書式は、自由にアレンジしてください。

--------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
  Const HIDUKE As Integer = 2 'B列
  
  '列の範囲(A:AF) 'B列を除く
  If Target.Column = HIDUKE Then Exit Sub
  If Target.Column > 33 Then Exit Sub 'AF-32, AG-33
  
  If Target.Count > 1 Then Exit Sub
  If Target.Value = "" Then Exit Sub
  i = Target.Row '行
  
  Application.EnableEvents = False
  '書式
  Cells(i, HIDUKE).NumberFormatLocal = "mm/dd hh:MM"
  Cells(i, HIDUKE).Value = Now()
  Application.EnableEvents = True
End Sub

この回答への補足

できましたーーーー!!!

完璧に動いてます!
ありがとうございました!

ちなみに、これですと縦に何行データが伸びて行っても対応してくれるマクロになっているのだと言うことですか?
だったとしたら、前回おっしゃっていた「500行ではむしろ少ない・・・」の点も考慮していただけたマクロになっているのではないですか?

補足日時:2007/10/08 13:15
    • good
    • 0

こんにちは。



>前回おっしゃっていた「500行ではむしろ少ない・・・」の点も考慮していただけたマクロになっているのではないですか?

よく考えてみたけれど、500行とか、まったく、制限を設けないことにしたのです。範囲を設定したければ、たとえば、

If Taget.Row >501 Then Exit Sub

ということなのですが、それほど複雑な内容ではないし、負担も大きくないので、そのまま、一番下まで動くようにしました。

ここまで来ると、私は、途中、一体、何を書いていたのかって思われるかもしれません。だって、内容自体は、最初の質問のものよりも易しいからです。結局のところ、最初のマクロとも、似ていて違う内容のマクロなんですね。(^^;
    • good
    • 0
この回答へのお礼

Wendy02さん。
本当に本当にありがとうございました。
長いやり取りになってしまい、しかもかなり遠回りさせてしまったみたいで・・・

それもこれも、私の質問と説明の仕方が悪かったからです。

実は私も、普段は他人の話を聞く時は、相手が言いたいことが的確に把握した上でじゃないと意見を言わないように気を付けているのですが、文章の上でなら尚更のこと気をつけなければならないこともわかっていたつもりでした。

ところが、問題に焦っていたことと、ソフトやプログラムのことは全くわかっていない世界のことで、何をどう説明したら時系列が伝わるのか・・・と言うよりも、自分が置かれている状況が時系列で言うとどこなのかさえもわからない状況の中での質問だったので、本当にご迷惑をおかけしてしまいました。

それでも、いろんな角度から質問を返していただいて、最適な問題解決方法を考えていただけて、本当に私が得たかった答えそのものが返ってきたことに感動してます。

マクロのプログラムの内容だけでなく、ここまで至るまでのご対応にも感動してます。

今後も、いろいろとこのサイトを利用させていただきたくなりました。
一番最初に完結までお付き合いくださった方がWendy02さんで本当によかったと思っています。

これからも、私の質問を見かけましたら、懲りずにアドバイスを送ってやってください。

本当にありがとうございました!!

お礼日時:2007/10/08 21:45

こんばんは。



>今回マクロを利用して、行全体のどの項目で更新されても「最終更新日時」が表示されるようにしようと思い、B列に「最終更新日」の項目を増やして問題のマクロを設定しました。

エラーの問題としては別にして、同じだと思ったのでしょうけれども、もしかしたら、マクロとしては、似ていて非なるものかもしれません。なんといっていいやら……。(^^;

>B列に「最終更新日」の項目

B列のどこの行ですか?
入力した行のB列ですか?

>「データの範囲」と言われる解釈を上記のように「この先も見越して」空白欄も含めているところは、もしかしたら間違いなのでしょうか?

「先を見越して」は問題ないですね。
すでに、150あるとしたら、500という範囲ですと、Excelの設定としては一般的には少ないかもしれません。

イベント・ドリブン型マクロというのは、除外範囲を作ってあげることによって、マクロが無駄に働かないように作るというのがコツなのです。Chageイベントというのは、セルに何かを入れると、それをきっかけにマクロが動いてしまうので、マクロが入力しても、また、マクロが動いてしまうことになるのです。私も、最初は、マクロがマクロを呼ぶなんていうことは、まったくありえないと思っていました。

私としては、やっぱり自分で全部コードを書いてみないと、はっきりいえません。

「B列のどこの行」というのがはっきりしたら、自分なりに作ってみます。

p.s. 私個人としては、エラー自体の解決は見ておきたいとは思いますが、それはどちらでもよいです。もともと、このエラーは個人的な興味です。この実行時エラーというのは、とても勉強になるのですね。コンパイルエラーとしては出てこないのですから、コードの間違いではないのですから。

この回答への補足

ひぇ~・・・表現とは難しいものですね・・・

それにしても、興味とは言えお付き合いいただいて本当に感謝です。

えっとですね・・・
B列にマクロによって行毎の最終更新日時が入力される欄をつくりました。
つまり、各行毎の更新日時が入力されるようにしたいのです。

たとえば、ID:89の人は89行目にA列にID、C列に名前、D列に生年月日・・・とプロフィールが入っていたとします。
このデータのどの項目を変更しても、マクロが働いてB列89行目のセルに「最終更新日時」として入力されるようにしたかったのです。

実際に「名前」や「生年月日」など、どの行のどこの列を変更してみても、その行のB列にあるセルにきちんと最終更新日時が入力されます。
が、入力された瞬間に固まって動かなくなってしまいエラーが出ます。

この説明でイメージできますでしょうか?

補足日時:2007/10/07 23:53
    • good
    • 0

#3の訂正:



本来は、他の言語から通して、Excelを使う場合などに現れるエラーだと思います。
------------------------------------------------------------------

-> 他の言語から通して、
他のブログラム言語を通して、

この回答への補足

重ね重ねありがとうございます。

#3に書きました通り、私が作成したエクセルの表に、どのような目的でマクロを設定したのか説明申し上げます。
本来最初に書くべきことで、順序が逆になってしまったことをお許しください。

私がエクセル2007で作成した表は、会員プロフィールを管理するデータベースのようなものです。
最初はただセルにIDごとに書き連ねていただけの、データベースと呼ぶに程遠いものなのですが、何人かで新しい会員のデータを「追加、削除」して更新していくうちに、どのデータが最新の更新内容なのかわからなくなってきたため、ちょっと細工をしてみようと思いトライしたのが、今回このサイトで見つけたマクロでした。

1行目のA列「ID」、B列「名前」、C列「生年月日」・・・「身長」「体重」・・・・などと項目を設定してAE列まであります。

今回マクロを利用して、行全体のどの項目で更新されても「最終更新日時」が表示されるようにしようと思い、B列に「最終更新日」の項目を増やして問題のマクロを設定しました。

現在は、150行ほどに会員が埋まっていますが、この先のことを考えて500行までデータの範囲としてしまいました。

「更新日」ではなく、「更新日時」まで表示したかったのは、ただ単にマクロを使ってカッコよさをアピールしたかっただけですので、どちらでも構わないことではあります。

この表に当てはめようと考え、先の質問欄のマクロをあてはめた結果、今回の騒動の質問へと発展したと言うわけです。

このような説明で、利用状況は掴んでいただけたでしょうか?

もしかしたら、「データの範囲」と言われる解釈を上記のように「この先も見越して」空白欄も含めているところは、もしかしたら間違いなのでしょうか?

#3に続いて、また何かご指摘いただけるところがございましたら、是非教えていただけたら幸いです。

どうぞよろしくお願いします。

補足日時:2007/10/07 20:37
    • good
    • 0

こんにちは。



いろいろ考えましたが、このスレは、一応、私の中では、完結させたほうがよいと思いました。回答があっていなかったらすみません。

>中途で質問し直した方が、かえって迷惑にならないでしょうか?

今回のエラーは、かなり特殊な部類に入るのです。ある期間、Google にもヒットしますから、ご質問者さんの判断に任せますが、中途のままにしてしまうのは、仕切り直しもよいとは思ったのですが、後々の人のため不便をさせてしまうような気がしました。私のこだわりは捨て、私の考えたことを書いておくことに決めました。勝手をお許しください。

Q&Aっていうのは、後々利用する人のためにもあるのです。
本来は、他の言語から通して、Excelを使う場合などに現れるエラーだと思います。
------------------------------------------------------------------
私の考え:

>実行時エラー'-2147417848(80010108)':
>これは、VBA自体ではなく、実行時のExcel側のエラーです。

この原因は、イベントプロシージャが、おそらく、何万回となく、起動して、
 Set L = Rows(1).Find("最終更新日")
が読み込まれているので、最後には、Excel側で、エラーを起こしたのだと考えました。
一度、今のエラーの発生するコードで、ブレークポイント(左端の枠をクリックすると●が出る)をおけば、何度も呼び出されているはずです。本来は、1回きりですが、そうはなっていないはずです。

問題はここの部分です。

MyRng が広ければ広いほど、イベントが繰り返します。また、日にちなら、Now ではなく、Date です。Application.EnableEvents で、その周りを囲い、二重起動させないようにします。


Application.EnableEvents = False
For Each R In MyRng.Rows
  Cells(R.Row, LastUpdated).NumberFormatLocal = "yy/mm/dd" '書式は文字列で
  Cells(R.Row, LastUpdated) = Date
Next R
Application.EnableEvents = True

とすれば、おそらく直るだろうと思います。

それと、もしも、1個しか入れないのなら、

If Target.Count >1 Then Exit Sub
Set MyRng = Intersect(Target, Range("B2:AF500"))

としたほうがよいです。
-----------------------------------------------------------------
これで、だめならダメ出ししてください。

この回答への補足

寛大で親切なご回答に感謝します。

おっしゃる通り、後々利用される人にわかりやすい流れのQ&Aであるべきですよね。
本当に、私のような後先考えないような質問の仕方をしているのにも関わらず、わかりやすいご説明をありがとうございます。

問題の起きている部分も、詳しくはわかってはいないのですが、とてもイメージが湧き納得です。

この節でご推薦のマクロの変更を試してみたいと思いますが、それと同時に、もう一度私の作成した表とマクロの使用目的などを、次の#4のご回答の方に書きなおしてみますので、参考までにそちらも見ていただけたらと思います。

本当にご親切にありがとうございます。

補足日時:2007/10/07 20:23
    • good
    • 0

こんにちは。



Findメソッドのエラーで、Rangeオブジェクトというのは、Rows(1) が、Range オブジェクトではない、ということになるので、私の知っている範囲ではありえないです。しかし、

>実行時エラー'-2147417848(80010108)':
これは、VBA自体ではなく、実行時のExcel側のエラーです。

どこが問題なのかは想像はつきますが、おそらく、いままでのExcelですと、性能の問題なのか、そこまでのエラーにはならなかったような気がします。また、そのような目的では書かなかったからです。

いずれにしても、こちらは、こちらで、新たにコードを書きたいと思います。
そこで、少し、もう少し、内容を説明してもらわないといけません。

>Set MyRng = Intersect(Target, Range("B2:AF500"))
この部分は、入力する場所を、B2:D6 に限定しているのですが、Range("B2:AF500")という広い範囲では、AF500 までというと、1ヶ月分のワークシートですね。

その範疇に書き込むと、その中で、1行目のどこかにある「最終更新日」を見つけ出し、その入力、または貼り付けた範囲に、日付+時間の記録がされるということになるわけですが、果たして、それでよいのでしょうか?でも、「最終更新日」というのが固定された列なら、こういうコードは必要ないように思います。

なお、私は、他人の解決したコードをいじるのは嫌です。ちょっとしたことですが、自分のミスは、それを続けていく限りは、いずれは知ることになるからです。ただ、自分で気づく場合は腹も立たないけれども、他人にちょっとでも言われたら、不愉快になる人がいます。今回の回答者さんは、ここでは良く知られた回答者さんで、そのような人ではないのですが、できる限り、うまくいかない場合は、新たに仕切りなおしたほうがよいことが多いのです。それは、自分で書いたコードでも同じことです。ひとつにしがみつくよりも、新たに起こしたほうがよいことが多いです。

この回答への補足

なるほどー♪
それがひとつのネチケットなんですね~。その意味でも勉強になります。

ということは、こちらの質問は一度締めきって改めて質問を立てた方がよいのですよね?
この質問は、もともとスタート段階から良い質問の仕方ができていませんでしたから・・・

ただ、中途で質問し直した方が、かえって迷惑にならないでしょうか?
ネット上のマナーにもうといので、教えていただけませんか?

その上でもう一度ご指摘の部分も併せて質問し直してみたいと思います。
いろいろ本当にありがとうございます。

補足日時:2007/10/07 14:38
    • good
    • 0

>過去ログにあったQNo.2827109を参考に


この様な場合は、リンクを貼っておきましょう。
【エクセル】行の最終更新日を、あるセルに自動で入力させる方法。
http://okwave.jp/qa2827109.html

元のコードを貼り付けるのではなく、現在のコードを貼り付ける方が
回答がつきやすいですけど。

例えば、
>1列目に項目がある表で
元のコードは”1行目”ですが、実際の表にあわせて変更されてますか?
Set L = Columns(1).Find("最終更新日")
LastUpdated = L.Row
For Each R In MyRng.Columns
Cells( LastUpdated , R.Column) = Now

あたりでしょうか?

この回答への補足

投稿に対するアドバイスもいただけて感謝感激です。
質問すること自体も初めてなので恐縮です。

改めて先にしました質問を見直しましたら表現が間違っていましたので質問しなおします。

私の作った表は「1列目」ではなく「1行目」に項目がある表でした。
コピーさせていただいて、自分の表に合わせて設定した現在のコードは次の通りです。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim MyRng As Range, R As Range, L As Range
Dim LastUpdated As Integer
Set MyRng = Intersect(Target, Range("B2:AF500"))
If MyRng Is Nothing Then Exit Sub

Set L = Rows(1).Find("最終更新日")
If L Is Nothing Then Exit Sub
LastUpdated = L.Column

For Each R In MyRng.Rows
Cells(R.Row, LastUpdated) = Now
Next
End Sub

コピー後変更したのは4行目のデータの範囲("B2:AF500")だけです。

動かしてみると、下記のエラーが出ます。
実行時エラー'-2147417848(80010108)':
'Find'メソッドは失敗しました: 'Range'オブジェクト

デバッグでは、
Set L = Rows(1).Find("最終更新日")
の部分が矢印で指摘されてます。

以上の通りです。

伝えられてますでしょうか?恐縮です。

補足日時:2007/10/07 10:51
    • good
    • 0

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