• 締切済み

エクセル マクロのこの意味教えて

初心者で済みませんが 下記のマクロの意味を行ごとに教えてください。 Dim bk As Workbook Set bk = ActiveWorkbook Dim st As Worksheet For Each st In bk.Sheets Workbooks.Add st.Copy Before:=ActiveWorkbook.Sheets(1) ActiveWorkbook.SaveAs path & st.Name & ".xls" ActiveWorkbook.Close Next 以上です

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 余計な波風を立てるつもりではありませんが、ちょっとつまらないアドバイスをさせてください。 そのマクロ自体は、おそらくは、記録マクロによるものを加工したのではないかと思います。手順さえ分かれば、とはいうものの、個々の意味よりも、ちゃんとした論理(ロジック)で覚えたほうがよいです。そうすれば、記録マクロでも作れるわけです。 このコードのミソは、   今開いているブックは、ActiveWorkbook   新規ブックを開くと、それも、また、ActiveWorkbook という二点ですね。だから、同じ名前なのに別のものになり、ややこしくなります。 書いた人には失礼かもしれませんが、少し雑です。 問題のあるとすると、Dim st As Worksheet ここで、ワークシートを宣言しておいて、その後で、bk.Sheets と、シートを拾っているのですから、厳密に言えば、整合性がありませんから、「データ型が違う」というエラーが出る可能性があります。 path & st.Name & ".xls" それと、この path というのは何だろうということです。もし、間違えた代入をすれば、保存しても、どこかに消えてしまいます。なお、デフォルトの場合は、拡張子は、xls になります。 また、同じ名前があったときに、上書きするかどうかの問題も解決されていませんね。 同じ名前があると、ダイアログが出て、「いいえ」にすると、エラーで終了します。 私なりに考えたコードです。 'Option Explicit Sub Test1() Dim acBk As Workbook Dim sh As Worksheet Dim orgPath As String orgPath = ThisWorkbook.Path 'マクロのあるブックのパス Set acBk = ActiveWorkbook ChDir acBk.Path '現行のブックのパスに変更 Application.ScreenUpdating = False '画面のちらつきを抑える Application.DisplayAlerts = False '上書きするかどうか聞いてこない For Each sh In acBk.Worksheets 'ワークシートを指定する     sh.Copy '目的オブジェクトがないと、ブックは新規ブックになる     ActiveWorkbook.SaveAs sh.Name     ActiveWorkbook.Close False Next Application.DisplayAlerts = True Application.ScreenUpdating = True Set acBk = Nothing 'オブジェクトの解放 ChDir orgPath 'パスを戻す End Sub

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

Dim bk As Workbook 'bkをWorkbookと宣言 Set bk = ActiveWorkbook 'bkは現在のActiveなWorkbook Dim st As Worksheet 'stをWorksheetと宣言 For Each st In bk.Sheets 'bkの各ワークシートについて Workbooks.Add '新たにWorkbooksを作成する st.Copy Before:=ActiveWorkbook.Sheets(1) 'bkのワークシートをActiveなWorkbookの先頭シートの前にコピー ActiveWorkbook.SaveAs Path & st.Name & ".xls" 'ActiveWorkbookをシート名で保存 ActiveWorkbook.Close 'ActiveWorkbookを閉じる Next '繰り返し(bkの各ワークシートについて)

K-19
質問者

お礼

有難うございます。教えてもらったのですが どんな意味なのかわからなかったのです。 詳しく説明を入れていただき感謝しております。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

Dim bk As Workbook 'bkをワークブックの配列名に指定 Set bk = ActiveWorkbook '今開いてるワークブックをbkに置き換え Dim st As Worksheet 'stをワークシートの配列名に指定 For Each st In bk.Sheets 'bk内の各ワークシートを読み出し Workbooks.Add '新規ワークブックの作成 st.Copy Before:=ActiveWorkbook.Sheets(1) '読み込んだシートをコピー ActiveWorkbook.SaveAs path & st.Name & ".xls" 'シート名で名前を付けて保存 ActiveWorkbook.Close '保存した新規ワークブックを閉じる Next 'シートを全て読み込むまでFor Eachの行に戻ります。 つまりマクロを実行したワークブックの各シートを新規のワークブックとしてシート名で保存しています。

K-19
質問者

お礼

有難うございます。教えてもらったのですが どんな意味なのかわからなかったのです。 詳しく説明を入れていただき感謝しております。