• ベストアンサー

targetをA列のセルに限定するには?

『A列のセルに変更があったときのみ実行する』マクロを組みたいと思っています。 『If Target.Column = 1 Then』で条件をつけたのですが、これではA列と同時に他の列を同時に変更した場合、A列以外のセルも対象になってしまいます。 文章ではうまく説明できないので、具体例を挙げたいと思います。 シートに下記マクロを設定しました。 (1)A1~A30を選択しDeleteボタンを押すとB1~B30に1~30の数値が入力されます。 (2)次にA1:J30を選択しDeleteボタンを押すとB1:B30に(1)の時の10倍の数値が入力されます。 A1:J30を選択した場合でも(1)の時と同じ結果を出すにはどうすればよろしいでしょうか? また、このマクロを実行したときに処理に時間がかかるときとかからないときがあるのですが、その理由もわかる方がいらっしゃれば是非教えていただけないでしょうか? 拙い文章でわかりづらくなってしまいましたが、どうか宜しくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then Dim tRANGE As Range i = 1 If Selection.Count > 1 Then For Each tRANGE In Target Range("A1").Offset(tRANGE.Row - 1, 1) = i i = i + 1 Next End If End If End Sub

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

  • ベストアンサー
  • tom11
  • ベストアンサー率53% (134/251)
回答No.2

こんにちは、 デリートボタンとなっていますが、単なる、削除ですよね。 *********************引用********************** (1)A1~A30を選択しDeleteボタンを押すとB1~B30に1~30の数値が入力されます。 (2)次にA1:J30を選択しDeleteボタンを押すとB1:B30に(1)の時の10倍の数値が入力されます。 A1:J30を選択した場合でも(1)の時と同じ結果を出すにはどうすればよろしいでしょうか? ************************************************ 言葉のとおりに、コードを改良すると以下のようになりました。 一行しか、変えていませんが、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then Dim tRANGE As Range i = 1 If Selection.Count > 1 Then For Each tRANGE In Range(Target.Columns(1).Address) Range("A1").Offset(tRANGE.Row - 1, 1) = i i = i + 1 Next End If End If End Sub ほとんどコードは変わっていませんが、 これだと、a1:a30を削除しても、a1:j30を削除しても b1:b30に、1~30が、入ります。

delilah91
質問者

お礼

tom11さん、ありがとうございます!! Target.Columns(1).Addressという記述もあるんですね。 まさに僕が欲しかった解決方法そのものです。 これはいろいろと応用できそうです。 本当に分かりづらい質問文にも関わらず、 丁寧でシンプルで的確なご回答、本当にありがとうございました!

その他の回答 (1)

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

どういう状況で使う必要があるのか理解できないが Private Sub Worksheet_Change(ByVal Target As Range) MsgBox Selection.Columns.Count If Target.Column = 1 And Selection.Columns.Count = 1 Then MsgBox "A" End If End Sub など参考になりませんか。 A.For Each tRANGE In Target と全セルを繰り回していれば、時間かかる場合があろう。 B.Application.ScreenUpdating = False を入れてみるとか C.セルの削除のDeleteは時間がかかるようです。 ーー A列と加えて他の列を範囲指定してA列の値を変更したとき A列は触らず B列に連番を振る。質問の意味が良くわからないのでこうした。 自信なし。都合の良いように修正してください。根本的に的外れなら 無視してください。 Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "A" Dim tRANGE As Range If Target.Column = 1 And Selection.Columns.Count > 1 Then Application.EnableEvents = False i = 1 u = Target(1).Row MsgBox u h = Selection.Rows.Count MsgBox h d = u + h - 1 MsgBox d For Each tRANGE In Range(Cells(1, "B"), Cells(d, "B")) tRANGE = i i = i + 1 Next Application.EnableEvents = True End If End Sub

delilah91
質問者

お礼

分かりづらい質問文にもかかわらず、早速のご回答を頂き、ありがとうございました。 EnableEventsは知らなかったので大変参考になりました。 ありがとうございます。

