• ベストアンサー

エクセルVBAのChangeイベントの書き方について

またまた質問させてもらいます。 先ほど「エクセルで作業した日の日付を残す」で質問させて 頂いた件での引き続きなのですが、 セルA1~セルL1までのそれぞれのセルに「1」を入力する 作業が有るとします。(1が入力されるか、されないかは任意で また、入力する時刻も異なる) そして、「1」が入力された、その時の時刻をセルA2~セルL2 に表示させるにはどうのようにVBAを書けばいいのでしょうか? セルA1に「1」が入力された場合はA2に表示されるという風に それぞれのセルの下に表示されるという形なのですが。 ちなみに先ほど回答いただいたVBAを少しいじってみて 以下のようなものを作ってみたのでが、これだと常にA1のセルに 「1」が入っているので、毎回時刻が更新されてしまうみたいで、、 この繰り返しを書いてもダメなのですね。 ご回答のほど宜しくおねがいしますーーーー Private Sub Worksheet_Change(ByVal Target As Range) If Range("a1") = "1" Then Range("a1").Value = Now() End If End Sub

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

こんな感じでしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1:L1")) Is Nothing Then Exit Sub Else If Target.Value = 1 Then Target.Offset(1, 0) = Now() Else Target.Offset(1, 0) = "" End If End If End Sub コピペやドラッグ等でいっぺんに複数セルへの入力があるのであれば、以下です。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1:L1")) Is Nothing Then Exit Sub Else If Target.Count = 1 Then If Target.Value = 1 Then Target.Offset(1, 0) = Now() Else Target.Offset(1, 0) = "" End If Else For Each c In Selection If c.Value = 1 Then c.Offset(1, 0) = Now() Else c.Offset(1, 0) = "" End If Next End If End If End Sub

tmgolf
質問者

お礼

まったくの素人にVBAをこのように作成して いただきありがとうございます。 まだ、悪戦苦闘中ですが、もう少し勉強して 的を得た質問が出来るよう勉強して出直して きます。 ありがとうございます。

tmgolf
質問者

補足

お返事ありがとうございますーーーーー 早速VBAを利用しようとしているのですが、、、(泣) 全く反応がありません(泣) ご回答いただいたVBAが問題ではなくて、自分のPCのエクセルの 問題っぽいのですが。 VBAが全くの素人のため、いろんな所を触ってしまって、設定 をおかしくしてしまいましたのでしょうか? 何処をどうしてしまったのか、全く分からないのですが、 どうしたらよういのでしょうか? 何かアドバイスいただけないでしょうか

その他の回答 (4)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.5

> ツール>>マクロ>>visual basic editorを選択 > VBAProject(test.xls)>>Microsoft Excel Objects>>ThisWorkbook > をダブルクリック #1のmerlionXXです。 やはり・・・・。 ThisWorkbookではなく、Sheet1 (Sheet1) のようになっているシートのモジュールに貼り付けてください。(該当するシートのところにです。)

tmgolf
質問者

お礼

ごめんなさい。本当にこんな事で、皆さんに時間を取り お返事をくださいまして、本当にありがとうございました。 これからも勉強して頑張って理解していきますので その時はまたよろしくお願いいたします。 ありがとうございましたーm(..)m

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 一応、デフォルトでは、Option Explicit は強制されていたはずですが、それがなければエラーが出ますから、よほどの初心者でなければ気がつきます。一応、「1 」を入れて、日時を出すのだから、セルは複数は扱わないことになるかと思います。 それはともかくとして、Changeイベントだから、二重起動は気をつけないといけません。 私は、こうした組み込み型のイベント・ドリブン・マクロは、最近はほとんど書きません。ご質問者さんの言うように、トラブったときの復活のしようがありません。本来はインスタンスを設けたほうがよいのですが、それはちょっとややこしいです。 とりあえず、でなくなったら、ReGain を実行してください。 Private Sub Worksheet_Change(ByVal Target As Range)   If Intersect(Target, Range("A1:L1")) Is Nothing Then Exit Sub   If Target.Count > 1 Then Exit Sub 'セルはひとつ   If Not IsNumeric(Target.Value) Then Exit Sub '数値を強制      Application.EnableEvents = False   If Target.Value = 1 Then     Target.Offset(1).Value = Now '日付と時間込み   Else     Target.Offset(1).ClearContents   End If   Application.EnableEvents = True End Sub 'おまけ Sub ReGain()  'イベント復活  Application.EnableEvents = True End Sub

tmgolf
質問者

お礼

