エクセル2013VBAのChangeイベントでの問題解決方法

このQ&Aのポイント
  • エクセル2013でのVBAプログラムでChangeイベントを使用する際に、隣の列を選択している場合に問題が発生することがあります。この問題を解決するために、特定の入力範囲に対して条件分岐を行い、正しく処理を行うようにプログラムを修正することが必要です。
  • 計画のファイルでは、A列に品物、B列には品物に対応する付属品が入力されています。しかし、隣の列を選択してコピー&ペーストを行った場合に、付属品が正しく表示されない問題があります。これは、Changeイベントが正しく発生しないためです。
  • 上記の問題を解決するために、VBAプログラムを修正します。修正後のプログラムでは、Changeイベントが発生したセルが特定の入力範囲に含まれる場合にのみ処理を行い、それ以外の場合は処理をスキップします。これにより、隣の列を選択した場合には問題が発生せず、正しく付属品が表示されるようになります。
回答を見る
  • ベストアンサー

エクセル2013VBA Changeイベント 選択

お世話になります。一度質問を締め切ったのですが、色々やっているうちに問題がでてきたので再投稿いたしました。Excel2013です。 計画のファイルがあります。 例えば、"テーブル"シートのA列に品物A、品物B、品物C・・・、と入力されていて、B列にはA列の品物に対応して、付属A、付属B、付属Aなどと入力されているとします。実際は、品物数は数千種類あります。(この例の場合は、品物Aと品物Cは同じ付属を使う) "計画"シートには、A列にデータの入力規則のリストより、A社やB社・・・を選択し、 さらにB列は入力規則のリストより、=INDIRECT(B2)などといれて、A列の入力規則に対して品物Aや品物B・・・などを選択します。選択するようにしています。 それで、品物Aを選んだら、その下の行に付属Aとか自動ででるようにしたいと思っています。 (列は増やしたくありません) 入力範囲のどこでも選択をできるようにしておきたいので、入力範囲にはすべてリストが設定されており、数式を入れることはできません。 とりあえず、品物を入力する範囲は、C2:C25,G2:G25範囲です。 その状態で、 とりあえずご教授いただいて下記コードまでたどりついていき通常は大丈夫なのですが、B列とC列をまとめて選択コピーして貼り付けると、付属Aと出るべきところが何も起こりません。アクティブセルが隣の列を選択しているためだと思われますが、どうすればよいか分かりません。 Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = True On Error GoTo mExit Application.EnableEvents = False If Intersect(Target, Range("C2:C25,G2:G25")) Is Nothing Then Application.EnableEvents = True Exit Sub Else If Target.Offset(1, 0).Value = "" Then Target.Offset(1, 0).Value = Application.WorksheetFunction.VLookup(Target.Value, Sheets("テーブル").Range("B:C"), 2, False) Application.EnableEvents = True End If End If Application.EnableEvents = True Exit Sub mExit: Application.EnableEvents = True End Sub 度々お手数をおかけいたしますが、ご教授ください。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

>B列とC列をまとめて選択コピーして貼り付けると、付属Aと出るべきところが何も起こりません イベントプロシジャが想定している以外の使い方をしてると(イベントプロシジャの設計想定にヌケがあると)、こういう不具合が起こります。 private sub Worksheet_Change(byval Target as excel.range)  dim h as range  on error resume next  for each h in application.intersect(target, range("C2:C25,G2:G25"))   application.enableevents = false   h.offset(1) = application.worksheetfunction.vlookup(h.value, worksheets("テーブル").range("B:C"), 2, false)   application.enableevents = true  next end sub >B列は入力規則のリストより、=INDIRECT(B2)などといれて、 >A列の入力規則に対して品物Aや品物B・・・などを選択します。選択するようにしています。 こんな具合に間違った事がご相談に書かれているので、ご相談で書かれてる内容のどれがホントでどれが間違いなのか、全て疑って解明してか無きゃならないのがとっても大変です。 >物Aを選んだら、その下の行に付属Aとか自動ででるようにしたいと思っています。 >(列は増やしたくありません) 入力欄C2:C25,G2:G25には入力規則で許可している「品物ABC」だけじゃなく、入力規則では許可していない「付属品ABA」もまたC2:C25,G2:G25の中に入力したいと、一種矛盾した説明になってます。でもまぁ、この部分はホントであると(付属品ABAも入力できるよう、入力規則を設定しているとの説明がヌケていると)解釈します。

hinoki24
質問者

お礼

