電子書籍の厳選無料作品が豊富!

全然分からず、大変困っています。宜しくお願い致します。

【質問】
あるフォルダーに複数のhtmlファイルがあります。その各ファイルの中に商品番号と卸価格の情報が含まれています。商品は、各ファイルごとに数10件程度ありますが、数は決まっていません。
このファイル群に含まれる全ての卸価格を、エクセルに抽出するマクロを教えていただけないでしょうか。

全商品番号は、「卸価格情報」というシートのA列に2行目(A2)から既に入力されています。その情報を元に、該当する卸価格を抽出し、B列の該当行にそれぞれ入力するマクロが希望です。
(もし不要であれば、A列に既に入っている商品番号をご利用頂かなくても問題ございません。結果としてA列に商品番号、B列に卸価格が得られれば、方法は問いません。)

【ソース】※全文は、文字数オーバーとなる為、該当部分の一部を抜き出しました。また、ソースは「株式会社名」を「あいうえお株式会社」、「リンクアドレス」を「aaaa.jp」、「商品名」をそれぞれ「商品A」「商品B」に変更した以外はオリジナルのままです。また、一例ですが、<a href="/shop/357136/4971710383515">商品A</a></h3>の「4971710383515」部分が商品番号です。
また、その商品の「卸価格」は、そこから下方向に一番近い<strong class="fontstyle1">卸価格203円/点(税抜)</strong>に記載されており、そこから「203」というように数値部分のみを抽出したいです。

<table id="listingTableA" summary="テーブルA">
<tr class="item firstRow">
<td class="classFirstCol">
<div class="iteminner">
<div class="itemImage">
<a href="/shop/357136/4971710383515"><img src="http://img04.aaaa.jp/ex37/20150331/6/sml_6418346 … width="140" height="140" alt="商品A" border="0" class="imageborder"></a>
</div><!-- /itemImage -->
<div class="itemBanner">
<img src="/image/icon/beginner2.gif" alt="ビギナー購入可" class="mr">



<img src="/image/stamp/stamp07.gif" alt="スタンプ【販売後注文可】">
<img src="/image/icon/ninki2_3.gif" alt="人気★★★">
<img src="/image/icon/chumoku2_3.gif" alt="注目★★★">
<img src="/image/icon/repeat2_3.gif" alt="リピート★★★">
</div><!-- /itemBanner -->


<div class="contEnd"><hr></div>
<h3 class="itemListContents" data-soldOutFlug="N" data-exId="6418346"><!--(商品)-->

<a href="/shop/357136/4971710383515">商品A</a></h3>

<div class="itemInfo">
<!---->
<!---->

<!---->

<!---->

<!---->




<div>
<script type="text/javascript">
//<![CDATA[
if (isHasNickName) {
document.write('オープンプライス');
}
//]]>
</script>
</div>

<div class="itemPrice">
<!---->
<!---->
<!---->
<strong class="fontstyle1">卸価格203円/点(税抜)</strong>
<!---->

<!---->

</div><!--/.itemPrice-->

<script type="text/javascript">
//<![CDATA[
if (isHasNickName) {
document.write('<div class="iconBox"><div class="payIcons"><img src="/image/icon/pay_atobarai.gif" alt="後払い可" class="mr"><img src="/image/icon/pay_creditcard.gif" alt="クレジットカード可" class="mr"></div><\/div><!-- /.iconBox -->');
}

if (isHasNickName) {
document.write('<h4>あいうえお 株式会社 </h4>');
}

if (isHasNickName) {
document.write('<div class="supLink"><a href="/corpinfo/357136">⇒会社情報</a><a href="/shop/357136">⇒商品一覧</a><a href="/shop/357136/B">⇒ブランド一覧</a></div><div class="brandName"><img src="/image/icon/brand.gif" alt="ブランド"> <a href="/shop/357136/B/P">あいうえお 株式会社</a></div>');
}
//]]>
</script>

<div class="bookmarkBtnWrap">
<a href="javascript:void(0);" data-products=";357136_30301_4971710383515" data-option="6418346" data-count="1" class="itemBookmarkBtn" id="bkmkBtn1">ブックマーク<span>に追加</span></a>
<div id="bkmkPopup_1" class="bkmkPopupC"></div>
</div>

</div><!-- /itemInfo -->
</div><!-- /iteminner -->


</td>
<td class="col">
<div class="iteminner">
<div class="itemImage">
<div class="soldout"><a href="/shop/357136/4902424437867">完売御礼</a></div>
<a href="/shop/357136/4902424437867"><img src="http://img04.aaaa.jp/ex36/20150410/6/sml_6819716 … width="140" height="140" alt="商品B" border="0" class="imageborder"></a>
</div><!-- /itemImage -->
<div class="itemBanner">
<img src="/image/icon/beginner2.gif" alt="ビギナー購入可" class="mr">

<img src="/image/icon/ninki2_2.gif" alt="人気★★">
</div><!-- /itemBanner -->


<div class="contEnd"><hr></div>
<h3 class="itemListContents" data-soldOutFlug="Y" data-exId="6819716"><!--(商品)-->

<a href="/shop/357136/4902424437867">商品B</a></h3>

<div class="itemInfo">
<!---->
<!---->

<!---->

<!---->

<!---->




<div>
<script type="text/javascript">
//<![CDATA[
if (isHasNickName) {
document.write('オープンプライス');
}
//]]>
</script>
</div>

<div class="itemPrice">
<!---->
<!---->
<!---->
<strong class="fontstyle1">卸価格1,021円/点(税抜)</strong>
<!---->

<!---->

