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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Shopify

Shopifyとは、ECサイト向けのプラットフォームを提供している企業。さらに、その企業が提供するオンラインストアやPOSシステムを指します。高いデザイン性とカスタマイズ性が評価され、世界各国のネットショップで使用されています。

VBA

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

Q&A

解決済

2回答

2523閲覧

VBAによるカンマ区切り文字列→配列化→整列処理

JMS

総合スコア7

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Shopify

Shopifyとは、ECサイト向けのプラットフォームを提供している企業。さらに、その企業が提供するオンラインストアやPOSシステムを指します。高いデザイン性とカスタマイズ性が評価され、世界各国のネットショップで使用されています。

VBA

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

0グッド

0クリップ

投稿2020/05/02 06:26

編集2020/05/02 14:29

いま、日本郵政の郵送ラベルの自動作成をしたいと思っております。
そのためには、日本郵政のクリックポストというラベル発行サービスがあり、
そのサービスの指定したcsvをuploadしなければならず、それによりはじめてラベルが自動で印刷できる仕組みになっています。
そこで、そのサービスの指定したcsvを作りたいのですが、一つ一つの入力が大変で自動化したいと思っています

そこで、以下のようにしたいと思っています。

1.ECサイト(shopfy)の注文データの氏名住所データをコピー(氏名, 150-0000, 東京都 住所1,住所2,ビル名,日本)
2.これを日本郵政のサービス(クリックポスト)が求めるデフォルトcsvの入力欄外に上記カンマ区切りデータを貼付(以下codeでは10列目)
3.VBAを実行することで、上記カンマ区切りデータを並べ替えして入力欄に貼付

※問題は、注文者によって住所の描き方が違うことです。つまり住所1に全ての住所を記載する人もいれば、住所1に町名迄、住所2にビル名
など丁寧に分けて書く人がいることです。これにより配列の数が変わってきてしまい、以下のcodeではインデックスエラーが起こります。

ショッピファイの注文データが多く、クリックポストのCSVにするのが大変でどなたか助けてもらえませんでしょうか。

また、こちらの質問とは別件ですが、この方法ではショッピファイの注文を一人一人の画面を見て、その注文データの氏名住所をコピーしてと、まだ少し手間がかかるのですが、本当はなにかすれば、一気に未配送のデータをもとにクリックポストのcsvを作り出す良い方法があるように思っています。検索してもあまりでてこず、もしご存知の方がいらっしゃいましたら教えていただけますと本当に助かります。
御忙しい中恐縮です。

VBA

