
質問内容の画像を添付いたします。
SHEET1のエクセルのデータをもとに
SHEET1変換イメージに文字を置換、行の追加を実施
最後に変換後をCSV出力する。
★ご質問させていただきたい内容
1点目
画像のシート1について
5行目のレコードですが、C4,D4,E4,...最終列をもとに
Sheet1変換イメージのように行を追加する方法
2点目
「○」であれば01に置換「×」であれば02に置換する。
CSV出力についてはネットでググりながら出力することができたのですが、
文字列を追加したり、行を追加したりなどの方法がわからず、ご教授お願いいたします。

No.2ベストアンサー
- 回答日時:
こんばんは、
ご質問の回答ではありません。
少し気になったのは01 02
これをただセルに書き込むと1とか2になってしまうと思いました
データ加工(操作)をシート経由でCSVにする場合、少し面倒ではないかと、、
'を付けておけば良いだけかもしれませんが、、
シートで目視する必要がないのなら、直接CSVに出来るデータを作成する方が良いかも、、と思います。
スキルをお持ちと思いますので サンプルで示します。
Sub CSV_Text()
Dim csvData As String
Dim lineData As String
Dim pointKey As String
Dim TrgRange As Range, R As Range, CEL As Range
With ActiveSheet
With .Range("A5").CurrentRegion
Set TrgRange = Intersect(.Cells, .Offset(1).Cells)
End With
csvData = ""
For Each R In TrgRange.Rows ' 行ループ
For Each CEL In R.Columns
If CEL.Value = "○" Or CEL.Value = "×" Then
If CEL.Value = "○" Then
pointKey = "01"
Else
pointKey = "02"
End If
lineData = .Cells(CEL.Row, 1) & "," & .Cells(CEL.Row, 2) & "," & .Cells(4, CEL.Column) & "," & pointKey
If csvData = "" Then
csvData = lineData
Else '改行
csvData = csvData & vbCrLf & lineData
End If
End If
Next
Next
End With
Worksheets("Sheet2").Range("A1") = csvData ' CSV に書き込む全データ
End Sub
csvDataをOpenTextFileなどでcsv保存すればcsv作成できると思います。
サンプル
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) ' CSV書き込み
TS.Close
Set TS = Nothing
Set fso = Nothing
End Sub
回答ありがとうございます。
FileSystemObjectについて知識がなかったので
ぐぐってみました。
参照設定からMicrosoft Scripting Runtimeをクリックして
外部ライブラリーを参照できるようにしたのですが
サンプルをモジュールに記載したのですがマクロとして実行しようにも
どこから実行していいのかわかりませんでした。
※マクロとして選択できない?
すみません。私の知識不足もありご教授お願いできますでしょうか。
No.3
- 回答日時:
こんにちは
#2の
Sub CSV_Text() と
Sub FSO_csv(csvData As String)が同じ標準モジュールに書いてあるとして
Sub CSV_Text()の行末前の
Worksheets("Sheet2").Range("A1") = csvDataを置き換えるか
又は、次の実行行に
Sub FSO_csv(csvData As String)を呼びます
方法はCall します。
Next '既存コード
End With '既存コード
'Worksheets("Sheet2").Range("A1") = csvData '(不要なら削除)
Call FSO_csv(csvData)
End Sub
>参照設定からMicrosoft Scripting Runtimeをクリックして外部ライブラリーを参照できるようにしたのですが
Set fso = CreateObject("Scripting.FileSystemObject")
実行時バインディングにしてありますので事前の参照は不要です。
(デメリットは作成時プロパティ参照などが出来ないのと、実行速度が少し遅いくらい?と解釈しています)
回答ありがとうございます。
同じ標準モジュールに記載して
コールで呼び出して使用する。理解できました。
ありがとうございます。
FSOについてネットでググってほかにどのような方法で使えるのか調べてみます。
No.1
- 回答日時:
ダサいけど例えばこれ
sheet2はあらかじめ準備して書式も文字列にしてください。
データ数わからないのでとりあえず例にあわせてます。
縦は空白でおしまい。
Sub test()
r = 5
rr = 1
For r = 5 To 100 '縦のデータ数により変更
If Cells(r, 1) = "" Then Exit Sub
For c = 3 To 5 '横のデータ数により変更
If Cells(r, c) = "〇" Then
Sheets("Sheet2").Cells(rr, 1) = Cells(r, 1)
Sheets("Sheet2").Cells(rr, 2) = Cells(r, 2)
Sheets("Sheet2").Cells(rr, 3) = Cells(4, c)
Sheets("Sheet2").Cells(rr, 4) = "01"
End If
If Cells(r, c) = "×" Then
Sheets("Sheet2").Cells(rr, 1) = Cells(r, 1)
Sheets("Sheet2").Cells(rr, 2) = Cells(r, 2)
Sheets("Sheet2").Cells(rr, 3) = Cells(4, c)
Sheets("Sheet2").Cells(rr, 4) = "02"
End If
rr = rr + 1
Next
Next
End Sub
回答ありがとうございます。
縦横で変数を持たせて、SHEET1のセルの内容をSHEET2のセルの内容にセットするに記載すれば実現できるということですね。
>For r = 5 To 100 '縦のデータ数により変更
> If Cells(r, 1) = "" Then Exit Sub
>For c = 3 To 5 '横のデータ数により変更
上記追加でご質問させてください。
縦のデータと横のデータが毎回変化する場合は
ご回答していただいた内容にそると
「100」と「5」を変数にし、範囲を指定する方法は可能なのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Visual Basic(VBA) VBAで出力したCSVファイルの先頭にカンマを挿入したい 5 2022/10/14 12:20
- Ruby power BI クエリエディター 〇〇を含む文字列置換 1 2022/10/16 17:34
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) A列にある値をB列・C列にVBAで切り出し 3 2022/04/09 19:20
- Visual Basic(VBA) VBA 検索と入力 Excel ブック ぶぶぶ シート ししし 列V 検索対象の列です 最終行は、お 6 2023/05/17 01:40
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- その他(Microsoft Office) WordやExcelで英数字のみ半角または全角にしたい 6 2022/08/03 08:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pythonについて質問です。 csv...
-
Pythonのコードエラーについて...
-
マクロで使うfor文
-
Pythonのエラーの原因がわかり...
-
バッチ処理でcsvの項目を変換す...
-
Excelマクロ 空白セルを無視し...
-
ファイル名を変数で書きこむfwr...
-
pythonのこのエラーがわかりません
-
指定回数の確認?
-
シムズ2のダウンロードフォルダ...
-
サーバにアップしたファイルを...
-
web色見本について
-
タグ初心者
-
動的ページから静的ページへ
-
スタイルシートに記述できる限...
-
バッチ処理 特定の文字以降を...
-
WEBサイトの背景に画像を付けたい
-
<textarea>に入れた数値を定型U...
-
プログラミングについて教えて...
-
TEXTファイルを日付・時刻で保存。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでcsvファイルもシートもあ...
-
Excelマクロ 空白セルを無視し...
-
【ExcelVBA】300万件越えCSVか...
-
ダブルコーテーション付きでCSV...
-
ファイル名を変数で書きこむfwr...
-
VBAで複数のCSVからレコードセ...
-
CSVデータの文字列置換
-
複数のファイルをまたぐエクセ...
-
CSVファイルの比較と結果の取得...
-
【C#】 csvファイルをバイナリ...
-
PowerShellからGhostscriptを動...
-
EXCEL→CSV保存時のダブルクォー...
-
VB.NETでオブジェクトの内容を...
-
パイソン文法で ファイルオープ...
-
VB.netでShellExecuteがしたい
-
PowerShellでファイルの連結方法
-
Rubyを使用してcsvファイルを処...
-
rubyを用いたCSVファイルの分割...
-
バッチファイルでcsvファイルに...
-
エクセルの任意のシートをcs...
おすすめ情報
For r = 5 To Cells(Rows.Count, 1).End(xlUp).Row '縦のデータ数により変更
If Cells(r, 1) = "" Then Exit Sub
For c = 3 To Cells(5, 1).End(xlToRight).Column '横のデータ数により変更
このように変更したら取得したい値が取れました。
ありがとうございます。