• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルマクロでファイルを開いて保存したいです。)

エクセルマクロでファイルを開く・保存する方法

このQ&Aのポイント
  • エクセルマクロを使用して、ファイルを開いて保存する方法を紹介します。
  • 特定のエクセルファイルを開いて、シートにCSVファイルの内容を展開し、保存する手順を説明します。
  • マクロを使用することで、簡単にファイルの操作を自動化することができます。

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

  • ベストアンサー
  • utun01
  • ベストアンサー率40% (110/270)
回答No.1

この要件なら新しくworkbookを作ってそちらで編集した方が簡単ですよ。 また、worksheet、workbookを跨ぐソースを記述する場合は それぞれ使用するオブジェクトを変数に格納しないとバグの元になります。 (SheetsやActiveSheetなど) マクロの記録はあくまで雛形作成用にした方がいいですよ。 それはともかく、 こんな感じでどうでしょうか。 Sub Macro1() Dim fName As String Dim wBook As Excel.Workbook Dim wSheet As Excel.Worksheet Dim buf As String Dim rng As Range Dim i As Integer Dim fLine As Variant Dim fso As Object Dim dPath As String fName = Application.GetOpenFilename( _ FileFilter:="CSVファイル(*.csv),*.csv" _ , FilterIndex:=1 _ , Title:="CSVファイルを選択してください" _ , MultiSelect:=False) Application.ScreenUpdating = False Application.Calculation = xlManual Set fso = CreateObject("Scripting.FileSystemObject") dPath = fso.GetParentFolderName(fName) Application.SheetsInNewWorkbook = 1 Set wBook = Workbooks.Add Set wSheet = wBook.Worksheets(1) wSheet.Name = "集計" Set rng = wSheet.Range("A1") Dim n As Variant n = FreeFile Open fName For Input As #n i = 0 Do Until EOF(n) Line Input #n, buf fLine = Split(buf, ",") rng.Offset(i).Resize(, UBound(fLine) + 1).Value = fLine i = i + 1 Loop Close #n 'ここにメイン処理(集計処理?)を入れてください。 '「rng」がworkbooks("編集").worksheets("集計").range("A1")になっています。 'FileFormatはExcel2007で2003以前に対応したファイルを指定するものです。 '状況に応じて変更してください。 wBook.SaveAs Filename:=dPath & "\売上" & Year(Date) & Month(Date) & Day(Date) & ".xls", _ FileFormat:=XlFileFormat.xlExcel8 wBook.Close Application.Calculation = xlAutomatic Application.ScreenUpdating = True MsgBox "編集終了" End Sub

gx9wx
質問者

お礼

回答と、補足に対する質問にも回答くださいまして ありがとうございました。 また補足をしました。申し訳ありません。 よろしくお願いします。

gx9wx
質問者

補足

どうもありがとうございます。思っていたようにできました。 一つ教えていただきたいのですが 該当CSVファイルをクリックしてエクセルで開いた時と、 この教えていただいたマクロで完成されたエクセルファイルで書式が相違します。 このCSVファイルを直接開いた時には1は1なのですが このマクロで完成保存されたファイルは1が00001と表示で 「数値が文字列として保存されています」 とセルの左上に緑のマークがあります。 該当CSVファイルを直接クリックしてエクセルで開いてもこうなっていません。 編集用のマクロが記述されたエクセル1を開きます。 該当CSVファイルをクリックして新たなエクセル2が開きます。 この新たなエクセル2のシートからデータ部分を全選択でコピーします。 先ほどのエクセル1のシート1にコピーします。 エクセル1に記述されたマクロで編集をします。 この状態でも上記の緑マークの状態のセルはありません  マクロで編集したあとにマクロ込みでエクセル1を名前を変えて保存をし、 CSVファイルを開いたエクセル2は閉じます。 その後その保存したファイルをクリックしエクセルで開いても 緑マークのあるセルはひとつもありません。 これは何が影響しているのでしょうか? よろしくお願いします。

その他の回答 (4)

  • utun01
  • ベストアンサー率40% (110/270)
回答No.5

すいません。 ちょっと忙しくて確認していませんでした。 ActiveSheetはまずいですね。 私のソースでは、特にSelectメソッドでの操作は行っていないので、 しっかりとオブジェクトを特定して指定する必要があります。 最初にも少し触れたと思いますが、ActiveSheetやActiveCell等の曖昧なオブジェクトは極力使用しないほうが良いです。 手軽ではありますが、ちょっとしたことで動作が変わり、バグの元になります。 今回のソースでは、プログラム処理中のExcelの動きを止めているので、その可能性は低くなりますがね。 ActiveSheetは「編集()」に引数としてwSheetを渡し、wSheetのインスタンスをRangeオブジェクトに「編集()」内で格納し、そのオブジェクトをActiveSheetの代わりに使えば良いはずです。 ともあれ、ご解決なさったようでよかったです。

