出版社への面倒な返品了解依頼。了解書作成をサクッと簡単に済ませる方法を紹介しています。
今回は「Webの書誌データを利用」その取り出し方をエクセルVBAを使って説明します。
こんにちは、じゅんぱ店長(@junpa33)です。
今回のテーマは返品了解書作成ソフト作りの中で、
返品をしたい書誌のデータを、Webにある情報から入手します。
手打ちで書誌情報を入力すれば済む様な問題かもしれませんが、作業効率化の面からも ”楽できるところは楽をする” ことにしましょう。
何冊分も手打ちしなくて済む自動化は、エクセルVBAを使って作成していきます。
「FAX発注書作成」で作成したコードと同じ要領で行うことが出来ます。
このテーマの前の記事についてはこちら↓になります。
Excelシートに返品了解書テンプレートを作成。手書き入力可能
コンテンツ
Webの書誌データをエクセルBOOKに落とす

新しくエクセルBOOKを開きます。
シートの名前を変更します。
- Sheet1を「操作ボタン」
- Sheet2を「書誌データ貼付」
- Sheet3を「抽出データ」
- Sheet4を「出版社リスト」
とします。
Webから取り込んだデータを出版社別に整理して、返品了解書テンプレートに書誌データを送ることを操作します。
Webからのコピペしたデータの必要部分を取り出し「抽出データ」シートへデータを送ります。
取り出した書誌データのストックヤードになります。
返品了解依頼先の出版社の一覧書き出し用シートになります。
そして このエクセルBOOKを「返品書誌情報」として保存します。
「書誌データ貼付」シートを作成します

Webにある書誌情報を取り入れるために最初に「書誌データ貼付」シートを作成します。
書誌データのセル位置確認
Webからの書誌データをコピペする時の、必要なデータのセル位置を確認します。
必要な書誌データは
- 書誌名
- 副書名
- 出版社
- 著者名
- 本体価格
- ISBNコード
になります。
この項目が表示されているセル位置を登録指定するための表を作成します。
コピー元のWebサイトによってセル位置が変わりますので、
参照するWebサイトを変更するときは、その都度設定してください。
日販NOCSから書誌データを取得する場合は、セル位置は殆ど変化しませんので利用しやすいです。出版書誌データベースの場合は、頻繁にセル位置が変化しますので、その都度、設定変更をしてください。
貼り付けには書誌データのテキストをつかんで、
コピー先(書誌データ貼付)のA列に「形式を指定して貼り付け」の「テキスト」を選択します。
日販NOCSのサンプル

コピーしたい書誌データをつかみます。
返品書誌情報.xlsmの「書誌データ貼付」シートのA列に
「形式を選択して貼り付け」→「テキスト」で張り付けます。

「抽出項目」があるセル位置を「抽出セル名」に入力します。
このサンプルでは、それぞれの項目のセル位置は
- 書名・・・・・A1
- 副書名・・・・B2
- 出版社・・・・B6
- 著者・・・・・B7
- 本体価格・・・B8
- ISBN ・・・・B9
になります。
セル位置の入力表は、G列に抽出項目をH列に入力欄を作成してください。
I列に「項目とデータの区切り文字」入力欄を作成します。
VBAでデータを拾っていきますので、入力欄のセル位置は変更しないでください。
「書誌データ貼付」シートのレイアウトはセル位置データ入力表以外は特に指定はありませんが、
例えばこのシートは、
各セル高さ(行の高さ)・・36ピクセル
列の幅 A列・・・・・・・335ピクセル
B列~F列・・・・・・・・88ピクセル
G列~H列・・・・・・・・125ピクセル
I列・・・・・・・・・・・・256ピクセル
の設定になっています。
VBAの組み立て準備
この書誌データ貼付シートではペーストしたデータを「抽出データ」シートへ送り出すためのVBAを組み、
作動ボタンを設置していきます。
保存したエクセルBOOK「返品書誌情報.xlsm」を起動して下さい。
まず、VBAを記述するため「返品書誌情報.xlsm」にModuleを挿入します。
(挿入の方法はこちら↓で確認できます。)

