Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


37118 / 76738 ←次へ | 前へ→

【44794】Re:新規ブックの処理について
発言  Kein  - 06/12/1(金) 15:38 -

引用なし
パスワード
   ども。返事が遅くなってすいません。
>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) にコピーするコードを続けます。
いずれにせよ、どのような理由があるか知りませんが、やたらといろんなブック
を開いたり作ったりするのは、混乱の元でもあるしメモリーの消費量も多くなって
不安定になるので、そのへんの整理から考えた方がいいと思いますけどね・・。

0 hits

【44727】新規ブックの処理について tomo 06/11/30(木) 11:19 質問
【44728】Re:新規ブックの処理について Jaka 06/11/30(木) 13:41 発言
【44751】Re:新規ブックの処理について tomo 06/11/30(木) 17:12 お礼
【44739】Re:新規ブックの処理について Kein 06/11/30(木) 15:45 回答
【44757】Re:新規ブックの処理について tomo 06/11/30(木) 18:38 質問
【44794】Re:新規ブックの処理について Kein 06/12/1(金) 15:38 発言
【44801】Re:新規ブックの処理について tomo 06/12/1(金) 16:58 お礼

37118 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free