gx9wx
質問者

お礼

ありがとうございました。  Sub 自動編集 ()      ---教えていただいた記述  ---Call 編集() 私の記述  ---教えていただいた記述 で思ったように動いています。 1が00001と表示も直りました。 Callで呼び出す私の記述内で15種類の編集のうち1種類だけ処理されない件 →Function ConvertNumbersをやめてSelect Case Trueで対応  し15種類の編集が可能になりました。 >ActiveSheetは「編集()」に引数としてwSheetを渡し、 >wSheetのインスタンスをRangeオブジェクトに「編集()」内で格納し、 >そのオブジェクトをActiveSheetの代わりに使えば良いはずです。 全然わかりません。申し訳ないです。 どうもありがとうございます。

  • utun01
  • ベストアンサー率40% (110/270)
回答No.4

No.2補足に関する回答です。 おそらくですが、編集のブックではR1C1参照形式のオプションが 設定されているのではないでしょうか。 私のご提示したマクロでは新規ブックにて処理を行っておりますので、 >.Formula = "=ConvertNumbers(RC[-1])" の記述は .FormulaR1C1 = "=ConvertNumbers(RC[-1])" でないと正常に処理されないかもしれません。 正確なマクロ内容が分からないので これで確実とは言えませんが 試して見る価値はあるかと思います。 また、VBAについてですが Excelの参照形式自体に二通りの参照形式があります。 例1:=Sheet1!A1 例2:=Sheet1!RC 前者がいわゆるA1形式、後者がR1C1形式ですね。 R1C1形式は相対座標の参照が簡単にできて便利ですが 使う場合は明確に区別するといいかもしれません。 そういう意味では私の提示した一文も本来 wSheet.UsedRange.Formula = wSheet.UsedRange.Value であるべきですね。 混乱させてしまったら申し訳ありません。

gx9wx
質問者

お礼

With ActiveSheet .Columns(8).Insert With .Range("H1", Cells(Rows.Count, 7).End(xlUp).Offset(, 1)) .Formula = "=ConvertNumbers(RC[-1])" .Value = .Value End With End With ---省略--- End Sub ----------------------------------------------   Function ConvertNumbers(ByVal arg As Variant) As String ---省略--- End Select ConvertNumbers = buf End Function これは同じBOOK内でないと駄目なようです。 新規BOOKを開いてそこにCSVファイルをインポートしているので 処理されないみたいです。 どうもありがとうございました。

gx9wx
質問者

補足

アドバイスありがとうございます。2010年9月28日17:00 .Formula = "=ConvertNumbers(RC[-1])" ↓ .FormulaR1C1 = "=ConvertNumbers(RC[-1])" wSheet.UsedRange.Formula = wSheet.UsedRange.Value ↓ wSheet.UsedRange.Formula = wSheet.UsedRange.Value 試しましたが駄目でした。 編集する為のプロシージャー内で15種類の編集作業を行います。 14種類は編集してくれますがますが以下の部分だけ駄目です。 もしかして  With ActiveSheet が原因でしょうか? Function ConvertNumbersは同じブック内なら呼び出せるみたいです。 今回教えていただいた物は新規ブックで編集を行いますのでFunction ConvertNumbersを 呼び出せないのでしょうか? データーファイルに直接このプロシージャーを登録してF8で動かしていくと .Formula = "=ConvertNumbers(RC[-1])"の次は Function ConvertNumbersからEnd Functionの間でループして データがなくなると .Value = .Value に移動します。 ところが教えていただいた物を同じくF8で動作を見ると BOOK2が開きその中でどんどん編集がされていき With ActiveSheet .Columns(8).Insert With .Range("H1", Cells(Rows.Count, 7).End(xlUp).Offset(, 1)) までキチンと編集しますが問題の .Formula = "=ConvertNumbers(RC[-1])"の次は .Value = .Value に移動してしまいFunction ConvertNumbersには行きません。 よってFunction ConvertNumbersの編集がされないまま 次の編集作業が進み名前を付けて保存までいきます。 Sub 編集() ---省略--- With ActiveSheet .Columns(8).Insert With .Range("H1", Cells(Rows.Count, 7).End(xlUp).Offset(, 1)) .Formula = "=ConvertNumbers(RC[-1])" .Value = .Value End With End With ---省略--- End Sub ----------------------------------------------   Function ConvertNumbers(ByVal arg As Variant) As String ---省略--- End Select ConvertNumbers = buf End Function

  • utun01
  • ベストアンサー率40% (110/270)