</div><!--/.itemPrice-->

A 回答 (13件中11~13件)

次の二つのページを参考にして、勉強のために作ってみました。



「エクセルからテキストを開き、コピー&ペーストするマクロ(VBA)を... - Yahoo!知恵袋」
http://detail.chiebukuro.yahoo.co.jp/qa/question …

「【VBA】テキストファイルの一部をエクセルに抽出するマクロ - Yahoo!知恵袋」
http://detail.chiebukuro.yahoo.co.jp/qa/question …

次の通りです。
・各商品が<!--(商品)-->と<!--/.itemPrice-->で囲まれていることが前提。
・商品名のリンクが「/shop/357136/」など商品番号の前に"/"が3個あることが前提。
・卸価格が「卸価格」と「</strong>」で囲まれていることが前提です。
既にリストアップされた商品番号を利用せず、抽出した各商品のブロックから、「商品番号」と「卸価格」を抽出しました。
私はプログラミングの素人ですから、プロが改造すれば、もっときれいなプログラムになるかもしれません。

Sub sample()
Dim folder As String
Dim r As Long
Dim n As Long
Dim m As Long
Dim item As Variant
Dim price As Variant
Dim file As Variant
Dim str As Variant
Dim str0 As String

lastRow = Range("A" & Rows.Count).End(xlUp).Row 'A列最終行

item = Range("A1:A10000")
price = Range("B1:B10000")
file = Range("ZZ1:ZZ1000")
folder = ThisWorkbook.Path '全てがあるフォルダ
r = 0

For n = 1 To 1000
file(n, 1) = n & ".html" 'ファイル名は、通し番号+".html"

If Dir(folder & "\" & file(n, 1)) <> "" Then 'ファイルがあったら
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile (folder & "\" & file(n, 1))
str0 = .ReadText
.Close

str = Split(str0, "<!--(商品)-->")

For m = 1 To UBound(str)

str(m) = Split(str(m), "<!--/.itemPrice-->")(0)
item(r + m, 1) = Split(Split(str(m), "/")(3), """")(0)
price(r + m, 1) = Split(Split(str(m), "卸価格")(1), "</strong>")(0)

Range("A" & r + m).Value = item(r + m, 1)
Range("B" & r + m).Value = price(r + m, 1)

Next

r = r + UBound(str)

End With
End If

Next
End Sub
    • good
    • 0

回答は消さないのですよね。


的外れな回答だから恥ずかしくて消したくなりましたが…。

さっきの回答の二番目の「問いにあるソースの上に、次のソースを記述し」は「問いにあるソースの下に、次のソースを記述し」です。

ファイルが大量にあったら、この方法は面倒ですね。

どなたかが、VBAか何かを使った方法を教えてくれると思うので、
私の回答は、簡単にできそうだと期待する材料程度にしてください。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。こういう方法もあるのですね。勉強になります。

ご指摘のとおり、ファイル数は大量(数千程度)にございますので、全てのファイルを一括で処理出来る方法の方がありがたい為、大変恐縮ではございますが、引き続き、回答を募集させてください。

お礼日時:2015/04/13 16:27

エクセルのマクロは分かりませんが、


最初からエクセルを使うのではなく、
テキストから抽出するプログラムを使って抽出してから、エクセルに移しても良いのかもしれません。

ちなみに、HTMLソースから抜き出すというと、私の場合はJavascriptを使うことを連想しちゃうので、試してみました。

問いにあるソースの上に、次のソースを記述し、

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">

<script type="text/javascript">
function change(){
var str = "";
var str0 = "";
var item = document.getElementsByTagName("h3");
var Price = document.getElementsByTagName("strong");
for (var i = 0; i < item.length; i++){
str0=item[i].innerHTML.split('/')[3]+","+Price[i].innerHTML;
str0=str0.replace('">', ',');
str0=str0.replace('<,卸価格', ',');
str=str+"<br />"+str0
}
document.write(str);
}
</script>

<title>J抽出</title>
</head>
<body>

問いにあるソースの上に、次のソースを記述し、

<form>
<input type="button" value="抽出" onClick="change()">
</form>

</body>
</html>

ブラウザで表示した後に「抽出」ボタンを押したら、次のような出力になりました。

4971710383515,商品A,203円/点(税抜)
4902424437867,商品B,1,021円/点(税抜)

これをテキストに保存できるようにして、,区切りのCSVファイルとして読み込めば、
その後の処理が楽かもしれません。
ただ、これが使えるのは、HTMLソースのフォーマットが統一されている時だけです。
ソースによって微妙に異なるのなら、違った出力になるかもしれません。
    • good
    • 0
この回答へのお礼

マクロも記述いただきまして、ありがとうございます。
私が知識が無い為に、マクロでお願いしておりましたが、どうも、いしい様に最初にご提案いただきましたjavaによる方法が今回の質問に合っているように思います。

そこで、「冒頭の2行目の欠落部分」(www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …)と、以下の書式で抽出する場合は、どう記述すれば良いかを教えていただけないでしょうか。
お手数をお掛け致しますが、宜しくお願い致します。

4971710383515 商品A 203
※上記は半角スペースで記述しましたが、欲しいのは、タブ区切りです

この辺の記述を多分変更するのだろうな、と思うのですが、さっぱりわかりません。どんな本を読めばこの辺がわかるようになりますか。
str0=item[i].innerHTML.split('/')[3]+","+Price[i].innerHTML;
str0=str0.replace('">', ',');
str0=str0.replace('<,卸価格', ',');
str=str+"<br />"+str0

お礼日時:2015/04/14 10:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!