タイトルが正しいかどうか疑問ですが。
シート[Sheet1]にて値を入力したアドレス(の行番号と列番号)を取得し、
その周囲のセルの罫線の色を赤(3)から灰色(15)に置換するコードを作っています。
Sheet1のコードには、
Private Sub Worksheet_Change(ByVal Target As Range)
AAA Target
End Sub
とだけ書き、入力があったらプロシージャAAAへTargetを持って飛びます。
Sub AAA(ByVal Target As Range)
Dim M_Row As Integer
Dim M_Clm As Integer
Dim Y As Range
M_Row = Target.Row
M_Clm = Target.Column
For Each Y In Worksheets("Sheet1").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5))
With Y
If .Borders(xlEdgeTop).ColorIndex = 3 Then .Borders(xlEdgeTop).ColorIndex = 15
If .Borders(xlEdgeLeft).ColorIndex = 3 Then .Borders(xlEdgeLeft).ColorIndex = 15
If .Borders(xlEdgeBottom).ColorIndex = 3 Then .Borders(xlEdgeBottom).ColorIndex = 15
End With
Next
End Sub
ここまでは正常に動きます。
この後に、アクティブでないシート[Sheet2]の同じセル範囲にある罫線の色も同じように置換したいので、
上記コードに続けて、以下のように書きました。
Sub AAA(ByVal Target As Range)
Dim M_Row As Integer
Dim M_Clm As Integer
Dim Y As Range
M_Row = Target.Row
M_Clm = Target.Column
For Each Y In Worksheets("Sheet1").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5))
With Y
If .Borders(xlEdgeTop).ColorIndex = 3 Then .Borders(xlEdgeTop).ColorIndex = 15
If .Borders(xlEdgeLeft).ColorIndex = 3 Then .Borders(xlEdgeLeft).ColorIndex = 15
If .Borders(xlEdgeBottom).ColorIndex = 3 Then .Borders(xlEdgeBottom).ColorIndex = 15
End With
Next
For Each Y In Worksheets("Sheet2").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5))
With Y
If .Borders(xlEdgeTop).ColorIndex = 3 Then .Borders(xlEdgeTop).ColorIndex = 15
If .Borders(xlEdgeLeft).ColorIndex = 3 Then .Borders(xlEdgeLeft).ColorIndex = 15
If .Borders(xlEdgeBottom).ColorIndex = 3 Then .Borders(xlEdgeBottom).ColorIndex = 15
End With
Next
End Sub
これだと、
For Each Y In Worksheets("Sheet2").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5))
の部分で失敗します。
この1行前に、
Sheets("Sheet2").Select
と入れてやると正常に動作するのですが、
シートを切り替えずにやりたいと思っています。
可能でしょうか?
以下のように、
実行後にSheet1に戻し、
それらを
Application.ScreenUpdating = False
Application.ScreenUpdating = True
で挟むことで、見た目はシートを切り替えずに実行できるのですが、
実際にこのコードを組み込んでいるシートはシート上にあるデータが多いためか(600行×100列程度)、
全く同じコードを実行しても一瞬画面がチラついてしまいます。
(新規Bookで同じコードを組み込んで、何行かに罫線を引いただけのシートだと全くチラつかなかったので、
シート上のデータが多いせいじゃないかと思いました)
Sub AAA(ByVal Target As Range)
Dim M_Row As Integer
Dim M_Clm As Integer
Dim Y As Range
M_Row = Target.Row
M_Clm = Target.Column
For Each Y In Worksheets("Sheet1").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5))
With Y
If .Borders(xlEdgeTop).ColorIndex = 3 Then .Borders(xlEdgeTop).ColorIndex = 15
If .Borders(xlEdgeLeft).ColorIndex = 3 Then .Borders(xlEdgeLeft).ColorIndex = 15
If .Borders(xlEdgeBottom).ColorIndex = 3 Then .Borders(xlEdgeBottom).ColorIndex = 15
End With
Next
Application.ScreenUpdating = False
Sheets("Sheet2").Select
For Each Y In Worksheets("Sheet2").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5))
With Y
If .Borders(xlEdgeTop).ColorIndex = 3 Then .Borders(xlEdgeTop).ColorIndex = 15
If .Borders(xlEdgeLeft).ColorIndex = 3 Then .Borders(xlEdgeLeft).ColorIndex = 15
If .Borders(xlEdgeBottom).ColorIndex = 3 Then .Borders(xlEdgeBottom).ColorIndex = 15
End With
Next
Sheets("Sheet1").Select
Application.ScreenUpdating = True
End Sub
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
> For Each Y In Worksheets("Sheet2").Range(Cells(M_Row - 2, M_Clm), Cells(M_Row + 1, M_Clm + 5))
のRangeはSheet2を参照しているのに、CellsはこのままではActiveSheetすなわちSheet1を参照することになるので、当然オブジェクト定義エラーになる。
ここは、長くなるが、
For Each Y In Worksheets("Sheet2").Range(Worksheets("Sheet2").Cells(M_Row - 2, M_Clm), Worksheets("Sheet2").Cells(M_Row + 1, M_Clm + 5))
としなければならない。
with
を使え。
回答ありがとうございます。
With Worksheets("Sheet2")
End With
で挟んで望んだような動作となり、解決しました。
Cellsの説明で「Objectの指定を省略したときにはアクティブシー
トが対象となります。」という文も発見しました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Worksheet_Change 4 2023/03/12 21:54
- Visual Basic(VBA) VBA 罫線について B列3行目から21行毎にデータがはいります。 データがはいったらデータが入った 6 2022/11/15 17:22
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VBA】PDF出力に任意のファイ...
-
エクセルのシートごとに連番を...
-
エクセルで設定していないのに...
-
複数のEXCELシートの印刷順の指定
-
既存ワークシートにピボットテ...
-
エクセルでページごとにヘッダ...
-
Excelマクロ パスワードを入力...
-
エクセルで、ハイパーリンクの...
-
excel串刺し計算で合計値が表示...
-
PowerPointの表内のカンマ
-
Wordの差し込み印刷で空白行が...
-
EXCELでタイトル行と一番下の行...
-
エクセルの計算式でコンマを付...
-
名簿の漢字名を関数で半角カナ...
-
LINEのこの空白ってどんな意味...
-
エクセルでleft関数の結果が表...
-
エクセルでオートサムを使った...
-
エクセルでセル内改行の1行目...
-
Excelのテーブル上のセルの保護...
-
エクセルで囲み線で出来ますか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VBA】PDF出力に任意のファイ...
-
エクセルでページごとにヘッダ...
-
エクセルのシートごとに連番を...
-
エクセルで設定していないのに...
-
エクセルで、ハイパーリンクの...
-
Excelマクロ パスワードを入力...
-
エクセルのイベントVBAを複数の...
-
エクセルで個人成績グラフをつ...
-
社内SEです。機種、ライセンス...
-
Access2010 Excelのエクスポー...
-
【VBA】#N/Aを無視して串刺し...
-
Excel 一覧表から特定の数値を...
-
excel串刺し計算で合計値が表示...
-
複数のEXCELシートの印刷順の指定
-
[EXCEL] あるフィールドをキー...
-
この記号、手短(テミジカ)に日本語...
-
既存ワークシートにピボットテ...
-
EXCELで3つのシートのデータを...
-
エクセル VBAでシートのコピー...
-
ロータスについての質問。
おすすめ情報