エクセルワークブックの数だけ処理を繰り返したいです

このQ&Aのポイント
  • 元のフォルダにある.xlsxの数だけ連番にしたファイル名で保存し、同じファイル名になったら連番にしたいです。
  • 各.xlsxをワークブックのワークシート1のA1のファイル名にし、.csvに変換する方法を教えてください。
  • 質問は、エクセルワークブックの数だけ処理を繰り返す方法についてです。元のフォルダにある.xlsxの数だけ連番にしたファイル名で保存し、同じファイル名になったら連番にしたいです。また、各.xlsxをワークブックのワークシート1のA1のファイル名にし、.csvに変換する方法を教えてください。
回答を見る
  • ベストアンサー

エクセルワークブックの数だけ処理を繰り返したいです

excel vba(マクロ)についての質問です。 元のフォルダには、複数の.xlsxのワークブックがあります。この各ワークブックのワークシート1のA1に”〇月見積書”と記載があり、これらを元のフォルダと同じフォルダに各ワークブックのワークシート1のA1に記載があるファイル名にし、かつ、csvにして保存し、同じファイル名になったら、連番にしたいです。 例えば、"11月見積書(1)"の様に。そして、元の.xlsxの数だけ連番にしたいです。 元のフォルダにある.xlsxをカウントしてその分だけ繰り返せばいいと思うのですが、連番が永遠と繰り返されてしまい、出来ません。 各.xlsxをワークブックのワークシート1のA1に記載があるファイル名にし、そして、この.xlsxの分だけ.csvに変換するには、どうすればいいでしょうか? dim f as string dam i as long dim tem as string tem = thisworkbook.sheets(1).range("A1") & "¥" f = dir(tem) if f ="" then f= tem else do while f<>"" i = i+1 f= dir(tem& "(" & i &")" & ".csv") loop f =tem & "(" & i &")" & ".csv" end if activeworkbook.save as filename:=tem & "(" & i &")" & ".csv" お手数ですが、宜しくお願い致します。

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

  • ベストアンサー
  • SI299792
  • ベストアンサー率48% (712/1469)
回答No.5

返事が遅れてすみません。 こちらでは正しく動いているので、原因は解りません。 上げておくのでダウンロードして動かしてみて下さい。 https://1drv.ms/u/s!AnfEM367OeSdiG3oN79IlJuaR1ZZ?e=TjwTUu 考えれる可能性としては、1番左のシートのA1が空白になっている等ありませんか。 それでも解らない場合、 データ便 https://www.datadeliver.net/1 OneDrive https://www.microsoft.com/ja-jp/microsoft-365/free-office-online-for-the-web 等に上げていただければ見てみます。

tamanoyama
質問者

お礼

ご連絡が遅くなり、失礼しました。 ありがとうございます!お蔭様で、動きました!どうやら、大本のxlsxが読み取り専用になっていたのが原因でした。 ありがとうございました!

その他の回答 (4)

  • SI299792
  • ベストアンサー率48% (712/1469)
回答No.4

いえ、こちらこそ質問を読み返しても、どこにも全シートと書いてありませんでした。私の読み間違いです。 多分原因は他シートを処理しようとしてA1が空白だったので異常動作したと思われます。 (原因が思い当たらずしばらく放置していました) 1番左だけを処理対象にしました。やってみて下さい。 Option Explicit ' Sub Macro1()   Dim Sheet As Worksheet   Dim FileName As String   Dim Count As String '   FileName = Dir(ThisWorkbook.Path & "\*.xlsx")   Application.ScreenUpdating = False '   Do While FileName > ""     Workbooks.Open ThisWorkbook.Path & "\" & FileName, False, True     Sheets(1).Select     Count = 0     On Error Resume Next '     Do While Err = 0       FileName = ThisWorkbook.Path & "\" & _         Replace([A1] & "(" & Count & ")", "(0)", "") & ".csv"       Open FileName For Input As #1 '       If Err <> 0 And Err <> 53 Then         Error Err       End If       Close       Count = Count + 1     Loop     On Error GoTo 0     ActiveWorkbook.SaveAs FileName, FileFormat:=xlCSV     ActiveWorkbook.Close False     FileName = Dir   Loop   End End Sub

tamanoyama
質問者

補足

新たにご教示いただきまして、ありがとうございます。 ただ、すいません。いただいたプログラムを走らせると、「実行時エラー1004 ファイルにアクセスできませんでした。」と出てしまい、エラーになってしまいます。 activeworkbook.save as 〜が該当の様です。 この箇所を、activeworkbook.savbas filename:=として保存すると、エラーは出てこないのですが、代わりに、名前の重複処理が出来なくなります。(名前が重複するファイルあるけど、保存する?というメッセージが出ます。) お手数ですが、他の方法をご教示いただげせんでしょうか? 申し訳ありませんが、宜しくお願い致しますm(_ _)m

  • SI299792
  • ベストアンサー率48% (712/1469)
回答No.3

>ワークシート1のA1に というのを見落としていました。 という事は、ワークシート1のA1だけ入っていて、他シートは入っていないのでしょうか。 全てのシートが対象だと思っていたのですが、1番左だけでいいのですか?

tamanoyama
質問者

補足

言葉足らずで失礼しました。 はい、仰る通り、ワークシート1のA1だけで大丈夫です。

  • SI299792
  • ベストアンサー率48% (712/1469)
回答No.2

フォルダは、このワークブックを保存したフォルダと同じフォルダにしました。 Option Explicit ' Sub Macro1()   Dim Sheet As Worksheet   Dim FileName As String   Dim Count As String '   FileName = Dir(ThisWorkbook.Path & "\*.xlsx")   Application.ScreenUpdating = False '   Do While FileName > ""     Workbooks.Open ThisWorkbook.Path & "\" & FileName, False, True '     For Each Sheet In Worksheets       Sheet.Select       Count = 0       On Error Resume Next '       Do While Err = 0         FileName = ThisWorkbook.Path & "\" & _           Replace([A1] & "(" & Count & ")", "(0)", "") & ".csv"         Open FileName For Input As #1         Close         Count = Count + 1       Loop       ActiveWorkbook.SaveAs FileName, FileFormat:=xlCSV     Next Sheet     ActiveWorkbook.Close False     FileName = Dir   Loop End Sub

tamanoyama
質問者

補足

ご意見いただき、ありがとうございます。 ただ、すいません。ご教示いただきましたプログラムを走らせたのですが、何も起きずに醜虜してしまいます。 〉Open FileName For Input As #1 で動作が止まってしまうみたいたのです。 大変申し訳ありませんが、もし宜しければ、他の方法をご教示いただけますと幸いです。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

こんな質問は、タイプとしてはよくあることだ。 (1)FSOを使う (2)Dirを使う の2方式あるが、For Eachが使える(1)がお勧め。 Googleで「fso folderのファイルを捉える」などで照会し https://excelwork.info/excel/fsofiles/ などの記事が出てくるから、その中の例の(一部を修正し) ーーー Sub Sample_Files() Dim fso As Object Dim myFiles As Object Dim myFile As Object Dim strFiles As String Set fso = CreateObject("Scripting.FileSystemObject") Set myFiles = fso.GetFolder("C:\Users\XXXX").Files ’xxxx以下は修正する i = 1 For Each myFile In myFiles strFiles = myFile.Name MsgBox strFiles i = i + 1 If i = 3 Then Exit Sub ’確認なので、3ファイルで打ち切る Next End Sub これで、結果が、おかしいところが無いようなら MsgBox strFiles のところを、ブックstrFilesのOpenに変える。 その次に、そのブックのOpen後の処理のコードを書く(質問のコードが使えるか、やって見たら)。 質問者だけの、固有の処理ニーズなので自力でやること。 回答者に全部やらすのは、勉強にもならず、自分でやってみること。 疑問があればそのコードについて質問すること。 参考 https://teratail.com/questions/201039 Early BindingとLate Bindingについて のうち、初心者に、やさしいと思う方をやっている。

関連するQ&A

  • 新しいワークブックのシートが指定できません

    エクセルでマクロを作成中です。 マクロの動作の中で新しいワークブック作成して、 その中のワークシートを指定してデータを入力したいのですが、 全て1つ目のシートに入力されてしまいます。 どのようにしたら2つ目以降のシートを指定できるのでしょうか? ソース Public Csvfile Public Csv_bk As Workbook Public Xls_bk As Workbook Public ch As Integer Public i As Integer Public LineCSV As Variant Public LineXLS As Variant Sub CSV_XLS() Set Csv_bk = Workbooks.Open(Csvfile) Set Xls_bk = Workbooks.Add ch = FreeFile Open Csvfile For Input As #ch i = 1 Do Until EOF(ch) Line Input #ch, LineCSV LineXLS = Split(LineCSV, ",") Xls_bk.Worksheets(1).Range(Cells(i, 1), Cells(i, UBound(LineXLS) + 1)) = LineXLS i = i + 1 Loop End Sub DO文の中のWorksheets(1)をWorksheets(2)にしても全て 1つ目のシートに入力されてしまいます。 上のソースでは全てのデータを同じシートに入力していますが、 実際にはWorksheets(n)として nを使ってデータをシート毎に振り分けたいと考えています。 Csvfileには別のフォームからファイル名を取得しています。

  • EXCELのKill処理について質問です。

    EXCELのKill処理について質問です。 とあるフォルダに「test.csv」がある場合のみ その「test.csv」を削除する処理を作りたいのですが、 Dim Del_Dir as string Del_Dir = ThisWorkbook.Path & "\test\test.csv" if Del_Dir <> "" then kill Del_Dir end if 上記のようにすれば、「test.csv」は削除できるのですが、 もともとフォルダに存在しない場合、Elseの処理がどのようにすれば できるので悩んでおります。 ご教示お願いします

  • Excel2003 マクロ(VBA) どこにあるか分からないフォルダAのワークブックAを開く

    いつもお世話になっております。 新しいマクロの記録でフォルダAのワークブックAを開きました。 ChDir "C:\フォルダA" Workbooks.Open Filename:= _ "C:\フォルダA\ワークシートA.xls" しかし、今はフォルダAがCドライブにありますが、 明日はデスクトップ上にあったり、フォルダBの中に入っていたりするかもしれません。 このような時、上記のようなVBAでは開けません。 どこにあるか分からないフォルダAのワークブックAを開くには どこをどのように直せばよろしいのでしょうか? 以上、よろしくお願いいたします。

  • エクセルVBA、マクロについて教えてください。

    https://box.yahoo.co.jp/guest/viewer?sid=box-l-62itttdrrgzrvsaxkvu53tmg3a-1001&uniqid=d4c90186-7ae6-4c7a-8f04-a499509147fc&viewtype=detail サンプルブックを見て頂きたいのですが、シートに分けておりますが、それぞれ別ブックとなります。 エクセルブックAにはシート1-シート10まであります。 ブックAのデータをVBAを使って、ブックBに転記したいのですが、 今はVBAがわからないため、作業列、関数を使って読み取っているのですが、検索をかけると、とても遅いため、関数を消すと早く検索が出来たため、VBAでデータを転記出来たらいいなと思っております。 いくつか条件があるのですが、 ブックAのAQ-ATが作業列としており、 ブックBのG-Uまで関数を入れております。 G4==SUMIFS('[ブックA.xlsx]シート1'!$AD:$AD,'[ブックA.xlsx]シート1'!$AQ:$AQ,$A4,'[ブックA.xlsx]シート1'!$AS:$AS,$F$2,'[ブックA.xlsx]シート1'!$AT:$AT,G$2) H4==SUMIFS('[ブックA.xlsx]シート1'!$AD:$AD,'[ブックA.xlsx]シート1'!$AQ:$AQ,$A5,'[ブックA.xlsx]シート1'!$AS:$AS,$F$2,'[ブックA.xlsx]シート1'!$AT:$AT,H$2) I4==SUMIFS('[ブックA.xlsx]シート1'!$AD:$AD,'[ブックA.xlsx]シート1'!$AQ:$AQ,$A4,'[ブックA.xlsx]シート1'!$AS:$AS,$F$2,'[ブックA.xlsx]シート1'!$AT:$AT,I$2) 同じような関数をG-Uまで入れております。 このような関数を入れております。 E4==VLOOKUP(A4,'[ブックA.xlsx]シート1'!$B:$AC,28,FALSE) この関数をなくすとAdvancedFilterが早くなるので、ここの部分を転記出来たらと考えております。 ブックAとブックBはブックAのB列のコードとブックBのA列のコードが一致すれば、転記すると言った感じです。 決まっている部分は、商品コードは重複しないのと、ブックAのB列は結合されております。 結合セルのため、作業列を使用しておりました。 ブックAの基準をかえずに転記できる方法があればおしえてください。

  • Excel VBA

    Excel VBAを勉強中の者です。 複数のワークブックを開いているため、ワークブックから指定していってセルを選択したいと思い下記のようなコードにしてみたのですができませんでした。 Workbooks(“C:\フォルダ\ワークブック.xls”).Worksheets(“C”).Range(“A1”).Select このようなコードは有り得ないのでしょうか? または、ワークブックを開いて、ワークシートをアクティブにして、セルを選択するというように、ひとつひとつ選択していくのではなく、一文でワークブックからセルまで指定する他の方法はありますでしょうか? 教えてください。よろしくお願いします。

  • CSVファイルの読み込みVBA作成について

    初めまして。 色々インターネット等で検索して作成してみたのですが、 ここから先のプログラムが組めないので、 やり方を教えて頂けますと幸いです。 おそらくIf Elseで場合訳すると思うのですが、 上手くできてません。 下記、プログラムの概要です。 (1)フォルダを指定し、そのフォルダにある全てのCSVファイルを読み込む。 (2)CSVファイルを読み込む際には、「*.csv」の「*」部分をワークシート名とし、CSVファイルの内容をワークシートに書き込む。 例)「test.csv」の場合、ワークシート名は「test」になります。 (3)既にブックにワークシート名がある場合は上書き処理を行い、ない場合は新規に作成する。 例)既に「test」ワークシートがある場合は、内容の上書きを行います。 (4)ワークシートを追加する際は、今あるワークシートの最後に追加する。 下記に現在作ったプログラムを記載します --------------------------------- Sub csvRead() Dim FoldPath As String Dim f Dim ch1 As Long Dim r As Long Dim textLine As String Dim csvLine() As String Dim i As Long Dim FSO Dim folderSelect As Object Set folderSelect = CreateObject("Shell.Application"). _ BrowseForFolder(0, "フォルダを選択してください", 0) If Not folderSelect Is Nothing Then FoldPath = folderSelect.Self.Path 'フォルダ選択 End If Set FSO = CreateObject("Scripting.FileSystemObject") i = Worksheets.Count '現在のワークシート数を格納 For Each f In FSO.GetFolder(FoldPath).Files If StrConv(Right(f.Path, 4), vbLowerCase) = ".csv" Then ch1 = FreeFile Open f.Path For Input As #ch1 r = 1 Worksheets.Add after:=Worksheets(i) With ActiveSheet .Name = Left(f.Name, Len(f.Name) - 4) Do While Not EOF(ch1) Line Input #ch1, textLine If textLine <> "" Then csvLine() = Split(textLine, ",") .Range(Cells(r, 1), Cells(r, UBound(csvLine()) + 1)) = csvLine() End If r = r + 1 Loop End With i = i + 1 Close #ch1 End If Next End Sub

  • ファイルを検索するマクロで教えて下さい

    質問No.9060575で下記のような質問をさせて頂きました。 ↓↓↓↓↓↓↓↓ ファイルを選択するマクロを教えてください。 ブックAのシートA セルA1に100という数字が入力されています。 C:\Users\Documents のフォルダの中に シート選択#100.xlsm シート選択#101.xlsm シート選択#102.xlsm シート選択#103.xlsm シート選択#104.xlsm というシートがあるとします。 やりたいことはセルA1に数字が入力されている状態でマクロ実行ボタンを押した時 C:\Users\Documentsのフォルダの中にあるシート選択#100.xlsmのシートを開きたいです。 セルA1が101ならシート選択#101.xlsmを開く。 またセルA1になにも入力されていない場合はメッセージで [入力されていません] 入力されていてもフォルダ内に当てはまる番号がない場合は [ヒットするNo.がありません] みたいな感じでメッセージを表示したいです。 宜しくお願いします。 ↑↑↑↑↑↑↑↑ この質問で回答をもらい、解決できましたが ここにプラスαで、もしA2セルに999と入力されていて C:\Users\Documents のフォルダの中に シート選択#100#999.xlsm というシートや シート選択#101#995.xlsm というシートがある場合はどのようにすればよろしいでしょうか? 前回と同じく100や999の部分はランダムに変わります。 前回のベストアンサーを載せておきます。 ■VBAコード Sub file_open() Dim f_fmt As String, i As Integer '設定==============   Const dpath As String = "C:\Users\Documents\"   Const adr As String = "A1"   Const st As String = "シートA"   f_fmt = "#<NO>\シート選択#<NO>.xlsm" '==================   If Len(Range(adr).Value) = 0 Then MsgBox "入力されていません": Exit Sub   f_fmt = dpath & Replace(f_fmt, "<NO>", Range(adr).Value)   If Dir(f_fmt) = "" Then MsgBox "ヒットするNo.がありません": Exit Sub   Workbooks.Open Filename:=f_fmt   For i = 1 To Worksheets.Count     If Worksheets(i).Name = st Then       Worksheets(i).Activate       Exit Sub     End If   Next i   MsgBox "ワークブック """ & Dir(f_fmt) & """ に、ワークシート """ & st & """ が見つかりません" End Sub

  • シート名と同じブックを開くVBA

    初めまして、以下のVBAについて質問させてください!「新しいフォルダ」に入っている「りんご」という名前のブックを開くことに成功したのですが、ここからさらに応用して、アクティブワークブックのシート名と同じ名前を含むブックが新しいフォルダにあれば、該当のブックを開く作業をしたいと思っています。シート名は「りんご」を含め「みかん」や「りんご」など色々あります。 VBA初心者のため以下の簡単なコードをなるべく崩したくないのですが、何か方法はありますでしょうか…?!ネットで色々検索しているのですが同じようなケースが見つからず困っています!どうかよろしくお願いします…!m(_ _)m Const お茶 As String = "C:\Users\PC○○\Desktop\新しいフォルダ\" Dim 三色団子 As String 三色団子 = Dir(お茶 & "りんご.xlsx") Workbooks.Open Filename:=お茶 & 三色団子

  • VBAで複数シートをまとめたい

    VBAを作るのは今回が初めてで行き詰ってしまいました。 フォルダ内の「.xlsx」4つのファイルのSheet1(4つともSheet1です) を統合.xLsmの1月シートのb2~値でコーピー貼り付けを行いたいのですが、 下記のものでやっていけば出来のかなと思ってますが、ご教授お願い致します。 Private Sub CommandButton1_Click() Dim sFile As String Dim sWB As Workbook, dWB As Workbook Dim dSheetCount As Long Dim i As Long Dim c As Long Dim ws As Worksheet Debug.Print (ws.Index) Const SOURCE_DIR As String = "C:\Users\KWEUSER\Desktop\data\" Application.ScreenUpdating = False '指定したフォルダ内にあるブックのファイル名を取得 For c = 1 To 4 sFile = Dir(SOURCE_DIR & "*.xlsx") 'フォルダ内にブックがなければ終了 If sFile = "" Then Exit Sub '集約用ブックを作成 Set dWB = Workbooks.Add '集約用ブック作成時のシート数を取得 dSheetCount = dWB.Worksheets.Count Do 'コピー元のブックを開く Set sWB = Workbooks.Open(Filename:=SOURCE_DIR & sFile) 'コピー元の c (1,2,3,4,5)シートを集約用ブックにコピー sWB.Worksheets(c).Copy After:=dWB.Worksheets(dSheetCount) 'シート名をファイル名に ActiveSheet.Name = sFile 'コピー元ファイルを閉じる sWB.Close '次のブックのファイル名を取得 sFile = Dir() Loop While sFile <> "" '集約用ブック作成時にあったシートを削除 Application.DisplayAlerts = False For i = dSheetCount To 1 Step -1 dWB.Worksheets(i).Delete Next i Application.DisplayAlerts = True '集約用ブックを保存して閉じる dWB.SaveAs Filename:="C:\Users\KWEUSER\Desktop\data\" & c & ".xlsx" dWB.Close Next Application.ScreenUpdating = False End Sub

  • エクセルVBAでConsolidate

    以下は、ネット検索で見つけたサンプルコードです。 同じフォルダ内の全ブックのSheet1のA1:B10をThisWorkbookのSheet1に統合しています。 Sub test2() Dim MyFile As String, MyPath As String Dim SumFile() As Variant, i As Long MyPath = ThisWorkbook.Path & "\" MyFile = Dir(MyPath, vbNormal) Do Until MyFile = "" If MyFile <> ThisWorkbook.Name Then ReDim Preserve SumFile(i) 'A1からB10の値を変数に代入 SumFile(i) = "'" & MyPath & "[" & MyFile & "]Sheet1'!R1C1:R10C2" i = i + 1 End If MyFile = Dir Loop If i = 0 Then MsgBox "データが有りません": Exit Sub Worksheets("Sheet1").Range("A1").Consolidate Sources:=SumFile() End Sub 質問1 Sheet1だけでなく全シートのA1:B10をThisWorkbookのSheet1に統合するためにはどう書き換えればよいのでしょうか? 質問2 上記コードではなぜ、ブックを開かずにデータがとれるのでしょうか?

専門家に質問してみよう