答えてねっとは、
マイクロソフトが運営する
パソコンに関する
Q&Aサイトです。

 

質問

グループ化したシートを編集するExcelマクロ。

製品名:Office製品/Excel/2003

現象:知りたい/プログラミング

懸賞ポイントが設定されています。 300

この質問は解決で締め切られています

一つのブック内に複数のシートがあって、その中から何かしらの条件にあったシート名を選択してグループ化(?)するコードとして以下のコードを利用しています。
以下は、シート名が ) で終わるシートを選択しています。

Sub シート選択()
  flg = False
    For i = 1 To Sheets.Count
        shtmei = Sheets(i).Name
        If Right(shtmei, 1) = ")" Then
            If flg = False Then
                Sheets(i).Select
                flg = True
            Else
                Sheets(i).Select Replace:=False
            End If
        End If
    Next
End Sub

このコードで選択された(作業グループになった)シートを対象に編集すると、できることとできないことが出てしまっています。

シート全体の数式をコピーして値貼り付け、選択されたシートごとコピーや印刷等はできるのですが、
どうも「特定のセル範囲を対象にした動作」(例:セルの塗りつぶし、列幅をAutoFit、特定列を削除する等)は、その時アクティブになってるシートにだけにしか反映されません。

Sheets(Array("Sheet1 (2)", "Sheet2 (2)", "Sheet3 (2)")).Select のように書けば、そう言った動作もできましたが、
できれば先のコードを生かして、シート名で都度判断して作業グループにする方法を使いたいと思っています。

このようなケースでの方法が何かありましたら、是非ご教示くださいますようよろしくお願い致します。

質問者からのコメント

  • 投稿日時:2007/02/27 10:52

マクロ記録したコードに手を加えて使っていたので、「シートをグループ化して編集」の視点から離れることができていませんでした。
グループ化して編集するのではなく、対象シートごとに同じ動作をループするほうが自然な流れなのですね。
今までそういう意識が無かったので、目からウロコが落ちた思いです。大変勉強になりました。

今後は、お二人共通のアドバイス「Selectしないコード」を意識して作っていきたいです。
どうもありがとうございました。

回答1 (この回答は質問に対する回答です)

  • 投稿ID:A2007067658
  • 投稿日時:2007/02/26 20:49
  • 最も役に立った投稿として評価されました

作業グループにして「)」のついているシートのA1に塗りつぶしを設定したいとすると。

Sub macro()
Dim A() As String
Dim I As Integer
Dim J As Integer
For I = 1 To Sheets.Count
 If Right(Sheets(I).Name, 1) = ")" Then
  ReDim Preserve A(J) As String
  A(J) = Sheets(I).Name
  J = J + 1
 End If
Next I
Sheets(A).Select
Range("A1").Select
Selection.Interior.ColorIndex = 6
End Sub


となりますが、なぜいちいちSelectをして実行しようと考えるのでしょうか?
Selectは非常に無駄な動作です。マクロ記録ではSelectしないとできない操作も、VBAではほとんどの操作はSelectやActiveにしなくても実行出来ます。Selectしないプログラムを組む練習をしたほうがいいと思いますよ。

Sub macro()
Dim I As Integer
For I = 1 To Sheets.Count
If Right(Sheets(I).Name, 1) = ")" Then
 Sheets(I).Range("A1").Interior.ColorIndex = 6
 Sheets(I).Rows(1).AutoFit
 Sheets(I).Columns(3).Delete
End If
Next I
End Sub

  •  

回答2 (この回答は質問に対する回答です)

  • 投稿ID:A2007067701
  • 投稿日時:2007/02/26 21:35

コレクションと For Each構文を組み合わせ、
Select使わないで処理する方法が自然でお勧めの気がします。

Sub sample()
  Dim mySheets As New Collection
  Dim sh As Worksheet
  mySheets.Add Sheets("Sheet1") '任意条件でシート追加
  mySheets.Add Sheets("Sheet3")
  For Each sh In mySheets   ' 任意の処理
    sh.Range("a1").Interior.ColorIndex = 3
  Next sh
End Sub

  •  

答えてねっと

昨日の利用状況


総投稿数 431 件

回答総数 337 件

登録者数 27 人

利用登録ユーザ 1510 人

ゲスト 243581 人

ページビュー 427949

登録済みFAQ 20 件

景品応募サイト

Windows ヘルプと使い方

マイクロソフトドリームスパーク