[[20070620214818]] 『シート名指定しないでマクロをつくる』(ほと) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『シート名指定しないでマクロをつくる』(ほと)

1週間ごとにファイルになっていてシートの名前が日付になっています。
その6つのシートに同じマクロで作業したいのですが、
1つのシート分のマクロは作りました。
シート名が固定じゃないのでこのあとどうやればいいのかわかりません。
どなたかアドバイスをお願いします。


 ブックにその6個のシートしかないなら

 Sub test()
    Dim SH As Worksheet

    For Each SH In ThisWorkbook.Worksheets

       '作ったマクロ
    Next
 End Sub

 で、回したらいかがでしょうか?
      (SHIOJII)


 これでもいいかな?
 (SHIOJII)
 Sub test()
   Dim sh As String

     For Each sh In Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet5")
         With Sheets(sh)

          '作ったマクロ

         End With
     Next

 End Sub


SHIOJIIさんありがとうございます。

はじめの方でやらせていただきましたが
シート1つ目で終わってしまいます。

回すの意味がちょっとわからないのですが、そのままでは使えないのでしょか?

あとその次のほうは

For Each sh のところのshで

「コンパイルエラー
 For Each に指定する変数はバリアント型またはオブジェクト型でなければなりません」

と出てしまいます。

OSがXPでoffice2000なのですが、お手数ですがよろしくお願いします。


 失礼しました。後のほうは、

   Dim sh As Variant

 ですね。

 はじめのほうも、
  With SH

    End With
 で、はさんでますか?

 後は、どのようなマクロを組んでいるかわからないので・・・
    (SHIOJII)


 マクロを標準モジュールに書いて(作って)あって、そのコードに
 特定のシートの指定がなければ、処理は、選択されている
シートが対象になって処理されますから、シート毎に作るということ
はありませんよ。
 くまでも、マクロは1個ですよ。(標準モジュールに)


何度もすみません。

はじめのほうは

Sub test()

    Dim sh As Worksheet

    For Each sh In ThisWorkbook.Worksheets

       Range("B10:I10").Select
    Application.CutCopyMode = False
    Selection.AutoFilter
    Selection.AutoFilter Field:=1, Criteria1:="0"
    Selection.AutoFilter Field:=2, Criteria1:="0"
    Selection.AutoFilter Field:=3, Criteria1:="0"
    Selection.AutoFilter Field:=4, Criteria1:="0"
    Selection.AutoFilter Field:=5, Criteria1:="0"
    Selection.AutoFilter Field:=6, Criteria1:="0"
    Selection.AutoFilter Field:=7, Criteria1:="0"
    Selection.AutoFilter Field:=8, Criteria1:="0"
    Rows("11:45").Select
    Selection.Delete Shift:=xlUp
    Selection.AutoFilter
    Range("A1").Select

    Next
 End Sub

とやっています。どこにwith SH と End With 入れればいいかわかりません。

後の方は With Sheets(sh) のところで
「実行時エラー9:インデックスが有効範囲にありません」
と出てしまいます。(ほと)

Sub test()

     Dim sh As Variant

     For Each sh In Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet5")
         With Sheets(sh)

       Range("B10:I10").Select
    Application.CutCopyMode = False
    Selection.AutoFilter
    Selection.AutoFilter Field:=1, Criteria1:="0"
    Selection.AutoFilter Field:=2, Criteria1:="0"
    Selection.AutoFilter Field:=3, Criteria1:="0"
    Selection.AutoFilter Field:=4, Criteria1:="0"
    Selection.AutoFilter Field:=5, Criteria1:="0"
    Selection.AutoFilter Field:=6, Criteria1:="0"
    Selection.AutoFilter Field:=7, Criteria1:="0"
    Selection.AutoFilter Field:=8, Criteria1:="0"
    Rows("11:45").Select
    Selection.Delete Shift:=xlUp
    Selection.AutoFilter
    Range("A1").Select

         End With
     Next

 End Sub