「品物ABC」をリストから選べますが、「付属品ABA」も入力できるよう、入力規則を設定できています。 抜け、もれ、間違いありで余計なことを考えさせてすいません。 このコードでうまくいきました。一応色々な使い方を適当に試しましたが、問題は発生していません。 どうもありがとうございました。助かりました。

関連するQ&A

  • VBA Changeイベントのエラー

    エクセルで簡単な計算書を作成しています。(マクロ初心者) ちなみにこのコードは自分で作成したものではなく、人から聞いていじってみました。 Private Sub Worksheet_Change(ByVal Target As Range) '一度に複数セルの値が変更された場合は終了 '(A5:C5を選択しDeleteも含みます。) If Target.Count > 1 Then Exit Sub If Intersect(Target, Me.Range("H170:K170", "H171:K171","C76")) Is Nothing Then Exit Sub Application.EnableEvents = False '数値かつ空白以外の場合 If IsNumeric(Target.Value) And Target.Value <> "" Then Me.Range("M170").Formula = "=if(iserror(H170*I170*J170*K170),""-"",H170*I170*J170*K170)" '空白の場合 ElseIf Target.Value = "" Then Me.Range("H170:K170,M170").Value = "-" End If Application.EnableEvents = True Application.EnableEvents = False '数値かつ空白以外の場合 If IsNumeric(Target.Value) And Target.Value <> "" Then Me.Range("M171").Formula = "=if(iserror(H171*I171*J171*K171),""-"",H171*I171*J171*K171)" '空白の場合 ElseIf Target.Value = "" Then Me.Range("H171:K171,M171").Value = "-" End If Application.EnableEvents = True Application.EnableEvents = False '空白の場合 If Target.Value = "" Then Me.Range("D76:K76","C76").Value = "-" End If Application.EnableEvents = True End Sub H170、I170、J170、K170のどれかに数値の入力があった場合、M170に計算式を入力。 H170、I170、J170、K170のどれかの値をDELETEキーでクリアした場合、H170、I170、J170、K170、M170に"-"を入力。 その他に似たような処理がたくさん出てくるので、H171の処理とC76をDELETEキーでクリアした場合の処理を自分で考えて作ってみたのですが、うまく実行されません。H171~の処理はうまくいったので単純にコードをどんどん追加していけば動くと思ったんですが、いろいろ調べてもどうも方法がわからず進みません・・・ 解決してもらえるでしょうか・・

  • Excel 2000です。VBAを改造していただきたいのですが

    入荷品のチェックシートです。B列に受領数を入力するとA列に年月日が記録されるVBAを作っていただき必要なブックのシートごとにコピーして使っていました。全品入荷完了後 別のロットにシートタブの名目を書き換えて再利用します。  ('複数セルが選択された場合、動作をキャンセル  がなぜ必要かも理解できないVBAの勉強を挫折の高齢者です) B列のセル一個づつ選択削除でないとB列が空白になるだけでA列には日付が残ります。複数のセル選択で一気に日付を削除したいのです。 お助けください。 Private Sub Worksheet_Change(ByVal Target As Range) '複数セルが選択された場合、動作をキャンセル If Target.Count <> 1 Then Exit Sub If Intersect(Target, Range("B5:B1000")) Is Nothing Then Exit Sub 'B5:B1000"の範囲外は除外 Application.EnableEvents = False If Target.Value <> "" Then If IsDate(Target.Offset(, -1).Value) Then GoTo EXIT_LABEL '日付が記入済の場合は実行しない Target.Offset(, -1).Value = Format$(Now, "mm/dd hh:mm") Else 'セルを空白にした場合、日付を削除 Target.Offset(, -1).Value = "" End If EXIT_LABEL: Application.EnableEvents = True End Sub

  • VBA CHANGEイベントに複数イベントを

    いつもお世話になっています。 色々しらべて試してみたんですが、うまくいかないんで教えてください。 CHANGEイベントに複数のイベントを書き込みたいんですが。 今現在、問題なく動いている以下のイベントがあります。 (1) Private Sub Worksheet_Change(ByVal Target As Range) Dim rang3 As Range Dim rang4 As Range Dim ■■ As String Dim LastRow1 As Long LastRow1 = Worksheets("○○").Cells(Rows.Count, "b").End(xlUp).Row Set rang4 = Worksheets("○○").Range("b:I" & LastRow) Set rang3 = Range("h4") If Intersect(Target, rang3) Is Nothing Then Exit Sub On Error Resume Next ■■ = WorksheetFunction.VLookup(Target.Value, rang4, 2, 0) If Err.Number > 0 Then MsgBox Target.Value & "はありません。基本情報台帳に入力してください。" Range("h4").Select Else Application.EnableEvents = False Range("I4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 2, False) Range("j4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 3, False) Range("k4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 7, False) Range("l4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 8, False) Range("m4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 5, False) Application.EnableEvents = True Range("K4").Select End If End Sub このシートにもう一つ、イベントを入れたいのですが。 (2) If Target.Count > 1 Then Exit Sub If Intersect(Target, Range("E4")) Is Nothing Then Exit Sub Else If Range("e4").Value = "1" Then Target.Offset(0, 19).Value = "☆" End If どこに入れればいいのかわかりません。 (3) また、(2)のイベントの他に、 (1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたいのですが・・・。 (2)のみなら動くことは確認できましたが、(1)のexit sub の直前に入れたり、end ifの前に入れたりしましたが、片方は動くが、もうひとつが動かないです。 (3)については、まったくわかりません。 マクロについて、自分でネットで勉強した程度なので、基本がわかっていないからなのでしょうが・・・。 どなたか、教えてください。 お願いします。

  • EXCEL VBAについて教えてください

    はじめまして。 過去ログに私のやりたいような内容を探していたらこのような下記のエクセルVBAがあったので、教えて頂きたいです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value = "" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With With Cells(ActiveSheet.Rows.Count, "C").End(xlUp) .Offset(1, 0).Value = x .Offset(1, 1).Value = Time() End With End Sub A1に入力するたびに同一セルに加算。 A1をクリアできる。 C列に入力履歴、D列に入力時間を記録。 If Target.Address <> "$A$1" Then Exit Sub の$A$1を変えることによって他のセルにも設定できる。 と、いう内容なのですが、これをたとえば同一シートのA1~E10のセルとA12~E22にも同じよう別々に処理できるように設定したいのですが、どのようにすればいいのでしょうか?ちなみにA11~E11とA23~E23は合計を表示するセルにしたいです。 Excelのバージョンは2003です。 よろしくお願い致します

  • イベント(Worksheet_Change(ByVal Target As Range)に詳しい方お願いします。

    こんにちわ。 エクセルで経理関係の表を作っているのですが、イベントプロシージャにて、特定の列のセルに入力された数値に対して、許容範囲か否かサインを出して(IF関数)、そのサインがでれば音を出すマクロを組もうとしているのですが、なかなかうまく行きません。   商品           商品  A B C -------- L M N O  | P Q--------AA 1 ○ |     ▲ 2 | 3 | | この表で注意すべき赤字は▲、伸ばすべき黒字は○。 A1~N1が商品種別や単価などの情報です。 ○▲サインはIF関数にて表示出来るようにしたのですが、このサインが表示された時にマクロを実行するイベントとして、 ************************ Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 14 Then Application.EnableEvents = False Target.Value = s If s <> "" Then Call サイン発生通知 End If Application.EnableEvents = True End If If Target.Column = 28 Then Application.EnableEvents = False Target.Value = s If s <> "" Then call サイン発生通知 End If Application.EnableEvents = True End If End Sub ************************ としています。 音を出すマクロ自体は単体で(call サイン発生通知で)確認出来ているので、イベントプロシージャの記述に問題があると思うのですが・・・ 記述しているところは、Excelobject Sheet1(この表があるところ)です。 どなたか詳しい方おられましたら、ご教授の程お願い致します。<(_ _)>ペコリ 

  • VBAについて教えてください。

    過去のQNo.457545であったのですが エクセルに20080801と入力すると 自動的に平成20年8月1日と表示されるVBAについて 下記の構文で可能ということでした。 この場合、変換がされるのは A1からA10までのセルだと思うのですが 加えてC1からC10も変換させるには どこかに入力を加えることで 可能になるでしょうか? よろしくお願いします。 QNo.457545にあった構文です。 Sheet1のコードウインドウに貼り付け ↓ Const HenkanAdr = "A1:A10" 'この範囲で機能する。変更して下さい Private Sub Worksheet_Change(ByVal Target As Excel.Range)   Dim txt As String   Application.EnableEvents = False   On Error GoTo ErrorHandler   If Target.Count = 1 Then     If Not Intersect(Target, Range(HenkanAdr)) Is Nothing Then       txt = Right("00000000" & Target.Text, 8)       txt = Left(txt, 4) & "/" & Mid(txt, 5, 2) & "/" & Right(txt, 2)       Target = Format(txt, "gggee年mm月dd日")     End If   End If   Application.EnableEvents = True   Exit Sub ErrorHandler:   Application.EnableEvents = True End Sub

  • エクセルでVBAの起動がうまくいかない

    VBAに関してはあまり知識が無い初心者です。現在、会社で計算書をエクセルで作成しています。質問は、【A1に数量を入力し、B1に労務費を入力したら、B1にA1×B1の計算結果が表示される】という感じにしたいのです。 そこで、教えて!gooで似た様な質問(その質問は【A1+B1の答えをA1に表示させる】でした)があったので、その質問の回答がVBAでの解決でしたので、私もVBAで解決を試みました。 しかし、A1に1、B1に27,450を入力するとB1に27,450が表示されはするのですが、A1の数量を2に変えるとA1に27450と表示されてしまいます。 A1の数量を2や3にしてもB1に入力した数値がちゃんとB1×2、B1×3になるようにしたいです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "A1" Then Exit Sub If VarType(Target) <> vbDouble Then Exit Sub Application.EnableEvents = False Range("A1").Value = Target.Value * Range("B1").Value Application.EnableEvents = True End Sub 上記が入力した全文です。どこを修正すればいいのか教えてください。 長々の質問、申し訳ございませんが、宜しくお願いいたします。

  • VBA 範囲選択時エラー

    Private Sub Worksheet_SelectionChangeのVBAでA列B列C列でワンクリックで文字が入力できるように設定致しました。 その後、A列からC列を範囲選択してDeleteするとデバック 「実行時エラー  型が一致しません」と出てしまいます。業務上、そのセルのデータは一気に消したいので困っております。どなたか分かる方よろしくお願い致します。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim rng As Range, rng_1 As Range, rng_2 As Range Application.EnableEvents = False Set rng_1 = Range("H17:H100") Set rng_2 = Range("I17:I100") Set rng_3 = Range("J17:J100") Set rng_4 = Range("K17:K100") Application.EnableEvents = True Set rng = Intersect(Target, rng_1) If Not rng Is Nothing Then Cancel = True If Target.Value = "" Then Target.Value = "(1)" Else Target.Value = "(1)" End If Else Set rng = Intersect(Target, rng_2) If Not rng Is Nothing Then Cancel = True If Target.Value = "(2)" Then Target.Value = Empty Else Target.Value = "(2)" End If Else Set rng = Intersect(Target, rng_3) If Not rng Is Nothing Then Cancel = True If Target.Value = "(3)" Then Target.Value = Empty Else Target.Value = "(3)" End If Else Set rng = Intersect(Target, rng_4) If Not rng Is Nothing Then Cancel = True If Target.Value = "(4)" Then Target.Value = Empty Else Target.Value = "(4)" End If End If End If End If End If End Sub

  • エクセル 加算 

    1つのセルに数字を入力すると加算されているマクロを探していたら 以下の回答がありました Dim memo Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value <> "**" And IsNumeric(Target.Value) = False Then Exit Sub Application.EnableEvents = False If Target.Value = "**" Then memo = 0 Else memo = memo + Target.Value End If Target.Value = memo Application.EnableEvents = True End Sub このマクロですがA1に入力した場合に適用しますが、このマクロをたとえばA1からC1の範囲で使用した1場合にどのようなマクロをすればよいかわかりません それか、このマクロではそのようなことができるのかもわかりませんので教えて頂けないでしょうか

  • VBA(エクセル)でのCOUNTAについて

    エクセルのSheet1のB列にSheet2の内容をコピーして、(ここまではできました) Sheet1のB列に入ってきたデータの横(A列に)連番を振りたいと思っています。 そのため、以下のように作ってみたのですが、 A列に表示される連番が現在のB列の最後の数“54”をA列全て(B列にデータがあるところ)に表示してしまいます。 どの部分が悪いのかさっぱりわからず、どのように修正すべきかもわからず・・・困ってしまっています。 よろしくお願いします。 Dim i As Range Dim mycount As Range Set mycount = Application.Intersect(Target, Me.Range("b:b")) If mycount Is Nothing Then Exit Sub End If Application.EnableEvents = False For Each i In mycount If IsEmpty(i.Value) Then i.Offset(0, -1).ClearContents Else i.Offset(0, -1).Value = Application.WorksheetFunction.CountA(Range("b2:b200")) End If Next i Application.EnableEvents = True End Sub

専門家に質問してみよう