Changeイベントに指示を加えたい

このQ&Aのポイント
  • 3行目以降のC列のセルに何か入力すると、そのとなりのD列のセルに日付と時間が返され、且つ、3行目以降のE列のセルに 'chcl' とすると、B列のセルに '機能回復' と自動入力される、というシートが欲しい。
  • 上記マクロは、それぞれ単発だと機能するが、一緒に作動させる方法を教えてください。
回答を見る
  • ベストアンサー

Changeイベントに指示を加えたい

こんにちは 現在ワークシートで下記マクロにて、日付・時間の履歴を自動入力しています。 3行目以降のC列のセルに何か入力すると、そのとなりのD列のセルに日付と時間が返されるものです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Integer, c As Integer r = Target.Row c = Target.Column If c < 3 Or c > 3 Or r < 3 Then End If Cells(r, c) <> "" Then Cells(r, c + 1) = Format(Now, "yyyy/m/d h:mm") Else Cells(r, c + 1) = "" End If End Sub この同一シートに、下記マクロの指示を加えたいのですが、うまくいきません。 3行目以降のE列のセルに "chcl" とすると、B列のセルに "機能回復" と自動入力されるものです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Integer, c As Integer r = Target.Row c = Target.Column If c < 5 Or c > 5 Or r < 3 Then End If Cells(r, c) = "chcl" Then Cells(r, c - 3) = Format("機能回復") Else Cells(r, c - 3) = "" End If End Sub まとめると・・・・・・ 3行目以降のC列のセルに何か入力すると、そのとなりのD列のセルに日付と時間が返され、 且つ、 3行目以降のE列のセルに "chcl" とすると、B列のセルに "機能回復" と自動入力される、 というシートが欲しいのです。 上記マクロ、それぞれ単発だと機能するのですが、一緒に出来ません。 どなたか、解決方法をご教授下さい。 よろしくお願いします。

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

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.2

lark-7さん はじめまして。 整理すると以下のようになります。 Private Sub Worksheet_Change(ByVal Target As Range)  Select Case False   Case Intersect(Target, Range("C3:C" & Rows.Count)) Is Nothing     Cells(Target.Row, "D") = IIf(Target = "", "", Format(Now, "yyyy/m/d h:mm"))   Case Intersect(Target, Range("E3:E" & Rows.Count)) Is Nothing     Cells(Target.Row, "B") = IIf(Target = "chcl", "機能回復", "")  End Select End Sub 【ちょっと解説】 1.Tagetのセルを場合分けしています。   Intersect(Target, Range("C3:C" & Rows.Count)) Is Nothing   ※TargetがC3:C65535(EXCEL2003の場合)に入っているか?   Intersect(Target, Range("C3:C" & Rows.Count)) Is Nothing   ※TargetがE3:E65535(EXCEL2003の場合)に入っているか? 2.入力値のよる2者択一   IIf(Target = "", "", Format(Now, "yyyy/m/d h:mm"))   ※Targetの値が""の時は"",そうではない場合は今日の日付   IIf(Target = "chcl", "機能回復", "")   ※Targetの値が"chcl"の時は"機能回復",そうではない場合は"" のようにしてます。 今後別の列で判断をしたい場合、Case文を増やすことで対応できるかと思います。 また、Format("機能回復")は特にエラーにはなりませんが、Format関数を行う意味がないので 単純に"機能回復"だけで良いかと思います。

lark-7
質問者

お礼

回答ありがとうございました。 実はまだ勉強中で、いろいろなマクロを切り貼りしているレベルです。 初心者ですね。 本回答は、まさに自分が欲しかったものでした。 解説もわかりやすく、今後の参考にさせていただきます。 Case文を増やして対応できることも感動です。 本当にありがとうございました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

うまく行かないとはなに? C列でもE列でも値が変化したら、ここ(このイベントプロシ)へ飛んでくるから、はじめに C列の場合 質問に記述のコード E列の場合 >"chcl" とするとTargetがchcl"ならばーー>B列のセルに "機能回復(同行だよね) にIFステートメントで分ければ良いだけでしょう。 ーー C列が変化したか、E列が変化したか判別するコードがわからないわけでなかろう。 c = Target.Column は数字で返るから3か4かを見れば仕舞い。 何を悩んでいるのか。

