Amazonの出荷指示データから、伝票作成用フォーマットデータを作成するマクロ
Amazonから出力される商品の出荷指示データから、必要な情報を、運送会社の指定フォーマットにコピペして、出力するVBAマクロを作成したので、ソースコードを解説します。
もくじ
- 効率化する前の既存ワークフロー
- システム要件
- 必要なプログラム
- ソースコードの解説
スポンサードサーチ
効率化する前の既存ワークフロー
現在のワークフローは以下のようになっています。
- Amazonで商品が売れると、出荷指示データが吐き出される(テキスト)
- 運送会社の指定フォーマットに、1件ずつ必要な項目をコピペ(エクセル)
- 運送会社の専用ページに指定フォーマットのファイルをアップロード
図にするとこんな形です。
システム要件
Amazonから出力される、出荷指示データをコピペする作業に、手間がかかります。
そこで、Amazonから発行された、出荷指示データ(テキスト)を読み込み、指定フォーマットに自動入力するプログラムを作成します。
システムのおおまかな流れ
- 出荷指示データを、Excelにインポート
- 運送会社の指定フォーマット(エクセル)に必要な項目を自動でコピペ
- Excel形式でデータをエクスポートする
こんな形をイメージしてます。
スポンサードサーチ
必要なプログラム
システムを作成するために、必要となるプログラムをリストアップしました。
必要なプログラム一覧
- テキストデータをエクセルにインポートする
- インポートしたデータを整形する
- 指定フォーマットに必要な項目をコピペする
- 指定フォーマットデータに、名前をつけてエクスポートする
ソースコードの解説
実際に作成したソースコードを順番に解説していきます。
テキストデータをエクセルにインポートする
Amazonから出力されたテキストデータを、エクセルのシートにインポートする処理です。
Sub textFile_get() Dim openCsv As String Dim toSh As Worksheet Dim buf As String Dim cols As Variant Dim row As Long openCsv = Application.GetOpenFilename("textファイル,*.txt") If openFile = "False" Then Exit Sub Set toSh = Worksheets("Sheet1") row = 1 Open openCsv For Input As #1 Do Until EOF(1) Line Input #1, buf cols = Split(buf, vbTab) With toSh.Range(Cells(row, 1), Cells(row, UBound(cols) + 1)) .NumberFormatLocal = "@" .Value = cols End With row = row + 1 Loop Close #1 End Sub
ブックを起動すると、ファイル選択のダイアログが表示されるので、対象のテキストファイルを選択します。
こんな形で、エクセルにテキストデータがインポートされます。
インポートしたデータを整形する
インポートしたデータを、指定フォーマットにコピペする前に、3箇所ほどテキストを整形する必要があります。
それぞれ、自動整形する処理を作ります。
- 当日の日付を、指定のフォーマットで自動入力する
- 商品名が25文字以上の場合は、頭から切り詰める
- 住所のフィールドが別れているため、各セルの文字列を結合する
それぞれのソースコードになります。
文字列を切り詰める処理
作業対象の行番号を引数にして、25文字に切り詰めた品名を返します
Function Sinamei(ByVal row As Long) Dim strSina As String strSina = "" strSina = Left(Range("L" & row), 25) Sinamei = strSina End Function
日付を指定フォーマットで返す処理
当日の日付を「20190210」のようなフォーマットで返します。
Function Syukkayoteibi() Syukkayoteibi = Format(Date, "yyyymmdd") End Function
文字列を連結して返す処理
作業対象の行番号を引数にして、連結した文字列(住所)を返します。
文字列を連結するには & を使います。
Function Mojirenketu(ByVal row As Long) Dim a As String a = "" a = a & Range("R" & row).Value 'a = a & Range("S" & row).Value Mojirenketu = a End Function
スポンサードサーチ
指定フォーマットに必要な項目をコピペする
メインのプログラムです。インポートしたデータの数を取得して、データの数だけ指定フォーマットにコピペを繰り返します。「依頼主情報」など、固定の情報も入力します。※個人情報は、サンプルデータに置き換えています。
Sub harituke() Dim b As String Dim Lastrow As Long Dim n As Long Dim Cont As Long Cont = 2 Lastrow = Range("A65536").End(xlUp).row For Cont = 2 To Lastrow Worksheets("format").Range("E" & Cont).Value = Syukkayoteibi Worksheets("format").Range("I" & Cont).Value = Range("J" & Cont) Worksheets("format").Range("K" & Cont).Value = Range("W" & Cont) Worksheets("format").Range("L" & Cont).Value = Mojirenketu(Cont) Worksheets("format").Range("N" & Cont).Value = Range("T" & Cont) Worksheets("format").Range("P" & Cont).Value = Range("Q" & Cont) Worksheets("format").Range("M" & Cont).Value = Range("S" & Cont) Worksheets("format").Range("T" & Cont).Value = "【電話番号が入ります】" Worksheets("format").Range("V" & Cont).Value = "【郵便番号が入ります】" Worksheets("format").Range("W" & Cont).Value = "【住所が入ります】" Worksheets("format").Range("Y" & Cont).Value = "【店舗名が入ります】" Worksheets("format").Range("AB" & Cont).Value = Sinamei(Cont) Worksheets("format").Range("AN" & Cont).Value = "【電話番号が入ります】" Worksheets("format").Range("AP" & Cont).Value = "【コードが入ります】" Next Cont End Sub
指定フォーマットデータを当日の日付でエクスポートする
コピペが終わったら、エクセルのシートをエクスポートします。その際、ファイル名には当日の日付を入力します。操作回数を減らすため、エクスポート先はデスクトップにしました。ソースコードを少し変更すれば、任意の場所にエクスポートすることもできます。
Sub OutputFile() Dim w As Worksheet Dim myFile As String Worksheets("format").Activate Range("A2").Select Sheets("format").Copy ActiveWorkbook.SaveAs _ Filename:=CreateObject("WScript.Shell").specialfolders("Desktop") & "\" & Syukkayoteibi & "_送り状.xls", _ FileFormat:=xlOpenXMLWorkbook End Sub
これでソースコードはだいたい完成です。
スポンサードサーチ
ブックを起動したタイミングで、マクロが実行されるようにする
最後に、エクセルを起動したタイミングで、マクロが自動で起動するようにします。
ThisWorkbookオブジェクトで、Workbook_Open()というイベントプロシージャにソースコードを入れると、ブックを開いたタイミングでマクロが実行されます。
Workbook_Open()に、作成したソースコードと、入力されているデータを初期化する処理を追加しました。
Private Sub Workbook_Open() Dim Lastrow1 As Long Dim Lastrow2 As Long Lastrow1 = 0 Lastrow2 = 0 Lastrow1 = Worksheets("Sheet1").Range("A65536").End(xlUp).row Lastrow2 = Worksheets("format").Range("E65536").End(xlUp).row Worksheets("Sheet1").Range("A1:AC" & Lastrow1).ClearContents If Not Lastrow2 = 1 Then Worksheets("format").Range("A2:CQ" & Lastrow2).ClearContents End If Worksheets("Sheet1").Activate Call textFile_get Call harituke Call OutputFile End Sub
ここまで作成したソースコードをまとめます。
ThisWorkbookオブジェクト
Private Sub Workbook_Open() Dim Lastrow1 As Long Dim Lastrow2 As Long Lastrow1 = 0 Lastrow2 = 0 Lastrow1 = Worksheets("Sheet1").Range("A65536").End(xlUp).row Lastrow2 = Worksheets("format").Range("E65536").End(xlUp).row Worksheets("Sheet1").Range("A1:AC" & Lastrow1).ClearContents If Not Lastrow2 = 1 Then Worksheets("format").Range("A2:CQ" & Lastrow2).ClearContents End If Worksheets("Sheet1").Activate Call textFile_get Call harituke Call OutputFile End Sub
標準モジュール
'指定フォーマットに必要な項目をコピペする Sub harituke() Dim b As String Dim Lastrow As Long Dim n As Long Dim Cont As Long Cont = 2 Lastrow = Range("A65536").End(xlUp).row For Cont = 2 To Lastrow Worksheets("format").Range("E" & Cont).Value = Syukkayoteibi Worksheets("format").Range("I" & Cont).Value = Range("J" & Cont) Worksheets("format").Range("K" & Cont).Value = Range("W" & Cont) Worksheets("format").Range("L" & Cont).Value = Mojirenketu(Cont) Worksheets("format").Range("N" & Cont).Value = Range("T" & Cont) Worksheets("format").Range("P" & Cont).Value = Range("Q" & Cont) Worksheets("format").Range("M" & Cont).Value = Range("S" & Cont) Worksheets("format").Range("T" & Cont).Value = "【電話番号が入ります】" Worksheets("format").Range("V" & Cont).Value = "【郵便番号が入ります】" Worksheets("format").Range("W" & Cont).Value = "【住所が入ります】" Worksheets("format").Range("Y" & Cont).Value = "【店舗名が入ります】" Worksheets("format").Range("AB" & Cont).Value = Sinamei(Cont) Worksheets("format").Range("AN" & Cont).Value = "【電話番号が入ります】" Worksheets("format").Range("AP" & Cont).Value = "【コードが入ります】" Next Cont End Sub '指定フォーマットデータを、当日の日付でエクスポートする Sub OutputFile() Dim w As Worksheet Dim myFile As String Worksheets("format").Activate Range("A2").Select Sheets("format").Copy ActiveWorkbook.SaveAs _ Filename:=CreateObject("WScript.Shell").specialfolders("Desktop") & "\" & Syukkayoteibi & "_送り状.xls", _ FileFormat:=xlOpenXMLWorkbook End Sub '文字列を連結して返す処理 Function Mojirenketu(ByVal row As Long) Dim a As String a = "" a = a & Range("R" & row).Value 'a = a & Range("S" & row).Value Mojirenketu = a End Function '日付を指定フォーマットで返す処理 Function Syukkayoteibi() Syukkayoteibi = Format(Date, "yyyymmdd") End Function '文字列を切り詰める処理 Function Sinamei(ByVal row As Long) Dim strSina As String strSina = "" strSina = Left(Range("L" & row), 25) Sinamei = strSina End Function
まとめ
今回のプログラムの制作時間は、2時間ぐらいです。本当は入力チェックなども、した方がいいのですが、利用する方のITリテラシーが高かったので、必要最低限のコーディングを行いました。
今のところ、問題なく動いているようです。作業時間は大幅に短縮されたと、満足していただきました。
部分的な作業の効率化であれば、サクッとコーディングして、使ってもらいながら改良していく感じでもいいですね。