皆様、本当に色々なアドバイスをご返答くださいまして ありがとうございます。 状況が変化しましたのでご連絡させていただきます。 皆様が送っていただいたVBAコードを VBAProject>>Microsoft Excel Objects>>sheet1 の方に貼り付けましたら。 エクセルシート1のA1のセルに「1」と入力したところ 動作の確認がありました。 ThisWorkbookの方ではダメなんですね。 その辺の所もまだまだ理解できていなく、皆様にお時間 取っていただき返答していただいた事に、本当に感謝しており ます。ありがとうございます。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

> 全く反応がありません(泣) #1のmerlionXXです。 標準モジュールではなく、シートのモジュールに記述しているのですよね? 残念ながらこちらではまったく状況がわかりません。 一度、パソコン自体を再起動してから、新しいファイルで再度わたしのコードを試してみていただけますか? Option Explicit を宣言するなら、わたしの二つ目のコードの場合、#2さんご指摘の通り、2行目に Dim c As Range を挿入してください。

tmgolf
質問者

お礼

何度もご親切にお返事ありがとうございます。 コードを書き込んで居る場所は エクセルを立ち上げ、ファイルname:testで保存 そこから、エクセルのツールバーから ツール>>マクロ>>visual basic editorを選択 VBAProject(test.xls)>>Microsoft Excel Objects>>ThisWorkbook をダブルクリック 右にコード記入欄が表示され 一行目に Option Explicit と表示され、 その下に頂いた、VBAを貼り付け その後エクセルシートに戻り、A1セルに「1」と入力 と言う操作を行っておりますが、「1」と入力した後 何も変化が無いと言う状況です。 コードは教えて頂いたとおり、2行目には Dim c As Range を入れてあります。 何かお気づきの点などありましたら、また、お返事いただけれ ばと思います。 お時間を取っていただきありがとうございます。 

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

QNo.2931377「エクセルで作業した日の日付を残す」でのANo.2の Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Cells(1) = Range("a1") Then     Target.Cells(1, 2).Value = Now()   End If End Sub は質問の『A1のセルに「1」入力した時の日付、時刻をA2セルに表示したい』ということを満足しません。 解答(ANo.2)は、 『入力したセル範囲の左上の値と、セルA1の値が等しかったら、入力したセル範囲の左上の右のセルに日付、時刻を表示する』ようになっており、質問の答えにはなっていません。 例えば、A1に「ある値X」が入力されていれば、別のあるセルに「X」と入力すれば、その右に日付、時刻を表示したり、A1に何も入力されていないときは、別のあるセルの値を消去すれば、消去したセルの右に日付、時刻を表示したりします。早々に締め切られたので、コメントのしようがなかったです。 Private Sub Worksheet_Change(ByVal Target As Range)   If Range("a1") = "1" Then     Range("a1").Value = Now() ‘Range("a2").Value = Now()   End If End Sub これは、A1に最初、1を入れると、A1を書き換えてしまいます。後、別のセルに何を入力しても何も起きません。Range("a2").Value = Now() とすべきですが、A列しか変更していません。 まず、いろいろ作業する前にバックアップしておきます。 まずは、QNo.2931377解答(ANo.2)のモジュールまたはこのモジュールを修正したモジュールは削除してしまうべきでしょう。 ANo.1 merlionXXさんのモジュールは正しく動くと思いますが、問題があるとすれば、Option Explicit が宣言されていないようなので、   For Each c In Selection で止まる可能性があります。これは、tmgolfさんのVBEの設定にも関係しますが、   Private Sub Worksheet_Change(ByVal Target As Range)     Dim c As Range     If Intersect(Target, Range("A1:L1")) Is Nothing Then と、c を宣言した方がいいでしょう。 >何処をどうしてしまったのか、全く分からないのですが、 >どうしたらよういのでしょうか?   解答者も、なおさら分からないでしょう・・・   新しいExcelにmerlionXXさんのモジュールを貼り付けなおすのが最適ではないかと思います。また、エラーが起きたら、[実行→リセット]を行なわないと、何も反応しなかったりします。   Option Explicit は設定しておく方がいいでしょう。   VBE画面で、ツール→オプション、編集タブで、「変数の宣言を強制する」にチェックします。

tmgolf
質問者

お礼

