VBAでCSVの1行目だけを書き換える方法

このQ&Aのポイント
  • VBAを使用して、CSVファイルの1行目だけを書き換える方法について質問します。
  • 例えば、CSVファイルの1行目にはデータラベルがあり、2行目以降には数値データが記録されています。
  • VBAを使用して、マクロのセルに入力された新しいデータラベルで、CSVファイルの1行目を置き換えたいです。
回答を見る
  • ベストアンサー

VBAでCSVの1行目だけを書き換える方法

VBAでCSVの1行目だけを書き換える方法について質問させて頂きます。 例として、以下のようなCSVファイルが存在したとします。 1行目がデータラベルで、2行目から数値がデータとして記録されています。 A,B,C,D 1,2,3,4 1,2,3,4 1,2,3,4 1,2,3,4 1,2,3,4 一方、マクロを含んだエクセルのセル(例えばA1, B1,C1,D1)に Anew, Bnew, Cnew, Dnew というように新しいデータラベルが入力されています。 今回実現したい動作は、CSVファイルのデータラベルA,B,C,Dを 新しいデータラベルAnew, Bnew, Cnew, Dnewに置き換えることです。 VBAのappend機能を用いて実現しようと思いましたが、最終行に追加することはできても1行目を書き換えることができません。 ポイントとして、データは下に約50万行ほど続いているので、ワークブックとして開いたりすると最悪の場合メモリ不足で 止まってしまいます。1行目の操作だけで作業を完結させたいところです。 良い方法をご存知の方がいらっしゃればご教授いただきたく思います。 よろしくお願いします。 (以下に、最終行に追加するのに用いたコードを参考として記載します) sub macro() dim ch as integer ch=freefile open "C:\***\data.csv" for append as #ch j=1 do while cells(1,j)<>"" 'cells(1,1)からcells(1,4)にAnew, Bnew, Cnew, Dnewが記録されています。 print #ch, cells(1,j) & ","; '改行させないため ; を付ける j=j+1 loop close #ch end sub

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

Excel VBAには可変長のランダムアクセスが無いので,一回スルーで読み書きが必要になりますね。 簡単に作ってみた例: sub macro1()  dim FSO as object  dim s1 as object  dim s2 as object  dim buf as string  set fso = createobject("Scripting.FileSystemObject")  set s1 = fso.opentextfile(thisworkbook.path & "\data.csv", 1)  set s2 = fso.opentextfile(thisworkbook.path & "\out.csv", 2, true)  buf = "Anew,Bnew,Cnew,Dnew"  s1.skipline  s2.writeline buf  s2.write s1.readall  s1.close  s2.close  set fso = nothing end sub

liquidengine7a
質問者

お礼

サンプルまで示して頂き、ありがとうございました。 やはり基本的に書き換えることは出来ないようなので、時間はかかりますがその方針で行こうと思います。

その他の回答 (2)

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

1行だけの変更でも 今あるデータはあくまでデータとして、作るものは別に新しく全部作ることになる。 (1)第1レコート(見出しの1行=1レコードデータ)はプログラムでつくり、新しいファイルに書き出す (2)今あるファイルの1行目は、読んで読み飛ばし (3)今あるファイルの第2レコードを読む 新しいレコードとして新しいファイルに書き出しする。 (4)(3)を最後のレコードまで繰返す。 (5)両ファイルをCLOSEする この基本線を抑えてないから質問になる。 固定長のランダムファイル以外はファイルの一部書き換えはしないのだ。 そういうことをスクールででも行って(や先輩から聞いて)学習してないで、VBAに入るからこういう質問になる。

liquidengine7a
質問者

お礼

ご指摘ありがとうございます。 >そういうことをスクールででも行って(や先輩から聞いて) 個人が置かれた状況は様々で、そういう事をする代用の手段としてこの様な掲示板が存在するのだと思っています。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

コードが一行だったとしても、実際の作業としては全行読み出し、 新規ファイルに書き出しということになるんじゃないかな。 http://q.hatena.ne.jp/1075191001

liquidengine7a
質問者

お礼

ありがとうございました。 ご指摘の通りのようです。

