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

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

【質問】
あるフォルダーに複数の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件中1~10件)

圧縮ファイルの中ではなかったのですね。


VBAで圧縮フォルダーの中から一つづつファイルを展開して処理後に削除するアルゴリズムで対策を考えていましたが、私の趣味の範囲で終わりそうです。
やはりhtmlソース内の私が見てない部分が原因かもしれませんね。
でも、htmlソースに
<!--(商品)-->
が含まれていれば、まともな抽出でなくても、何かは抽出されるはずなのですが…。
真っ白だった原因が気になりますが、これまでの情報だけでは難しそうです。

Javascriptの方で何とかなりそうなら、そちらを利用してもらうしかありません。
大量にファイルがある場合は、そちらだと手間がかかりそうですが、
お役に立てなくてすみません。

質問を締めてくださって結構です。
私のVBAのプログラムの問題点は、もう少し分析してから私が別に質問したいと思います。
これ以上mnmnmnoにお付き合いいただいては申し訳ありませんし…。
今回は課題を提供してくださって勉強になりました。ありがとうございました。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
私の方こそ、これ以上、お手数をお掛けするのは申し訳なく思いますので、締めさせて頂きたいと思います。
大量データにつきましては、複数ファイルを1ファイルまとめて、動作確認が取れましたので、問題ないです。
また、しばらくしましたら、いしい様のページを覗いてみたいと思います。
本当にありがとうございました。

お礼日時:2015/04/14 22:11

もし、私がアップロードしたExcelファイルで、


同じフォルダーにある「サンプル.htm」などでも、真っ白なままだと、
環境依存なのかもしれません。
文字コード違いなら、ファイル名の一覧だけは表示されます。
ちなみに、私はWindows 7のExcel 2007 です。

SHIFT-JIS用です。
http://yahoo.jp/box/5NoxCe
UTF-8用は
http://yahoo.jp/box/mibuVN

ちなみに、圧縮フォルダーの中に入ったままだと、
「表示」タブ「マクロ」グループ「マクロの表示」の「sample」で「実行」しても真っ白なままです。
ファィル数が多いということなので、圧縮フォルダーの中にある可能性も…。
ただ、2ファイルのみでも動かないということは圧縮フォルダーの中ではないでしょうから…。
    • good
    • 0
この回答へのお礼

お世話になっております。

サンプルは、動作しました。
圧縮ファイルでもないです。
ソースも前半部分は、サンプルと同じにしましたが、後半部分は、サンプルと全く同じでは無く、不要な部分が削除しきれない状態で残っています。これが原因の可能性はあるでしょうか。

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

失礼しました。


SHIFT-JISに変更してあったのですね。
変ですね。
私が試したサンプルHTMLは、て供された部分にヘッダ部分を付けただけなので、
他に何かあるのかな?
とりあえず、私の共有ホルダにアップロードしたので、
こちらでお試しください。
http://yahoo.jp/box/5NoxCe
SHIFT-JIS用です。
UTF-8用は
http://yahoo.jp/box/mibuVN
    • good
    • 0
この回答へのお礼

ありがとうございます。

サンプルのソースと同様に不要部分を削除した上で実行してみましたが、だめでした。
マクロだとソースがちょっと違ったら動作しないのですね。会員だけのページですので、公開は難しい為、これ以上は、無理かもしれないですね。

色々調べてみましたら、JAVAの方で、やりたい事は、なんとか出来そうです。ご返答をお待ちして無理そうなら、質問を締めたいと思います。

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

HTMLソースの文字コードがSIFT-JISだと、何も抽出されないです。


その場合はマクロの方のUTF-8の所をSIFT-JISに書き換えてみてください。
    • good
    • 0

>「冒頭の2行目の欠落部分」(www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …)


リンクになっちゃってますね。http://の後ろは
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
です。