ご返答ありがとうございます。 おっしゃるとおり、何が悪いか解らない と質問しても、回答する方も回答のしようが ないですね。 ど素人のため、的確な質問ができない中 お返事を頂き、ありがとうございます。 もう少し状況を説明させていただきますと 最初は Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Cells(1) = Range("a1") Then     Target.Cells(1, 2).Value = Now()   End If End Sub のVBAと Private Sub Worksheet_Change(ByVal Target As Range)   If Range("a1") = "1" Then     Range("a1").Value = Now() ‘Range("a2").Value = Now()   End If End Sub のVBAも目的は達成は果たしてないにもしろ、反応はしており 動いていたのですが、あれこれ試行錯誤しているうちに 動作してないような感じになりました。 A1セルに「1」と入力するとB2セルもしくはA2セルにはその時 の時刻が表示されていたのですが、それすら出なくなったと 言うのが、今現在の状況です。 もう少し勉強して、もっと的確な質問を出来るようがんばります。 このような素人の質問に対して、アドバイスしていただき ありがとうございます。

関連するQ&A

  • エクセル イベントマクロ Changeイベントを複数作りたい

    Private Sub Worksheet_Change(ByVal Target As Range)   If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub 以下マクロの内容 End Sub これでセルA1が変わるとイベントマクロが発生しますが セルB1が変わると別のマクロが発生し セルC1が変わるとまた別のマクロが発生し…とするには どうすればよいのですか 単純に並べて書いたらだめみたいだったんですけど

  • VBA changeイベントを複数入れたい

    VBA changeイベントを複数入れたい VBAは初心者で、以前もこちらでお世話になりました。 F4セルに入力した際、VLOOKUPで検索し、該当がなければメッセージボックスを出し、 該当があれば、そのまま次に進む、というchangeイベントが既にあります。 ここに、E4セルに入力した数字が、同じシートのE列5行目以下と重複していた場合、 エラーメッセージを出す、とのをつけたしたいと思っています。 IFを使えばいい、ということはわかるのですが、どこに入れたらいいのかがわからず・・・。 すでにあるVBAは以下のとおりです。 Private Sub Worksheet_Change(ByVal Target As Range) '処分受託者(入力用名称)を入力して、処分業者名簿になければエラーメッセージを出す。 Dim rang1 As Range Dim rang2 As Range Dim 処分受託者名称 As String Dim LastRow As Long LastRow = Worksheets("処分業者名簿").Cells(Rows.Count, "b").End(xlUp).Row Set rang2 = Worksheets("処分業者名簿").Range("b4:b" & LastRow) Set rang1 = Range("f4") If Intersect(Target, rang1) Is Nothing Then Exit Sub On Error Resume Next 処分受託者名称 = WorksheetFunction.VLookup(Target.Value, rang2, 1, 0) If Err.Number > 0 Then MsgBox Target.Value & " はありません" Range("f4").Select Else End If End Sub この、どこに重複の場合はエラーメッセージを出す、というのを入れればいいのか、 教えてください・・・。

  • Excel2003 VBAのChangeイベント

    特定の1つのセルに時刻をキーボードで入力(入力規則で時刻のみ可)したら、以下のコードが動くようにしたいと思っています。Changeイベントを使用することらしいのは、解ってきたのですが組み立て方がわかりません。素人には難易度が高すぎて難渋しています。ご教示いただけたら幸いです。 Sub x軸の最小最大値() ActiveSheet.ChartObjects("グラフ 1").Activate With ActiveChart.Axes(xlCategory) .MinimumScale = Range("A2").Value '最小値 .MaximumScale = Range("A10").Value '最大値 End With Range("B3").Select End Sub

  • エクセルVBAのイベントについて教えてください。

    エクセルVBA初学者のです。 "C9"にいれるとchangeイベントが発生するコードなんですが、 "C9"のほかに"D1"においてもchangeイベントを発生させたいのですが 下記のコードに続けて書いてもイベントが発生しないのですが どのように書けばよいのでしょうか? private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("C9")) Is Nothing Then Exit Sub Range("H14:H56").Interior.ColorIndex = 2 If Intersect(Target, Range("D1")) Is Nothing Then Exit Sub Range("G14:G56").Interior.ColorIndex = 2 End Sub よろしくお願いします。

  • Excel VBA セルの双方向同期のエラーについ

    エラーが発生して理由がわからないので、どなたか助言をお願いします。 以下のVBAにて、目的のセルにデータを入力すると、1回目は必ず添付写真の通りのエラーが出まして、デバッグをすると3行目が黄色でハイライトされます。 記述は以下の通りです。どうぞよろしくお願いします。 シートAへのVBA設定 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Sheets("シートB").Range("$B$1").Value = Sheets("シートA").Range("$A$1").Value End If End Sub シートBへのVBA設定 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$1" Then Sheets("シートA").Range("$A$1").Value = Sheets("シートB").Range("$B$1").Value End If End Sub

  • エクセル: Changeイベントが発生しないのはなぜ?

    エクセルでChangeイベントが発生しないので以下の方法で確認してみました。 やはり駄目でした。 なぜでしょうか。 条件:Excel2000 セル"A1" に楽天証券から株価データをRSSでもらっています。 書いたコード Private Sub Worksheet(ByVal Target As Range) If Target.Address <> "" Then MsgBox "イベント確認" End if End Sub これで駄目なのでセルにをいじるとイベントは発生しているようです。 Intersectプロシージャも試しましたが駄目でした。 Case文で拾うことも試しましたが駄目でした。 RSSで信号を受けた場合イベントは発生しないものでしょうか? よろしくお願いいたします。

  • ワークシートのChangeイベントについて

    シート1のA1セルの値を変更したらシート2のA1・A2・A3と変更内容を順に記録するような以下のようなコードがありますが、うまく動作しません。問題点を指摘していただければ大変助かります。 【Worksheet】 Private Sub Worksheet_Change(ByVal Target As Range) Static r Dim s As Range Set s = Sheets("sheet1").Range("$a$1").Value If s Is Nothing Then Else If r = "" Then r = 1 Sheets("sheet2").Cells(r, 1) = Sheets"sheet1").Range("$a$1").Value r = r + 1 End If End Sub

  • VBAでChangeイベントを使いたい

    今エクセルで出納を作ってます。 シート1には A日付 Bコード C金額 D 消費税区分 E 金額 F,G,H,Iにも同様に貸方科目を入れてます。 シート2にはAコードB科目を上から下にずっといれてます。 それで借方金額Cの金額をEに飛ばすこと VLOOKUPでBのコードに対応する科目を表示すること 上記をChangeイベントでやりたいのですが、金額転記はうまくいったのですが、 VLOOKUPの方が標準モジュールではうまくいくものの、シートモジュールに移すとうまく 行きません。おそらく根本的な理解がかけてるからだと思います。 今の記述は下記 シート1に Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = 1 Or Target.Row > 100 Then Exit Sub If Target.Column <> 5 Then Exit Sub Dim Cnt As Long For Cnt = 2 To 100 Range("I" & Cnt).Value = Range("E" & Cnt).Value Next Cnt If Target.Row = 1 Or Target.Row > 100 Then Exit Sub If Target.Column <> 3 Then Exit Sub End Sub 標準モジュールに Option Explicit Sub 科目() Dim シート1 As Worksheet Dim シート2 As Worksheet Set シート1 = Worksheets("出納") Set シート2 = Worksheets("科目") Dim myR On Error GoTo ErrorHandler myR = Application.WorksheetFunction.VLookup(シート1.Range("B2"), シート         2.Range("A2:B87"), 2, False) シート1.Range("C2").Value = myR Exit Sub ErrorHandler: シート1.Range("C2").Value = "該当無し" End Sub  大変素人な質問ですみませんが、ご回答いただけると嬉しいです。  基礎の本やレファレンス本は見たのですが、標準モジュールでできること  がなぜシートモジュールでできないかが全く分かりません。  よかったらお教えください。

  • エクセルVBA記述方法についての質問です。

    初心者です。色々調べるとVBAを使わないと下記の処理はできないみたいで・・・ わかる方がいれば是非教えて頂きたいです。 今回、毎日入力している数値に対して作業日付(更新日時)を残したいのですが、 例えば、A列のセルに数値を入力すると、入力したセルの右側のセル(この場合B列)に 日付と時間が残るようにしたいです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("a1") Then Target.Cells(1, 2).Value = Now() End If End Sub 自分でも色々調べてやってみましたが、上記の記述だと、A1に入力すればB1に作業日時が残ります。 やりたいことはこれに限りなく近いのですが、対象入力範囲をA列にしたいです。 A列のどのセルに数値を入力しても、入力したセルの右側(B列)に作業日時を残していきたいです。 どのように記述すれば良いのかわからないので是非アドバイスを下さい。 よろしくお願い致します。

  • Worksheet_changeイベントが動作しない

    Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case "$D$224" If Target.Value = "" Then Range("D224").Value = "-" End If End Select End Sub DeleteキーでD224をクリアした場合、D224に"-"が入力されません。 D224はD225と結合してあります。 select~caseを使ってdeleteキーで"-"が入力されるような動作を教えてください・・よろしくおねがいします。。。

専門家に質問してみよう