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

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

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

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

Q&A

解決済

3回答

3070閲覧

VBA 文字列の置換の除外ルールの設定方法

beambeam

総合スコア7

VBA

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

0グッド

0クリップ

投稿2020/09/14 03:00

こんにちは。
エクセルで、[貼り付け用シート]に張り付けたダウンロードデータを
[計算用シート]で文字列を入れたものを[保存用シート]に張り付けて、CSVで保存するVBAを作っています。

[貼り付け用シート]

コントロールカラム商品管理番号商品名
item-01送料無料 愛媛県産 みかん 蜜柑 10kg
item-02送料無料 愛媛県産 みかん 蜜柑 15kg
item-03送料無料 愛媛県産 みかん 蜜柑 20kg

[計算用シート]

コントロールカラム商品管理番号商品名
uitem-01【本日ポイント2倍】送料無料 愛媛県産 みかん 蜜柑 10kg
uitem-02【本日ポイント2倍】送料無料 愛媛県産 みかん 蜜柑 15kg
uitem-03【本日ポイント2倍】送料無料 愛媛県産 みかん 蜜柑 20kg

データは3000件に満たないものもあるので、不要データを削除したり、
ここまでは前任者のソースを切り貼りしてなんとか作成できたのですが、
「C列」の「商品名」の部分に半角スペースが多数入っているので同時に置換されてしまい困っています。
同じような動作をさせつつ、C行は除外する方法などありましたら教えていただきたいです。
よろしくお願いいたします。

▼▼▼

VBA

1Sub マクロ1() 2Sheets("計算用シート").Select 3Range("A1", "C3000").Copy 4Sheets("保存用シート").Select 5Range("A1").PasteSpecial Paste:=xlPasteValues 6Application.CutCopyMode = False 7 8 9 10Sheets("保存用シート").Select  11 Dim msg As String 12 Dim col_num As Long 13 Dim row_num As Long 14 Dim row_end As Long 15 Dim i As Long 16 17 18 col_num = ActiveCell.Column 19 row_num = ActiveCell.Row 20 21 row_end = Cells(Rows.Count, col_num).End(xlUp).Row 22 23 For i = row_end To row_num Step -1 24 If Len(Cells(i, col_num).Value) = 0 Then 25 Cells(i, col_num).Delete xlShiftUp 26 End If 27 Next i 28 29 30 Sheets("保存用シート").Select 31 32 Dim h As Range 33 Dim buf As String 34 Dim FileN As String 35 36 FileN = Application.GetSaveAsFilename( _ 37 InitialFileName:="\CSV_" & Format(Now(), "yyyymmddhhmm") & ".csv", _ 38 FileFilter:="CSV ファイル (*.csv), *.csv") 39 Open FileN For Output As #1 40 41 With Application 42 For Each h In Range("A1:A" & Range("A65536").End(xlUp).Row) 43 buf = Join(.Transpose(.Transpose(Range(h, Cells(h.Row, "IV")).Value)), " ") 44 buf = .Trim(buf) 45 buf = Replace(buf, " ", ",") 46 Print #1, buf 47 Next 48 End With 49 50End Sub 51 52

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

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

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

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

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

guest

回答3

0

ほとんど変更したくないのであれば一例として。
※どこにも「_」がない場合

vba

1With Application 2 For Each h In Range("A1:A" & Range("A65536").End(xlUp).Row) 3 buf = Join(.Transpose(.Transpose(Range(h, Cells(h.Row, "IV")).Value)), "_") 4 buf = .Trim(buf) 5 buf = Replace(buf, "_", ",") 6 Print #1, buf 7 Next 8End With

その場しのぎで根本的解決ではありませんが、
勉強していくうちに改善されるのも良いと思いました。

投稿2020/09/14 04:14

radames1000

総合スコア1925

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

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

beambeam

2020/09/15 04:57

なるほど、こういう考え方もあるのですね!答えは同じなのにいろいろな書き方があって、とても勉強になりました。ありがとうございます。
guest

0

3列だけなら単純に & で繋げはいいのでは。

vba

1 With Application 2 For Each h In Range("A1:A" & Range("A65536").End(xlUp).Row) 3 buf = h.Value & "," & h.Offset(0, 1).Value & "," & h.Offset(0, 2).Value 4 Print #1, buf 5 Next 6 End With

Join と Transpose を使うなら、

vba

1 With Application 2 For Each h In Range("A1:A" & Range("A65536").End(xlUp).Row) 3 buf = Join(.Transpose(.Transpose(h.Resize(1, 3).Value)), ",") 4 Print #1, buf 5 Next 6 End With

投稿2020/09/14 03:48

編集2020/09/14 03:56
hatena19

総合スコア34075

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

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

beambeam

2020/09/15 04:58

2つも回答をいただいてありがとうございます。 Transpose については初めて聞いた言葉なので、もう少し勉強してみたいと思います。
guest

0

ベストアンサー

なんで折角Joinしているのに、その場でカンマで結合しないんでしょうか。
列がIVまでと多めに取っているようなので、行ごとに列数が違うのでしょうか。
という前提で必要な列数分のみをJoinで結合すればよいと思いますので、以下でいかがでしょうか。
IV列がMAXと考え、その次のIW列から左方向にある最後の列までを結合します。

VBA

1For Each h In Range("A1:A" & Range("A65536").End(xlUp).Row) 2 buf = Join(.Transpose(.Transpose(Range(h, Cells(1, "IW").End(xlToLeft)))), ",") 3 Print #1, buf 4Next

投稿2020/09/14 08:45

ttyp03

総合スコア17000

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

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

radames1000

2020/09/14 23:56

列がIVで行が65536なので昔のExcelの最大をとっているように見えますね。 作られた前任者の意図としては全範囲なのかもしれません。
beambeam

2020/09/15 05:00 編集

A65536の意味が今までわからなかったのですが、最大値ということだったのですね。 行ごとに列数が違うわけではないのですが、目からうろこでした。BAとさせてください。 めげずにもう少し勉強してみようと思います!ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問