質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1642閲覧

【VBA】全ての列の値を引用符で囲んでCSV出力するコードの書きかた

koburon

総合スコア30

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2023/01/11 04:20

編集2023/01/11 04:21

前提

VBAでボタンをクリックするとエクセルからCSVに出力するマクロを作っています。

該当のソースコード

CSV出力するコードです。
シート1行目にA1セルにシートのタイトル、2行目に表のタイトル行があります。
3行目から下のみを出力します。

VBA

1Sub CSV出力_詳細指定() 2 Dim Filename As String 3 Filename = Mid(ActiveWorkbook.Name, 1, InStrRev(ActiveWorkbook.Name, ".") - 1) & EXT 4 5 Dim Filepath As String 6 Filepath = ActiveWorkbook.Path & "\" & Filename 7 8 Call csv.Output(TargetSheet:=ActiveSheet, Filepath:=Filepath, _ 9 StartRow:=3, StartCol:=1, _ 10 WithQuoteCols:="1,2", _ 11 Charset:="utf-8") 12 13 MsgBox Filepath & "にCSVファイルを、文字コード「UTF-8」で出力しました。" & Chr(13) _ 14 & "3行目から下のみ出力しています。" & Chr(13) 15End Sub

実現したいこと

上のコードでは、対象範囲の1列目と2列目をダブルクオーテーションで囲んで出力させますが、実際の表は50列まであるので、より広い範囲の列の値を「" "」で囲んで出力させたいです。

試したこと

5列目くらいまでの少ない範囲であれば

WithQuoteCols:="1,2,3,4,5",

と書けば良いですが、50までいちいち書くのは少し大変です。
省略の仕方を調べても見当たらなかったのですが、やはり面倒でも書くべきでしょうか。
なるべく少ないコードで書ける方法があれば、アドバイスいただけると幸いです。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

PC:Windows11
ソフト:Microsoft365 Excel

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/01/11 05:09

csv.Outputの中身は? それを改造すれば良いのでは?
sk.exe

2023/01/11 05:44 編集

> Call csv.Output(TargetSheet:=ActiveSheet, Filepath:=Filepath, _ > StartRow:=3, StartCol:=1, _ > WithQuoteCols:="1,2", _ > Charset:="utf-8") https://www.excelspeedup.com/csvsyuturyoku/ 上記の記事で紹介されている(ダウンロードしたマクロ有効ブックに保存されている) マクロを使用されている、ということでしょうか。 > 対象範囲の1列目と2列目をダブルクオーテーションで囲んで出力させますが、 > 実際の表は50列まであるので、より広い範囲の列の値を「" "」で囲んで出力させたい > 50までいちいち書くのは少し大変です。 csv モジュールのコードを改変して範囲指定を簡略化できるようにするか、 引数 WithQuoteCols に渡す文字列(列番号リスト)をコードによって生成する ようになさればよろしいでしょうけど、いずれにせよ For 文の使用が必須となるはず。
koburon

2023/01/11 05:40

コメントありがとうございます。 csv.Outputの内容が不足していました。 そうです、そちらのサイトで紹介されているマクロを使用しました。
guest

回答1

0

ベストアンサー

csv.Output はおそらく下記のサイトからダウンロードしたものですね。そのコードを書き換えてもいいとは思いますが、連番を生成する関数を作成してそれを利用すればどうでしょう。

【超簡単】ワンタッチでエクセルからCSV出力するVBAプログラム

標準モジュールに下記の関数を作成します。

vba

1Public Function GetSequence(minNum As Long, maxNum As Long) As String 2 Dim i As Long 3 For i = minNum To maxNum 4 GetSequence = GetSequence & "," & i 5 Next 6 GetSequence = Mid(GetSequence, 2) 7End Function

csv.Output を Call している部分のコードを下記のように書き換える。

vba

1 Call csv.Output(TargetSheet:=ActiveSheet, Filepath:=Filepath, _ 2 StartRow:=3, StartCol:=1, _ 3 WithQuoteCols:=GetSequence(1, 50), _ 4 Charset:="utf-8")

追記

Microsoft365ということなので、新関数の Sequence を使えば、自作関数を作成する必要はないですね。

vba

1 Call csv.Output(TargetSheet:=ActiveSheet, Filepath:=Filepath, _ 2 StartRow:=3, StartCol:=1, _ 3 WithQuoteCols:=Join(WorksheetFunction.Sequence(1,50),","), _ 4 Charset:="utf-8")

投稿2023/01/11 05:20

編集2023/01/11 05:51
hatena19

総合スコア33797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koburon

2023/01/11 05:51

回答ありがとうございます。 はい、その通り、上記のサイトに紹介されているマクロを使用しました。 関数を作成しコードを書き換え実行したところ、望み通り50列全ての項目に「""」が付いたCSVファイルができました。 テキストエディタで開いて確認済みです。 こちらをベストアンサーとさせていただきます、ありがとうございました。
koburon

2023/01/11 05:53

追記コメントありがとうございます。 新機能があったんですね。 こちらのコードも今後のため参考とさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問