> 4971710383515 商品A 203
> ※上記は半角スペースで記述しましたが、欲しいのは、タブ区切りです
タブ区切りは方法が分からないです。ウェブではすべてスペースになっちゃうので…。
でも、カンマだと卸価格の3桁区切りと区別つかないですね。
卸価格からカンマを取っちゃえば良いかもしれません。
str0=item[i].innerHTML.split('/')[3]+","+Price[i].innerHTML;

str0=item[i].innerHTML.split('/')[3]+","+Price[i].innerHTML.replace(',', '');
にします。
また、「円/点(税抜)」を削除するのは、
str0=str0.replace('<,卸価格', ',');
の下に
str0=str0.replace('円/点(税抜)', '');
を入れます。
ウェブで表示するためにスペースを長く開けたいのなら、&nbsp;を重ねれば良いのですが、お勧めできません。

ただ、タブ区切りにしたいということは、Excelでの使用を考えているのでしょうから、
やっぱり、VBAの方が良いです。Excelからコピーすればタブ区切りになりますし…。

それで、

4971710383515 商品A 203
4902424437867 商品B 1,021
(ここにコピー&ペーストしたらタブ区切りになってます。表示は多分半角スペース)

のように表示させるマクロのプログラムを作ってみました。
自分が後々、他のことに応用することを想定していますで、コメント行があって見ずらいですが、
コピー&ペーストすると次の通りです。
ファイル名を通し番号にしなくて済むようにもしました。
また、異常があった時に元のファイルを探せるようにE列をファイル名に、
卸価格がちゃんと数値になっているか確認するためにF列(まだ改善の余地あり)を設けました。
タブ区切りのデータが欲しければ、A列からC列までをテキストエディタなどにコピーすれば良いと思います。

Sub sample()
Dim folder As String
Dim r As Long
Dim n As Long
Dim m As Long
Dim item(30000) As Variant '商品数以上に設定
Dim itemname(30000) As Variant '商品数以上に設定
Dim price(30000) As Variant '商品数以上に設定
Dim file(10000) As Variant 'ファイル数以上に設定
Dim str As Variant
Dim str0 As String
Dim buf As String
Dim cnt As Long 'ファイル数

folder = ThisWorkbook.Path '全てがあるフォルダ
r = 0

cnt = 0
buf = Dir(folder & "\*.htm*") '拡張子にhtmを含むファイルを一つ見つける

Do While buf <> ""
cnt = cnt + 1
file(cnt) = buf 'Dirで見つけたファイルを毎回file()に格納する
'Range("F" & cnt).Value = file(cnt) 'ファイル一覧の表示
buf = Dir() '上のDirと同じことを毎回繰り返すが、一度見つけたファイルは除外するらしい
Loop

For n = 1 To cnt 'ファイル数だけしか実行しない

