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

解決済みの質問

エクセル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

アドバイスを頂けたらと思います。
どうぞ宜しくお願いします。

投稿日時 - 2013-11-25 22:37:22

QNo.8361984

すぐに回答ほしいです

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

ご相談の書き間違いまで全部想定して「ご相談に書かれてることが全部正しければこう、ここが間違いてる場合はこう、あっちが間違いならこう」と回答しなきゃダメですかね。
まぁでも、こちらの回答1にもマクロの読み違いがあったので、一応チャラということで。



改めて。
でもふつーに各部で「ここはシート1から持ってくる」「こっちはシート2から持ってくる」と、丁寧に作成してみればよいだけでは。


 :
'ファイル名の取得
MyFile = worksheets("sheet1").Range("A1") & ".csv"  ’★
 :
'使用しているセルの取得
Set UsedCell = worksheets("Sheet1").UsedRange ’★
 :

Write #ch1, worksheets("Sheet1").Cells(Rowcnt, Colcnt);
 ;
Write #ch1, worksheets("Sheet1").Cells(Rowcnt, EndCol)


結局最後の2か所でシートを指定していないのが、直接の敗因です。
シートモジュールに記載したマクロでは、明示的にシートを修飾してない場合はアクティブシートじゃなく自シートを参照します。

投稿日時 - 2013-11-26 00:16:27

お礼

いつもご回答下さり、ありがとうございます。

シートをアクティブにしていれば、そちらを参照するものだと勘違いしていました。
ありがとうございました。
無事実行することが出来ました。

投稿日時 - 2013-11-27 00:39:05

ANo.5

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

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

回答(5)

ANo.4

> Worksheets("シート1").Activate
Worksheets("シート1").Select
としたらどうなります?

投稿日時 - 2013-11-26 00:05:21

お礼

ご回答ありがとうございます。
すみません、見逃してしまっていました。
早速試して見たいと思います。

投稿日時 - 2013-11-27 00:45:13

ANo.3

STEP実行中にクリックして切替る等、ご自身でActiveSheetを変更してませんか?

書き間違いとは「どこが」「どう」間違い?

投稿日時 - 2013-11-25 23:59:05

お礼

書き間違いはVBAそのものではなく、説明文の方です。
すみません。
シート1をCSV化したいのにシート2をCSV化したいと書いていました。

投稿日時 - 2013-11-27 00:42:54

ANo.2

> '対象のシートをアクティブにする
> Worksheets("シート1").Activate
コードのはじめで、シート1を指定してるじゃないですか。
そのままでデータ本体を出力し始めるから、シート1のまま。

ヘッダー処理が済んだら、シート2をActivateして下さい。
ファイルオープンの後かな

投稿日時 - 2013-11-25 23:16:24

お礼

すみません。
書き間違えてしまいました。

先ほどのVBAで実行しても、【シート2】の内容を持って来てしまう、の誤りです。
本当は【シート1】の内容を持って来ようと思っています。

失礼しました。
改めて教えて頂ければ嬉しいです。
宜しくお願い致します。

投稿日時 - 2013-11-25 23:47:27

ANo.1

はて??

ご相談の状況説明:
>シート2のコマンドボタンを押すことでシート1の内容をCSV化したいと考えています。
 :
>どうしてもシート1の内容を持ってきてしまいます。
>どのように改修したらシート2の内容を持ってこれるでしょうか。


実際のマクロ:
>'対象のシートをアクティブにする
>Worksheets("シート1").Activate
 :
>'使用しているセルの取得
>Set UsedCell = ActiveSheet.UsedRange
 :



あと、
>シート1のA1に入力した内容がCSVのタイトルになります。

このご説明も実際のマクロとは食い違っています。


--------------------------
それで結局。
ヤリタイ事:
1.CSVのファイル名はシート1記載の内容じゃなくて、マクロ動作中にインプットしたい
2.シート2のデータを書き出したい



現在のマクロの修正箇所
変更前:
'対象のシートをアクティブにする
Worksheets("シート1").Activate

変更後:
'対象のシートをアクティブにする
Worksheets("シート2").Activate

以上です。

投稿日時 - 2013-11-25 23:10:26

お礼

すみません。
書き間違えてしまいました。

先ほどのVBAで実行しても、【シート2】の内容を持って来てしまう、の誤りです。
本当は【シート1】の内容を持って来ようと思っています。

失礼しました。
改めて教えて頂ければ嬉しいです。
宜しくお願い致します。

投稿日時 - 2013-11-25 23:47:55

あなたにオススメの質問