エクセルVBAの別sheetの空白行削除について

このQ&Aのポイント
  • エクセルVBAで複数のシートの情報を1つにまとめる方法について質問があります。
  • シート1とシート2の情報をシート3にコピーし、シート1とシート2の内容が変更されるたびに自動的にマクロを実行する方法を知りたいです。
  • 現在固まってしまうエラーが発生しており、空白行を削除する部分の書き方に問題があるかもしれません。
回答を見る
  • ベストアンサー

エクセルVBAの別sheetの空白行削除について

エクセルVBAでBOOK1のsheet1とsheet2とsheet3があり、 sheet1とsheet2の全ての情報をsheet3にコピーしてまとめるようにしました。 マクロを実行するには、Visual Basicを開いてF5を押しています。 それをsheet1かsheet2の中身の一部分でも変更すると そのときに自動的にマクロが実行されるようにしたいです。 sheet1とsheet2(sheet3は空白のまま)に Private Sub Worksheet_Change(ByVal Target As Range) Call マクロ() End Sub を入れ、 次に、標準モジュールに Sub マクロ() '下記よりsheet1とsheet2の内容をsheet3にコピーする Worksheets("sheet1").Range("C1:BE50").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C1:BE50") Worksheets("sheet2").Range("C1:BE100").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C51:BE150") '下記より上記sheet3の状態から余分な空白行を削除する Dim UsedCell As Range Dim Max_Row, RowCount As Integer Set UsedCell = ActiveSheet.UsedRange Max_Row = UsedCell.Cells(UsedCell.Count).Row Application.ScreenUpdating = False For RowCount = Max_Row To 1 Step -1 If Application.WorksheetFunction.CountA(Rows(RowCount)) = 0 Then Rows(RowCount).Delete End If Next Application.ScreenUpdating = True End Sub をやって、sheet1かsheet2のセルを変更すると エクセルが固まってしまいます。 デバックでは Rows(RowCount).Delete がよくないようです。 書き方が間違っているのでしょうか?

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

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

同じ事を何度も言うのは全く気が引けるのですが,このままではマルで先に進みません。 具体的な確認のポイントは,既に沢山の行数を費やしてご説明済みですが,まるっきりスルーされてしまいました。 「ダメでした」じゃ,いったい何をどう確認してどこがどうダメだったのか,全然情報がありませんので説明のとっかかりもありません。 再掲: 「正しく動く」姿を理解するため,まず次の通りに手を動かしてください。 1.まっさらのブックを一つ用意する 2.「シートあ」と「シートい」「シートう」のシートモジュールにマクロを登録する 3.標準モジュールを追加しマクロを登録する 4.シートあ,い,うに何かサンプルでデータ(数字や文字)を記入する 5.データを記入した行が,空白行を省いて「実行シート」に自動でコピーされる様子を確認する。 特に手順の4および5が確認できていないと推測されます。 あなたの実際のエクセルが,上述で動作確認したサンプルと何がどうちがうのかよく観察し,必要に応じて必要な箇所を(シートの内容を?マクロの記述を?適切に)修正してください。 次に。 あなたが試した「動かないエクセル」で「シートあ」のシートモジュールのマクロを次の通りに変更します Private Sub worksheet_change(ByVal Target As Excel.Range) stop Call macro1 End Sub 「シートあ」に何か文字か数字を記入します 特にこの手順を行っていない可能性が推測されます VBE画面でStop命令が自動で黄色反転したら,F8キーを連打してマクロを「ステップ実行」します 正しくmacro1に自動で実行が移り,さらに一行ずつ進行していくか確認します 以上の手順もちゃんと実行したのかどうなのか,さっぱり不明です。

その他の回答 (2)

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

