- ベストアンサー
エクセルVBAでシート名を指定すると動かない理由は?
- エクセルVBAでシート名を指定すると動かない理由を教えてください。
- Sheets関数を使用してシート名を指定すると動作しない現象が発生します。
- Activesheetでは問題なく動作するのですが、指定したシート名では動きません。なぜでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
VBA、 とりわけ、With と CurrentRegion この2つの使い方を学習しているものと思います。 MINYA3481さんが既に理解している(だろう)とおり、 With Sheets("実験").Range("A1").CurrentRegion End With この2行に挟まれたコード群には、 MINYA3481さんの期待するセル範囲 (Sheets("実験")シートのA1セルから A1セルの次行のセル以下、空白が登場する直前まで) が引き渡されます。 MINYA3481さんはこのセル範囲を処理の対象にしたいものと思います。 この引き渡されるセル範囲を受け取るには .(ドット)で書き始める必要があります。 .(ドット)を省略した場合の挙動は他の方のコメントのとおりです。 都合、 With Sheets("実験").Range("A1").CurrentRegion End With この2行を生かすコードは次のような記述になります。 Sub Test4() With Sheets("実験").Range("A1").CurrentRegion Dim i As Long For i = 1 To .Rows.Count If WorksheetFunction.CountIf(.Range("A:A"), .Cells(i, 1)) > 1 Then .Cells(i, 3) = "重複" End If Next i End With End Sub 'あるいは Sub Test3() With Sheets("実験").Range("A1").CurrentRegion Dim i As Long Dim LastRow As Long LastRow = .Rows.Count For i = 1 To LastRow If WorksheetFunction.CountIf(.Range("A:A"), .Cells(i, 1)) > 1 Then .Cells(i, 3) = "重複" End If Next i End With End Sub
その他の回答 (5)
- unokwave
- ベストアンサー率58% (966/1654)
Rows.CountのRowsも、LastRow = RangeのRangeも、Counifの中のRangeやCellsも、Then CellsのCellsも、上位指定の有無にで動作対象シートが左右されます。 WithでRangeオブジェクトを参照している時は、シート指定の代わりに.Rangeや.Cellsや.Rowsが使えます。 https://docs.microsoft.com/en-us/office/vba/api/excel.range(object)#properties VBA標準オブジェクトで.Parentプロパティがあるオブジェクトは、何かのオブジェクトの子オブジェクトですから、親を省略するとActiveなんとかが対象になります。 但し.Rows.Countを使った場合は、LastRow=の箇所は.Rows.Countを参照するだけで良い筈です。 CurrentRegionの結果の範囲になっていますから。
- kkkkkm
- ベストアンサー率66% (1719/2589)
No3の追記です。 Withで指定しないとなどでシートの指定がない場合 コードの存在する場所でセルの参照が変わります。 シートモジュールの場合はそのコードの存在するシートのセルを 標準モジュールの場合はアクティブなセルを それぞれ指定したことになります。
- kkkkkm
- ベストアンサー率66% (1719/2589)
With Sheets("実験").Range("A1").CurrentRegion を With Sheets("実験") .Range("A1").CurrentRegion にして以下RangeとCellsの前にドット「.」を入れて .Range(略) .Cells(略) にしたら動くのではないでしょうか。
- kon555
- ベストアンサー率51% (1842/3559)
LastRow = Range("A" & Rows.Count).End(xlUp).Row を LastRow = Sheets("実験").Range("A" & Rows.Count).End(xlUp).Row にしましょう。 その他の部分も、セル指定する場合はその前にシート指定が必要です。 シート指定を省略した場合、自動的にアクティブなシートの指定と認識されてしまいます。Activesheetにすると動くのはそのためですね。 複数シートに跨るマクロを書くとよくやるミスです。覚えておきましょう。
- f272
- ベストアンサー率46% (8467/18126)
Range("A" & Rows.Count) Range("A:A") Cells(i, 1) Cells(i, 3) なんていうところでセルあるいはセル範囲を指定したいようだけど,どこのシートか明示的に書いていないので,VBAでは現在のシートのことだと解釈します。
お礼
みなさま、親切丁寧にご回答いただき、本当にありがとうございました!!! 会社を休んでいた間ずっと悩んでいたのに一気に解決!! 感謝でございます。 もっと勉強がんばります。