みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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のような手順で、処理を行う事が出来るのでしょうか?
アドバイス頂けたらと思います。<(_ _)>

投稿日時 - 2009-10-30 20:26:16

QNo.5409406

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

回答3,myRange、ミスあり。

最後の、
Application.ScreenUpdating = False  ●Falseがミス●

Application.ScreenUpdating = True
です。
 

投稿日時 - 2009-10-31 13:45:51

お礼

わざわざ本当にありがとうございますっ

感謝感謝ですっ^ー^わぁ~ぃ

投稿日時 - 2009-11-05 14:19:11

ANo.3

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
'---------------------------------------------------

以上です。
 

投稿日時 - 2009-10-31 13:41:08

お礼

書き込みありがとうございますっ
凄いです9ステップで処理が終わるなんて^^
なるほど、読み込む時に1行飛ばしで読み込んでおくんですねっ。
全然、気付かなかったですっ。メモメモ♪

投稿日時 - 2009-11-05 14:18:27

ANo.2

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

あくまでも一案です。

投稿日時 - 2009-10-31 06:33:17

お礼

ありがとうございます。
自分でも Insert を使うなんて発想が全然出てこなかったです。
凄いソースが短くなるんですねっ^^

あと、Merge等の関数はバッチリ調べさしてもらいましたっ^^
助かりましたっ^^

自分で作成した時は少しばかり急いでいたので、
新規にワークシートを作成して、一行づつ読み込む方法をとってしまいましたが、
もしかして、こちらの方が速かったりするのですか? きになるところですっ^^

投稿日時 - 2009-11-05 14:02:55

ANo.1

>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シート残した状態で保存すれば良いのでは。子コピーをとって扶養シートを削除するとか。
全体に、初心者のようで、言っていることが心もとない。
こんな細工(質問の処理)をするのは早すぎるのでは。

投稿日時 - 2009-10-30 23:19:32

補足

実際に本当に初心者なので
オープンの関数をどれ使ったらいいかとかも全く分からずチンプンカンプンでした

結局行った処理内容としまして

 新しいワークブックを作成し、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


一応こんな感じで動いてくれましたので、とりあえず今回は解決としますっ^^
皆さまありがとうございました

投稿日時 - 2009-11-05 15:16:35

お礼

お返事ありがとうございました。

>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


一応うまくいったので、後でまとめを乗せておきますねっ^^
返信んありがとうございましたっ^^

投稿日時 - 2009-11-05 13:50:23

あなたにオススメの質問