• ベストアンサー

Excelマクロで、ファイルの閉じ方

作成している実行ファイルabc.xlsのマクロについて質問です。 (過去作られたものを修正しているので、私にも説明できないコードはあります) 実行すると、別ファイルSheet1.csvを開き、 Sheet1.csvの4~1024行目を、abc.xlsにコピーし、 Sheet1.csvを閉じる。 といったことをやりたいです。 ※ここまでのソースに、Sheet1.csvを開く、という部分があります。  Sheet1.csvはアクティブになっています。 ※Sheet1.csvファイルには、Sheet1というシートが1つだけあるものとします。 rng1 = "4:1024" rng2 = "4:4" rng3 = "A4" CurName = "abc.xls" sheetname = "Sheet1" ActiveSheet.Rows(rng1).Copy Windows(CurName).Activate Sheets(sheetname).Select   Range(rng2).Select '特に意味は無いと思われる Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Range(rng3).Select '特に意味は無いと思われる Application.CutCopyMode = False Dim ACT As String ACT = sheetname & ".csv" 以上を実行すると、 Sheet1.csvを開き、コピーする所までは正常に実行できます。 抜粋したのでこれだけじゃ意味不明な部分があるかもしれませんが、コピー完了までは正常に動いております。 この後に、Sheet1.csvを閉じるコマンドを入れたいのですが、 検索等して調べたコードではエラーが発生し、閉じることができません。 例えば「新しいマクロを記録する」でExcelに作ってもらったコードだと、  Windows("Sheet1.csv").Activate  ActiveWindow.Close で閉じることができるのですが、 これを記述してもエラーが出ます。 どのように書けばよいのでしょうか。

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

  • ベストアンサー
  • kigoshi
  • ベストアンサー率46% (120/260)
回答No.1

一例ですが、 Dim csvFileCaption ※Sheet1.csvはアクティブになっているところで csvFileCaption = ActiveWindow.Caption とし、閉じたいときに Windows(csvFileCaption).Close (True) とするのではいかがでしょう。

tktk1228
質問者

お礼

回答ありがとうございます。 挙げていただいたコードで、アクティブなファイルは閉じることができました。 が、どうやら私(が修正している)のコードだと、閉じたい方のファイルがアクティブになっている瞬間が無いようで、 (アクティブにせずともファイル操作が可能なのかはわかりませんが) 色々な場所にcsvFileCaption = ActiveWindow.Captionを仕込んで実行してみましたが、 結局目的のファイルは消せませんでした。 また、Dimの宣言は、As以降を書かなくても正常に動くんですね、 知りませんでした。

tktk1228
質問者

補足

すみません、できました。 コピーの直後に入れれば正常に動作し、目的のファイルを閉じることができました。 1行ずつ試したつもりでしたが、勘違いだったようです。 申し訳ありません。 投稿内容の修正方法がわからないので(不可能?)、 こちら「補足」の方に書かせていただきます。

その他の回答 (1)

  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.2

こんにちは。 抜粋されている部分の間に新しくコードを足して下記のようにして下さい。 rng1 = "4:1024" rng2 = "4:4" rng3 = "A4" CurName = "abc.xls" sheetname = "Sheet1" ActiveSheet.Rows(rng1).Copy '#################################################################### Dim csvFile As Workbook Set csvFile = ActiveWorkbook '設定 '#################################################################### Windows(CurName).Activate Sheets(sheetname).Select Range(rng2).Select '特に意味は無いと思われる Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Range(rng3).Select '特に意味は無いと思われる Application.CutCopyMode = False Dim ACT As String ACT = sheetname & ".csv" そして、処理の最後に閉じる部分を足してください。 '#################################################################### csvFile.Close '閉じる '#################################################################### これで如何でしょう?  Windows("Sheet1.csv").Activate  ActiveWindow.Close だと、Sheet1.csvをアクティブにして制御がそちらのBOOKに移っているためにCloseのコードが実行できなくなっているんだと思います。なのでSheet1.csvがアクティブでない状態で閉じる方法でないとうまく行かないように思えます。

tktk1228
質問者

お礼

回答ありがとうございます。 無事閉じることができました。 閉じる時はアクティブにすべきものだと勝手に思い込んでおりました。

