- 締切済み
VBA シート1だけを保存する
VBA シート1だけを保存する こんにちは、VBA初めてまもない初心者です よろしくお願いします 動作環境として、OS:XP excel:excel2007 を使用しています VBA で CSV データを取込む際にCSV データのとある項目以降から 2行目にして更にセルを結合しようと思っていたのですが どうやら、VBAだとワンアクションじゃ出来ないことに気がつきました。 例: ※1行の例です。実際にはこのCSVデータが1000行近く有ります (CSV data) "AAA","BBB","CCC","DDD","EEE","FFF" ↓ (VBAのみではワンアクションでは出来ませんでした) (excel) A B C D 1行目 AAA BBB CCC DDD 2行目 EEE FFF //EEEは[2A,2B]のセル、 FFFは[2C,2D]のセル ですので、やり方を切り替えて 1・1度CSVデータをエクセルシート1に取込む 2・シート2でセルの枠の結合やサイズ等を変更しながら、シート1の内容を参照する (注意:コピーではなく参照です) 3・シート2の部分だけを保存する、もしくはシート1の内容を削除する 1-3のような手順で、処理を行う事が出来るのでしょうか? アドバイス頂けたらと思います。<(_ _)>
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- myRange
- ベストアンサー率71% (339/472)
回答3,myRange、ミスあり。 最後の、 Application.ScreenUpdating = False ●Falseがミス● は Application.ScreenUpdating = True です。
- myRange
- ベストアンサー率71% (339/472)
CSVを読み込んだ後からのコード、一案。 読み込みデータ最終列(F列)の次の列から(G列~J列)に結果を入れ 処理済後に、A~F列を一気に削除する。 '------------------------------------------------ Sub Test() Dim R As Long Dim R2 As Long Application.ScreenUpdating = False For R = 1 To Cells(Rows.Count, "A").End(xlUp).Row R2 = (R - 1) * 2 + 1 Cells(R2, "G").Resize(1, 4).Value = Cells(R, "A").Resize(1, 4).Value Cells(R2 + 1, "G").Resize(1, 2).Merge Cells(R2 + 1, "G").Value = Cells(R, "E").Value Cells(R2 + 1, "I").Resize(1, 2).Merge Cells(R2 + 1, "I").Value = Cells(R, "F").Value Next R Columns("A:F").Delete xlLeft Application.ScreenUpdating = False End Sub '--------------------------------------------------- 以上です。
お礼
書き込みありがとうございますっ 凄いです9ステップで処理が終わるなんて^^ なるほど、読み込む時に1行飛ばしで読み込んでおくんですねっ。 全然、気付かなかったですっ。メモメモ♪
- n-jun
- ベストアンサー率33% (959/2873)
Excel2002環境なので2007での実行についてはわかりませんが。 (CSV data)をExcelで普通に開きます。 A列~F列×データ数行で表示されると思います。 下のコードを貼付けて実行。 その後、名前をつけてBookとして保存するなり新しいブックにデータだけ貼付ける。 Sub try() Dim i As Long Application.ScreenUpdating = False ' A列の最終行から2行目までをループ For i = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1 With Range("A" & i + 1) .Resize(, 2).Merge 'i行の1行下のA列とB列をセル結合 .Value = Range("E" & i).Value 'i行のE列の値を結合セルに代入 Range("E" & i).ClearContents 'i行のE列の値をクリア End With With Range("C" & i + 1) '上記作業をC・D・F列に対して実行 .Resize(, 2).Merge .Value = Range("F" & i).Value Range("F" & i).ClearContents End With Range("A" & i).EntireRow.Insert Shift:=xlDown Next With Range("A2") '上記作業を1行目のA・B・E列のデータに対して実行 .Resize(, 2).Merge .Value = Range("E1").Value Range("E1").ClearContents End With With Range("C2") '上記作業を1行目のC・D・F列のデータに対して実行 .Resize(, 2).Merge .Value = Range("F1").Value Range("F1").ClearContents End With Application.ScreenUpdating = True End Sub あくまでも一案です。
お礼
ありがとうございます。 自分でも Insert を使うなんて発想が全然出てこなかったです。 凄いソースが短くなるんですねっ^^ あと、Merge等の関数はバッチリ調べさしてもらいましたっ^^ 助かりましたっ^^ 自分で作成した時は少しばかり急いでいたので、 新規にワークシートを作成して、一行づつ読み込む方法をとってしまいましたが、 もしかして、こちらの方が速かったりするのですか? きになるところですっ^^
- imogasi
- ベストアンサー率27% (4737/17069)
>2C,2D]のセルなんて書いている人に、こんなVBAが作れるのかな。丸投げで、回答のわけもわからず、コピー実行になるだろう。 (1) CSVファイルで "AAA","BBB","CCC","DDD","EEE","FFF" を "AAA","BBB","CCC","DDD" と "EEE",,"FFF" の 別レコードに組み替えて、別CSVファイルを作り エクセルに読み込ませ、偶数行のAB列、CD列をVBAでセル結合する手はある。 ーーー (2) CSVファイルをよみ、"AAA","BBB","CCC","DDD",は横1行(A-D列)にせっとし、"EEE",,"FFF" は、次の行のA,C列にセットし、あとの行のA,B列とC,D列は セル結合する。 こういうプログラムを組めば良い。 CSVファイルの読み方 Split セルの各列の値をセット などを勉強のこと。 === >VBA シート1だけを保存する と前期のことは何の関係があるのか。 これはこれなりに1シートだけにして保存しないと、何番目のシートだけ残し、他のシートは削除し保存はVBAで指示できない。 削除しても良いシートならVBAで削除して、1シート残した状態で保存すれば良いのでは。子コピーをとって扶養シートを削除するとか。 全体に、初心者のようで、言っていることが心もとない。 こんな細工(質問の処理)をするのは早すぎるのでは。
お礼
お返事ありがとうございました。 >2C,2D]のセルなんて書いている人に、こんなVBAが作れるのかな。 丸投げで、回答のわけもわからず、コピー実行になるだろう。 >すみませんコードが聞きたかったんではなく、 考え方があっているのか?、こんな方法じゃないと無理なんじゃない?とか または、一番手数の少ない方法をご教授いただきたかったのです 丸投げにしてるつもりはないので、文章を気をつけますね >別レコードに組み替えて、 別CSVファイルを作りエクセルに読み込ませ、偶数行のAB列、CD列をVBAでセル結合する手はある。 色々やってみる時間がなかったなりに 色々やってみた結果、imogasi さんと大体同じ方法を使いました^^ > CSVファイルをよみ、 "AAA","BBB","CCC","DDD",は横1行(A-D列)にせっとし、 "EEE",,"FFF" は、次の行のA,C列にセットし、 あとの行のA,B列とC,D列は セル結合する。 こういうプログラムを組めば良い。 CSVファイルの読み方 Split → 参考になりました^^ セルの各列の値をセット などを勉強のこと。 >>VBA シート1だけを保存する >と前期のことは何の関係があるのか。 一番手順の少ない内容が、シート1だけ保存する事なのかな?って思い タイトルをこの名前にしてみたんですけど、分かりずらかったですねっ。 >これはこれなりに1シートだけにして保存しないと、何番目のシートだけ残し、他のシートは削除し保存はVBAで指示できない。 >全体に、初心者のようで、言っていることが心もとない。 >こんな細工(質問の処理)をするのは早すぎるのでは。 →すいませんVBA触るの3日日目ぐらいの初心者です。 IF文の書き方さえままならないので、 使う時に毎回大きな本を開いてみてますけどw 一応うまくいったので、後でまとめを乗せておきますねっ^^ 返信んありがとうございましたっ^^
補足
実際に本当に初心者なので オープンの関数をどれ使ったらいいかとかも全く分からずチンプンカンプンでした 結局行った処理内容としまして 新しいワークブックを作成し、1ラインづつ読み込んで セルサイズ等決めながら、データ値をセットしていく方法をとりました 1.新しいワークブックを開きます(Workbooks.Add) マクロ付のファイルでデータを取込んでセーブしようとしたところ マクロまでくっついてセーブされてしまったため、新規ファイルを作りました。 2.初期設定を行いました ・使用シート、ブック、 ・表示形式変更 Selection.NumberFormatLocal = "@" 'セル内容を文字列に変更 ・横幅変更 .ColumnWidth = で横幅の変更 3.ファイル読込 a. Open 関数を使いファイルを開きました Workbooks.OpenTextはライブラリが必要だったので 自分のPC以外で使う場合は設定が必要なのであきらめました 【1ラインずつの処理】 b.Line Input関数を使いEOF まで一行づつ読込みます Do Until EOF(fp) d.高さの変更 ・・・ (.RowHeight = ) e.罫線を引く ・・・ (.Borders.LineStyle = xlContinuous) f.セルの結合 ・・・ .Range(cell(), cell()).Merge g.1ラインデータの取得 ・・・ Split(, """,") を使い h.不要文字のカット ・・・ Replace i.再繰返しワード変更 ・・・ Replace(buf(), ",", Chr(10)) カンマを改行に変換 j.図面の取込み ・・・ .Pictures.Insert k.図面縦横比固定 ・・・ Selection.ShapeRange.LockAspectRatio = True ' m.図面サイズ変更 ・・・ セルの大きさより図面が大きかったら縮小する l.図面出現位置設定 ・・・ .Top = と .Left = の設定 m.読込元ファイル削除 ・・・ Kill () Loop: n.終了処理 ・ファイルクローズ ・使用ブック、シート、レンジの解放 o.ファイル保存処理 ・名前を付けて保存 ・・・ ActiveWorkbook.SaveAs excel2007 以上ならば → FileFormat:=xlExcel9795, 以下ならば → FileFormat:=56 一応こんな感じで動いてくれましたので、とりあえず今回は解決としますっ^^ 皆さまありがとうございました
お礼
わざわざ本当にありがとうございますっ 感謝感謝ですっ^ー^わぁ~ぃ