関連するQ&A

  • エクセル2003 VBAでセル移動

    いつもお世話になります。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row > 9 Then If Target.Column = 3 Then Cells(Target.Row, 4).Select ElseIf Target.Column > 5 Then Cells(Target.Row + 1, 1).Select End If End If End Sub これで、B列からC列を飛ばしてD列にセル移動して取りあえずの目的は達成しているのですが、 D列からB列には方向キー移動してくれません。Target.Columnが3になるんで当たり前なんですが・・・ B列の入力ミスがあるときマウスで移動させるか、A列まで戻ってから方向キーで上に上がるかです。 何かいい方法ありませんでしょうか。D列から方向キーで戻るときも、出来ればC列を飛ばしてほしいです。 よろしくお願いします。

  • エクセル:Targetが複数の時の処理

    Private Sub Worksheet_Change(ByVal Target As Range)   Dim eiji As String   eiji = Target.Address   eiji = Left(Target.Address, 2)   eiji = Right(eiji, 1)   If eiji = "B" Then     If Target.Text = "" Then       Range("A1").Value = "B-clear"     End If   End If   If eiji = "C" Then     If Target.Text = "" Then       Range("D1").Value = "C-clear"     End If   End If End Sub 上記は、C、B列の値がDeleteキーなどで空欄になった場合に文字を出力するコードです。 最初にTarget.Addressから英字部だけを抜き出し(少々ムリヤリですが)、 それを判断基準に以降の処理をしています。 この時B1:C1のように範囲選択してDeleteキーを押された場合に、 どちらの処理(今回の例だと"B-clear"と"C-clear"の表示)も行いたいのですが、 その場合どのように記述したらよいでしょうか。

  • エクセルVBAについて

    エクセルVBAについて 下にある、1行目に入力された数値の、選択したセルの数値を、B5セルに表示させるマクロなのですが、1行目が結合していると、うまくB5セルに表示できません。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)  If Target.Count > 1 Then Exit Sub    '●複数セル選択は無視  If Target.Row <> 1 Then Exit Sub    '●1行目以外の選択は無視  If Target.Column > 6 Then Exit Sub   '●F列目以降の選択は無視  If Target.Value = "" Then Exit Sub   '●選択セルが未入力なら無視    Range("B5").Value = Target.Value End Sub このマクロで、結合しているセルをB5に表示させることはできますでしょうか? 1行目で選択するセルは、すべて2つのセルが結合しています。 よろしくお願いいたします。

  • VBA 隣の文字列のセルが4桁以下の時

    いつもお世話になります。 WINDOWS7 EXCELL2010 です。 下記のマクロはWクリックでB列に ○ 印ができるマクロです。 この ○ 印はA列にある沢山あるシート一覧で不必要になったシートのみを選択し別のマクロで削除するためです。 A列には別のマクロでシートの一覧を 2桁 3桁 と 4桁の文字列が入り混じっています。 例えば  入力 検索 利用 シート / 0101 1231 1117 (0101~1231) のように。 現在は誤ったシートの削除の防止をするために 条件付書式( =(LEN($A2)>3)*($A2<>"") )でB列に色付けして○印が入力できるセルを示しています。 ただ色付けでは完全には防止できないので下記のマクロの中で何とか処理できないものかと御指導いただけたら幸いです。 御指導願いたいのは、A列が >3文字 の時だけに ○ 印がWクリックして入力したい。 ※下記のマクロの中で、 If Len(Target Range(“A2:A51)) < 4 Then ‘A2~A51の範囲で4文字以下の時はB2~B51には入力できず End If は私が考えたイメージです。 参考 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("A2:A51")) Is Nothing Then 'この範囲がWクリックされた時 Cancel = True Sheets(CStr(Target.Value)).Select ElseIf Not Application.Intersect(Target, Range("B2:B51")) Is Nothing Then 'この範囲がWクリックされた時 Cancel = True Target = IIf(Target = "", "○", "") End If If Len(Target Range(“A2:A51)) < 4 Then ‘A2~A51の範囲で4文字以下の時はB2~B51には入力できず End If End Sub

  • 結合されたセルを列方向に検索したい

    excel2003 結合されたセルを列方向に検索したい Bセルで同じ文字列が入っているセルをダブルクリックすると、順繰りに検索する。 下記が、マクロの内容です。 ------------------------------------------------------------------------- Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) On Err GoTo Myerr: Dim MyRange As Range Dim FirstRow As Integer Application.EnableEvents = False If Target.Column = 2 And Target.Value <> "" Then If Target.Row = Range("B" & Rows.Count).End(xlUp).Row Then FirstRow = 1 Else FirstRow = Target.Row End If With Range("B" & FirstRow & ":B" & Range("B" & Rows.Count).End(xlUp).Row) Set MyRange = .Find(Target.Value, LookIn:=xlValues, After:=ActiveCell) If FirstRow = Target.Row Then Set MyRange = Range("B1:B" & Range("B" & Rows.Count).End(xlUp).Row).Find(Target.Value, LookIn:=xlValues, After:=ActiveCell) MyRange.Select Else MyRange.Select End If End With End If Application.EnableEvents = True Myerr: Application.EnableEvents = True End Sub ------------------------------------------------------------------------- 上記内容で、単独セルであれば動作するのですが、 行方向に結合されている(B1とB2が結合されている)セルをダブルクリックすると 実行時エラー’13’: 型が一致しません。 というエラーが発生します。 上記マクロでどこを修正したらよいのか、教えていただきたく。 B列は、結合されたセル、単独のセルが混在しています。

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

    マクロで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 どなたかご存じの方教えて下さい

  • VBA A1セルが空白になったら隣のセルも空白に

    いつもお世話になります。 WINDOWS7 EXCELL2010 です。 A1セルに文字列で5桁のID番号を入力するとI4のセルに今日の日付が入るようにマクロを作っています。 このときA1セルをキーボードのBacksPaceでID番号を消してエンターキーを押した時にI4セルも空白にしたいと考えて下記のように作りましたが If Range("A1") = “” Range("$I$4") = "0000/00/00" Else Range("$I$4").ClearContents 上の構文が上手くゆかず困り果てました。 どのようにすればいいか御指導願えませんでしょうか。 参考に Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Range("I4").Value = Date If Range("A1") = “” Range("$I$4") = "0000/00/00" Else Range("$I$4").ClearContents End Sub

  • Excelで入力したセルの隣のセルに累計の表示を

    無理難題を押し付けられて困っています。 画像のように、セルB3に入力し、その累計を隣のセルC3に表示させたいのです。 以下、B4~B6も同じです。 同様のことをD⇔E、F⇔G、H⇔I、J⇔K・・・・でも行いたいのです。 ここの質問欄を検索し、以下のVBAを見つけました Const inpColumn = "C" '入力する列名が『A』列の場合 Private Sub Worksheet_Change(ByVal Target As Excel.Range) With Target '単一セルに入力した場合 If .Count = 1 Then '入力する列名に入力した場合 If .Column = Range(inpColumn & "1").Column Then '入力が数値の場合 If IsNumeric(.Value) Then '隣の列『B列』の値に入力した値を加える '(Offsetの2番目の1が1つ右のB列を示す) .Offset(0, 1) = .Offset(0, 1) + .Value End If End If End If End With End Sub これを実行したところ、B⇔Cだけが実行され、他の列では駄目でした。 VBAに無知なもので、どこを直せばよいのか全く分かりません。 また、他の方法があるのかも分かりません。 説明不足かも知れませんが、よろしくお願いいたします。

  • 続・VBAでセルに値が入ったときにイベントを起こしたい

    http://oshiete1.goo.ne.jp/qa4650025.htmlで教えていただきありがとうございました。大変分かりやすい解説でした。 こういうことが出来るんだーとわかりもっと使いやすいように仕様を変えた方がいいと気づき新たに書き込んでみました。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long ' 変更したセルに値が入った場合条件成立 If Trim(Target.Value) <> "" Then ' 行番号が10以上65530以内のとき条件成立 If Target.Row >= 10 And Target.Row <= 65530 Then ' BCD列で、5の倍数の行のとき条件成立 If (Target.Column = 2) And (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 Worksheets("Sheet4").Range("A2:K6").Copy Target.Offset(5, -1) End If ElseIf (Target.Column = 3) And (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 End If ElseIf (Target.Column = 4) And (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 End If Else Exit Sub End If End If End If End Sub ここまでは何とか出来たのですが問題点があります・・・ ・複数セルを選択してDELすると実行時エラー13が出ます。(別の回答にあったやつですが・・・) ・別シートより範囲指定したセルをコピーして張り付けるときも出ます。 ・B列には6桁の整数値しか入らないようにしたいけど整数値限定は可能?・・・その整数値を貼り付ける際日付型へのフォーマットが難しい などあります。ヒントをいただけないでしょうか?

  • 別の列のデータを検索してセルの色を変える

    Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Column <> 1) And (Target.Column <> 5) Then Exit Sub If Not IsNumeric(Target.Value) Then Exit Sub Target.Offset(0, 1).Value = Now() End Sub 上記のスクリプトで 「1列目にナンバーを記入すると2列目に、5列目にナンバーを記入すると6列目に時刻が自動的にセルに入る」ようになっています。 これに追加で 「5列目にナンバーが記入されると、そのナンバーと同じものを1列目から探し出して、1列目のセルの色を薄い青にする。なければなしとアラートを出す」 ように改造したいのですが どうすればいいでしょうか? どうかお願いいたします。

専門家に質問してみよう