回答No.3

すいません 何が影響しているかとかまったく答えていませんでしたね。 このソースではRangeオブジェクトに値を入れる際、 おそらくはCollectionクラスをそのまま放り込んでいます。 Collectionクラスの各要素はVariant型なので、 Excel側でそれが数値なのか文字なのかを判断できません。 結果として、Range.Valueに入るデータ型はStringに統一されている?ようです。 たぶんですがこんな感じですね。 ちなみに今回追加した一行は、 使用している全てのセルのリスト.数値入力用ボックス = 使用している全てのセルのリスト.中身 といった感じです。

gx9wx
質問者

お礼

説明までありがとうございます。 ここでいろいろな方に教わると、 その文章や単語をwebで検索しながら 内容を調べて覚えてます。 だからこの文を使うのか、とかこういう場合にこれを使うのかなど、 参考書やwebでの検索では限界があります。 記述だけ教えてもらい、そのまま貼り付けて完成では 今後に生かす事ができませんので。 このように説明までしていただけると大変助かります。 ありがとうございました。

gx9wx
質問者

補足

アドバイスありがとうございます。2010年9月27日16:12 .FormulaR1C1 = "=ConvertNumbers(RC[-1])" wSheet.UsedRange.Formula = wSheet.UsedRange.Value 駄目でした。 編集する為のプロシージャー内で15種類の編集作業を行います。 14種類は編集してくれますがますが以下の部分だけ駄目です。 もしかして  With ActiveSheet が原因でしょうか? Function ConvertNumbersは同じブック内なら呼び出せるみたいです。 今回教えていただいた物は新規ブックで編集を行いますのでFunction ConvertNumbersを 呼び出せないのでしょうか? データーファイルに直接このプロシージャーを登録してF8で動かしていくと .Formula = "=ConvertNumbers(RC[-1])"の次は Function ConvertNumbersからEnd Functionの間でループして データがなくなると .Value = .Value に移動します。 ところが教えていただいた物を同じくF8で動作を見ると BOOK2が開きその中でどんどん編集がされていき With ActiveSheet .Columns(8).Insert With .Range("H1", Cells(Rows.Count, 7).End(xlUp).Offset(, 1)) までキチンと編集しますが問題の .Formula = "=ConvertNumbers(RC[-1])"の次は .Value = .Value に移動してしまいFunction ConvertNumbersには行きません。 よってFunction ConvertNumbersの編集がされないまま 次の編集作業が進み名前を付けて保存までいきます。 Sub 編集() ---省略--- With ActiveSheet .Columns(8).Insert With .Range("H1", Cells(Rows.Count, 7).End(xlUp).Offset(, 1)) .Formula = "=ConvertNumbers(RC[-1])" .Value = .Value End With End With ---省略--- End Sub ----------------------------------------------   Function ConvertNumbers(ByVal arg As Variant) As String ---省略--- End Select ConvertNumbers = buf End Function

  • utun01
  • ベストアンサー率40% (110/270)
回答No.2

No.1です。 ・ ・ ・ Close #n '********以下の一行を追加する********* wSheet.UsedRange.FormulaR1C1 = wSheet.UsedRange.Value 'ここにメイン処理(集計処理?)を入れてください。 '「rng」がworkbooks("編集").worksheets("集計").range("A1")になっています。 ・ ・ ・ 前回ご提示したソースにこの1行を加えればいけると思います。 もしもできなければ、集計処理の途中でまた文字列になっている可能性があるので 集計処理が終わった後にこの1行を移動させてみてください。

gx9wx
質問者

お礼

ありがとうございます。 1行加えたら、補足した内容(手動で行った時の状態) になって保存されていました。

gx9wx
質問者

補足

wSheet.UsedRange.FormulaR1C1 = wSheet.UsedRange.Value でうまくできました。 手動でやった時と同じ状態で保存されています。 ありがとうございます。 ただ、 >'ここにメイン処理(集計処理?)を入れてください。 ここにCall 編集 と入れて、Sub 編集()を呼び出すようにしました。 このSub 編集()ではかなりの編集をしています。 ですがこの中の一部の編集だけができません。 このSub 編集()を単独で起動時には問題がありません。 Sub 編集()の中には Sub 編集() ----省略---- .Formula = "=ConvertNumbers(RC[-1])" .Value = .Value ----省略---- End Sub Function ConvertNumbers ---省略---- End Function   が含まれています。編集できないのはこの部分です。 Callがいけないのでしょうか? Function ConvertNumbersがいけないのでしょうか?

関連するQ&A