(ほと)です。

説明が悪かったようですみません。
選択されているシートだけでマクロを実行するのではなく
シート名が固定ではない(毎週かわるので)シート全部に同じ作業をさせるマクロを作りたいのですが

なんとかできないものでしょうか


 >シート名が固定ではない(毎週かわるので)シート全部に同じ作業をさせるマクロを作りたいのです

 なら、とりあえずこれで動くと思います。
 もう寝ますので、後は明日か、別の先生が・・・
   (SHIOJII)

 Sub test() 

    Dim sh As Worksheet

    For Each sh In ThisWorkbook.Worksheets
  
  with SH 

       .Range("B10:I10").Select
    Application.CutCopyMode = False
    Selection.AutoFilter
    Selection.AutoFilter Field:=1, Criteria1:="0"
    Selection.AutoFilter Field:=2, Criteria1:="0"
    Selection.AutoFilter Field:=3, Criteria1:="0"
    Selection.AutoFilter Field:=4, Criteria1:="0"
    Selection.AutoFilter Field:=5, Criteria1:="0"
    Selection.AutoFilter Field:=6, Criteria1:="0"
    Selection.AutoFilter Field:=7, Criteria1:="0"
    Selection.AutoFilter Field:=8, Criteria1:="0"
    .Rows("11:45").Select
    Selection.Delete Shift:=xlUp
    Selection.AutoFilter

  End With

    Next
 End Sub


  >シート名が固定ではない(毎週かわるので)シート全部に同じ作業をさせる

 そういうことであればヒントが数点あります。
 ヒント1
    シート数を固定しないで,マクロ実行中にマクロで確認して最後の
    シートまで,自動で処理させます。
         n=worksheets.count   でシート数が数えれます。

ヒント2

     シート名に固有の名前を使わないでworksheets(i)  のように
        変数で表記して,左から何番目のシートかで,区別する。
              i=1,2,3・・・・ と数値を変化させれば
            シートは自由自在に指定できます。

ヒント3

      i=1 to  n   で繰返して,各ワークシートで処理させ,最後まで
         繰返す。

           (標準モジュールに)


 Selectはやめましょう。
 SH をSelect していないから、最初のシートで全て実行されているのです。

 With SH
      With .Range("B10:I10")
           .AutoFilter ....
           .Autofilter ....
           .
           .
           .

      End With
      .Rows("11:45").Delete
      .AutoFilterMode = False
 End With
 (seiya)


seiyaさんのご指摘で以下のように直してみたら
大丈夫みたいです。
他のやり方も時間のあるとき少し研究したいと思います。
皆さん本当にどうもありがとうございました。

Sub test()

    Dim sh As Worksheet

    For Each sh In ThisWorkbook.Worksheets

With sh

      With .Range("B10:I10")

Application.CutCopyMode = False

    .AutoFilter
    .AutoFilter Field:=1, Criteria1:="0"
    .AutoFilter Field:=2, Criteria1:="0"
    .AutoFilter Field:=3, Criteria1:="0"
    .AutoFilter Field:=4, Criteria1:="0"
    .AutoFilter Field:=5, Criteria1:="0"
    .AutoFilter Field:=6, Criteria1:="0"
    .AutoFilter Field:=7, Criteria1:="0"
    .AutoFilter Field:=8, Criteria1:="0"

   End With
      .Rows("11:600").Delete
      .AutoFilterMode = False
 End With

    Next
 End Sub

(ほと)


 ほとさんのやり方だと、

 With sh
     .Select  '<- この一行挿入

 だけでよいでしょう。
 (seiya)

VBA超初心者です。
私も同じようにブックの全てのシートに対して処理をしたかったのですが、
開いているシートにしか実行されなくて、とても困っていました。

With sh

     .Select  '<- この一行挿入

でうまくいきました。意味は分からないですが、魔法の言葉のように感じられました。
どうもありがとうございました。


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.