|
ども。返事が遅くなってすいません。
>Set ステートメントを用いることで,名前付き仮保管
んー・・分からないでもないのですが、その解釈は少し正確さに欠けます。
"仮"というなら、ブックやシートを新規作成したとき Excelが勝手に付けている
名前。それだけが正しく"仮の名"と言えます。保存は仮にもしていません。
で、Setステートメントを用いて何をするかと言うと「生成したオブジェクトの
インスタンスを変数に格納」しているのです。つまり、あとあと扱いやすいように
変数に入れているだけです。
もし変数に入れないコードにするなら、Workbooks.Add の直後から「一切、他の
ブックをアクティブにせず」ActiveWorkbook を、その新規ブックを参照する
ものとして使います。そーすると ActiveWorkbook.Close した時点で自動的に
ThisWorkbook がアクティブになるはずです。実際にそーいうコードもよく組み
ますが、参考書の例文などは圧倒的に変数へ格納するやり方が多いので、私も
そうしてみたというわけです。
それはさておき、肝心のマクロ全体(横道にそれますが、Sub〜End Sub までを
本来"プロシージャ"と呼び、それらをひとまとめにして意味のある一連の処理
をさせるものを"マクロ"と呼びます。それがMicrosoft社の定義ですが、今は
単一のプロシージャで処理が完結する場合、それもマクロと呼んでます。)
は、プロシージャの呼び出しが入れ子になっていて、たいへん見通しが悪い、
と感じます。できればMainPgmからの呼び出しは、最後の計算処理部分だけに
すると良いと思います。で、コピー元ブックは実際には
>OpenTextによって開いたブックがデータ元
なら、当然シートは1枚のみですよね ? テキストファイルをエクセルで開いても
複数シートになることは絶対ありません。だから新規ブックにコピーするにしても
そこから他のブックへデータをコピーするにしても「シートをループする」こと
自体があり得ない処理となります。なので
>Workbooks.OpenText Filename:="sample.txt",
としたら
MyB.Worksheets(1).Range("A1:A50").Value =
ActiveWorkbook.Worksheets(1).Range("A1:A50").Value
と、一回だけコピーして終わりになるはずです。そしてコピー元がシート1枚なら
新規ブックもシート1枚でいいので、SheetsInNewWorkbook でシート数を取得
したり設定するコードや変数は不要になり、
Set MyB = Workbooks.Add(xlWBATWorksheet)
とするだけで"ワークシート1枚のみを含む"ブックが作成されますから、
Worksheets(1) にコピーするコードを続けます。
いずれにせよ、どのような理由があるか知りませんが、やたらといろんなブック
を開いたり作ったりするのは、混乱の元でもあるしメモリーの消費量も多くなって
不安定になるので、そのへんの整理から考えた方がいいと思いますけどね・・。
|
|