Webの書誌情報を利用して返品了解書を作成する

henwebdaeyecatcha

出版社への面倒な返品了解依頼。了解書作成をサクッと簡単に済ませる方法を紹介しています。
今回は「Webの書誌データを利用」その取り出し方をエクセルVBAを使って説明します。

こんにちは、じゅんぱ店長(@junpa33)です。

今回のテーマは返品了解書作成ソフト作りの中で、

返品をしたい書誌のデータを、Webにある情報から入手します。

手打ちで書誌情報を入力すれば済む様な問題かもしれませんが、作業効率化の面からも ”楽できるところは楽をする” ことにしましょう。

何冊分も手打ちしなくて済む自動化は、エクセルVBAを使って作成していきます。

「FAX発注書作成」で作成したコードと同じ要領で行うことが出来ます。

このテーマの前の記事についてはこちら↓になります。

henpintempeyecatch Excelシートに返品了解書テンプレートを作成。手書き入力可能

Webの書誌データをエクセルBOOKに落とす

henpinjoho006kai

新しくエクセルBOOKを開きます。

シートの名前を変更します。

  •  Sheet1を「操作ボタン」
  •  Sheet2を「書誌データ貼付」
  •  Sheet3を「抽出データ」
  •  Sheet4を「出版社リスト」

とします。

「操作ボタン」シートでは

Webから取り込んだデータを出版社別に整理して、返品了解書テンプレートに書誌データを送ることを操作します。

「書誌データ貼付」シートでは

Webからのコピペしたデータの必要部分を取り出し「抽出データ」シートへデータを送ります。

「抽出データ」シートは

取り出した書誌データのストックヤードになります。

「出版社リスト」シートは

返品了解依頼先の出版社の一覧書き出し用シートになります。

そして このエクセルBOOKを「返品書誌情報」として保存します。

「書誌データ貼付」シートを作成します

henpinjoho007kai

Webにある書誌情報を取り入れるために最初に「書誌データ貼付」シートを作成します。

書誌データのセル位置確認

Webからの書誌データをコピペする時の、必要なデータのセル位置を確認します。

必要な書誌データは

  •  書誌名
  •  副書名
  •  出版社
  •  著者名
  •  本体価格
  •  ISBNコード

になります。

この項目が表示されているセル位置を登録指定するための表を作成します。

コピー元のWebサイトによってセル位置が変わりますので、

参照するWebサイトを変更するときは、その都度設定してください。

日販NOCSから書誌データを取得する場合は、セル位置は殆ど変化しませんので利用しやすいです。出版書誌データベースの場合は、頻繁にセル位置が変化しますので、その都度、設定変更をしてください。

貼り付けには書誌データのテキストをつかんで、

コピー先(書誌データ貼付)のA列に「形式を指定して貼り付け」の「テキスト」を選択します。

日販NOCSのサンプル

henpinjoho001a

コピーしたい書誌データをつかみます。

返品書誌情報.xlsmの「書誌データ貼付」シートのA列に

「形式を選択して貼り付け」→「テキスト」で張り付けます。

henpinjoho002kai

「抽出項目」があるセル位置を「抽出セル名」に入力します。

このサンプルでは、それぞれの項目のセル位置は

  1.  書名・・・・・A1
  2.  副書名・・・・B2
  3.  出版社・・・・B6
  4.  著者・・・・・B7
  5.  本体価格・・・B8
  6.  ISBN ・・・・B9

になります。

セル位置の入力表は、G列に抽出項目をH列に入力欄を作成してください。

I列に「項目とデータの区切り文字」入力欄を作成します。

VBAでデータを拾っていきますので、入力欄のセル位置は変更しないでください。

「書誌データ貼付」シートのレイアウトはセル位置データ入力表以外は特に指定はありませんが、

例えばこのシートは、

各セル高さ(行の高さ)・・36ピクセル

列の幅 A列・・・・・・・335ピクセル

B列~F列・・・・・・・・88ピクセル

G列~H列・・・・・・・・125ピクセル

I列・・・・・・・・・・・・256ピクセル

の設定になっています。

VBAの組み立て準備

この書誌データ貼付シートではペーストしたデータを「抽出データ」シートへ送り出すためのVBAを組み、

作動ボタンを設置していきます。

保存したエクセルBOOK「返品書誌情報.xlsm」を起動して下さい。

標準モジュールを挿入します

まず、VBAを記述するため「返品書誌情報.xlsm」にModuleを挿入します。

(挿入の方法はこちら↓で確認できます。)

VBE(ビジュアルベーシックエディター)を起動する

vbavbekidoeyecatch VBA初めての起動。VBEの立ち上げ、保存と終了

VBAの記述

プロシージャー名を「書誌データ登録」としてください。

VBA
Option Explicit

Sub 書誌データ登録()
・・・・
End Sub

変数の宣言

まず「書名」、「副書名」、「出版社」、「著者」、「本体価格」、「ISBN」を変数として宣言します。

VBA
'変数の宣言
    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

入力された「抽出セル名」を変数化する

  1.  書名・・・・・BN
  2.  副書名・・・・BS
  3.  出版社・・・・SH
  4.  著者・・・・・WR
  5.  本体価格・・・CO
  6.  ISBN ・・・・ISB

「抽出セル名」から得られる各文字列を変数化する

  1.  書名・・・・・Boname
  2.  副書名・・・・Bosname
  3.  出版社・・・・Shuname
  4.  著者・・・・・Wriname
  5.  本体価格・・・Cost
  6.  ISBN ・・・・IsCode