VBAの記述
プロシージャー名を「書誌データ登録」としてください。
Option Explicit
Sub 書誌データ登録()
・・・・
End Sub
まず「書名」、「副書名」、「出版社」、「著者」、「本体価格」、「ISBN」を変数として宣言します。
'変数の宣言
Dim BN, Boname As String
Dim BS, Bosname As String
Dim SH, Shuname As String
Dim WR, Wriname As String
Dim CO, Cost As String
Dim ISB, IsCode As String
Dim i, nRow As Long
Dim mysasu As Variant
Dim mymsg1, mymsg2, mytitle1, mytitle2, mykyaku As Variant
入力された「抽出セル名」を変数化する
- 書名・・・・・BN
- 副書名・・・・BS
- 出版社・・・・SH
- 著者・・・・・WR
- 本体価格・・・CO
- ISBN ・・・・ISB
「抽出セル名」から得られる各文字列を変数化する
- 書名・・・・・Boname
- 副書名・・・・Bosname
- 出版社・・・・Shuname
- 著者・・・・・Wriname
- 本体価格・・・Cost
- ISBN ・・・・IsCode
取り出した書誌データは「抽出データ」シートの何行目に張り付ければ良いかを調べる必要があります。
その行数は作業する毎に増えていきますので、その時に張り付ける行は何行目かを変数として定義します。
「データ入力行」・・・nRow
「抽出データ」シートに書誌データを送るのに、第1行目を項目行にします。
'抽出データシートのデータ項目を記述
Worksheets("抽出データ").Select
Range("A1").Value = "ISBN"
Range("B1").Value = "書名"
Range("C1").Value = "出版社名"
Range("D1").Value = "著者名"
Range("E1").Value = "本体価格"
Range("F1").Value = "冊数"
Range("G1").Value = "客注名"
データを張り付ける行は何行目かを調べるのに
A列を使って行数を計ります。

'A列を使ってデータ入力済の行数を数える
nRow = Range("A1").CurrentRegion.Rows.Count + 1
「書誌データ貼付」シートにて、変数に値を代入します。
セル位置データ入力表の値を変数に代入します。
'Webからコピペした書誌データの取り込み
'書誌データ貼付シートでのデータ取り出し
With Worksheets("書誌データ貼付")
.Select
BN = .Range("H2").Value
BS = .Range("H3").Value
SH = .Range("H4").Value
WR = .Range("H5").Value
CO = .Range("H6").Value
ISB = .Range("H7").Value
値を代入した変数から対応する文字列を取得します。
書名「Boname」が空白値の場合は、書誌データを取得できないので、プロシージャーを終了します。

Boname = .Range(BN)
If Boname = "" Then
MsgBox "書名が見つかりません。" & vbCrLf & _
"初めからやり直してください。", vbExclamation, "FAX注文書作成"
Exit Sub
End If
Bosname = .Range(BS)
Shuname = .Range(SH)
Wriname = .Range(WR)
Cost = .Range(CO)
IsCode = .Range(ISB)
抽出項目と抽出したいデータがつながっている時のつなぎ文字(「発行所=技術評論社」の場合は「=」)を指定することで、抽出データだけを分離しています。




For i = 2 To 7
If .Cells(i, 9) = "" Then
.Cells(i, 9) = " "
End If
Next i
Boname = Right(Boname, _
Len(Boname) - InStr(Boname, .Range("I2")))
Bosname = Right(Bosname, _
Len(Bosname) - InStr(Bosname, .Range("I3")))
Shuname = Right(Shuname, _
Len(Shuname) - InStr(Shuname, .Range("I4")))
Wriname = Right(Wriname, _
Len(Wriname) - InStr(Wriname, .Range("I5")))
Cost = Right(Cost, Len(Cost) - InStr(Cost, .Range("I6")))
IsCode = Right(IsCode, _
Len(IsCode) - InStr(IsCode, .Range("I7")))
End With
次に、この変数で指定されたセル位置にある(セル内の)データを
「抽出データ」シートの所定位置に張り付けていきます。
ISBNについては同時に表示形式を”数値”に変更します。


