【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言

初心者で済みませんが
下記のマクロの意味を行ごとに教えてください。
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
以上です

A 回答 (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
    • good
    • 1

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の各ワークシートについて)
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/15 16:15

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の行に戻ります。

つまりマクロを実行したワークブックの各シートを新規のワークブックとしてシート名で保存しています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/15 16:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報