関連するQ&A

  • 決められたセル範囲のみ別ファイルに保存するマクロ

    Book内のシートSheet1,Sheet2,Sheet3を別個のCSVファイルSheet1.csv/Sheet2.csv/Sheet3.csvとして保存したいです。 過去ログを参考に以下のコードで正常に動作しました。 For Num = 1 To 3 SheetName = "Sheet" & Num Worksheets(SheetName).Copy ActiveSheet.SaveAs Filename:=myPath & SheetName, FileFormat:=xlCSV, CreateBackup:=False ActiveWorkbook.Close False Next ここで、 決められたセル範囲A1:D5に書かれたデータのみをCSVファイルとして保存する、 といったことをしたいのですが、記述の仕方を教えてください。 その範囲以外が削除されてしまっても構わないので、 その範囲以外をクリアしてから保存を実行、というコードも組んだのですが、 上書き保存されているシートに対して行うとクリアする前の状態のシートをコピーするようで、失敗しました。 Worksheets(SheetName).Copyの部分を、 Sheets(SheetName).Select Range("A1:D5").Copy と変えてみたのですが、マクロを実行したファイルが閉じてしまい、巧く動きません。 ※myPathには保存先フォルダのパスが入ります。 また、保存の際に「同名のファイルがあるが、上書きするか?」のメッセージを出さずに強制的に上書きにする方法はありますか?

  • EXCEL VBA セルからファイル名を読み込む

    EXCEL VBAについての質問です 同じ処理を名前の違う複数のファイルで行いたいと思っています そこで、セルA2へファイル名の『○○.xls』○○部分だけをそれぞれのファイルに書き込んでおき、マクロは共通にしてファイル名をそれぞれのファイルから読み込んで実行したいと思っています。 良い方法を教えてください。 Workbooks("200809.csv").Activate Sheets("200809").Select Range("C3:C33").Copy Windows("○○.xls").Activate'←ここをファイルにあわせて変更できる形にしたい Sheets("報告書").Select Range("G5:G35").Select ActiveSheet.Paste Windows("200809.csv").Activate Range("K3:K33").Copy Windows("○○.xls").Activate’←ここ Sheets("報告書").Select Range("I5:I35").Select ActiveSheet.Paste Workbooks("200809.csv").Close SaveChanges:=False よろしくお願いします。

  • Excel マクロでファイル名を変数に・・・

    初心者です。検索してもわからなかったので質問です。 下記のようなマクロの処理で「AAA」というファイル名のExcelに「2.xls」からデータをコピーし貼り付けています。    ・    ・ Windows("AAA.xls").Activate Rows("4:4").Select Selection.Insert Shift:=xlDown Windows("2.xls").Activate Range("C6").Select Selection.Copy Windows("AAA.xls").Activate Range("A4").Select ActiveSheet.Paste Windows("2.xls").Activate Range("C7").Select Application.CutCopyMode = False Selection.Copy    ・    ・ 今回は「2.xls」ではなく「3.xls」、「4.xls」、・・・といったように違うファイル名で同じ処理を行ないたいので「2」と指定するのではなく「(ファイル名).xls」といった形にしたいのですが、それは可能なのでしょうか。 ご意見宜しくお願いいたします。

  • Excel マクロ : マクロの記録の表記方法の変更

    Excelで質問です。 下記のようなマクロの記録を使用し「顧客一覧」のブックにデータを追加しています。 しかし、処理の中で一項目コピーするごとにファイルを行ったり来たりしているようで処理が遅いようです。何か解決策はあるのでしょうか? ・ ・ ・ Windows("顧客一覧.xls").Activate Rows("4:4").Select Selection.Insert Shift:=xlDown Windows("2.xls").Activate Range("C6").Select Selection.Copy Windows("顧客一覧.xls").Activate Range("A4").Select ActiveSheet.Paste Windows("2.xls").Activate Range("C7").Select Application.CutCopyMode = False Selection.Copy Windows("顧客一覧.xls").Activate Range("B4").Select ActiveSheet.Paste Windows("2.xls").Activate Range("C8").Select Application.CutCopyMode = False Selection.Copy   ・   ・

  • マクロを使って不特定のファイルからコピー&ペーストしたい(エクセル)

    エクセルのデータの必要な列を別のブックに入っているフォーマットにどんどん追加していけるようなマクロを作りたいと思っています。 マクロの自動記録を使ってみたのですが、特定のファイル名が入っているので、使えません。 中を見てみると Windows("A.xls").Activate Columns("b:b").select Selection.copy workbooks.open Filename:="B.xls" Windows("B.xls").Activate Range("D9").select Windows("A.xls").Activate Application.CutCopyMode = False Range("b:b").select Selection.copy Windows("B.xls").Activate Selection.Pastespecial Paste:=xlValues,Operation:=xlNone,SkipBlanks:=False,Transpose:=False . . . となっています。 このファイルAとなっている部分を、どのファイルでも実行できるようにしたいです。 後、ファイルBに貼り付けるときに一番最終行に追加していくにはどのような構文を足せばいいか教えていただきたいです。 初心者で質問の意図が伝わりにくかったらすみません.. よろしくお願いします。

  • excel 2003でCSVファイルを読み込むVBA

    現在CSVファイルを読み込むマクロを作成してますが、レベルが低く下記載のコードで作業を行ってます。 皆様の技術をお借りしたいので、ご教授宜しくお願い致します。 ※現在のコードです。 CommandButton1でフォルダーを開いてcsvファイルを選択し、toolをsheetに追加してます。それから、CommandButton3で追加されたtoolからB14:C14)を選択し最終行までコピーしSheet1の(B12)に数値のみを貼り付けています。 結構手間が係り作業に時間がかかってしまいます。 そこで、改良をしたいと思いますのでご教授お願い致します。 ※改良したいポイント (1)同じフォルダー内のTOOL.CSVをフォルダーを開かず直接commandButton1でSheetに追加する。 (2)Sheet2にコピーされたデーターから(B14:C14)を選択し最終行までコピーしSheet1の(B12)に数値のみを貼り付ける。 (commandButton3はなくしたいと思ってます) 以上です。 宜しくお願い致します。 --------------------------------------------------------- Private Sub CommandButton1_Click() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Myname = ActiveWorkbook.Name CSV_Filename = Application.GetOpenFilename("CSVファイル(*.CSV;*.prn),*.CSV;*.prn", , "CSVファイルを開く") If CSV_Filename = False Then Exit Sub Workbooks.Open CSV_Filename CSV_SheetName = Worksheets(1).Name Sheets(CSV_SheetName).Move after:=Workbooks(Myname).Sheets(Sheets.Count + 1) Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub ---------------------------------------------------------------- Private Sub CommandButton3_Click() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Sheets("(TOOL)").Select Sheets("(TOOL)").Range("B14:C14").Select Sheets("(TOOL)").Range(Selection, Selection.End(xlDown)).Select Selection.copy Sheets("CSV Road").Select Sheets("CSV Road").Range("B12").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub -------------------------------------------------------------

  • エクセルで複数ファイルからコピーをする。

    すみませんが、BOOK1に複数のファイルから部分的にコピーして貼り付けるという作業をしたいのですが、ど素人なもんでわかりません。マクロで記録したモノをいじってみてるのですが、根本的にコードが分かっていなくギブアップです。  やりたいことは、フォルダーの中の970305日報1、970305日報2、970306日報1、970306日報2のようなファイルが山ほどあるのですが、 この970305の日報1と2を開き、それぞれファイルの決まった列を順番にをBook1の行へ行列を入れ替えて貼りつけていき(1日が1行)保存して閉じてから、次の日970306のデータをBOOK1の2行目に貼り付けるということをしたいのですが、どなたか教えていただければ助かります。よろしくお願いします。 Sub Macro2() Dim MyFile As String, MyPath As String Dim wb As Workbook, tb As Workbook Set tb = ThisWorkbook MyPath = tb.Path & "\" MyFile = Dir(MyPath & "*.xls", vbNormal) Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Do While MyFile <> "" If MyFile <> tb.Name Then Set wb = Workbooks.Open(MyPath & MyFile) With ActiveSheet Windows("970305日報1.xls").Activate Range("B34:B38").Select Application.CutCopyMode = False Selection.Copy Windows("日報リスト.xls").Activate Range("C1").Select Selection.PasteSpecial Paste:=xlPasteAll,         Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Windows("970305日報1.xls").Activate Range("C33:C38").Select Application.CutCopyMode = False Selection.Copy Windows("日報リスト.xls").Activate Range("H1").Select Selection.PasteSpecial Paste:=xlPasteAll,       Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Application.CutCopyMode = False ActiveWorkbook.Save Windows("970305日報1.xls").Activate ActiveWindow.Close Windows("970305日報2.xls").Activate Range("B31:B36").Select Selection.Copy Windows("日報リスト.xls").Activate Range("N1").Select Selection.PasteSpecial Paste:=xlPasteAll,   Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Windows("970305日報2.xls").Activate Range("D31:D36").Select Application.CutCopyMode = False Selection.Copy Windows("日報リスト.xls").Activate Range("T1").Select Selection.PasteSpecial Paste:=xlPasteAll,   Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Application.CutCopyMode = False ActiveWorkbook.Save Windows("970305日報2.xls").Activate ActiveWindow.Close Windows("970306日報1.xls").Activate Range("B34:B38").Select Application.CutCopyMode = False Selection.Copy Windows("日報リスト.xls").Activate Range("C2").Select Selection.PasteSpecial Paste:=xlPasteAll,   Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Windows("970306日報1.xls").Activate Range("C33:C38").Select Application.CutCopyMode = False Selection.Copy Windows("日報リスト.xls").Activate Range("H2").Select Selection.PasteSpecial Paste:=xlPasteAll,   Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Application.CutCopyMode = False ActiveWorkbook.Save Windows("970306日報1.xls").Activate ActiveWindow.Close -----------------------------------------

  • マクロ是非ともアドバイスお願いします。

    6月累計ファイル データをコピーして「全社累計」ファイルへ貼り付け ’6月累計ファイル データF32~F109データをコピーして Range("F32:F109").Select Selection.Copy ’全社累計シート管理用E3~E80に貼り付ける。 Windows("全社累計.xls").Activate Sheets("管理用").Select Range("E3:E80").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("E3:E80").Select これを F32→E3 F48→E19 F68→E34 とセルごとに指定し貼付けたいのですが、 どうしたらよいのでしょうか? 前後にコードを入力し実行ができているので できれば、出来る限りこのコードのままで返ることはできないでしょうか? これでは無理・変だと指摘がありましたら宜しくお願い致します。

  • エクセル:シートを保存するマクロ

    あるエクセルファイルFile.xls内に、4つのシートSheet1,Sheet2,Sheet3,Sheet4があるとして、 4つのシートを個別にcsvファイルとして保存するようなマクロを作りたいです。 ▼ソースです  (ここまでのコードで、Pathに保存先のディレクトリ名を取得する部分があるとお考えください)  Filename = "Sheet1" '保存するシート名は、Sheet1~4 GoSub Save1 Filename = "Sheet2" GoSub Save1 Filename = "Sheet3" GoSub Save1 Filename = "Sheet4" GoSub Save1 '保存完了後は、File.xls内Sheet1のCells(4, 1)にカーソルを配置。 Sheets("Sheet1").Select Cells(4, 1).Select Exit Sub Save1: Sheets(Filename).Select fname = Path & "\" & Filename & ".csv" ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlCSV, CreateBackup:=False Return End Sub 以上のソースで実行すると、 指定したディレクトリにsheet1.csv、sheet2.csv、sheet3.csv、sheet4.csvの4ファイルができます。 ここまでは問題ないのですが、 マクロを実行後、Sheet4.csv(最後に保存したファイル)が開かれた状態になってしまいます。 しかも、ファイル名はSheet4.csvなのに、シートSheet1~4を持っている状態です。 普通にSheet4.csvファイルを開くと、シートはSheet4しかありません。 状態が伝わるでしょうか? File.xlsのマクロを実行しているので、実行完了後もFile.xlsを開いておきたいのですが、 どのような記述を加えればよいでしょうか? マクロ(VBA)は使い始めたばかりなので説明されても理解できないかもしれませんが、 できればよろしくお願いいたします。

  • 「コピペ」するExcelマクロで困っています。

     エクセルのマクロの自動作成ツールで、下のようなコピペのマクロを作ってみました。 シートをコピーして貼り付けるところまでは動きますが、その後に用済みの「ABCD.csv」を閉るところで、メッセージ画面が出て止まってしまいます。  良く見てみると、その後に開く「はい」「いいえ」「キャンセル」の選択画面(参考画面)の指示が自動では記入出来ないようで、色々調べてみましたがどうもうまくいきません。 Windows("ABCD.csv").Activate   Range("A1:B10").Select Selection.Copy Windows("DATA.xlsm").Activate   Range("A1").Select ActiveSheet.Paste   Windows("ABCD.csv").Activate ActiveWorkbook.Saved = False ActiveWindow.Close  この画面で、「いいえ」を選択するマクロを、誰か教えてください。 マクロを始めてまだ一週間なのでまったくわからず困っています、よろしくお願いします。

専門家に質問してみよう