'抽出シートへデータを転記
With Worksheets("抽出データ")
.Select
'書名
.Range("B" & nRow) = Boname
'副書名
.Range("I" & nRow) = Bosname
'書名連結
.Range("B" & nRow) = .Range("B" & nRow) _
& " " & .Range("I" & nRow)
.Range("I" & nRow) = ""
'出版社
.Range("C" & nRow) = Shuname
'著者
.Range("D" & nRow) = Wriname
'本体価格
.Range("E" & nRow) = Cost
'ISBN
With .Range("A" & nRow)
.Value = IsCode
.NumberFormatLocal = "0_ "
End With
End With
返品数量と何のキャンセル分かの情報を入力できるようにします。
ここで使用する変数は、
利用者側からの情報入力での変数設定
- 返品冊数 ・・・・・・mysasu
- 説明文1・・・・・・・mymsg1
- 説明文2・・・・・・・mymsg2
- InputBoxタイトル1・・mytitle1
- InputBoxタイトル2・・mytitle2
- 客注名 ・・・・・・・mykyaku

情報の入力方法はサクッと ” インプットボックス ” で作ってしまいます。
'利用者からの情報取得
With Worksheets("抽出データ")
.Select
'冊数
mymsg1 = "冊数を記入ください。"
mytitle1 = "冊数"
mysasu = Application.InputBox(prompt:=mymsg1, _
Title:=mytitle1, Type:=1)
If mysasu = "" Or mysasu = False Then
MsgBox "数量が入力されていませんが、" & vbCrLf & _
"数量1冊として登録します。", vbExclamation, "FAX注文書作成"
mysasu = 1
End If
.Range("F" & nRow).Value = mysasu
'客注名
mymsg2 = "客注名を記入ください。"
mytitle2 = "客注名"
mykyaku = Application.InputBox(prompt:=mymsg2, _
Title:=mytitle2, Type:=2)
If mykyaku = "" Or mykyaku = False Then
MsgBox "客注名が入力されていませんが、" & vbCrLf & _
"客注名無しとして登録します。", vbExclamation, "FAX注文書作成"
mykyaku = ""
End If
.Range("G" & nRow).Value = mykyaku
「抽出データ」シートに必要な書誌データを移しましたが、
セル幅を自動で調節して見やすくします。

'列幅自動調節
.Columns("A:E").AutoFit
End With
これで、このページで行う目標は完了です。
次の返品書誌のデータ抽出のために、「書誌データ貼付」のデータをクリアーします。
With Worksheets("書誌データ貼付")
.Activate
.Range("A:F").Clear
.Range("A1").Select
End With
End Sub
「書誌データ取出し」実行ボタンの設置

「書誌データ貼付」シートに、プロシージャー「書誌データ登録」を作動させるボタンを設置します。
設置場所は指定はありませんが、G・H列あたりがいいと思います。
ボタンの設置方法についてはこちらでも↓確認できます。

出来上がりのシートはこのようになります。
作成したVBAコード全体