lark-7
質問者

お礼

回答ありがとうございます。 実はまだ、参考にできるマクロを切り貼りしているレベルでして、初心者同様です。 さらに勉強してゆきますね。 今回は失礼な質問だったかと思いますが、今後も見守ってやって下さい。 ありがとうございます。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.1

少しコードを整理してみましょう If c < 3 Or c > 3 Or r < 3 Then End を If c =3 Then 実行したいコード End If If c =5 Then 実行したいコード End If で考えませんか? Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Integer, c As Integer r = Target.Row c = Target.Column If c = 3 Then Range("D" & r).Value = Now End If If c = 5 And Target.Value = "chcl" Then Range("B" & r).Value = "機能回復" End If End Sub で試してみてください。 シンプルなコードにしましたのでわかりやすいかと。

lark-7
質問者

お礼

回答ありがとうございました。 このようなコードなど思いもつきませんでした。すごいです。 参考にさせていただきます。 シンプルで非常にわかりやすいものでした。 まだ初心者なもので、失礼な質問だったと思いますが、丁寧な回答本当にありがとうございました。

関連するQ&A

  • 日付の自動表示がうまくできません。

    VBAを使って、EXCELで日付を自動表示するマクロを作ったのですが、うまく動作しません。 設定の条件は、(対象の行は6~31行目で) D列に入力があった場合、G列に日付を表示、 M列に入力があった場合、N列に日付と時間を表示 です。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Integer, c As Integer 'r 行番号 'C 列番号 r = Target.Row c = Target.Column If Target.Count > 1 Then Exit Sub If c <> 13 Or r < 6 Or r > 31 Then End If Cells(r, c) <> "" Then If c = 13 Then Cells(r, c + 1) = Format(Now, "m/d hh:mm") Else Cells(r, c + 1) = "" End If If Target.Count > 1 Then Exit Sub If c <> 4 Or r < 6 Or r > 31 Then End If Cells(r, c) <> "" Then If c = 4 Then Cells(r, c + 3) = Format(Now, "m/d hh:mm") Else Cells(r, c + 3) = "" End If End Sub 作っているうちに、どこがおかしいのかわからなくなってしまいました。 助けて頂ければと思います。

  • Changeイベントのセル選択

    Private Sub Worksheet_Change(ByVal Target As Range) Dim myrang As Range Dim x as Long ★★ 'K列に入力した時 If Target.Column = 11 And Target.Count = 1 Then With Workbooks("システム.xlsm").Worksheets("台帳").Columns(7) Set myrang = .Find(what:=Target.Value, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, matchbyte:=False, searchformat:=False) End With If myrang Is Nothing Then Dim intret As Integer ’☆ intret = MsgBox("入力エラーです!", vbCritical + vbOKOnly, "エラー発生") Else  処理2のコード X=2  ★★ End If Target.offset(X,0).select End If     End sub ’☆1のメッセージボックスが出て、OKを押したときは、入力したセルを選択、 処理2を行ったときは、2行下のセルを選択したい、という質問をし、★★のコードを教えていただき、 思った通りの動作をしました。 このパターンで、同じように1行下のセルを選択、は出来たのですが。 他に、 ’☆1のメッセージボックスが出た時には、入力したセル、 処理2を行ったときは Target.offset(1,3).select としたい時はどのようにしたらいいのでしょうか? 会社にしかパソコンがなく、お返事は明日になると思いますが、どなたか よろしくお願い致します。

  • エラーが出てしまいます。

    特定の列(C列)に日付が入力されると同じ行の違う列に月名が入力されるマクロをt食ってみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 Then Cells(Target.Row, 10) = Month(Target.Value) End If End Sub しかしC列の一つのセルに入力したときはきちんと作動したのですが、C列の複数セルを選択したときにエラーが出てしまいました。 このエラーを回避する方法はあるのでしょうか。

  • エクセルマクロで複数列のセルを選択した時でも正しく動作するようにしたい

    エクセルマクロで複数列のセルを選択した時でも正しく動作するようにしたい。 今、3列目に入力された値によって15列から17列の値を自動入力するように次の マクロを作りました。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 3 Then Exit Sub For Each r1 In Selection If r1.Cells(1, 1) <> "部品表" Then Cells(r1.Row, 15) = "-" Cells(r1.Row, 16) = "-" Cells(r1.Row, 17) = "-" End If Next End Sub 3列目のみのセルをペーストすると正しく動作しますが、1列目から3列目のセルにペーストすると何も動きません。 正しく動くようにするには、どう修正すればいいでしょうか?

  • イベントを起こすと画面が揺れまくって大変です・・・結構見栄えもきついので回避できないでしょうか?

    以前ワークシートのイベントのプログラムを教えていただきありがとうございました。 参考に作ったプログラムなのですが・・・範囲をもう少しだけでかくしてやると画面がゆれて困っています。 値を入れてコピーしているときが特にひどいです。 複数セルを選択して消去しても大丈夫なようにかつ揺れない方法はないでしょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) Dim r As Range For Each r In Target MyProc r Next End Sub Sub MyProc(Target As Range) Dim i As Long Application.EnableEvents = False If Selection.Cells.Count <> 1 Then Exit Sub ' 変更したセルに値が入った場合条件成立 If Trim(Target.Value) <> "" Then ' 行番号が10以上65530以内のとき条件成立 If Target.Row >= 10 And Target.Row <= 65530 Then ' BCD列で、5の倍数の行のとき条件成立 If (Target.Column >= 2) And (Target.Column <= 4) Then If (Target.Row Mod 5) = 0 Then If Target.Value <> "" Then For i = 0 To 4 Target.Copy Target.Offset(i, 10).PasteSpecial Paste:=xlPasteValues Next If (Target.Column = 2) Then Worksheets("Sheet4").Range("A2:K6").Copy Target.Offset(5, -1) End If End If Else Exit Sub End If End If End If Application.CutCopyMode = False End If Application.EnableEvents = True End Sub

  • ワークシートの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

  • エクセルマクロvbのchangeイベントで複数入力した時フリーズして困っています

    マクロ初心者で困っています。 セルに『新規』と入力すると、T2セルに『F』と表示されるようにしたのですが、 『新規』をコピーして複数セルに貼り付けると貼り付けた状態のままパソコンが動かなくなってしまいます。 複数のセルがchangeした場合、マクロを終了する方法はないでしょうか? 教えて下さいm(_ _)m Private Sub Worksheet_Change(ByVal Target As Range) Dim tr As Integer Dim x As String If Intersect(Target, Range("H4:H253")) Is Nothing Then Exit Sub x = Target.Value tr = Target.Row If x = "" Then Exit Sub If x = "新規" Then Range("T2") = "F"   End sub

  • 列が対象のChangeイベントの入力セル選択

    Private Sub Worksheet_Change(ByVal Target As Range) Dim myrang As Range 'K列に入力した時 If Target.Column = 11 And Target.Count = 1 Then With Workbooks("システム.xlsm").Worksheets("台帳").Columns(7) Set myrang = .Find(what:=Target.Value, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, matchbyte:=False, searchformat:=False) End With If myrang Is Nothing Then Dim intret As Integer       '☆ intret = MsgBox("入力エラーです!", vbCritical + vbOKOnly, "エラー発生") Else      処理2のコード End If Target.Offset(2, 0).Select End If     End sub 以上のコードがあります。 ’☆のメッセージボックスを出し、OKを押したとき、入力したセルを選択して終了させたいのですが、 今のままでは、最後の Target.Offset(2, 0).Select を選択してしまいます。 どのようにすればいいのでしょうか?

  • 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 この、どこに重複の場合はエラーメッセージを出す、というのを入れればいいのか、 教えてください・・・。

  • エクセル マクロを利用して繰り返して入力する方法

    マクロでA1B1C1D1E1F1セルに入力しF1入力後A2B2C2D2E2F2と 下方向へ繰り返し800行くらいまで入力し、それとB列はスキップしたいのですが下記の方法で別々のシートでは うまくいくのですが同じシ-ト内ではエラ-になってしまいます 次の行への移動 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 7 Then Cells(Target.Row + 1, 1).Select End If End Sub B列のスキップ Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Range("G1") <> "" Then If Target.Column = 2 Then Target.Offset(0, 1).Select End If End If End Sub どなたかご存じの方教えて下さい

専門家に質問してみよう