2008年4月12日土曜日

第89回目 ブック(ファイル)を超えての処理の仕方(本題)

○第89回目 ブック(ファイル)を超えての処理の仕方(本題)
 ※エクセル2007で行なったものです

 今回はファイルを越えてです。
 ファイルの中に入れば、前回の処理で全シートの中身を置き換えていくという処理になります。
 ですから、前回の処理(置換語等の情報を取得したあと)に初めとおわりを付け加えればよいことになります。
 流れを頭の中に入れておきましょう。
 1.置換語等の取得
 2.パス名等の取得
 3.ファイルを閉じる
 4.フォルダ内のエクセルファイルを開く
 5.全シートに対して置換え処理をする
 6.当該ファイルを閉じる
 7.次のファイルを開き、処理を繰り返す。ファイルがない場合は終了。

 2.パス名等の取得
myPath = ActiveWorkbook.Path
 =⇒パス名は、フォルダの名前までが取得されます。
ChDir myPath
=⇒フォルダを指定します。
 ファイルを開く時には、フルパス名で開くことにします。

 3.ファイルを閉じる
ActiveWorkbook.Close SaveChanges:=True
 最初のファイルは閉じておきます、これをしないと二重に開くということが起きるので、その回避が面倒くさいので、閉じることにします。

 4.フォルダ内のエクセルファイルを開く
  フォルダに入っているエクセルのファイル名が必要です
   myFName = Dir(myPath & "\*.xls")
  =⇒これで取得します。myFName にはファイル名が入ります。パス名ではありません。
  (myFName = Dir("*.xls") でいいはずなのですが、フォルダの指定が出来ていないため、デフォルト値のフォルダをさがしにいってしまう)
  まず一つ取得しておいて、あとはdo loopで繰り返します。

Do Until myFName = ""
=⇒フォルダに次のファイルがなくなると、ファイル名はヌルが取得される
myFName = myPath & "\" & myFName
=⇒'フォルダ間でのパス名とファイル名をつけて完全パス名にしています。
Workbooks.Open Filename:=myFName
  =⇒ファイルを開く命令
sh_no = ActiveSheet.Index
=⇒処理が終わったときに開いた時点のシート再現するために取得する。

 5.全シートに対して置換え処理をする=⇒前回参照

 6.当該ファイルを閉じる
Worksheets(sh_no).Select
=⇒開いた時のシートに戻す
ActiveWorkbook.Close SaveChanges:=True
=⇒ファイルを保存する。確認のメッセージは出ません。

 7.次のファイル名を取得し、処理を繰り返す。ファイルがない場合は終了。
myFName = Dir()
  =⇒次のファイル名を取得
     myFName = Dir("")とすると最初からになるので、ぐるぐるまわる。
Loop

 これで終了ですが、終了する前に最初に開いてたファイルを開いて最初の状態を再現するには、最初のファイルのパス名とシート番号を別にもっておいて開きなおしてください。
 完全パス名 ThisWorkbook.FullName

※今回は置換えだったので、シート内の表の形式はまったく関係ありませんでした。
 しかし、ファイル内のシートがまったく同じ形式、かつ、フォルダ内のすべてのファイルも同じということもあります。すると、今回の置換えではないロジックを含んだ複雑な処理が出来ます。そのようなケースで大量処理の場合、夜始動させておいて、朝に出来上がっているという、芸当ができ、時間の節約が可能となります。
 また、マクロ中にフォルダのパス名を記述する方法もあります。すると複数のフォルダの処理が可能となります。
 応用できる事例があると腕のふるいがいがありますね。いちやく一目置かれるかも(保証なし)。

0 件のコメント: