自動範囲指定のデータをCSVで保存したい

このQ&Aのポイント
  • データのやり取りができず、CSVとして保存できない点に問題があります。
  • 現在開いているシートのデータを自動的に最後の行まで範囲指定し、ダイヤログボックスを表示させてCSVとして保存したいです。
  • 以下のVBAコードを使用して、現在選択しているセル情報をCSVファイルとして保存することができます。
回答を見る
  • ベストアンサー

自動範囲指定のデータをCSVで保存したい。

添付ファイルにあるようにデータ(量が変化します)があり、自動的に最後の行まで指定してその範囲をダイヤログボックスを表示させてCSVとして保存したい。 今特に問題がある点は、 ・データのやり取りが出来ない点 ・CSVとして保存できない。(上記の点においてブランクの表が作成される) 何卒宜しくお願い致します。 '現在開いているシートをCSVデータで保存する Public Sub call_RangeSaveCSV() Dim fPath As String Dim fName As String Dim rng As Range Dim folderPath As String Fldr = "ダウンロード" '現在開いているブック情報をファイル名にするため、変数に格納 fPath = ActiveWorkbook.path & "\" fName = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".")) & "csv" Application.DisplayAlerts = False '現在選択しているセル情報をrngに格納 'Set Rng = Selection Set rng = Range("L6").CurrentRegion '新規ブック作成→rngをA1にコピー→CSV保存→CSV閉じる Workbooks.Add rng.Copy ActiveSheet.Range("A1") '■ここでエラーが返ってきます。ダイヤログボックスを出して任意の場所と名前を付けたいのですが。。 ActiveWorkbook.SaveAs FileName:=fPath & fName, FileFormat:="Sample.csv", FileFilter:="CSVファイル(*.csv),*.csv") ActiveWorkbook.SaveAs ActiveWindow.Close Application.DisplayAlerts = True End Sub

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.3

最終行をL列から求める場合と 220行固定の場合とを用意してみました。 作成してみてわかったことですが、 新たなシートにコピペして保存していますので 必然的に範囲末の空行は全数除かれることから、 最終行はあまり深く考えなくてもよさそうです。 Option Explicit Public Sub Sample1()     Dim rng As Range  Dim FileName As Variant  Dim wb As Workbook  Dim LastRow As Long     '最終行を取得 'L列の最終行  LastRow = Cells(Rows.Count, 12).End(xlUp).Row  'MsgBox LastRow     '抽出するデータ範囲を定義  Set rng = Range(Cells(6, 12), Cells(LastRow, 18)) 'L6~Rの最終行'  '新規ブック作成→rngをA1にコピー  Set wb = Workbooks.Add  rng.Copy wb.ActiveSheet.Range("A1")    'ダイアログで保存ファイル名のフルパスを取得  FileName = Application.GetSaveAsFilename(InitialFileName:="規定の名称.csv", FileFilter:="CSVファイル,*.csv")  If FileName = False Then   Exit Sub  End If    '保存し、クローズ  Application.DisplayAlerts = False  wb.SaveAs FileName:=FileName, _   FileFormat:=xlCSV, CreateBackup:=False  Application.DisplayAlerts = True  wb.Close End Sub Public Sub Sample2()     Dim rng As Range  Dim FileName As Variant  Dim wb As Workbook  Const LastRow = 220     '抽出するデータ範囲を定義  Set rng = Range(Cells(6, 12), Cells(LastRow, 18))  '新規ブック作成→rngをA1にコピー  Set wb = Workbooks.Add  rng.Copy wb.ActiveSheet.Range("A1")    'ダイアログで保存ファイル名のフルパスを取得  FileName = Application.GetSaveAsFilename(InitialFileName:="規定の名称.csv", FileFilter:="CSVファイル,*.csv")  If FileName = False Then   Exit Sub  End If    '保存し、クローズ  Application.DisplayAlerts = False  wb.SaveAs FileName:=FileName, _   FileFormat:=xlCSV, CreateBackup:=False  Application.DisplayAlerts = True  wb.Close End Sub

その他の回答 (2)

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.2

>例えば.「End(xlUp).Row」などを使って最後の行を判別すなどです。 どの列の最終行でしょうか?

chi_ko6262
質問者

お礼

補足し忘れたのですが、最終行は220となります。 宜しくお願い致します。

chi_ko6262
質問者

補足

何度もすみません。 データはL列、R列並列で表示されます。 そして文字で検索するのですが、その際には行数は変動します。10行だったり20行だったりします。 因みにL6,R6が最初の行となります。 宜しくお願い致します。

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.1

提示された画像に行番号、列番号がないので >自動的に最後の行まで どのような条件で求めるのかがわかりません。 >Set rng = Range("L6").CurrentRegion この条件でよく、 かつ、保存先、保存するファイル名を指定させるのであれば 後記のようなコードとなりましょう。 >自動的に最後の行まで の判定方法と 保存するデータの開始行番号 保存するデータの列範囲がわかれば コードを修正して再提示することが可能と思います。 Option Explicit Public Sub call_RangeSaveCSV()   'Dim fPath As String   'Dim fName As String   Dim rng As Range   'Dim folderPath As String   Dim FileName As Variant   Dim wb As Workbook    '  '現在開いているブック情報をファイル名にするため、変数に格納 '   fPath = ActiveWorkbook.Path & "\" '  fName = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".")) & "csv" ' '  Application.DisplayAlerts = False ' '  '現在選択しているセル情報をrngに格納 '  'Set Rng = Selection      Set rng = Range("L6").CurrentRegion      '新規ブック作成→rngをA1にコピー   Set wb = Workbooks.Add   rng.Copy wb.ActiveSheet.Range("A1")   'ダイアログで保存ファイル名のフルパスを取得し、保存し、クローズ   FileName = Application.GetSaveAsFilename(InitialFileName:="規定の名称.csv", FileFilter:="CSVファイル,*.csv")   If FileName = False Then     Exit Sub   End If   wb.SaveAs FileName:=FileName, _     FileFormat:=xlCSV, CreateBackup:=False   wb.Close      'Application.DisplayAlerts = True End Sub

chi_ko6262
質問者

補足

>自動的に最後の行までの判定方法  例えば.「End(xlUp).Row」などを使って最後の行を判別すなどです。 保存するデータの開始行番号: L6 保存するデータの列範囲:R です。 何卒宜しくお願い致します。

関連するQ&A

  • ファイルサーバーからローカルフォルダーに移動したい

    下記のVBAはローカル環境でデータを同じフォルダーにCSVとして吐き出す事を目的に調べながら作ったのですが、運用の関係上ファイルサーバーへ置く事になってしまいローカルの「ダウンロード」フォルダーにに吐き出せないか色々試してみているのですが、どうしても分かりません。お知恵をいただければ幸いです。 宜しくお願い致します。 '現在開いているシートをCSVデータで保存する Public Sub call_RangeSaveCSV() Dim fPath As String Dim fName As String Dim rng As Range '現在開いているブック情報をファイル名にするため、変数に格納 fPath = ActiveWorkbook.Path & "\" fName = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".")) & "csv" Application.DisplayAlerts = False '現在選択しているセル情報をrngに格納 Set rng = Selection '新規ブック作成→rngをA1にコピー→CSV保存→CSV閉じる Workbooks.Add rng.Copy ActiveSheet.Range("A1") ActiveWorkbook.SaveAs Filename:=fPath & fName, FileFormat:=xlCSV ActiveWindow.Close Application.DisplayAlerts = True End Sub

  • エクセルVBAでのエラー

    おはようございます。 昨日ここでいろいろ教えていただき、300のエクセルファイルから特定の範囲のデータ抽出方法を書いてみたのですが、セルが多すぎて実行できません、というエラーがでてしまいます。 これはどのように解消すればよろしいのでしょうか? Sub Test() Dim FPath1 As String, FPath2 As String Dim FName As String, myBook As String Const startROW As Long = 14, lastROW As Long = 20 Const startCOL As Long = 8, lastCOL As Long = 10 Const shtNAME As String = "sheet1" Application.ScreenUpdating = False FPath1 = "D:\MR5567\" FPath2 = "D:\New Microsoft Excel Worksheet\" Workbooks.Add myBook = ActiveWorkbook.Name FName = Dir$(FPath1 & "*.xls") Do While FName <> "" Workbooks.Open Filename:=FPath1 & FName ActiveWorkbook.Sheets.Select Sheets(1).Activate Sheets.Copy After:=Workbooks(myBook).Sheets(Sheets.Count) Workbooks(FName).Activate Application.DisplayAlerts = False ActiveWorkbook.Close FName = Dir$ Loop ActiveWorkbook.SaveAs Filename:=FPath2 & "Renketsu.xls", FileFormat:=xlNormal ActiveWorkbook.Close Application.ScreenUpdating = True End Sub

  • ActiveWorkBook VBA

    Sub test() Dim myCSV As String Dim Fname As Variant Dim Aname As String Dim Fullp As String Application.ScreenUpdating = False Fullp = ActiveWorkbook.FullName Pos = InStrRev(Fullp, "\") Fname = Left(Fullp, Pos) myCSV = Dir(Fname & "*.csv") Do Until myCSV = "" Workbooks.Open Fname & myCSV Aname = Left(Fullp, InStr(1, Fullp, ".") - 1) ActiveWorkbook.SaveAs filename:=Aname & ".xls", FileFormat:=xlExcel9795 ActiveWorkbook.Close myCSV = Dir() Loop Kill Fname & "*.csv" End Sub あるフォルダにあるcsvファイルをxlsで保存したいと思いましたが、アクティブになるBOOKがバラバラ? で、うまくいきません。csvファイルを開いたときに そのファイルがアクティブになり、うまくloopできないでしょうか?

  • エクセルのシートのデータをVBAを使ってCVS形式で保存したいのですが、文字化けしないようにするにはどうしたらいいでしょうか?

    エクセルのシートのデータをVBAを使ってCVS形式で保存したいのですが、文字化けしてしまいます。手動で「名前を付けて保存」すると文字化けしません。文字化けしないようにするにはどうしたらいいでしょうか? どなたかお教えいただきたく、よろしくお願いします。 ---------------------------------------------------------------------- Sub test5() Dim aaa As String Dim fname As Variant aaa = Format(Now, "YYMMDD") fname = Application.GetSaveAsFilename(InitialFileName:=aaa & ".csv", fileFilter:="csvファイル(*.csv), *.csv") If fname = False Then Exit Sub '保存 Worksheets("sheet1").SaveAs fname End Sub

  • フォルダ内全ファイルからデータを取得する方法

    お力をお貸しください。 下記のようなコードを書きました。*ドライブにあるフォルダ内全ファイルからデータを取得して、一つの表にまとめようとしています。 が、Workbooks.Open sFileで、「ファイルが存在しません」というエラーがでます。 変数を確認しましたが、きちっと呼び込んでいるのに、ファイルが存在しないとなるのが分かりません。 ここで、データの最終行を取得するのに、ややっこしいコードを書いているのは、データが虫食い状態で、全部のセルが埋まっているのはC列しかないため、このようなことになっています。 よろしくお願いします。 Sub Macro1() Dim FName As String, FPath As String, cnt As Long, r As Long, m As Long, MyMonth As String Dim LastRows As Long Set Wsh = CreateObject("Wscript.Shell") Set Wsh = Nothing m = Range("A1").Value - 1 MyMonth = m & "月" FPath = "*:\" & MyMonth & "\" ChDir FPath FName = FPath & "*.xls" sFile = Dir(FPath  & "*") ' 画面更新オフ Application.ScreenUpdating = False With ThisWorkbook.Sheets(1) LastRows = Cells(Rows.Count, 1).End(xlUp).Row + 1 Do While sFile <> "" If sFile <> ThisWorkbook.Name Then Workbooks.Open sFile cnt = Cells(Rows.Count, 3).End(xlUp).Row + 1 ActiveSheet.Range("A1:" & "M" & cnt).Copy Destination:=ThisWorkbook.Sheets(1).Cells(LastRows, 1) ActiveWorkbook.Close SaveChanges:=False sFile = Dir() End If Loop End With '画面更新オン Application.ScreenUpdating = True ''名前をつけて保存 ' ' Application.DisplayAlerts = False ' Filedate = Format(Date, "yyyymm") ' ActiveWorkbook.SaveAs Filename:=FPath & "\" & Filedate & ".xls" ' Application.DisplayAlerts = True ' ''画面更新オン 'Application.ScreenUpdating = True ' ' End Sub

  • Excel ホルダ内のCSVにMacroを実行

    Excel VBA 初心者です。指定ホルダ内の全てのCSVにMacroを実行したいのですがうまくいきません。 対象データは指定ホルダ内の全CSVファイル。 算出条件がBook内にありますが(セル番地の数値を読むようにしてあります)、以下のMacroのCSV処理をすると算出条件が見つからなくてストップしてしまいます。(Book内のデータに実行した場合は問題ないです) ※「 'CSVに対する処理 ActiveなBookとして処理します。」の部分に処理用のMacroをCallしています。 上記の問題の解決として A案 (1)作業用のBookにCSVのデータを[Sheet1]呼びだす→(2)Macroを実行→(3)保存 →(4)[Sheet1]のDataClear→(1)に戻り指定ホルダ内のファイルがなくなるまで繰り返す。 B案 以下のMacroにコードを付加してBook内の算出条件を読み込ませる。 と考えましたが、初心者故の未熟で解決できません。どなたか、助けてください。 何卒よろしくお願いいたします。 Sub Macro() Dim FSO, FDC, FL Dim FPath As String, Opath As String Dim i As Long Set FSO = CreateObject("Scripting.FileSystemObject") 'Filesystemobjectを使用する FPath = "E:\test\" '入力フォルダ Opath = "E:\test\ttt\" '出力フォルダ Set FDC = FSO.getfolder(FPath).Files 'パスのファイルコレクションを取得 For Each FL In FDC If UCase(FSO.GetExtensionName(FL)) = "CSV" Then '拡張子がCSVだったら Workbooks.Open FL 'Openする ' 'CSVに対する処理 ActiveなBookとして処理します。 ' Application.DisplayAlerts = False '保存しますかのメッセージを止める ActiveWorkbook.SaveAs Opath & "R" & FL.Name '名前を付けて保存 ActiveWorkbook.Close 'Closeする Application.DisplayAlerts = True 'メッセージ出力をもとに戻す End If Next End Sub

  • Excelシート1シートのみを指定フォルダへ保存

    Excelのシート1のみを、本日の日付と名前の入ったセル(I7)を保存する時の名前にして指定したフォルダへ保存したいと思っています。 1、シートは本日の日付+I7セルに入っている値を名前にする。 2、フォルダはCではなくV:\○○\○○\○○\○○\○○\○○\○○に格納 3、シート1以外のシート2、シート3は保存せず閉じる 4、格納後○○に保存しました。と表示 試行錯誤し、下記のように記述してみたのですが、 Sub Macro1() 'Option Explicit Sub Sample() Dim xSheet As Worksheet Dim myFile As String Dim myName As String Set xSheet = ActiveSheet ThisWorkbook.Worksheets("シート名").Copy 'myName = ActiveWorkbook.Worksheets(1).Name 'myFile = ThisWorkbook.Path & "\" & myName & ".xls" myFile = ThisWorkbook.Path & "\" & xSheet.Range("I7").Value & ".xls" Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:=myFile Application.DisplayAlerts = True ActiveWorkbook.Close End Sub 日付を指定して保存 Sub test()  Dim Filename As String  Filename = Format(Date, "yyyy年mm月dd日") & ".xls"  ActiveWorkbook.SaveAs "C:\My Documents\" & Filename End Sub 日付とI7セルの名前を合せてブックの名前としたい場合どうVBEで記述すればいいのかわからないので詳しい方がおられましたら、 よろしくお願いいたします。 あまり詳しくないので、そのままコピーできるか、○○の部分を指定フォルダ名に変えてください。等の注釈を付けていただけると助かります。

  • (VBA)書式が変更されてしまいます

    ↓SaveAsで保存すると書式が変更されてしまいます。 ActiveWorkbook.SaveAs FileFormat:=xlCSV, _ CreateBackup:=False ActiveWorkbook.Close False ネットで↓の回避策を見つけたのですがうまくいきません。 **************************************************************** Sub CSV_Save() 'Sheet1をCSV形式で保存します。 With ActiveWorkbook.Sheets(1) 'A1:A10まで日付あるいは通貨設定のデータが入っているとします。 For Each rng In Range("A1:A10") 'テキスト文字列に変更します。 rng.Value = "'" & rng.Text Next rng End With ActiveWorkbook.SaveAs FileName:="C:\test.csv", FileFormat:=xlCSV End Sub **************************************************************** ご指導お願いします。

  • 複数の.csvファイルから指定数値を取り出す

    毎度御世話になります。 あるフォルダ内の複数の.csvファイル一つ一つから 指定数値(B列6行目のみ)を取り出して、 デスクトップ上、別のExcelシートの(B列1行毎に日付と時間が書いてある) 隣のC列にまとめて自動で書いてくれるプログラムを考えます。 使用するファイル名は HU20150513_110000_AI2.csv です。 コードの該当行'ファイル名を配列変数に格納 のところを、 上記ファイル名にしても、「型が一致しません」とエラーが出るのですが、 どこか他に変更点があるのでしょうか。詳しい方、宜しく御願い申し上げます。 ■VBAコード Sub 値取得() '配列変数を宣言 Dim filnames As Variant Dim myfile As Variant Dim cnt As Long Dim mybook As Workbook Dim outbook As Worksheet Dim fname As String Dim mySerial As Date Dim myRng As Variant Dim key As String '出力先の先頭行番号 cnt = 1 '出力先のブックを格納 Set outbook = ActiveWorkbook.ActiveSheet 'ファイル名を配列変数に格納 filnames = Application.GetOpenFilename("CSVファイル (*.csv), *.csv", MultiSelect:=True) 'キャンセル時の処理 If IsArray(filnames) = False Then Exit Sub 'ファイルの数だけ繰り返し Application.ScreenUpdating = False For Each myfile In filnames   'ファイル開く   Set mybook = Workbooks.Open(Filename:=myfile, ReadOnly:=True)   'ファイル名からシリアル値の作成   fname = Format(Left(mybook.Name, 12), "0000/00/00 00:00")   mySerial = DateValue(fname) + TimeValue(fname)   '値を取得・出力先へ書き出し   mybook.Activate   key = Year(mySerial) & Month(mySerial) & Day(mySerial) & Hour(mySerial)   For Each myRng In outbook.Columns("B").SpecialCells(xlCellTypeConstants, 23)     If IsDate(myRng) Then       If Year(myRng) & Month(myRng) & Day(myRng) & Hour(myRng) = key Then         myRng.Offset(0, 1).Value = ActiveSheet.Range("B6").Value         Exit For       End If     End If   Next myRng   'ファイル閉じる   Application.DisplayAlerts = False   Workbooks(mybook.Name).Close   Application.DisplayAlerts = True   'カウントアップ   cnt = cnt + 1 Next myfile Application.ScreenUpdating = True End Sub

  • ワードで保存先を指定する

    http://okwave.jp/qa/q7366977.html http://okwave.jp/qa/q7370982.html の続きでお願いします。 ワードテンプレートを作成しています。入力後の保存先をNASの特定フォルダに自動的にできるような設定にしたいと考えています。 上記の質問で下記のようなマクロを提案されました。 Sub FileSaveAs() ' ' FileSaveAs Macro ' 作業中の文書を「顧客ID+日付」の名前で保存します。 ' Dim SaveDay As String Dim kokyaku As String Dim Fname As String SaveDay = Format(Date, "yymmdd") kokyaku = ActiveDocument.FormFields("顧客ID").Range.Text Fname = SaveDay & "_" & kokyaku ChangeFileOpenDirectory "フォルダパス名" ActiveDocument.SaveAs FileName:=Fname & ".doc" ' 名前を付けて保存ダイアログを表示する場合は以下を有効に ' Dialogs(wdDialogFileSaveAs).Show End Sub こによって、「名前を付けて保存」では目的を果たしましたが、「上書き保存では」規定のフォルダに保存されます。この際も”NASのフォルダ”に出来ますか? よろしくお願いします。

専門家に質問してみよう