- ベストアンサー
【エクセル】補足質問:行の最終更新日を、あるセルに自動で入力させる方法。
過去ログにあった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です。
- みんなの回答 (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
その他の回答 (6)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >前回おっしゃっていた「500行ではむしろ少ない・・・」の点も考慮していただけたマクロになっているのではないですか? よく考えてみたけれど、500行とか、まったく、制限を設けないことにしたのです。範囲を設定したければ、たとえば、 If Taget.Row >501 Then Exit Sub ということなのですが、それほど複雑な内容ではないし、負担も大きくないので、そのまま、一番下まで動くようにしました。 ここまで来ると、私は、途中、一体、何を書いていたのかって思われるかもしれません。だって、内容自体は、最初の質問のものよりも易しいからです。結局のところ、最初のマクロとも、似ていて違う内容のマクロなんですね。(^^;
お礼
Wendy02さん。 本当に本当にありがとうございました。 長いやり取りになってしまい、しかもかなり遠回りさせてしまったみたいで・・・ それもこれも、私の質問と説明の仕方が悪かったからです。 実は私も、普段は他人の話を聞く時は、相手が言いたいことが的確に把握した上でじゃないと意見を言わないように気を付けているのですが、文章の上でなら尚更のこと気をつけなければならないこともわかっていたつもりでした。 ところが、問題に焦っていたことと、ソフトやプログラムのことは全くわかっていない世界のことで、何をどう説明したら時系列が伝わるのか・・・と言うよりも、自分が置かれている状況が時系列で言うとどこなのかさえもわからない状況の中での質問だったので、本当にご迷惑をおかけしてしまいました。 それでも、いろんな角度から質問を返していただいて、最適な問題解決方法を考えていただけて、本当に私が得たかった答えそのものが返ってきたことに感動してます。 マクロのプログラムの内容だけでなく、ここまで至るまでのご対応にも感動してます。 今後も、いろいろとこのサイトを利用させていただきたくなりました。 一番最初に完結までお付き合いくださった方がWendy02さんで本当によかったと思っています。 これからも、私の質問を見かけましたら、懲りずにアドバイスを送ってやってください。 本当にありがとうございました!!
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >今回マクロを利用して、行全体のどの項目で更新されても「最終更新日時」が表示されるようにしようと思い、B列に「最終更新日」の項目を増やして問題のマクロを設定しました。 エラーの問題としては別にして、同じだと思ったのでしょうけれども、もしかしたら、マクロとしては、似ていて非なるものかもしれません。なんといっていいやら……。(^^; >B列に「最終更新日」の項目 B列のどこの行ですか? 入力した行のB列ですか? >「データの範囲」と言われる解釈を上記のように「この先も見越して」空白欄も含めているところは、もしかしたら間違いなのでしょうか? 「先を見越して」は問題ないですね。 すでに、150あるとしたら、500という範囲ですと、Excelの設定としては一般的には少ないかもしれません。 イベント・ドリブン型マクロというのは、除外範囲を作ってあげることによって、マクロが無駄に働かないように作るというのがコツなのです。Chageイベントというのは、セルに何かを入れると、それをきっかけにマクロが動いてしまうので、マクロが入力しても、また、マクロが動いてしまうことになるのです。私も、最初は、マクロがマクロを呼ぶなんていうことは、まったくありえないと思っていました。 私としては、やっぱり自分で全部コードを書いてみないと、はっきりいえません。 「B列のどこの行」というのがはっきりしたら、自分なりに作ってみます。 p.s. 私個人としては、エラー自体の解決は見ておきたいとは思いますが、それはどちらでもよいです。もともと、このエラーは個人的な興味です。この実行時エラーというのは、とても勉強になるのですね。コンパイルエラーとしては出てこないのですから、コードの間違いではないのですから。
補足
ひぇ~・・・表現とは難しいものですね・・・ それにしても、興味とは言えお付き合いいただいて本当に感謝です。 えっとですね・・・ B列にマクロによって行毎の最終更新日時が入力される欄をつくりました。 つまり、各行毎の更新日時が入力されるようにしたいのです。 たとえば、ID:89の人は89行目にA列にID、C列に名前、D列に生年月日・・・とプロフィールが入っていたとします。 このデータのどの項目を変更しても、マクロが働いてB列89行目のセルに「最終更新日時」として入力されるようにしたかったのです。 実際に「名前」や「生年月日」など、どの行のどこの列を変更してみても、その行のB列にあるセルにきちんと最終更新日時が入力されます。 が、入力された瞬間に固まって動かなくなってしまいエラーが出ます。 この説明でイメージできますでしょうか?
- Wendy02
- ベストアンサー率57% (3570/6232)
#3の訂正: 本来は、他の言語から通して、Excelを使う場合などに現れるエラーだと思います。 ------------------------------------------------------------------ -> 他の言語から通して、 他のブログラム言語を通して、
補足
重ね重ねありがとうございます。 #3に書きました通り、私が作成したエクセルの表に、どのような目的でマクロを設定したのか説明申し上げます。 本来最初に書くべきことで、順序が逆になってしまったことをお許しください。 私がエクセル2007で作成した表は、会員プロフィールを管理するデータベースのようなものです。 最初はただセルにIDごとに書き連ねていただけの、データベースと呼ぶに程遠いものなのですが、何人かで新しい会員のデータを「追加、削除」して更新していくうちに、どのデータが最新の更新内容なのかわからなくなってきたため、ちょっと細工をしてみようと思いトライしたのが、今回このサイトで見つけたマクロでした。 1行目のA列「ID」、B列「名前」、C列「生年月日」・・・「身長」「体重」・・・・などと項目を設定してAE列まであります。 今回マクロを利用して、行全体のどの項目で更新されても「最終更新日時」が表示されるようにしようと思い、B列に「最終更新日」の項目を増やして問題のマクロを設定しました。 現在は、150行ほどに会員が埋まっていますが、この先のことを考えて500行までデータの範囲としてしまいました。 「更新日」ではなく、「更新日時」まで表示したかったのは、ただ単にマクロを使ってカッコよさをアピールしたかっただけですので、どちらでも構わないことではあります。 この表に当てはめようと考え、先の質問欄のマクロをあてはめた結果、今回の騒動の質問へと発展したと言うわけです。 このような説明で、利用状況は掴んでいただけたでしょうか? もしかしたら、「データの範囲」と言われる解釈を上記のように「この先も見越して」空白欄も含めているところは、もしかしたら間違いなのでしょうか? #3に続いて、また何かご指摘いただけるところがございましたら、是非教えていただけたら幸いです。 どうぞよろしくお願いします。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 いろいろ考えましたが、このスレは、一応、私の中では、完結させたほうがよいと思いました。回答があっていなかったらすみません。 >中途で質問し直した方が、かえって迷惑にならないでしょうか? 今回のエラーは、かなり特殊な部類に入るのです。ある期間、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のご回答の方に書きなおしてみますので、参考までにそちらも見ていただけたらと思います。 本当にご親切にありがとうございます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 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行目のどこかにある「最終更新日」を見つけ出し、その入力、または貼り付けた範囲に、日付+時間の記録がされるということになるわけですが、果たして、それでよいのでしょうか?でも、「最終更新日」というのが固定された列なら、こういうコードは必要ないように思います。 なお、私は、他人の解決したコードをいじるのは嫌です。ちょっとしたことですが、自分のミスは、それを続けていく限りは、いずれは知ることになるからです。ただ、自分で気づく場合は腹も立たないけれども、他人にちょっとでも言われたら、不愉快になる人がいます。今回の回答者さんは、ここでは良く知られた回答者さんで、そのような人ではないのですが、できる限り、うまくいかない場合は、新たに仕切りなおしたほうがよいことが多いのです。それは、自分で書いたコードでも同じことです。ひとつにしがみつくよりも、新たに起こしたほうがよいことが多いです。
補足
なるほどー♪ それがひとつのネチケットなんですね~。その意味でも勉強になります。 ということは、こちらの質問は一度締めきって改めて質問を立てた方がよいのですよね? この質問は、もともとスタート段階から良い質問の仕方ができていませんでしたから・・・ ただ、中途で質問し直した方が、かえって迷惑にならないでしょうか? ネット上のマナーにもうといので、教えていただけませんか? その上でもう一度ご指摘の部分も併せて質問し直してみたいと思います。 いろいろ本当にありがとうございます。
- n-jun
- ベストアンサー率33% (959/2873)
>過去ログにあった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("最終更新日") の部分が矢印で指摘されてます。 以上の通りです。 伝えられてますでしょうか?恐縮です。
補足
できましたーーーー!!! 完璧に動いてます! ありがとうございました! ちなみに、これですと縦に何行データが伸びて行っても対応してくれるマクロになっているのだと言うことですか? だったとしたら、前回おっしゃっていた「500行ではむしろ少ない・・・」の点も考慮していただけたマクロになっているのではないですか?