取り出した書誌データは「抽出データ」シートの何行目に張り付ければ良いかを調べる必要があります。

その行数は作業する毎に増えていきますので、その時に張り付ける行は何行目かを変数として定義します。

「データ入力行」・・・nRow

「抽出データ」シートへデータを送る操作1

「抽出データ」シートに書誌データを送るのに、第1行目を項目行にします。

VBA
'抽出データシートのデータ項目を記述
        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列を使って行数を計ります。

vbalastcelleyecatch データ入力済セルの最終行番号を取得する
VBA
'A列を使ってデータ入力済の行数を数える
        nRow = Range("A1").CurrentRegion.Rows.Count + 1

「抽出データ」シートへデータを送る操作2

「書誌データ貼付」シートにて、変数に値を代入します。

セル位置データ入力表の値を変数に代入します。

VBA
'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」が空白値の場合は、書誌データを取得できないので、プロシージャーを終了します。

vbamsgboxeyecatch メッセージボックス MsgBox実際の使い方を最速に理解
VBA
            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)

抽出項目と抽出したいデータがつながっている時のつなぎ文字(「発行所=技術評論社」の場合は「=」)を指定することで、抽出データだけを分離しています。

fornextirekoeyecatch For~Nextのループと入れ子構造をVBA最速理解 vbamideyecstch Mid関数・Right関数・Left関数は文字列中の文字を切り出す vbaleneyecatch Len関数・LenB関数で文字列の文字数を調べる vbainsteeyecatch Instr関数・InstrRev関数は文字列を検索する。ファイルパス取得に威力
VBA
            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については同時に表示形式を”数値”に変更します。

vbawithstateeyecatch With~End Withの使い方。VBAコードを簡潔に記述する vbacellssyoshikieyecatch 「表示形式」をVBAコード的に最速理解する
VBA
    '抽出シートへデータを転記
        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

追加情報を入力できるようにする

返品数量と何のキャンセル分かの情報を入力できるようにします。

ここで使用する変数は、

利用者側からの情報入力での変数設定

  1.  返品冊数 ・・・・・・mysasu
  2.  説明文1・・・・・・・mymsg1
  3.  説明文2・・・・・・・mymsg2
  4.  InputBoxタイトル1・・mytitle1
  5.  InputBoxタイトル2・・mytitle2
  6.  客注名 ・・・・・・・mykyaku
vbainputboxeyecatch 2つのインプットボックス。関数とメソッド、特徴を生かした使い分け

情報の入力方法はサクッと ” インプットボックス ” で作ってしまいます。

VBA
'利用者からの情報取得
        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

セルのサイズの自動調整

「抽出データ」シートに必要な書誌データを移しましたが、

セル幅を自動で調節して見やすくします。

vbacolumnseyecatch Columnsプロパティでセルの列を指定する
VBA
        '列幅自動調節
            .Columns("A:E").AutoFit
        End With

次の書誌データ抽出のための準備

これで、このページで行う目標は完了です。

次の返品書誌のデータ抽出のために、「書誌データ貼付」のデータをクリアーします。

VBA
        With Worksheets("書誌データ貼付")
            .Activate
            .Range("A:F").Clear
            .Range("A1").Select
        End With
End Sub

「書誌データ取出し」実行ボタンの設置

vbabuttoneyecatch コマンドボタンをシートに設置する2つの方法

「書誌データ貼付」シートに、プロシージャー「書誌データ登録」を作動させるボタンを設置します。

設置場所は指定はありませんが、G・H列あたりがいいと思います。

ボタンの設置方法についてはこちらでも↓確認できます。

データ抽出ボタンを設置する。

出来上がりのシートはこのようになります。

作成したVBAコード全体

henpinjoho008kai
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の書誌情報を利用のまとめ

henpinjoho009kai

返品了解書を作成して行く中で、Webから書誌データ入手して利用することが省力化、自動化の一つの方法だということを説明してきました。

その具体的方法として、エクセルBOOKに「書誌データ貼付」シートを作成して、それに対応したデータ処理のVBAコードを組み立てました。

今回は返品時の依頼書作成のためのものでしたが、返品以外にもこの書誌データをいろいろ利用することが出来ると思います。

それぞれに利用できる部分を考えられればと思います。

次は抽出したデータを整理整頓する作業に移ります。

syosikakoueyecatcha 返品書誌データを出版社別に振り分けた出版社シートの作成

大村式【動画&テキスト】Excelマクロ&VBA最高のはじめ方
初めてのVBAの勉強、構えなくても気軽に始められる。
vbastudy020a
vbastudy021a

電子書籍版「大村式【動画&テキスト】Excelマクロ&VBA最高のはじめ方」をamazonで見てみる

(著者)大村あつし
(出版社)技術評論社
(税込価格)1,628円(本体1,480円+税)

学習書の新しい形です。
YouTubeと完全リンクした参考書です。入門と基礎を重点的に22本の動画で解説をしています。
ちょっとした空き時間を利用してでもスマホがあれば学習ができます。
動画は優しい語り口調で、視聴者にある意味安心感を与えてくれます。動画は5分から20分間ぐらいで22本の構成です。
文章解説と動画解説の関係性は、動画解説が主で、文章解説がサポートいう使い方もできます。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

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