WoocommerceのCSVファイルを作成するのに便利なExcelのVBA
Woocommerceに商品登録をする際にCSVファイルを一括インポートすると商品登録が楽に行えます。CSVファイルをExcelで作成する際にVBAを使えば、セルの結合や置き換えが簡単にできたり、インターネット上にある画像をダウンロードして任意の名前をつけて保存したりすることもできます。
なお、Themifyのテーマを使用して商品をWoocommerceに一括インポートする方法は、「WooCommerceを使って簡単にネットショップやアフィリエイトサイトなどのECサイトを作る方法」で紹介しています。
1 VBAを使用する準備と参考になる書籍
副業で出来る範囲のネットショップを作ってみようとWoocommerceと格闘して、ようやく目途が付いた矢先に提携先の会社がネット通販から撤退すると悲劇に。ほとんどリスクなく始めれると期待していたのに残念!
この件については、別の機会に記事にしようと思っていますが、Woocommerceと格闘した結果、商品登録するCSVファイルの作成に便利なVBAを覚えたので参考になればと。
最初にお断りさせて頂きますが、私はExcelの達人でもVBAの知識が豊富にある訳ではありません。CSVファイルを作成するのにあたり、何か作業を効率化する方法がないか書籍などで知識を得たVBAの初心者です。しかし、初心者の私でも作業の効率化を格段に図ることができました。
まず、Excelは知ってるけどVBAって何? という説明ですが、簡単に言うとExcelなどOfficeを操作するための初心者向けのプログラミング言語です。Excelに計算式を入力して集計したり、データを作成したりしますが、その都度、計算式などを入力するのは手間なので、事前にVBAを使って作成したマクロで自動処理をさせるためのものです。
プログラミングと聞くと難しい気がしますが、初心者の私でもCSVファイルを効率的に作成できる程度のマクロは作成できますが、マクロに関する基礎知識は必要です。
マクロを使用するには、Excelのファイルは「Excel マクロ有効ブック(.xlsm)」で保存する必要があります。また、Excelのセキュリティー設定を「すべてのマクロを有効にする。」しておくか、Excel マクロ有効ブックを開いた時に、その都度、「マクロを有効にする」を選択しなければVBAを実行することはできません。
VBAで作成するマクロはプログラミンの一種です。外部からメールなどでExcelファイルのやり取りをする環境の方は、「すべてのマクロを有効」にしておくとウィルス入りのExcelファイルを開いた時に感染する恐れがあります。Excelの初期設定がマクロを無効になっている理由を考慮の上、PCの使用環境にあわせて設定してください。
Excel ツールバー「開発」 > 「Visual Basic」をクリックすると、マクロを入力する画面が表示されます。(「開発」が表示されていない場合は、Excelのオプション > 基本設定 > [開発]タブをリボンに表示する にチェックを入れてください。)
マクロを入力場所は、標準モジュール > Module 内です。
新規ファイルとしてExcelを開いた場合は、標準モジュールのフォルダがありません。メニューバー > 「挿入」 > 標準モジュールをクリックするとModuleが追加されます。
ちなみに、開発 > コード > 「マクロの記録」をクリックすると、Excelシートに入力した内容が、マクロとして記述されます。入力を終えたら「記録終了」をクリックします。シートに入力した値を一旦クリアーして、マクロを実行すると先程入力した通りにシートに値が入力されます。
「マクロの記録」を使ってもある程度のことはできますが、処理が遅かったり、複雑な処理ができなかったりします。(ExcelシートとVisual Basicの画面を並べてExcelシートに入力していくと、Visual Basicにマクロが連動して記述されていくので、マクロが理解しやすいです。)
Woocommerceの商品登録するためのCSVファイルの作成に使える便利なVBAのマクロを理解しやすいように順を追って紹介します。
なお、Visual BasicのModuleにそのままコピペできるようにコードも掲載してあります。実行したマクロがExcelのSheet1に書き出すようになっています。先に説明した通り、標準モジュールのModule1にコピペしてください。
コードを貼り付けたら Sub() と End Subの間にカーソルを置いて赤丸の位置にある実行ボタンをクリックします。
開発 > マクロ で一覧の中から選択して実行することもできます。
サンプル値の入力のマクロを実行すると、Sheet1に値が入力されます。
※ Moreをクリックして全文表示してコピペしてください。
Sub サンプル値の入力()
Sheets(“sheet1”).Activate
Range(“A1”).Select
ActiveCell = “都市名”
Range(“A2”).Select
ActiveCell = “東京”
Range(“A3”).Select
ActiveCell = “横浜”
Range(“A5”).Select
ActiveCell = “名古屋”
Range(“A7”).Select
ActiveCell = “大阪”
Range(“A8”).Select
ActiveCell = “神戸”
Range(“A10”).Select
ActiveCell = “福岡”
Range(“A13”).Select
ActiveCell = “トヨタ”
Range(“B13”).Select
ActiveCell = “クラウン”
Range(“C13”).Select
ActiveCell = “プリウス”
Range(“A14”).Select
ActiveCell = “日産”
Range(“B14”).Select
ActiveCell = “アルファード”
Range(“C14”).Select
ActiveCell = “リーフ”
Range(“A15”).Select
ActiveCell = “マツダ”
これから説明するマクロは、先に貼り付けたマクロの下に貼り付けていってください。
2 マクロの基本
2-1 書式を設定する
シートを見やすくするために書式やセルの幅や高さを指定します。
通常、Excelに数字を入力すると数値として扱われます。数字の先頭に「0」が入力されているデータの場合、先頭の「0」が消えてしまうので、セルの書式を文字列として設定しておく必要があります。Woocommerceで読み込む際、入力値の先頭に「0」があるかないかで、データが変わってくることがあるので注意が必要です。
このマクロを実行すると、下の写真のようになります。
設定する書式に関しては、Excel VBA 逆引き大全に網羅されているので省略しますが、本がなくても「マクロの記録」を使って確認することができます。
※ Moreをクリックして全文表示してコピペしてください。
Sub 書式の設定()
Sheets(“sheet1”).Activate
Columns(“A:C”).Select
Selection.NumberFormatLocal = “@”
Columns(“A:A”).ColumnWidth = 17.5
Columns(“B:C”).Select
Selection.ColumnWidth = 10.5
Columns(“E:G”).Select
Selection.ColumnWidth = 12.5
Range(“A1:A10,A25:A27,A30:A37,A40:A42”).Select
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ThemeColor = 3
.TintAndShade = 0
.Weight = xlMedium
End With
2-2 Sheet1の入力値をクリアーする
シートに入力した値をクリアーするマクロです。
入力値をクリアーするだけなので、下の写真のよう書式は保持されます。
Sub sheet1を入力値をクリア()
Sheets(“sheet1”).Activate
Cells.Select
Selection.ClearContents
Range(“A1”).Select
End Sub
2-3 Sheet1のセルを削除する
シートに入力したセルを削除するマクロです。
セルを削除するので、入力値も書式も削除され下の写真のように初期状態のシートになります。
Sub Sheet1のセルを削除()
Sheets(“sheet1”).Activate
Cells.Select
Selection.Delete
Range(“A1”).Select
End Sub
ここまでコピペしたVBAのマクロをちょっと解説します。
Sub マクロの名前() ~ End Sub
マクロはこの間に記述し、上から順に実行します。
Sheets(“sheet1”).Activate
どのシートに対してマクロを実行するか、シートを指定しています。
この一文がないと、開いているシートに対してマクロを実行します。
指定したシート名が存在しないとエラーになります。
Cells.Select
シートのすべてのセルを指定しています。
A列だけを指定するなら Columns(“A:A”).Select
A列からC列を指定するなら Columns(“A:C”).Select
1行目を指定するなら Rows(”1: 1”)
1行目から3行目を指定するなら Rows(”1: 5”)
A1からA5のセルを指定するなら Range(“A1:A5”).Select
A1からC5のセルを指定するなら Range(“A1:C5”).Select
A1のセルを指定するなら Range(“A1”).Select 又は Cells(1, 1)
ActiveCell = “都市名”
Selection.ClearContents
Selection.Delete
指定したセルに対して処理する内容です。
マクロは、指定したセルに対してどのような処理をさせるのか記述します。
2-4 他のマクロを呼び出す
マクロの中に他のマクロ名を記述するだけで、他のマクロを呼び出して実行させることができます。
Sub サンプル値と書式をSheet1に書き出し()
サンプル値の入力
書式の設定
End Sub
3 WoocommerceのCSVファイル作成に便利なマクロ
3-1 セルをコピーして貼り付ける
Range( , )又はCells( , ).Copyでコピーして
Range( , )又はCells( , ).PasteSpecialで貼り付けます。
Application.CutCopyMode = Falseは、範囲選択をクリアーします。
列や行、セルの範囲などを、他のシートやセルに貼り付けるマクロです。
Sub A列をE列にコピー()
Sheets(“sheet1”).Select
Range(“A1”).Select
Range(“A1:A10”).Copy
Sheets(“sheet1”).Select
Range(“E1”).PasteSpecial
Application.CutCopyMode = False
Range(“A1”).Select
End Sub
3-2 入力されているセルの個数を数える
i = WorksheetFunction.CountA(Range(“A1:A10”))
A1からA10に入力されているセルの個数を数えます。
Range(“A1:A10”)を書き換えれば、その範囲内の入力されているセルの個数を数えます。
WoocommerceのCSVファイルを作成するのに、この数を数える処理はよく利用します。
Dim i As Integerは変数の宣言です。
変数はマクロ内で使用するデータを一時的に保存しておく場所のことで、保存するデータによって変数の種類が変わります。
このマクロはセルの個数を数えるので整数型の変数Integerを宣言しています。
Sub A1からA10に入力されているセルの個数()
Dim i As Integer
Sheets(“sheet1”).Select
i = WorksheetFunction.CountA(Range(“A1:A10”))
MsgBox “A1~A10に入力されているセルの個数は、 ” & i & “個 です。”, vbInformation
End Sub
変数Integerが数えることができる数は、-32768~32767 です。
この範囲外に整数を取り扱うには、長整数型のLongを使用します。
3-3 セルの入力数だけ繰り返しコピーする
i = WorksheetFunction.CountA(Range(“A1:A10”))
For i = 1 To i Step 1 ~ Next i
1から i の数になるまで繰り返し処理します。
処理する内容は、 ~ に入力した Cells(i, 6) = Cells(i, 1) です。
CSVファイルを作成する時、登録する商品の数はいつも同じではありません。商品数に合わせてマクロを書き換えるのは、手間だし間違いの元になります。商品数に左右されずにセルのコピーを繰り返すこのマクロはよく利用します。
A1からA10の範囲内で入力されているセルの個数は7個なので、A1をF1にコピー、A2をF2にコピー・・・A7をF7にコピーと7回繰り返します。
このマクロでの注意点は、セルの個数を数える際、空欄のセルは数に含まないが、繰り返し処理をする際は、空欄も処理の回数に含むという点です。
Sub A列の入力数だけF列にコピー()
Dim i As Integer
Sheets(“sheet1”).Select
i = WorksheetFunction.CountA(Range(“A1:A10”))
For i = 1 To i Step 1
Sheets(“sheet1”).Cells(i, 6) = Cells(i, 1)
Next i
Range(“A1”).Select
End Sub
サンプルでは、A8~A10のセルがコピーできていないですよね。これでは正しいCSVファイルが作成できません。このマクロを使用する時は、空欄のない列で数を数えておく必要があります。
3-4 空欄まで繰り返しコピーする
Do Until Cells(t, 1) = “” ~ Loop
右辺の条件に適合するまで繰り返し処理をします。このマクロでは右辺の「“」と「”」の間に何も入力していないため、「空欄が出現するまで 〜 を繰り返し処理する」というマクロになります。
3−3で数えた回数だけ繰り返し処理をする構文と比べるとシンプルな構文です。このマクロもCSVファイルの作成によく使います。
このマクロでは、最初に空欄が出現するまでA1をG1にコピー、A2をG2にコピー・・・を繰り返していきます。
繰り返し処理することを「ループ処理」、ループ処理を終えることを「ループから抜ける」と言います。ループから抜ける条件を「空欄」にするならば、CSVファイルを作成する際には、3–3と同様に空欄のない列を作成しておく必要があります。
Sub A列の空欄までG列にコピーを繰り返す()
Dim t As Integer
t = 1
Sheets(“sheet1”).Select
Range(“A1”).Select
Do Until Cells(t, 1) = “”
Sheets(“sheet1”).Cells(t, 7) = Cells(t, 1)
t = t + 1
Loop
End Sub
仮にA11に「aaa」を入力し、Do Until Cells( , ) = “”の右辺を「“aaa”」とすると、A10をG10にコピーしてループを抜けます。
3-5 セル同士や定型文の結合する
Cells(i, 5) = (“定型文1”) & Cells(i, 2) & Cells(i, 3) & (“定型文2”)
セルとセルの結合や定型文の結合は、「 & 」(前後に半角スペース)でつなげるだけです。エクセルでセルの結合をする場合は、 CONCATENATE関数の値を貼り付ける必要があるので手間がかかりますが、マクロで処理すると非常に簡単です。
商品の紹介文をCSVファイルで作成する際、Themifyのjosnコードを結合に必ず使用します。
(Range(Selection, Selection.End(xlDown)))は、連続するセルを範囲選択するCtrl + Shift + ↓ を構文にしたものです。
Cells( , )でセルの位置を表す時、変数 i は整数なので加算の計算式で表すことができます。サンプルではA13セルから結合させたいので、Cells( i +12, 〇)となります。
Sub セルと定型文の結合()
Dim i As Integer
Sheets(“sheet1”).Select
Range(“A13”).Select
i = WorksheetFunction.CountA(Range(Selection, Selection.End(xlDown)))
For i = 1 To i Step 1
Sheets(“sheet1”).Cells(i + 12, 5) = (“定型文1”) & Cells(i + 12, 2) & Cells(i + 12, 3) & (“定型文2”)
Next i
End Sub
3-6 文字列を置き換えする
Cells(書替え先) = Replace(Cells(書替え元), (“置換元”), (“置換先”))
書替え元のセルの文字列から置換元の文字列を置換先の文字列に置き換えて書替え先のセルに書き出すマクロです。置換先はセルを指定することも固定の文字列とすることもできます。
サンプルでは、置換元の文字列を「00000」とし、E列には「定型文3」、F列にはB列のセル、G列にはC列のセルを書き換えるようになっています。
21行目は書替え元のA21セルは、よく見ると「11000022」となっており書換元の文字列とは異なるため、書き換えられずにA21セルがそのまま表示されています。
Sub 置き換え2()
Dim i As Integer
Sheets(“sheet1”).Select
Range(“A18”).Select
i = WorksheetFunction.CountA(Range(Selection, Selection.End(xlDown)))
For i = 1 To i Step 1
Sheets(“sheet1”).Cells(i + 17, 5) = Replace(Cells(i + 17, 1), (“00000”), (“定型文3”))
Sheets(“sheet1”).Cells(i + 17, 6) = Replace(Cells(i + 17, 1), (“00000”), Cells(i + 17, 2))
Sheets(“sheet1”).Cells(i + 17, 7) = Replace(Cells(i + 17, 1), (“00000”), Cells(i + 17, 3))
Next i
End Sub
CSVファイルを作成する際、元データとなる画像の名前や商品の管理番号を画像URLに変換したり、商品紹介文に追加したりする必要が発生することがあります。置換元の文字列を含んだ書替え元のデータを作成することにより、CSVファイルの作成手順を楽にすることができます。
3-7 位置を調べて文字を抽出する
Cells(書出し先) = InStr(Cells(検索元), (“検索文字列”))
検索文字列が検索元の何文字目に位置するのか調べる構文を使って、文字列の抽出をします。
If InStr(Cells(検索元), (“検索文字列”)) > 0 Then
Cells(書出し先) = (”検索文字列”)
End If
Insterは検索元に検索文字列が存在する時、整数を取得するので、If ~ End if の条件式を使って書出し先のセルに検索文字列を抽出します。検索文字列はセルを指定することもできます。
A24セルの中に「う」は3番目に位置するので、E24セルに「3」と書き出されています。
Ifは条件式なので、If InStr(Cells(i + 24, 1), Cells(24, 2)) > 0 Then が成立する時、 Cells(24, 2) を Cells(i + 24, 5) に書き出す訳です。
条件式と条件が成立する時は構文に関連がないので、検索文字列以外を書き出すこともできます。
Sub 文字の抽出()
Dim i As Integer
Cells(24, 5) = InStr(Cells(24, 1), (“う”))
Sheets(“sheet1”).Select
Range(“A25”).Select
i = WorksheetFunction.CountA(Range(Selection, Selection.End(xlDown)))
For i = 1 To i Step 1
If InStr(Cells(i + 24, 1), Cells(24, 2)) > 0 Then
Cells(i + 24, 5) = Cells(24, 2)
End If
If InStr(Cells(i + 24, 1), Cells(24, 3)) > 0 Then
Cells(i + 24, 6) = Cells(24, 3)
End If
Next i
End Sub
3-6と異なる点は、検索文字列が検索元に存在しない時は何も書き出されない点です。
3- 8 文字列の文字数を取得する
Cells( i, 5) = Len(Cells( i, 1))
セル内の文字数を数えるマクロです。
文字列の大文字・小文字は問いません。
A30~A32セルの文字列の文字数をE30~E32セルに書き出しています。
取得した文字数を使用して文字の抽出を行うために、Cells(i + 34, 2) = Cells(i + 29, 5) でB35~B37セルに取得した数をコピーしています。
Sub 文字数の取得2()
Dim i As Integer
Sheets(“sheet1”).Select
i = WorksheetFunction.CountA(Range(“A30:A32”))
For i = 1 To i Step 1
Cells(i + 29, 5) = Len(Cells(i + 29, 1))
Cells(i + 34, 2) = Cells(i + 29, 5)
Next i
Range(“A30”).Select
End Sub
3- 9 指定した文字数以降の文字列を取得する
Cells( 抽出先) = Left(Cells(抽出元), (“文字数”))
Cells( 抽出先) = Right(Cells(抽出元), (“文字数”))
Leftは、抽出元の文字列の左から文字数までを抽出先に書き出します。
Rightは、抽出元の文字列の右から文字数以降を抽出先に書き出します。
Cells(抽出先) = Mid(Cells(抽出元), (”文字数”), (“抽出する文字数”))
Midは抽出元の文字列の左から文字数以降の文字列のうち、抽出する文字数だけを抽出先に書き出します。(”文字数”), (“抽出する文字数”)は指定したセルをすることができます。
B35~B37セルには3-7で抽出したセルの文字数がコピーされています。
E35~E37セルはLeft
F35~F37セルはMid(2文字抽出)
G35~G37セルはRight
を使ってA35~A37セルの文字列を抽出しました。
Sub 指定した文字数以降を抽出()
Dim i As Integer
Sheets(“sheet1”).Select
i = WorksheetFunction.CountA(Range(“A35:A37”))
For i = 1 To i Step 1
Cells(i + 34, 5) = Left(Cells(i + 34, 1), Cells(i + 34, 2))
Cells(i + 34, 6) = Mid(Cells(i + 34, 1), Cells(i + 34, 2), 2)
Cells(i + 34, 7) = Right(Cells(i + 34, 1), Cells(i + 34, 2))
Next i
Sheets(“sheet1”).Select
Range(“A35”).Select
End Sub
文字数の取得と文字列の抽出を分かりやすく説明するために、3-7 と3-8を分けましたが、(文字数)にLen(Cells( ))を使用するとこうなります。
Cells(i + 34, 5) = Left(Cells(i + 34, 1), Len(Cells(i + 29, 1)))
Cells(i + 34, 6) = Mid(Cells(i + 34, 1), Len(Cells(i + 29, 1)), 2)
Cells(i + 34, 7) = Right(Cells(i + 34, 1), Len(Cells(i + 29, 1)))
3-10 区切り文字で文字列を分割
Cells(分割先) = Split(Cells(分割元), (“区切り文字”))(”要素番号”)
分割元の文字列の中にあるキーとなる区切り文字で文字列を分割して取得します。要素番号は区切られた文節ごとに最初を「0」、次を「1」と割り振られるので取得したい文節の番号になります。
変数 h は、データ型のVariantです。
分割した文字列を変数 h を使ってすべての要素番号を取得しています。
要素番号「1」が空欄である理由は、区切り文字の「/」が並んでいるため、要素番号「1」の文節が存在しないためです。
分割元の区切り文字の個数より抽出する要素番号の方が多いとエラーになります。
Sub 区切り文字で文字列を分離()
Dim i As Integer
Dim h As Variant
Sheets(“sheet1”).Select
i = WorksheetFunction.CountA(Range(“A40:A42”))
For i = 1 To i Step 1
h = Split(Cells(i + 39, 1), (“/”))
Cells(i + 39, 5) = h(0)
Cells(i + 39, 6) = h(1)
Cells(i + 39, 7) = h(2)
Cells(i + 39, 8) = h(3)
Next i
Range(“A40”).Select
End Sub
CSVファイル作成の元データのシートからVBAを使って直接CSVファイル書き出し用のシートに出力しようとすると、場合によってはいくつもの変数を使いマクロが複雑になってきます。
マクロが複雑になり過ぎて作成に手間取るぐらいなら、一旦、別のシートに出力してマクロを簡略化した方が作成しやすくなり時間の節約になります。
4 IEで写真をダウンロードして任意のファイル名で保存するマクロ
Woocommerceの商品ページとそのページの写真を管理するため、写真のファイル名をURLのスラグや商品IDなどと関連付けるとWoocommerceの管理がし易くなると思います。
インターネット上にある写真をダウンロードして保存する方法する場合、フリーソフトなどのダウンロード支援ソフトがありますが、写真のファイル名を自由に指定することができません。
そこでExcelのVBAを使って写真をダウンロードし、任意のファイル名で保存するマクロを紹介します。なお、当たり前の話ですが、ダウンロードした写真を自分のサイトで掲載するには、写真の提供元の同意が必要です。このマクロは、ASPなどから提供される商品画像をダウンロードしてWoocommerceの商品ページに活用することを前提にしています。
このマクロを作成するにあたり、「VBAのIE制御入門」で勉強させて頂きました。VBAのいろはを学べるサイトです。一度訪問されることをお勧めします。
このマクロで使用するブラウザーは、IEです。chromeやfirefoxなどでは使用できません。64ビット版Excel の2007、2016、365で動作確認をしています。(32ビット版でも動作するハズです。)
まず、このマクロを使用するための準備をします。
4-1 保存用フォルダーの作成
ここまで読んで頂いている方は、既にご自身のExcelでマクロを試していると思います。Excelファイルに名前を付けて一旦保存してください。保存する場所は、ディスクトップでもDドライブでもどこでも構いませんが、フォルダーを作成(フォルダー名は自由)しその中にExcelファイルを保存してください。作成したフォルダーの中にフォルダー名を「保存用フォルダー」としたフォルダーを作成してください。
4-2 Excelの準備
Excel VBAでIEを制御できるように予めExcelに搭載されているライブラリを設定します。
ツールバー > 開発 > Visual Basic > ツール > 参照設定 を開きます。
参照可能なライブラリファイルの中から
・Microsoft HTML Object Library
・Microsoft Internet Controls
の二つにチェックを付けて保存します。
動作確認をします。
今まで貼り付けていたマクロの次に下のマクロを貼って実行してください。設定ができていれば真っ白な画面のIEが開きます。
Sub IE()
Dim objIE As InternetExplorer
Set objIE = CreateObject(“InternetExplorer.Application”)
objIE.Visible = True
End Sub
4-3 マクロを貼り付ける標準モジュールを追加する
CSVファイルを作成するのに便利なマクロは、標準モジュールのModule1に貼り付けましたが、これから説明するIEで写真をダウンロードして任意のファイル名で保存するマクロは、Module2にコピペしてください。
Module2の新規作成方法は、Module1を作成した方法と同じで、ツールバー > 開発 > Visual Basic > 挿入 >標準モジュールをクリックすると、Module2が作成されます。
Module2の先頭に次のコードを貼り付けてください。
このコードより上に他のマクロを記述するとエラーになります。
もしModule2に新規作成しない場合は、Module1の先頭に貼り付ける必要があります。
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib “kernel32” (ByVal ms As Long)
#End If
Declare Function URLDownloadToFile Lib “urlmon” Alias _
“URLDownloadToFileA” (ByVal pCaller As Long, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As Long
Private Declare Function DeleteUrlCacheEntry _
Lib “wininet” Alias “DeleteUrlCacheEntryA” _
(ByVal lpszUrlName As String) As Long
Excel VBAを使ってIEでファイルをダウンロードするのに必要な宣言・変数です。深く考えてもよく分からないので、こういうもんだ! と思ってコピペで問題ありません。しかし、くどい様ですが、絶対にModuleの先頭に記述するしてください。
次にIEを開くマクロを貼り付けます。
Sub ieView(objIE As InternetExplorer, _
urlName As String, _
Optional viewFlg As Boolean = True)
‘False
‘エラーを無視
On Error Resume Next
‘待機時間を2秒
Application.Wait [Now()+”00:00:02″]
‘IE(InternetExplorer)のオブジェクトを作成
Set objIE = CreateObject(“InternetExplorer.Application”)
‘IE(InternetExplorer)を表示・非表示
objIE.Visible = viewFlg
‘指定したURLのページを表示
objIE.navigate urlName
‘IE(InternetExplorer)が完全表示するまで待機
Call ieCheck(objIE)
End Sub
マクロの中で、「’」を付けるとコメントアウトできます。
Sub ieView( ) の各構文が何をするものか書いておきましたが、簡単に補足します。
’False
一番最後で説明します。
’待機時間を2秒
連続でダウンロードするため、相手サーバーに負担をかけないようにIEが開くのに必要な待機時間を設定しています。最低1秒以上にしてください。
’IEが完全表示するまで待機
マクロは次々に記述してある内容を実行していきます。IEが立ち上がり指定したURLを表示するまで、次の処理に移行しないようにしています。(この待機時間を確保するために、Sleep関数やWait関数を使う方法もありますが、PCのスペックや通信回線速度の影響も多分に受けるため、この方法がベストだと思います。)
IEが完全表示するまで待機させるマクロを貼り付けます。
Sub ieCheck(objIE As InternetExplorer)
Dim timeOut As Date
‘完全にページが表示するまで待機する
timeOut = Now + TimeSerial(0, 0, 20)
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Sleep 1
If Now > timeOut Then
objIE.Refresh
timeOut = Now + TimeSerial(0, 0, 19)
End If
Loop
timeOut = Now + TimeSerial(0, 0, 20)
Do While objIE.document.readyState <> “complete”
DoEvents
Sleep 1
If Now > timeOut Then
objIE.Refresh
timeOut = Now + TimeSerial(0, 0, 20)
End If
Loop
End Sub
インターネットを開く時、いつまで経ってもページが開かない経験は、誰しもあると思います。いわゆる、固まってしまう という現象です。
IEを開いている途中に固まってしまうと、次の処理に移行できなくなるのでタイムアウトする時間を20秒とっています。(使用しているネット回線が遅くIEが開いている途中にタイムアウトしてしまう場合は、この数字を調整してください。)
IEで写真をダウンロードする準備ができました。
実際にダウンロードしたいURLを開くマクロを記述する場所は、Module1でもModule2で問題ありませんが、マクロの用途や使用するシートごとにModuleを分けると、マクロの管理がし易くなります。
よって、Module2の続きに貼り付けてください。
まずは、写真1枚をダウンロードし、名前を付けて保存するマクロで動作を確認してみます。
ダウンロードするURLは、Sheet1のA45セル
保存するファイル名は、B45セル + .jpg
保存先フォルダは、Excelファイルが保存されているフォルダ内にある「保存用フォルダ」
Sub 写真1枚をDLして保存()
Dim objIE As InternetExplorer
Dim imgURL As String, fileName As String, savePath As String
Dim cacheDel As Long, result As Long
‘画像URL取得
Sheets(“Sheet1”).Select
Call ieView(objIE, Cells(45, 1))
imgURL = objIE.document.URL
‘画像ファイル名
fileName = ActiveSheet.Cells(45, 2) & “.jpg”
‘画像保存先(+画像ファイル名)
savePath = ActiveWorkbook.Path & “保存用フォルダ” & fileName
‘キャッシュクリア
cacheDel = DeleteUrlCacheEntry(imgURL)
‘画像ダウンロード
result = URLDownloadToFile(0, imgURL, savePath, 0, 0)
If result = 0 Then
‘ダウンロード良 URLを青色に書き換える
Cells(45, 1).Font.Color = RGB(0, 0, 255)
Else
‘ダウンロード不 URLを赤色に書き換える
Cells(45, 1).Font.Color = RGB(255, 0, 0)
End If
‘開いたIEを閉じる
objIE.Quit
Range(“A45”).Select
End Sub
開いたURLは、https://yukaki.kagoyacloud.com/wp-content/uploads/vba-sample/1.jpg ですが、保存用フォルダに保存されたファイル名は「photo1.jpg」になっているはずです。
次は連続して写真をダウンロードしてファイル名を付けて保存するマクロです。
Sub 連続して写真をDLして保存()
Dim objIE As InternetExplorer
Dim imgURL As String, fileName As String, savePath As String
Dim cacheDel As Long, result As Long
Dim i As Long
‘エラーを無視する
On Error Resume Next
Sheets(“Sheet1”).Select
i = WorksheetFunction.CountA(Range(“A45:A49”))
For i = 1 To i Step 1
‘画像URL取得
Call ieView(objIE, Cells(i + 44, 1))
imgURL = objIE.document.URL
‘画像ファイル名
fileName = ActiveSheet.Cells(i + 44, 2) & “-” & i & “.jpg”
‘画像保存先(+画像ファイル名)
savePath = ActiveWorkbook.Path & “保存用フォルダ” & fileName
‘キャッシュクリア
cacheDel = DeleteUrlCacheEntry(imgURL)
‘画像ダウンロード
result = URLDownloadToFile(0, imgURL, savePath, 0, 0)
If result = 0 Then
‘ダウンロード良 URLを青色に書き換える
Cells(i + 44, 1).Font.Color = RGB(0, 0, 255)
Else
‘ダウンロード不 URLを赤色に書き換える
Cells(i + 44, 1).Font.Color = RGB(255, 0, 0)
End If
‘開いたIEを閉じる
objIE.Quit
Next i
Range(“A47”).Select
End Sub
Sheet1を確認するとA45~A49セルの文字が青色になっています。
保存用フォルダを確認すると、「photo1-1.jpg」~「photo5-5.jpg」の写真が保存されています。
ダウンロードするURLの並び方と保存するファイル名を工夫すれば、Woocommerceの商品ページのスラグや商品IDに関連性を持たせたファイル名にすることができます。
4-4 連続ダウンロードする際の注意点
最後にSub ieView( ) の補足説明で、後から説明するとした「’False」について説明します。
連続して写真をダウンロードして保存できることは、確認して頂けたかと思いますが、写真数百枚をダウンロードする実用的なレベルになると、早くて数十枚、遅くても150枚程度を保存した時点でエラーが発生しマクロがフリーズすることが多いです。
はっきりした理由は分かりませんが、試行錯誤した結果、IEの動作を表示させているとエラーが発生することがわかりました。
Sub ieView(objIE As InternetExplorer, _
urlName As String, _
Optional viewFlg As Boolean = True)
の「True」を「False」に打ち変えると、IEの動作を非表示にすることができます。
数十枚から150枚程度ダウンロードした時点で、エラーによりマクロがフリーズする場合は、「False」に打ち変えて試してみてください。(ダウンロードできているか確認ができないため、保存用フォルダを開いておき写真が追加されているかでマクロの動作状況を確認してください。)
ちなみに、このエラーが発生するとマクロを終了させることも、Excelを閉じることもできない場合があります。そんな時はタスクマネージャーで強制的にExcelを閉じてください。
Woocommerceの商品ページをCSVファイルを使って一括インポートするのに、効率的にCSVファイルを作成するための便利なVBAは以上です。
Themifyには3種類の無料テーマを含む40種類以上のテーマがありますが、Woocommerceと特に親和性が高いテーマは下の9種類です。
具体的には、Themifyの設定画面にWoocommerceに関する設定項目があり、様々なカスタマイズをコードを書くことなくドラッグ&ドロップで設定できるようになっています。
テーマ名と写真にThemifyが用意したデモサイトのリンクを貼ったので、Themify ECサイト用テーマでどのようなショップが作成できるか参考にしてください。
この記事があなたのお役に立てたら幸いです。
またこの記事がお役に立てれたならhatena・Facebook・Twitterでシェアして頂けると励みになります。