関連するQ&A

  • VBAでのcsvファイルの読込み方法

    VBAを始めたばかりの新参者ですが、どうぞ宜しくお願いいたします。 csvファイルのデータの読込み方をご教示お願いします。 【csvファイルの内容】 "A行DATA1","A行DATA2","A行DATA3","A行DATA4","A行DATA5"・・・,"A行DATA10" "B行DATA1","B行DATA2","B行DATA3","B行DATA4","B行DATA5"・・・,"B行DATA10" "C行DATA1","C行DATA2","C行DATA3","C行DATA4","C行DATA5"・・・,"C行DATA10" (中省略) "Z行DATA1","Z行DATA2","Z行DATA3","Z行DATA4","Z行DATA5"・・・,"Z行DATA10"です。 (""併用カンマ切りで、Dataの型はStringです) 【やりたいこと】その(1) A行DATA3だけとかP行DATA5だけとか特定のデータを取り出して いくつかのラベルのCaptionやテキストBoxのテキストにしたいです。 【やりたいこと】その(2) A行DATA2からZ行DATA2のデータをひとつのCombBoxのAddItemにしたいです。 【やりたいこと】その(3) A行DATA2からA行DATA10のデータをそれぞれText2.text~Text10.Textに WhileやFor等を使って入れていきたいです。 (A行DATA2→Text2.text、A行DATA3→Text3.text、・・・A行DATA10→Text10.text) 最終的にはZ列DATA10まで回したいです。 どうぞ回答の程宜しくお願いいたします。

  • VBA でCSV集計

    VBAをはじめて1ヶ月のものです。 VBAの集計ツールを作成していますが 思うようにいかず、お知恵をお借りしたいと考えています。     abcというフォルダ配下に以下のように4桁の日付を示す フォルダが日付毎にあります。(いくつあるかはわかりません。) さらにその配下にいくつかのcsvファイルがおいてありますが aaa.csvというcsvのみ抽出し 最終的には合体.csvのような集計CSVを作成したいと考えています。 以上よろしくお願いいたします。 (1) abc → 0812フォルダ <aaa.csv>     A列     B列    C列 1行 100     200    8月12日                       2行 100     100 3行 200     200 4行 300     100 5行 100     100 6行 200     200 7行 400     100 8行 100     100 (2)abc → 0813フォルダ <aaa.csv>      A列     B列     C列 1行   0      300    8月13日              2行 100      100 3行 100      200 4行 100      200 5行 100      200 6行 300      200 7行 300      400 8行 200      100 ↓ (3)<合体.csv>     A列     B列      C列     D列     E列     F列     G列    (日付)  (A1~A4計)(A5~A8計)(合体B+C)(B1~B4計)(B5~B8計)(合体E+F) 1行 8月12日   700      800     1500     600     500     1100 2行 8月13日   300      900     1200     800     900     1700

  • ExcelマクロCSV出力 行に連番をつける

    Private Sub CommandButton1_Click() ' 実行したPCのDドライブに保存 Open "D:\data1.csv" For Output Access Write As #1 ' データシートのB17からB列にデータが入っている行のみを出力 ' もしB列にデータがあり、値が「ああ」なら区分を「1」に「いい」なら「2」に置き換える With Sheets("データ") Print #1, "区分" & "," & "ID" & "," & "名前" For intRow = 17 To .Range("B" & Rows.count).End(xlUp).Row If Trim(.Cells(intRow, 2).Value) <> "" And .Cells(intRow, 2).Value = "ああ" Then Print #1, Replace(.Cells(intRow, 2), "ああ", "1") & "," & Trim(.Cells(intRow, 3)) & "," & Trim(.Cells(intRow, 4)) ElseIf Trim(.Cells(intRow, 2).Value) <> "" And .Cells(intRow, 2).Value = "いい" Then Print #1, Replace(.Cells(intRow, 2), "いい", "2") & "," & Trim(.Cells(intRow, 3)) & "," & Trim(.Cells(intRow, 4)) End If Next intRow End With Close #1 End Sub ------------------------------------------------------------- 上記のロジックで「データ」シートのB17からD列の最終行までをCSV出力しています。 その際、(1)B列に値が入った行のみを出力する(A列が空白なら無視し次の行へ) (2)B列の値が「ああ」ならCSVファイルで「1」に、「いい」なら「2」に置き換え というロジックを加えています。 このコードに、CSV出力時の最終項目(名前の後ろ)に連番を項目として追加する ロジックを追加したいのですが、方法がわかる方いらっしゃいますか? CSVファイルは下記のようなイメージです。 区分,ID,名前,連番 1,9999,太郎,1 2,8888,花子,2 1,7777,一郎,3 1,6666,次郎,4 どなたか教えてくださいm(__)m!!

  • CSVでファイルを出す方法

    excelにデータをVBAを使い書き出しています。例えば、 cells(行1、列1).Value=data1 cells(行1、列2).Value=data2 cells(行1、列3).Value=data3 cells(行2、列1).Value=data4 cells(行2、列2).Value=data5 ...... と1行書き込んだら次の行へ、次の行へといった具合に書き込んでいます。 excelなので直接セルを指定して書き込むことができていますが、excelの かわりにcsvとして書き込みをしたい場合、どのような処理をしてテキストに 出せばよいのでしょうか?

  • VBAでCSVファイルをインポートする方法について

    VBAでCSVファイルをインポートする方法について OS:ウィンドウズXP Access Version:2000 AccessVBAでcsvファイルをインポートするマクロを作っています。 現在、インポート定義を利用して、データ型を指定したインポートができているのですが、1点だけ問題があり、質問します。 インポートするcsvファイルのA列にIDが入力されています。 そのA列の末尾に、ID(数値型)ではない「<b>32</b><br />」という値が入っています。 Accessのテーブルでは、このIDのフィールドは数値型で管理している為、この1レコードだけ エラーとなり、エラーテーブルが作られ、また、インポート先のテーブルには空のレコードができてしまいます。 この末尾の行については、IDではない「<b>32</b><br />」以外は何もデータが入っていない為、 インポートする必要がありません。 もし可能であれば、csvファイルのA列(Accessテーブルでは数値型のIDというフィールド)が数値ではない場合、 その行のインポートをスキップするような処理がVBAで作成できるとよいのですが、可能でしたら教えてもらえないでしょうか。 ※以下はVBAを作成する為に仮に用意し、読込を行っているcsvファイルと、VBAソースになります。 ○csvファイル名:インポート用csvファイル.csv 内容: ID,テキスト1,テキスト2,テキスト3,テキスト4,メモ1,メモ2, 1,a,A,z,Z,あ,ん, 2,b,B,y,Y,い,を, 3,c,C,x,X,う,わ, 4,d,D,w,W,え,ろ, 5,e,E,v,V,お,れ, 6,f,F,u,U,か,る, 7,g,G,t,T,き,り, 8,h,H,s,S,く,ら, 9,i,I,r,R,け,よ, 10,j,J,q,Q,こ,ゆ, <b>32</b><br />,,,,,, ○VBAソース Dim FN As String Dim Res As Integer WizHook.Key = 51488399 Res = WizHook.GetFileName(0, "", "", "", FN, "", _ "csvファイル(*.csv)|*.csv", 0, 0, 4, True) WizHook.Key = 0 If Res = 0 Then DoCmd.TransferText , "csvインポート定義", "インポートテーブル", FN MsgBox "csvファイルをインポートしました", vbOKOnly End If

  • エクセルVBAでのCSV出力方法について

    エクセルVBAを使ってCSVを出力しようとしているのですが、 狙った範囲を上手くCSV化することが出来ずに苦戦しています。 どなたかアドバイスを頂けませんでしょうか。 使用してるエクセルは2010になります。 シート2のコマンドボタンを押すことでシート1の内容をCSV化したいと考えています。 シート1のA1に入力した内容がCSVのタイトルになります。 2行目はヘッダーですが、CSVには反映しないように制御をかけています。 ↓が実際に書いてみたVBAですが、どうしてもシート1の内容を持ってきてしまいます。 どのように改修したらシート2の内容を持ってこれるでしょうか。 Private Sub CommandButton1_Click() Dim MyFile, FileType, Prompt As String Dim FileNamePath As Variant Dim StartRow, StartCol, EndRow, EndCol As Integer Dim Rowcnt, Colcnt As Integer Dim UsedCell As Range Dim ch1 As Long '対象のシートをアクティブにする Worksheets("シート1").Activate 'ファイル名の取得 MyFile = ActiveSheet.Range("A1") & ".csv" FileType = "CSV ファイル (*.csv),*.csv" Prompt = "保存するファイルの名前を付けてください" '保存するファイルのパスを取得します FileNamePath = SaveFileNamePath(MyFile, FileType, Prompt) If FileNamePath = False Then 'キャンセルボタンが押された End End If '空いているファイル番号を取得します ch1 = FreeFile 'FileNamePath のファイルをオープンします Open FileNamePath For Output As #ch1 '使用しているセルの取得 Set UsedCell = ActiveSheet.UsedRange StartRow = UsedCell.Cells(3).row StartCol = UsedCell.Cells(1).Column EndRow = UsedCell.Cells(UsedCell.Count).row EndCol = UsedCell.Cells(UsedCell.Count).Column For Rowcnt = StartRow To EndRow For Colcnt = StartCol To EndCol - 1 '改行を挿入しないで書き出す ; を最後に付ける Write #ch1, Cells(Rowcnt, Colcnt); Next '改行を挿入する Write #ch1, Cells(Rowcnt, EndCol) Next 'ファイルを閉じます Close #ch1 End Sub Function SaveFileNamePath(MyFile, FileType, Prompt) As Variant SaveFileNamePath = Application.GetSaveAsFilename(MyFile, FileType) End Function アドバイスを頂けたらと思います。 どうぞ宜しくお願いします。

  • VBA 1行のコードで表示したい。

    エクセルVBAです。 例えば、A1とB2に「a」と入力したい場合は、 Sub test1() Cells(1, 1) = "a" Cells(2, 2) = "a" End Sub とするしかないのでしょうか? Sub test2() Range(Cells(1, 1), Cells(2, 2)) = "a" End Sub だと、 A1、A2、B1、B2に「a」が入力されてしまいました。 test2のように、1行で離れているセルに「a」と入れる方法があれば教えて下さい。 (:は使わない方法です) ご回答よろしくお願い致します。

  • 下記エクセルVBAコード:改良 表

    下記エクセルVBAコードの中で Case "a" Case "b" Case "c" などの情報を処理していますが、その”a”、"b"、"c"の代わりに、$A$50~$A$52の表の中(ここにaとか入っている)のデータを用いて処理できるようにするには、どのようにコードを変更すべきでしょうか。よろしくお願いします。 Sub test01() d = Range("A65536").End(xlUp).Row j = 1 For i = 1 To d Select Case Cells(i, "a") Case "a" Case "b" Case "c" '---XXX Case Else Worksheets("Sheet2").Cells(j, "A") = Cells(i, "A") Worksheets("Sheet2").Cells(j, "B") = Cells(i, "b") 列や行やシートが変わっても、類推で変えられるでしょう。 '---YYY j = j + 1 End Select Next i End Sub

  • エクセルで1行にまとめられたCSVデータを複数行

    エクセルを使ってCSVファイルのデータを参照して複数行にまたがる表に反映させたいのですがうまくいきません。   A B C D E  1 あ い う え お 2 か き く け こ 上記のように1行で1件分のデータがCSVであります。 このデータを   A  B  C  D  E 1 あ う お 2 い え  3 か く こ 4 き け 上記のように参照させたいのです。 数件ならば1件1件を参照させれば表は完成するのですが、数千件あるのでできません。 1パターン作って、あとは連続フィルで出来れば助かります。 説明が難しく、わかりづらいかと思いますがお力をお貸しください。 よろしくお願いいたします。

  • 複数のcsvファイルをマクロ(VBA)で取り込みたい

    複数のcsvファイルをマクロ(VBA)で取り込みたい csvファイルの中身が、 20090507 120508 osaka 項目1,項目2,項目3,・・・・・,項目10 a1,a2,a3,・・・・・,a10 b1,b2,b3,・・・・・,b10 c1,c2,c3,・・・・・,c10 や 20090507 132529 hokkaido 項目1,項目2,項目3,・・・・・,項目10 d1,d2,d3,・・・・・,d10 e1,e2,e3,・・・・・,e10 f1,f2,f3,・・・・・,f10 となっているcsvファイルが特定のフォルダの中に100以上あります。 このcsvふぁいるの5行目だけをaccessに書き込んでテーブルに追加していきたいと思っています。 項目1,項目2,項目3,・・・・・,項目10 a1,a2,a3,・・・・・,a10 d1,d2,d3,・・・・・,d10 このようなテーブルができればいいのですが・・・ csvファイルを開く→5行目をテーブルに追加→csvファイルを閉じる(削除する)→次のcsvファイルを開く→5行目をテーブルに追加→csvファイルを閉じる(削除する) この流れでいいと思うのですが方法が分かりません。 丸投げですがよろしくお願いします。

専門家に質問してみよう