1Sub clickpostcsv_gen() 2 3 Dim LastRow As Long 4 LastRow = Cells(Rows.Count, 10).End(xlUp).Row - 1  5'あるcsvファイルの(2,10)セルにカンマ区切りデータを入力しておりその行数を調べています。LastRowには入力データ数が入ります。 6 7 Dim i As Long, tmp As Variant 8 For i = 1 To LastRow 9 tmp = Split(Cells(i + 1, 10), ",") 10 11 Cells(i + 1, 2) = tmp(0)  '(,2)が氏名入力欄です。 12 Cells(i + 1, 1) = tmp(1〉  '(,1)が郵便番号入力欄です。 13 Cells(i + 1, 4) = tmp(2)  '(,4)~(,6)が住所入力欄です。問題はここです。注文データによってはtmp(4)がなくインデックスエラーになるのです。 14 Cells(i + 1, 5) = tmp(3) 15 Cells(i + 1, 6) = tmp(4) 16 17 Next i 18End Sub

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

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

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

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

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

meg_

2020/05/02 06:49

コードは「コードの挿入」で記入してください。
JMS

2020/05/02 14:29

ありがとうございます。失礼致しました。修正させていただきました。
guest

回答2

0

ベストアンサー

"氏名1, 150-0000, 東京都 住所1,住所2,ビル名,日本" のデータが欠ける時に
"氏名2, 150-0001, 東京都 住所1,,,日本" のようにカンマが残されるなら
Splitで分割したときの番号と項目の対応はズレないので、以下のようなやり方で対処できそうです。
もし "氏名3, 150-0001, 東京都 住所1,日本" のように、カンマが無くて
途中が抜ける場合には、分割後に何らかの内容を判断して対応する項目に埋める必要があります。

VBA

1Sub clickpostcsv_gen() 2 3 Dim LastRow As Long 4 LastRow = Cells(Rows.Count, 10).End(xlUp).Row - 1  5 6 Dim i As Long, tmp As Variant 7 Dim columns as Long 8 9 Dim CustomerName as String 10 Dim ZipCode as String 11 Dim Address1 as String 12 Dim Address2 as String 13 Dim BuildingName as String 14 Dim CountryName as String 15 16 For i = 1 To LastRow 17 tmp = Split(Cells(i + 1, 10), ",") 18 columns = UBound(tmp) 19 CustomerName = "" 20 ZipCode = "" 21 Address1 = "" 22 Address2 = "" 23 BuildingName = "" 24 CountryName = "" 25 'カラム数が1〜6でない時は 26 If columns > 6 Or columns < 1 Then 27 GoTo CONTINUE 'その行を飛ばす 28 ' BuildingName = "Error" またはエラーメッセージを出力 29 End If 30 If columns > 5 Then 31 CountryName = tmp(5) 32 End If 33 If columns > 4 Then 34 BuildingName = tmp(4) 35 End If 36 If columns > 3 Then 37 Address2 = tmp(3) 38 End If 39 If columns > 2 Then 40 Address1 = tmp(2) 41 End If 42 If columns > 1 Then 43 ZipCode = tmp(1) 44 End If 45 If columns > 0 Then 46 CustomerName = tmp(0) 47 End If 48 49 Cells(i + 1, 1) = ZipCode 'お届け先郵便番号 50 Cells(i + 1, 2) = CustomerName 'お届け先氏名 51 Cells(i + 1, 3) = "様" 'お届け先敬称 52 Cells(i + 1, 4) = Address1 'お届け先住所1行目 53 Cells(i + 1, 5) = Address2 'お届け先住所2行目 54 Cells(i + 1, 6) = BuildingName 'お届け先住所3行目 55 56CONTINUE: 57 Next i 58End Sub

Shopifyヘルプによれば、CSVで注文データの一括出力もできるようです。

注文をCSVファイルにエクスポートする
https://help.shopify.com/ja/manual/orders/export-orders

投稿2020/05/02 21:12

t-takayama

総合スコア167

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

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

JMS

2020/05/03 08:15

正直、感動しました。完璧です。こういう頭の使い方ができるのは何故なんでしょう?天才のように思えます・・・。いやぁすごいです。 If columns > 5 Then こうやってコラム数を計算していってtmp配列の変数への挿入を調整するんですね。考え方がとても勉強になりました。
guest

0

配列がインデックスエラーになる対策として
UBound関数で配列の最大値を指定して処理を行うといいと思います。
参考サイト

VBA

1 dim k as long 2 For k = 2 To UBound(tmp) 3 Cells(i + 1, k + 2) = tmp(k) 4 Next k

投稿2020/05/02 09:11

ryuno_vanilla

総合スコア119

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

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

JMS

2020/05/02 14:32 編集

ご返信いただき有難うございました。こちらも考えてみたのですが、以下のように、tmp(x)を挿入する先が単純にi+1,k+2とできないので単純なforループで回せないのです。これができればforループを使いたいと思ったのですが。 ```VBA Cells(i + 1, 2) = tmp(0)  '(,2)が氏名入力欄です。 Cells(i + 1, 1) = tmp(1〉  '(,1)が郵便番号入力欄です。 Cells(i + 1, 4) = tmp(2)  '(,4)~(,6)が住所入力欄です。問題はここです。注文データによってはtmp(4)がなくインデックスエラーになるのです。 Cells(i + 1, 5) = tmp(3) Cells(i + 1, 6) = tmp(4) ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問