Option Explicit
Sub 書誌データ登録()
'変数の宣言
Dim BN, Boname As String
Dim BS, Bosname As String
Dim SH, Shuname As String
Dim WR, Wriname As String
Dim CO, Cost As String
Dim ISB, IsCode As String
Dim i, nRow As Long
Dim mysasu As Variant
Dim mymsg1, mymsg2, mytitle1, mytitle2, mykyaku As Variant
'抽出データシートのデータ項目を記述
Worksheets("抽出データ").Select
Range("A1").Value = "ISBN"
Range("B1").Value = "書名"
Range("C1").Value = "出版社名"
Range("D1").Value = "著者名"
Range("E1").Value = "本体価格"
Range("F1").Value = "冊数"
Range("G1").Value = "客注名"
'A列を使ってデータ入力済の行数を数える
nRow = Range("A1").CurrentRegion.Rows.Count + 1
'Webからコピペした書誌データの取り込み
'書誌データ貼付シートでのデータ取り出し
With Worksheets("書誌データ貼付")
.Select
BN = .Range("H2").Value
BS = .Range("H3").Value
SH = .Range("H4").Value
WR = .Range("H5").Value
CO = .Range("H6").Value
ISB = .Range("H7").Value
Boname = .Range(BN)
If Boname = "" Then
MsgBox "書名が見つかりません。" & vbCrLf & _
"初めからやり直してください。", vbExclamation, "FAX注文書作成"
Exit Sub
End If
Bosname = .Range(BS)
Shuname = .Range(SH)
Wriname = .Range(WR)
Cost = .Range(CO)
IsCode = .Range(ISB)
For i = 2 To 7
If .Cells(i, 9) = "" Then
.Cells(i, 9) = " "
End If
Next i
Boname = Right(Boname, _
Len(Boname) - InStr(Boname, .Range("I2")))
Bosname = Right(Bosname, _
Len(Bosname) - InStr(Bosname, .Range("I3")))
Shuname = Right(Shuname, _
Len(Shuname) - InStr(Shuname, .Range("I4")))
Wriname = Right(Wriname, _
Len(Wriname) - InStr(Wriname, .Range("I5")))
Cost = Right(Cost, Len(Cost) - InStr(Cost, .Range("I6")))
IsCode = Right(IsCode, _
Len(IsCode) - InStr(IsCode, .Range("I7")))
End With
'抽出シートへデータを転記
With Worksheets("抽出データ")
.Select
'書名
.Range("B" & nRow) = Boname
'副書名
.Range("I" & nRow) = Bosname
'書名連結
.Range("B" & nRow) = .Range("B" & nRow) _
& " " & .Range("I" & nRow)
.Range("I" & nRow) = ""
'出版社
.Range("C" & nRow) = Shuname
'著者
.Range("D" & nRow) = Wriname
'本体価格
.Range("E" & nRow) = Cost
'ISBN
With .Range("A" & nRow)
.Value = IsCode
.NumberFormatLocal = "0_ "
End With
End With
'利用者からの情報取得
With Worksheets("抽出データ")
.Select
'冊数
mymsg1 = "冊数を記入ください。"
mytitle1 = "冊数"
mysasu = Application.InputBox(prompt:=mymsg1, _
Title:=mytitle1, Type:=1)
If mysasu = "" Or mysasu = False Then
MsgBox "数量が入力されていませんが、" & vbCrLf & _
"数量1冊として登録します。", vbExclamation, "FAX注文書作成"
mysasu = 1
End If
.Range("F" & nRow).Value = mysasu
'客注名
mymsg2 = "客注名を記入ください。"
mytitle2 = "客注名"
mykyaku = Application.InputBox(prompt:=mymsg2, _
Title:=mytitle2, Type:=2)
If mykyaku = "" Or mykyaku = False Then
MsgBox "客注名が入力されていませんが、" & vbCrLf & _
"客注名無しとして登録します。", vbExclamation, "FAX注文書作成"
mykyaku = ""
End If
.Range("G" & nRow).Value = mykyaku
'列幅自動調節
.Columns("A:E").AutoFit
End With
With Worksheets("書誌データ貼付")
.Activate
.Range("A:F").Clear
.Range("A1").Select
End With
End Sub
Webの書誌情報を利用のまとめ

返品了解書を作成して行く中で、Webから書誌データ入手して利用することが省力化、自動化の一つの方法だということを説明してきました。
その具体的方法として、エクセルBOOKに「書誌データ貼付」シートを作成して、それに対応したデータ処理のVBAコードを組み立てました。
今回は返品時の依頼書作成のためのものでしたが、返品以外にもこの書誌データをいろいろ利用することが出来ると思います。
それぞれに利用できる部分を考えられればと思います。
次は抽出したデータを整理整頓する作業に移ります。


電子書籍版「大村式【動画&テキスト】Excelマクロ&VBA最高のはじめ方」をamazonで見てみる
(著者)大村あつし(出版社)技術評論社
(税込価格)1,628円(本体1,480円+税)
学習書の新しい形です。
YouTubeと完全リンクした参考書です。入門と基礎を重点的に22本の動画で解説をしています。
ちょっとした空き時間を利用してでもスマホがあれば学習ができます。
動画は優しい語り口調で、視聴者にある意味安心感を与えてくれます。動画は5分から20分間ぐらいで22本の構成です。
文章解説と動画解説の関係性は、動画解説が主で、文章解説がサポートいう使い方もできます。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。