With CreateObject("ADODB.Stream")
.Charset = "UTF-8" 'ファイルの文字コードを指定、シフトJISなら"SHIFT-JIS"
.Open
.LoadFromFile (folder & "\" & file(n))
str0 = .ReadText '.ReadTextのままだと問題が起きそうなので、str0にコピーした
.Close
End With

str = Split(str0, "<!--(商品)-->") 'ファイルのテキストを<!--(商品)-->で分割

For m = 1 To UBound(str) 'UBound関数は配列の指定された次元で使用できる添字の最大値を返す

str(m) = Split(str(m), "<!--/.itemPrice-->")(0) '分割した各ファイルの<!--/.itemPrice-->の後ろを切り捨て
item(r + m) = Split(Split(str(m), "/")(3), """")(0) 'コンパクトになった分割テキストから商品番号を抽出
itemname(r + m) = Split(Split(str(m), ">")(1), "<")(0) 'コンパクトになった分割テキストから商品名を抽出
price(r + m) = Split(Split(str(m), "卸価格")(1), "円/点(税抜)")(0) 'コンパクトになった分割テキストから卸価格を抽出

Range("A" & r + m).Value = item(r + m) '商品番号をA列に書き込み
Range("B" & r + m).Value = itemname(r + m) '卸価格をB列に書き込み
Range("C" & r + m).Value = price(r + m) '卸価格をC列に書き込み
Range("E" & r + m).Value = file(n) 'ファイル名をE列に書き込み
Range("F" & r + m).Value = "=C" & r + m & "*0" '卸価格が数値かチェック

Next

r = r + UBound(str) '次のファイルから抽出したデータを前のデータの下に書き込むため

Next
End Sub


> さっぱりわかりません。どんな本を読めばこの辺がわかるようになりますか。
本を買う金銭的余裕が無いので、ほとんどネット上の情報を利用しています。
また、コピー&ペースト後の改造は、ちゃんと勉強してないので暗号解読に近い状態です。
見たことのない各コマンド?の使い方はネット上で検索して調べています。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
マクロの方は、残念ながら動きはするものの、実行しても1行も書き出されず、全く何も変わらない状態で終了してしまいます(エラーは無く、何事もなかったかのように変化なしです)。SHIFT-JISですので、そこは書き換えました。また、ファイルは「1.html」「2.html」の2ファイルのみで、とりあえず実行しました。エクセルのファイルは、同じフォルダに保存してあります。この他に、何か前提条件が必要なのでしょうか。

JAVAの方は、うまく行きました。ご丁寧に色々とありがとうございます。

お礼日時:2015/04/14 18:31

またミスです。

たびたびすみません。

> そこから「203」というように数値部分のみを抽出したいです。
を見逃していました。

price(r + m) = Split(Split(str(m), "卸価格")(1), "</strong>")(0)



price(r + m) = Split(Split(str(m), "卸価格")(1), "円/点(税抜)</strong>")(0)

price(r + m) = Split(Split(str(m), "卸価格")(1), "円/点(税抜)")(0)
に変更してください。
    • good
    • 0

htmlファイルの文字コードのことも忘れていました。

UTF-8であることが前提になっています。

また、ファイル名を一括で連場にする方法は次のページなどに書いてあります。

「Windows 7で複数のファイル名を一括で変更する方法」
http://121ware.com/qasearch/1007/app/servlet/qad …

変更後のファイ名をDeleteすると" (1)"などと半角スペース付きのファイル名になります。

そんなこんなで、先のプログラムを変更し、無駄を省いたら次のようになります。

Sub sample()
Dim folder As String
Dim r As Long
Dim n As Long
Dim m As Long
Dim item(30000) As Variant '商品の数を設定
Dim price(30000) As Variant '商品の数と同じに
Dim file(10000) As Variant 'ファイルの数を設定
Dim str As Variant
Dim str0 As String

folder = ThisWorkbook.Path
r = 0

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

If Dir(folder & "\" & file(n)) <> "" Then
With CreateObject("ADODB.Stream")
.Charset = "UTF-8" 'ファイルの文字コードを指定、シフトJISなら"SHIFT-JIS"
.Open
.LoadFromFile (folder & "\" & file(n))
str0 = .ReadText
.Close

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

For m = 1 To UBound(str)

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

Range("A" & r + m).Value = item(r + m) '商品番号をA列に書き込み
Range("B" & r + m).Value = price(r + m) '卸価格をB列に書き込み

Next

r = r + UBound(str)

End With
End If

Next
End Sub
    • good
    • 0

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


を消し忘れました。
A列の情報を利用しようとしていた時の名残です。利用するなら、その行は削除してください。
他にも消し忘れが残ってたらすみません。
    • good
    • 0

ファイル数は数千でしたね。

1000個で作っちゃってあります。修正は容易ですが…。
それと、データの数がトータルでいくつになるか分からないので、配列の定義?の所で長さ?数?を増やさないといけないかもしれません。
    • good
    • 0

前提が一つ抜けてました。


htmlファイルがエクセルファイルと同じフォルダーにあり、拡張子がhtmlで通し番号であることが前提です。
Excelファイルにファイル名が書いてあれば、それを利用することができましたが、分からない状態で取得する方法は分かりませんでした。
    • good
    • 0

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