• ベストアンサー

VBA Excel処理の追加を2点教えてください

Office2003(SP3) 以下は、昔、教えてもらったExcel VBAスクリプトで、よく使わせて もらってます。「C:\mybooks\」にあるxlsファイル(a001.xls、a002.xls、 a003.xls・・・・)を片っ端から開き、 1つのBookに束ねる動作をします。 これだけでも大変便利なのですが、もう少し改善いたしたく。 (1) 束ねられたBookのSheet名が、Sheet1、Sheet1 (2)、Sheet1 (3)、 Sheet1 (4)・・・ になってしまいます。そこで、ファイル名から拡張子を落 とした文字列をSheet名にセットする記述をご教示下さい。 (2) a001.xls、a002.xls、a003.xls・・・は、それぞれSheet1、Sheet2、 Sheet3を含みます。Sheet1だけが抜き取られてSheet2、Sheet3が残された大量 の残骸Bookが開きっぱなしになります。これら、保存せずに閉じる記述を追加 したいのですが。 よろしくお願い致します。 Sub OpenFiles() Dim i As Integer Dim wb As Workbook Dim fname Dim dirname As String ' i = 1 dirname = "C:\mybooks\" fname = Dir(dirname + "*.htm") If fname <> "" Then Do While fname <> "" If fname <> "." And fname <> ".." Then If i = 1 Then ' 最初のファイルを開く Workbooks.OpenText FileName:=dirname + fname Set wb = ActiveWorkbook ' 最初のファイルを新規ブックに複製して閉じる。 ActiveSheet.Copy wb.Close Set wb = ActiveWorkbook Else ' 2番目以降のファイルは複製した最初のファイルに追加 Workbooks.OpenText FileName:=dirname + fname ActiveSheet.Move After:=wb.Worksheets(wb.Worksheets.Count) End If i = i + 1 End If fname = Dir Loop Else MsgBox "検索条件を満たすファイルはありません。" End If Set wb = Nothing End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

こんな感じでいいのでは Sub GetSheets()   Dim sName As String, sDir As String, n As Integer   Dim wb As Workbook, w As Workbook   Dim ws As Worksheet   Dim bflag As Boolean   sDir = "c:\mybooks\"   sName = Dir(sDir & "a*.htm")   ' 画面の更新の抑止   Application.ScreenUpdating = False   While sName <> ""     ' 取得ファイル名のブックを開く     Application.OpenText FileName:= sDir & sName     Set w = ActiveWorkbook     Set ws = w.Sheets("Sheet1")     ' Sheet1の名前を変更     ws.Name = Replace(sName, ".xls", "")     If wb Is Nothing Then       ' まとめるためのブックを追加       Set wb = Workbooks.Add       bflag = True     End If     ' 対象シートをコピー     ws.Copy after:=wb.Worksheets(wb.Worksheets.Count)     ' アラートの抑止     Application.DisplayAlerts = False     If bflag Then       ' 新規ブックの Sheet1,Sheet2,Sheet3を削除       For n = wb.Worksheets.Count To 1 Step -1         If Left$(wb.Worksheets(n).Name, 5) = "Sheet" Then           wb.Worksheets(n).Delete         End If       Next     End If     ' 開いたブックを閉じる     w.Close     ' アラートの抑止の解除     Application.DisplayAlerts = True     Set ws = Nothing     Set w = Nothing     sName = Dir   Wend   ' 画面更新の抑止を解除   Application.ScreenUpdating = True End Sub # 字下げには全角スペースを使用しています

litton101
質問者

お礼

redfox63さん、御礼が大変遅くなったことをまずはお詫び申し上げます。 別の作業に追われており、ようやく本件に取り掛かることができました。 さて詳細なコードまでご提示いただき、大変ありがとうございました。 実行してみると、 ' 取得ファイル名のブックを開く Application.OpenText FileName:= sDir & sName ここで以下のエラーで止まってしまうようです。 「実行時エラー '438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。」 「Application.OpenText FileName」をGoogleで調べてみましたが、 本質問にしかHITしないようで、、、 当方、Excel2003ですが、「Application.OpenText」はExcel2007など新しい バージョンでの記述なのでしょうか? まことに厚かましいですが、もし原因が簡単にわかるようでしたら ご教示いただけますと幸いです。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

Application.OpenText は間違えですね Workbooks.OpenTextです 投稿する際にコメントなどを追加したときに何かを間違えたのだと思います 大変失礼しました m(__)m

litton101
質問者

お礼

redfox63さん、フォローありがとうございました。 ばっちり動きました、大変作業がはかどります、ありがとうございます。

  • Sinogi
  • ベストアンサー率27% (72/260)
回答No.1

まずは希望動作のマクロ記録をとりましょう。 シート名の変更に関するコード ファイルを閉じるコードがすぐにわかるので現コードでループしているうちのどこに入れたらいいか考えましょう。 手作業でする順番を考えればすぐにわかりますよ

litton101
質問者

お礼

御礼遅くなってすみません。 アドバイスありがとうございました。 記録をとってみたのですが ファイルを閉じると記録したものも全て吹っ飛んでしまい、 そこで挫折しかけていました、、、 地道に研究してみます。ありがとうございます。

関連するQ&A