>マクロを実行しても何も起きません。 >マクロは有効にしてあります。 動かない原因はさまざま考えつくので,今の乏しいご説明だけで「それならこれが原因だからこうしましょう」と特定する事はできません。 ●シート1,シート2の具体的な姿について説明されていないのが原因かもしれません ●「マクロを実行する」方法が間違っているのかもしれません ●そもそもマクロを登録するところから何か判りませんが問題を起こしているのかも?しれません   「正しく動く」姿を理解するため,まず次の通りに手を動かしてください。 1.まっさらのブックを一つ用意する 2.Sheet1とSheet2のシートモジュールに先に回答したマクロを登録する 3.標準モジュールを追加し先に回答したマクロを登録する 4.シート1,シート2に何かサンプルでデータ(数字や文字)を記入する 5.データを記入した行が,空白行を省いてシート3に自動でコピーされる様子を確認する。 あなたの実際のエクセルが,上述で動作確認したサンプルと何がどうちがうのかよく観察し,必要に応じて必要な箇所を(シートの内容を?マクロの記述を?適切に)修正してください。 次に。 あなたが試した「動かないエクセル」でシート1のシートモジュールのマクロを次の通りに変更します Private Sub worksheet_change(ByVal Target As Excel.Range) stop Call macro1 End Sub シート1に何か文字か数字を記入します VBE画面でStop命令が自動で黄色反転したら,F8キーを連打してマクロを「ステップ実行」します 正しくmacro1に自動で実行が移り,さらに一行ずつ進行していくか確認します #こういう動作確認を「デバッグ」と言います。 漫然とマクロを実行して「うごいたーとまったー」と一喜一憂するのではなく,いま動かしているマクロが一行ずつ正しく進行しているか,意図しない結果に終わったときはどこで道を間違えているのか,ご自分の手を動かして確認を必ず実行してください。 正しくmacro1が実行され終了し,なおかつ「意図した結果」が起こらないときは,シート1,2の具体的な姿や「実際の使い方」がご質問で正しく情報提供できていないのが原因です。 シート1や2で「具体的に何をしたとき」「どの行はコピーされる必要があり」「どの行はコピーされて欲しくない」のか,その具体的な理由と判断基準を「具体的なエクセルの姿によって」説明してください。その情報を使い,正しいマクロをイチから作り直す必要があります。

tekkenman7
質問者

補足

詳しくアドバイスして頂き、ありがとうございます。 いろいろ試してみましたが、やはりダメでした。 ↓その作業画面を画像にして、アップロードしました。 http://blog-imgs-17.fc2.com/s/k/s/sksfiosjdijf34/newfile_sample.html

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

間違いのその1: 今のマクロは,changeイベントが走った時点でのactivesheetに対して諸々処理をするマクロになってしまっています。少なくともそうじゃなく,Sheet3に対して削除なりをするように直す必要がありますね。 付随しての間違いのその2: 上述の結果,シート1/2の空行を削除してしまっています。するとそのアクションがまたchangeイベントをトリガします。結果してchangeイベントから「マクロ」マクロの呼び出しが多重で発生し,場合によってはスタックオーバーフローで停止します。 で。こんなカンジですかね。 シート1とシート2のシートモジュールに: private sub worksheet_change(byval Target as excel.range) call macro1 end sub 標準モジュールに: sub macro1() with worksheets("Sheet3")  .cells.clearcontents  on error resume next  worksheets("Sheet1").range("C1:BE50").specialcells(xlcelltypeconstants).entirerow.copy _   destination:=.range("A1")  worksheets("Sheet2").range("C1:BE100").specialcells(xlcelltypeconstants).entirerow.copy _   destination:=.range("A" & .usedrange.rows.count + 1) end with end sub

tekkenman7
質問者

補足

ありがとうございます。 sheet1とsheet2の全ての情報をsheet3にコピーしてまとめ、 sheet1とsheet2の間にある空白行を削除する件ですが、 アドバイスをいただいたコードをそのままコピペしましたが マクロを実行しても何も起きません。 マクロは有効にしてあります。 コピペしたコードの貼付場所はMicrosoft Excel Objectsのsheet1とsheet2に Private Sub worksheet_change(ByVal Target As Excel.Range) Call macro1 End Sub といれ、 標準モジュールのModule1に Sub macro1() With Worksheets("Sheet3") .Cells.ClearContents On Error Resume Next Worksheets("Sheet1").Range("C1:BE50").SpecialCells(xlCellTypeConstants).EntireRow.Copy _ Destination:=.Range("A1") Worksheets("Sheet2").Range("C1:BE100").SpecialCells(xlCellTypeConstants).EntireRow.Copy _ Destination:=.Range("A" & .UsedRange.Rows.Count + 1) End With End Sub を入れました。原因は何でしょうか・・・

関連するQ&A

  • エクセルVBAでエラー、Changeの使い方が×?

    エクセルVBAでBOOK1のsheet1とsheet2とsheet3があり、 sheet1とsheet2の全ての情報をsheet3にコピーしてまとめるようにしました。 マクロを実行するには、Visual Basicを開いてF5を押しています。 それをsheet1かsheet2の中身の一部分でも変更すると そのときに自動的にマクロが実行されるようにしたいです。 sheet1とsheet2とsheet3に Private Sub Worksheet_Change(ByVal Target As Range) Call マクロ() End Sub を入れ、 標準モジュールに Sub マクロ() Workbooks("BOOK.xlsm").Worksheets("sheet1").Range("C1:BE50").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C1:BE50") Workbooks("BOOK.xlsm").Worksheets("sheet2").Range("C1:BE100").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C51:BE150") Dim UsedCell As Range Dim Max_Row, RowCount As Integer Set UsedCell = ActiveSheet.UsedRange Max_Row = UsedCell.Cells(UsedCell.Count).Row Application.ScreenUpdating = False For RowCount = Max_Row To 1 Step -1 If Application.WorksheetFunction.CountA(Rows(RowCount)) = 0 Then Rows(RowCount).Delete End If Next Application.ScreenUpdating = True End Sub をやって、sheet1かsheet2のセルを変更すると エクセルが固まってしまいます。 デバックでは最初の Workbooks("BOOK.xlsm").Worksheets("sheet1").Range("C1:BE50").Copy _ Destination:=Workbooks("BOOK.xlsm").Worksheets("sheet3").Range("C1:BE50") がよくないようです。 書き方が間違っているのでしょうか?

  • エクセルVBAで、シートに条件を付けて処理させたい

    エクセルVBAで 『コピー用』シートと『あああ』シートと『いいい』シートと『ううう』シートがあり、 『あああ』シートと『いいい』シートと『ううう』シートの全ての情報を 『コピー用』シートにコピーしてまとめるようにしました。 マクロを処理するには、 『あああ』シートと『いいい』シートと『ううう』シートに設置したボタンを押すと処理する。 ここまでは実現することができました。 私がやりたいことは、 シートの内容を変更したのに、そのボタンを押し忘れてしまい、 そのまま『コピー用』シートを使用してしまうことを避けるために、 【「あああ」シートか「いいい」シートか「ううう」シートが変更されている】 かつ 【マクロを処理させるボタンを押していない】 この場合に、「コピー用」シートをアクティブにしたときに マクロ処理をするかしないかを選択させるダイアログを表示させる。 シートが変更されていない または マクロを処理させるボタンを押した後にシートを変更していない この場合は、「コピー用」シートをアクティブにしたときに マクロ処理をするかしないかを選択させるダイアログは表示させない。 といった処理を可能にしたいです。 詳しくは↓のサンプルページを参考にして下さい。 http://blog-imgs-17.fc2.com/s/k/s/sksfiosjdijf34/sampledesu.htm ボタンを押して全シートをコピーする処理のコードは↓のような感じで作りました。 ダイアログの処理は調べて作ってみましたが、ちゃんと動作しませんでした。 Microsoft Excel Objectsのsheet1(sheet2とsheet3とsheet4は空白)に Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim keizoku As Integer keizoku = MsgBox("内容が変更されていますが、「あああ」シートか「いいい」シートか「ううう」シートのマクロ処理開始のボタンをまだ押していないためマクロ処理がされていません。処理しますか?", vbYesNo) Select Case keizoku Case vbYes Application.EnableEvents = False Call macro1 Application.EnableEvents = True Case vbNo myMsg = "" Case Else myMsg = "" End Select End Sub を入れ、 次に、標準モジュールのModule1に Sub macro1() Worksheets("あああ").Range("B2:AD51").Copy _ Destination:=Worksheets("コピー用").Range("B1:AD50") Worksheets("いいい").Range("B2:AD51").Copy _ Destination:=Worksheets("コピー用").Range("B51:AD100") Worksheets("ううう").Range("B2:AD101").Copy _ Destination:=Worksheets("コピー用").Range("B101:AD200") Application.ScreenUpdating = False For RowCount = 400 To 1 Step -1 If Application.WorksheetFunction.CountA(Worksheets("コピー用").Rows(RowCount)) = 0 Then Worksheets("コピー用").Rows(RowCount).Delete End If Next Application.ScreenUpdating = True Application.OnKey "a" End Sub を入れました。 詳しくは↓のサンプルページを参考にして下さい。 http://blog-imgs-17.fc2.com/s/k/s/sksfiosjdijf34/sampledesu.htm アドバイスをお願いいたします。

  • VBAで空白行を削除する

    VBAでリストの空白行を削除するための適当なコードを探しているのですがどんぴしゃのものが中々見つかりません。ご教授下さい。 ブックBのシートBのリストにはA2~AN●まで値が入っています。 別のブックAからVBAで値を取り出し貼り付けています。 いくつかの方法を試しました。 (1)ブックを開いたときに空白行を削除 Sub Auto_Open() '空白行を削除 Dim lRow As Long Dim i As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = lRow To 2 Step -1 If Cells(i, 1).Value = "" Then Range(i & ":" & i).Delete End If Next i Application.ScreenUpdating = True End Sub 5分以上砂時計のままで結局終わりません。 強制終了させ再度ブックを開くと空白行は削除されているのですが、こんな動作では使うことができません。 (2)ブックAの値を貼り付けた後、空白行を削除し上書き保存する Sub エクスポート() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Range(Cells(5, 7), Cells(79, 46)).Select Selection.Copy 'コピー Workbooks.Open Filename:="\\パス\ブックB.xlsm" '貼り付け先ファイルオープン Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '貼り付け Dim lRow As Long Dim i As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = lRow To 2 Step -1 If Cells(i, 1).Value = "" Then Range(i & ":" & i).Delete End If Next i Application.ScreenUpdating = True  '空白行を削除 ActiveWorkbook.Save '上書き保存 Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub (3)空白行を削除の部分は以下のコードも試しました Worksheets("SheetB").Range("A1").Select Set currentCell = Worksheets("sheetB").Range("A1") Do While Not IsEmpty(currentCell) Set nextCell = currentCell.Offset(1, 0) If Not IsEmpty(currentCell) Then 'カレントセルが空白でなく、 If IsEmpty(nextCell) Then '次のセルが空白のとき nextCell.EntireRow.Delete End If End If Set currentCell = currentCell.Offset(1, 0) Loop '空白行削除 宜しくお願い致します。

  • VBA シート指定とファイル名入力

    部署ごとに分割し、ブックで保存するコードです。 sheet名は「部署」です。 Sub macro1() Dim w As Worksheet Dim n As Long Dim r As Long Dim s As String Dim WSH As Variant Dim myPath As String Set w = ActiveSheet n = Worksheets.Count Application.ScreenUpdating = False On Error GoTo errhandle For r = 5 To w.Range("B65536").End(xlUp).Row s = w.Cells(r, "B") w.Rows(r).Copy Worksheets(s).Range("B65536").End(xlUp).Offset(1, -1) Next r On Error GoTo 0 Set WSH = CreateObject("Wscript.Shell") myPath = ActiveWorkbook.Path & "\1\" For r = Worksheets.Count To n + 1 Step -1 Worksheets(Worksheets.Count).Copy ActiveSheet.Columns.AutoFit ActiveWorkbook.SaveAs Filename:=myPath & ActiveSheet.Name ActiveWorkbook.Close False Application.DisplayAlerts = False Worksheets(Worksheets.Count).Delete Application.DisplayAlerts = True Next r w.Select Exit Sub errhandle: Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = s w.Rows(1).Copy Range("A1") w.Rows(2).Copy Range("A2") w.Rows(3).Copy Range("A3") w.Rows(4).Copy Range("A4") Resume Application.ScreenUpdating = True End Sub (1)sheet1にマクロ実行ボタンを配置し、部署seedにマクロ実行命令をする。 (2)sheet1のB2セルにファイル名を入力して、そのファイルに保存する。(例部署ファイル) (1)Dim w As Worksheets("部署")と変更したのですが、エラーが出ました。 (2)myPath = ActiveWorkbook.Path & "\部署ファイル\"   ↑ これをsheet1のB2セルから指定できるようにしたいです。 宜しくお願いします。

  • Excelの1シートを項目別に別シートへ分割

    左図のようなシートがあります。C列(部署番号)の左3桁をキーにデータとシートを分け、右図のようにシート名もその左3桁の名前にしたいと考えています。(部署番号)をキーにする場合は以下の通りとなると思うのですが Sub test1() Dim n As String Dim c, L As Long Dim ws1 As Worksheet On Error GoTo ErrorHandler Set ws1 = Sheets("Sheet1") L = ws1.Range("C65536").End(xlUp).Row For i = 2 To L n = ws1.Range("C" & i) '部門名抽出 c = Sheets(n).Range("C65536").End(xlUp).Row '部門のシートの最終行位置 ws1.Rows(i).Copy Destination:=Sheets(n).Rows(c + 1) Next i Exit Sub ErrorHandler: '部門のシートが無い時の処理 Worksheets.Add.Move after:=Worksheets(Worksheets.Count) '最後のシートの後へ追加 Worksheets(Worksheets.Count).Name = n '部門の名前をシートの名前にする ws1.Rows(1).Copy Destination:=Sheets(n).Rows(1) '1行目の項目名をコピー Resume End Sub (部署番号)の左3桁をキーにした時のコーディングがどうしても分かりません。このようなことが出来ますでしょうか。因みに元データとなる"sheet1"はそのまま残します。どうかご教授の程宜しくお願い致します。

  • Excel VBA 複数のSheet の合計

    Excel VBA  超超 初心者です。見よう見まねで、複数のSheet の L11:Q1000 ,T1:AW100 セル範囲にある文字 "~" を計算できたのですが、 更に各Sheet で計算された合計をしたいのですが、さっぱり判りません。Sheet 名は、バラバラです。合計は、最初か最後のsheet のどこかのセルに表示させたいです。どなたかヒントをてください。よろしくお願いします。 Sub すべてのシートでマクロ実行() Application.ScreenUpdating = False Dim シート As Worksheet For Each シート In Worksheets シート.Select Range("H3").Select ActiveCell.FormulaR1C1 = "=COUNTIF(R[8]C[4]:R[997]C[9],""*~*"")" Range("I3").Select ActiveCell.FormulaR1C1 = "=COUNTIF(R[-2]C[11]:R[997]C[40],""*~*"")" Range("I4").Select Next Application.ScreenUpdating = True End Sub

  • VBA 選択したセルが空白であったらシートを削除

    こんばんは!いつもお世話になっています。 選択したシート1のセル(C9)が空白であったら、選択したシートを削除するマクロ(VBA)を作りましたが、上手く作動しなくて困っています。 どうしたらよいのかよろしくお願い致します。 'シート1のセルC9を選択し、空白か判断する Sub セルの選択()   Worksheets("Sheet1").Activate   Range("C9").Select  If Len(Application.Trim(ActiveCell)) = 0 Then   MsgBox("空白セル")  End If End Sub '現在アクティブなシートを削除する Sub DeleteWorksheet() Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub

  • VBAで空白行を削除する。

    初めまして、VBA初心やです。なので具体的にご教授願います。環境WindoesXP SP3 EXCEL2010です。やりたい事Book1に空白行が沢山あるSheetが一枚あります。Sheetの中身は下記の通りです。 一行目に項目があります。n行目にも項目があります。nは、10個です。項目の下の行には、デターがあります。以下のようになっております。初めの位置はB2です。    B2    項目A 項目B 項目C 項目D・・・・・    項番1 データ1 データ2 データ3 データ4・・・・・・    項番2 データ1 データ2 データ3 データ4・・・・・・    項番3 データ1 空白  データ3 データ4・・・・・・    項番4 データ1 データ2  空白 データ4・・・・・・    項番5 データ1 データ2  空白 空白・・・・・・    項番6 データ1 データ2  空白 空白・・・・・・ 項番7 データ1 データ2  空白 空白・・・・・・ 項番8 空白   空白   空白 空白・・・・・・ ・    ・ ・     ・   ・     Bn    項目A 項目B 項目C 項目D・・・・・ 項番1 データ1 データ2 データ3 データ4・・・・・・ と続きます。この項番1は残して、項番8の様な空白セルが続く行だけ削除したいので、 以下のマクロを組みました。 Dim ii As Long Dim MaxRow(1 To 100) As Long Dim MaxCol As Long '============================ MaxRow(1) = Cells(Rows.Count, 2).End(xlUp).Row MaxRow(2) = Cells(Rows.Count, 21).End(xlUp).Row MaxRow(3) = Cells(Rows.Count, 22).End(xlUp).Row MaxRow(4) = Cells(Rows.Count, 23).End(xlUp).Row MaxCol = Range("IV4").End(xlToLeft).Column Application.ScreenUpdating = False '============================ For i = MaxRow(1) To 3 Step -1 '配列にした。 '============================ For j = 1 To MaxCol Step 1 '============================ If Cells(4, j).Value = "" Then GoTo Label22 'Else GoTo Label11 Label22: Range(4 & ":" & MaxCol).Delete Label11: Next j 'End If Next i Application.ScreenUpdating = True MsgBox "マクロが終了しました" End Sub しかし、ソートしてMaxRowの配列のいくつになるかを計算する処が判りません。 なので、空白行を削除できません。 ようするに、各項目(行)の空白セルがまちまちで(凹凸があり)、全ての項目が空白である処を探す事が出来ません。 何卒宜しくご教授願います。

  • エクセル:シートを切り替えずに別シート上の操作をする

    タイトルが正しいかどうか疑問ですが。 シート[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 よろしくお願いします。

  • エクセルVBAで非アクティブブックのRow取得

    非アクティブシートの最終行のRowを取得するマクロが xls形式のファイルだと動いていたのですが、xlsm形式に変更後、エラーになってしまいました。 これは仕様の変更によるものなのでしょうか? Activeteせずに対処する方法があれば教えて頂きたいです。 Sub ボタン1_Click() Dim 最終行 As Long 最終行 = Workbooks("1.xls").Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row MsgBox 最終行 End Sub

専門家に質問してみよう