
元のExcelデータがA~R列まであり、それを加工してCSV形式で保存して納品する業務なのですが、
データ内に半角カンマ「,」が紛れ込んでいる可能性があります。
このままCSV保存すると、カンマの数が増える為に列がずれてしまいます。
また、セル内改行コードが混入している場合があり、同じくCSV保存すると
開いた時にレイアウトが崩れてしまいます。
これらの対応として手作業で以下の操作をしています。
・G列とH列のみ半角カンマ「,」→全角句読点「、」に置換
・シート全体(もしくはA~R列)内の改行コード(Ctrl+J)を削除
しかし理由は不明なのですが、置換で(Ctrl+J)をnullに置き換えたのに、
CSV保存した後に確認すると不要な場所で改行されてしまっている場合があります。
「Ctrl+J」と違うコードが存在するのでしょうか?(単なる手作業ミスかもしれません)
とりあえず上記のカンマの置換作業と、Ctrl+Jを削除する作業をマクロで行えば見落としもなくなるのかなと思いまして。
また、加工の為に左の列に作業列を挿入するため、A~R列が、I~Z列にずれますので(A~H列が作業列)、
更に、1行目の項目名の行もCSV保存する時は不要なため、
2行目以降、I~Z列の部分をCSV保存したいです。(結果的にA~R列のCSVになる)
上記、置換と削除のコードと、
指定範囲だけ対象にCSV保存するコードを教えて頂けないでしょうか?
No.4ベストアンサー
- 回答日時:
やっぱり、
成り行きなので割愛しようと思いましたが、サンプルは多い方が良いかも、、と 書き直してみました
Sub make_csv()
Dim csvData As String ' CSV に書き込む全データ
Dim lineData As String
Dim TrgRange As Range
Dim R As Range, Cell As Range
With ActiveSheet
Call .Range("G:H").Replace(What:=",", Replacement:=",", LookAt:=xlPart, MatchCase:=True)
Call .UsedRange.Replace(What:=",", Replacement:="", LookAt:=xlPart, MatchCase:=True)
Call .UsedRange.Replace(What:="vbLf", Replacement:="", LookAt:=xlPart, MatchCase:=True)
' 見出し行を取り除く対象範囲
Set TrgRange = .Range("I2", Cells(Rows.Count, "Z").End(xlUp))
End With
For Each R In TrgRange.Rows ' 行ループ
lineData = ""
For Each Cell In R.Columns ' 列ループ
If lineData = "" Then
lineData = Cell.Value
Else
lineData = lineData & "," & Cell.Value
End If
Next
If csvData = "" Then
csvData = lineData
Else '改行
csvData = csvData & vbCrLf & lineData
End If
Next
Call FSO_csv(csvData)
End Sub
Sub FSO_csv(csvData As String)
Dim fso As Object, TS As Object ' TextStream
Set fso = CreateObject("Scripting.FileSystemObject")
Dim ex_csvPath As String, ex_csvFileName As String
ex_csvPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"
ex_csvFileName = "TEST.csv"
Set TS = fso.OpenTextFile(Filename:=ex_csvPath & ex_csvFileName, _
IOMode:=2, Create:=True)
TS.Write (csvData) ' 書き込み
TS.Close
Set TS = Nothing
Set fso = Nothing
End Sub
No.3
- 回答日時:
#2です
>dataRow = 2 の行の下に、
「With ActiveSheet ~ End With」文を挿入すればと考えてます。
大丈夫だと思いますが、With Worksheets(sheet_name)の中(次の行)に入れるのであれば、With ActiveSheetとEnd Withは不要です。
>改行削除は
中のCall文1行を複製して、「What:=vbLf」にすれば良いでしょうか。
ですね。
>すると以下のReplace分は重複処理で意味がないけどそのままでもOK
TS.Write Replace(Replace(Worksheets(sheet_name).Cells(dataRow, i).Value, vbLf, ""), ",", "、") & "," ' レコードを出力
確かに無駄ですので
TS.Write Worksheets(sheet_name).Cells(dataRow, i).Value & ","
でOKかな。
Replaceがメインのご質問と思い、添削コードで参考になればと回答してしまいましたが、少し変かも知れません。
End Withの位置をTS.Closeの後でもOKだと思います。
その場合、
TS.Write .Cells(dataRow, i).Value & ","
CSV出力を考えると、、CSVは区切り文字で区切られたテキストなので
ループ内でCSV用の文字列を作って
一度に TS.Write (csv用文字列)とした方が早いような気がします。
No.2
- 回答日時:
#1です
寝る前でしたので、思考が停止していたような、、回答でした。
作業列の入り方が良く分からずCSV出力のみを考えていたようです。
>・G列とH列のみ半角カンマ「,」→全角句読点「、」に置換
>・シート全体(もしくはA~R列)内の改行コード(Ctrl+J)を削除
With ActiveSheet
Call .Range("G:H").Replace(What:=",", Replacement:=",", LookAt:=xlPart, MatchCase:=True)
Call .UsedRange.Replace(What:=",", Replacement:="", LookAt:=xlPart, MatchCase:=True)
End With
こんな感じでどうでしょう?
.UsedRange 使用されている範囲を指定しています。
Replaceメソッドなので遅めの処理になります
Application.ScreenUpdatingなど対策が必要かも、、です。
少し気になるのは、他のフォーマットなどは大丈夫なのかな、、数値のみのセルや日付、時間など、、別の話ですね。
ありがとうございます。
dataRow = 2 の行の下に、
「With ActiveSheet ~ End With」文を挿入すればと考えてます。
改行削除は
中のCall文1行を複製して、「What:=vbLf」にすれば良いでしょうか。
すると以下のReplace分は重複処理で意味がないけどそのままでもOK
TS.Write Replace(Replace(Worksheets(sheet_name).Cells(dataRow, i).Value, vbLf, ""), ",", "、") & "," ' レコードを出力
または、
TS.Write
だけでも良いのでしょうか?
完成に近づいてきました。
よろしくお願いいたします<m(__)m>
No.1
- 回答日時:
こんばんは、
>加工の為に左の列に作業列を挿入するため
>更に、1行目の項目名の行もCSV保存する時は不要なため、
加工もVBAで行えば良いように思いますが、、
>2行目以降、I~Z列の部分をCSV保存したいです。
手元にある使い廻しコードですが、ご質問に合わせて
変えてみました。参考になりますか、、
FSOに関しては、他の処理の為に採用していますが、
処理速度などの問題があるようでしたら、CreateObject("ADODB.Stream")など、他の方法に書き直してください。
Sub Sample()
Dim ex_csvPath As String, ex_csvFileName As String, sheet_name As String
ex_csvPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"
ex_csvFileName = "TEST.csv"
sheet_name = "test"
Call FSO_Ex_CSV(ex_csvPath, ex_csvFileName, sheet_name)
End Sub
Sub FSO_Ex_CSV(ex_csvPath As String, ex_csvFileName As String, sheet_name As String)
Dim fso As Object, TS As Object ' TextStream
Set fso = CreateObject("Scripting.FileSystemObject")
Dim strREC() As String
Dim MaxRow As Long, i As Long
Dim dataRow As Long ', Maxcol As Long
dataRow = 2
With Worksheets(sheet_name)
MaxRow = .Cells(Rows.Count, "I").End(xlUp).Row
If .FilterMode Then .ShowAllData
End With
Set TS = fso.OpenTextFile(Filename:=ex_csvPath & ex_csvFileName, _
IOMode:=2, Create:=True) 'ForWriting
Do Until dataRow > MaxRow
For i = 9 To 26 'Maxcol
TS.Write Replace(Replace(Worksheets(sheet_name).Cells(dataRow, i).Value, vbLf, ""), ",", "、") & "," ' レコードを出力
Next i
TS.WriteLine '改行
dataRow = dataRow + 1
Loop
TS.Close
Set TS = Nothing
Set fso = Nothing
End Sub
ありがとうございます。動作確認しました。
せいぜい1,000行位で、処理速度も気にする必要なさそうです。
置換後の文字が句読点「、」じゃなくて全角カンマ「,」でしたのでソースを直しました。
あと、G列とH列のカンマを全角化の後、
シート全体から半角カンマを取り除きたいのです。
そうすればG列とH列からカンマは消えないはず。
他の列の半角カンマ混入も取り除きたいです。
可能ならお願いなのですが、
置換作業をシート内に反映した後に
↓
CSV保存
の順番に出来ないでしょうか?
半角カンマや改行コードは、エラー条件になるため元のブックも解消した上で保管しておきたいのです。(書き出すCSVだけ直したいのではない)
すみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) vbaマクロについて シート1のA列にある商品コードが シート2のB列にある商品コードに該当する場合 2 2023/05/17 13:41
- Visual Basic(VBA) vbaマクロについて 【1.csv】をもとに【商品.csv】に有るものを【有り.csv】として名前を 1 2023/05/18 07:58
- Visual Basic(VBA) VBAで出力したCSVファイルの先頭にカンマを挿入したい 5 2022/10/14 12:20
- Visual Basic(VBA) vbaマクロについて 次のようなマクロを組みたいです。 自分は初心者なので全くわかりません。 詳しく 8 2023/05/18 18:38
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- Visual Basic(VBA) 【VBA】特定の文字で改行(次の行)に行きたい。 3 2022/04/11 17:20
このQ&Aを見た人はこんなQ&Aも見ています
-
EXCELからCSVにすると余計なカンマがつきます
Excel(エクセル)
-
EXCELでCSVファイル保存するとデータが無いところにカンマ
その他(ソフトウェア)
-
Excel csv保存 列数が異なる場合に、余分にカンマをつけない(ヘッダとデータの列数を変える)
Excel(エクセル)
-
-
4
【Excel】 csvの作成時、空白セルにもカンマ
Excel(エクセル)
-
5
エクセル:セル内の文字列の最後の「,]を消したい。
その他(Microsoft Office)
-
6
Excelマクロ 空白セルを無視してCSV出力
Excel(エクセル)
-
7
CSV形式にすると出てくる空白を消したいです。
その他(Microsoft Office)
-
8
エクセルマクロで「1」を「01」に変換したい
Excel(エクセル)
-
9
VBAでCSVをExcelに取り込む時に、途中の改行を取り除くには
Visual Basic(VBA)
-
10
マクロの「SaveAs」でエラーが出るのを解消したいです(再)
Visual Basic(VBA)
-
11
カンマ区切りの数字をCSVファイルにインポートする時どうすれば?
Excel(エクセル)
-
12
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
13
Excel-vba 文字列と変数を連結して更に変数として扱いたい
その他(プログラミング・Web制作)
-
14
エクセルVBA テキストボックスに3桁ごとにコンマ
Visual Basic(VBA)
-
15
VBA 数式を残して値をクリアについて
Excel(エクセル)
-
16
VBAで「,」⇒「.」へ置換後、タグ区切りでテキスト保存したい。
Excel(エクセル)
-
17
カンマ区切りのCSVファイルから"を削除したい
その他(プログラミング・Web制作)
-
18
特定のPCだけ動作しないVBAマクロがあります。その理由は?
Visual Basic(VBA)
-
19
VBA セル内で改行またはカンマを含む場合「””」で括る為の処理
Excel(エクセル)
-
20
VBAでの Replace関数で、ワイルドカードは使えないのでしょうか?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで、あるセルの値に応じて...
-
Worksheets メソッドは失敗しま...
-
B列の最終行までA列をオート...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
URLのリンク切れをマクロを使っ...
-
データグリッドビューの一番最...
-
VBA 何かしら文字が入っていたら
-
IIF関数の使い方
-
VBAのFind関数で結合セルを検索...
-
マクロについて。S列の途中から...
-
VBAで重複データを確認したい
-
文字列があるセルを認識したい...
-
VBAでのリスト不一致抽出について
-
【VBA】2つのシートの値を比較...
-
エクセル 2つの表の並べ替え
-
オートフィルタをマクロで作成...
-
Changeイベントでの複数セルの...
-
DataGridViewにリンク列の追加...
-
EXCEL2010VBAで重複しない名前...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで、あるセルの値に応じて...
-
vba 2つの条件が一致したら...
-
Worksheets メソッドは失敗しま...
-
B列の最終行までA列をオート...
-
Cellsのかっこの中はどっちが行...
-
IIF関数の使い方
-
Changeイベントでの複数セルの...
-
【VBA】2つのシートの値を比較...
-
VBA 何かしら文字が入っていたら
-
URLのリンク切れをマクロを使っ...
-
VBAのFind関数で結合セルを検索...
-
DataGridViewに空白がある場合...
-
VBAを使って検索したセルをコピ...
-
文字列の結合を空白行まで実行
-
データグリッドビューの一番最...
-
VBAでのリスト不一致抽出について
-
エクセル 2つの表の並べ替え
-
rowsとcolsの意味
-
【Excel VBA】 B列に特定の文字...
-
VBA 列が空白なら別のマクロへ...
おすすめ情報
ありがとうございます。
"vbLf" はダブルクォーテーションを取らないといけないですよね?
まだ引き続き、検証中です。
非常に助かります。