全然分からず、大変困っています。宜しくお願い致します。
【質問】
あるフォルダーに複数の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-->
No.13ベストアンサー
- 回答日時:
圧縮ファイルの中ではなかったのですね。
VBAで圧縮フォルダーの中から一つづつファイルを展開して処理後に削除するアルゴリズムで対策を考えていましたが、私の趣味の範囲で終わりそうです。
やはりhtmlソース内の私が見てない部分が原因かもしれませんね。
でも、htmlソースに
<!--(商品)-->
が含まれていれば、まともな抽出でなくても、何かは抽出されるはずなのですが…。
真っ白だった原因が気になりますが、これまでの情報だけでは難しそうです。
Javascriptの方で何とかなりそうなら、そちらを利用してもらうしかありません。
大量にファイルがある場合は、そちらだと手間がかかりそうですが、
お役に立てなくてすみません。
質問を締めてくださって結構です。
私のVBAのプログラムの問題点は、もう少し分析してから私が別に質問したいと思います。
これ以上mnmnmnoにお付き合いいただいては申し訳ありませんし…。
今回は課題を提供してくださって勉強になりました。ありがとうございました。
どうもありがとうございます。
私の方こそ、これ以上、お手数をお掛けするのは申し訳なく思いますので、締めさせて頂きたいと思います。
大量データにつきましては、複数ファイルを1ファイルまとめて、動作確認が取れましたので、問題ないです。
また、しばらくしましたら、いしい様のページを覗いてみたいと思います。
本当にありがとうございました。
No.12
- 回答日時:
もし、私がアップロードしたExcelファイルで、
同じフォルダーにある「サンプル.htm」などでも、真っ白なままだと、
環境依存なのかもしれません。
文字コード違いなら、ファイル名の一覧だけは表示されます。
ちなみに、私はWindows 7のExcel 2007 です。
SHIFT-JIS用です。
http://yahoo.jp/box/5NoxCe
UTF-8用は
http://yahoo.jp/box/mibuVN
ちなみに、圧縮フォルダーの中に入ったままだと、
「表示」タブ「マクロ」グループ「マクロの表示」の「sample」で「実行」しても真っ白なままです。
ファィル数が多いということなので、圧縮フォルダーの中にある可能性も…。
ただ、2ファイルのみでも動かないということは圧縮フォルダーの中ではないでしょうから…。
お世話になっております。
サンプルは、動作しました。
圧縮ファイルでもないです。
ソースも前半部分は、サンプルと同じにしましたが、後半部分は、サンプルと全く同じでは無く、不要な部分が削除しきれない状態で残っています。これが原因の可能性はあるでしょうか。
No.11
- 回答日時:
失礼しました。
SHIFT-JISに変更してあったのですね。
変ですね。
私が試したサンプルHTMLは、て供された部分にヘッダ部分を付けただけなので、
他に何かあるのかな?
とりあえず、私の共有ホルダにアップロードしたので、
こちらでお試しください。
http://yahoo.jp/box/5NoxCe
SHIFT-JIS用です。
UTF-8用は
http://yahoo.jp/box/mibuVN
ありがとうございます。
サンプルのソースと同様に不要部分を削除した上で実行してみましたが、だめでした。
マクロだとソースがちょっと違ったら動作しないのですね。会員だけのページですので、公開は難しい為、これ以上は、無理かもしれないですね。
色々調べてみましたら、JAVAの方で、やりたい事は、なんとか出来そうです。ご返答をお待ちして無理そうなら、質問を締めたいと思います。
No.9
- 回答日時:
>「冒頭の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
> さっぱりわかりません。どんな本を読めばこの辺がわかるようになりますか。
本を買う金銭的余裕が無いので、ほとんどネット上の情報を利用しています。
また、コピー&ペースト後の改造は、ちゃんと勉強してないので暗号解読に近い状態です。
見たことのない各コマンド?の使い方はネット上で検索して調べています。
どうもありがとうございます。
マクロの方は、残念ながら動きはするものの、実行しても1行も書き出されず、全く何も変わらない状態で終了してしまいます(エラーは無く、何事もなかったかのように変化なしです)。SHIFT-JISですので、そこは書き換えました。また、ファイルは「1.html」「2.html」の2ファイルのみで、とりあえず実行しました。エクセルのファイルは、同じフォルダに保存してあります。この他に、何か前提条件が必要なのでしょうか。
JAVAの方は、うまく行きました。ご丁寧に色々とありがとうございます。
No.8
- 回答日時:
またミスです。
たびたびすみません。> そこから「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)
に変更してください。
No.7
- 回答日時:
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
No.6
- 回答日時:
lastRow = Range("A" & Rows.Count).End(xlUp).Row 'A列最終行
を消し忘れました。
A列の情報を利用しようとしていた時の名残です。利用するなら、その行は削除してください。
他にも消し忘れが残ってたらすみません。
No.5
- 回答日時:
ファイル数は数千でしたね。
1000個で作っちゃってあります。修正は容易ですが…。それと、データの数がトータルでいくつになるか分からないので、配列の定義?の所で長さ?数?を増やさないといけないかもしれません。
No.4
- 回答日時:
前提が一つ抜けてました。
htmlファイルがエクセルファイルと同じフォルダーにあり、拡張子がhtmlで通し番号であることが前提です。
Excelファイルにファイル名が書いてあれば、それを利用することができましたが、分からない状態で取得する方法は分かりませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS FC2カートのテンプレートでの商品表示について 1 2023/03/02 18:05
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- HTML・CSS CSSのホバーエフェクト 1 2023/06/19 06:53
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- HTML・CSS 【HTML】【CSS】【Swiper】 元の画像は横1200×縦600なのですが、実際のサイト上に反 5 2022/07/16 13:57
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで 自動的に◯や数字を...
-
【マクロ】2回実行したら、エ...
-
エクセルのツールバーから数値...
-
特定の文字列を含む、住所を抽...
-
Excel 2019 [オプション]の[リボンのユ...
-
祝日と土曜、日曜の合計をカウ...
-
EXCELの散布図で日付が1900年に...
-
マイクロソフトのPADを使ってい...
-
絶対参照
-
エクセルでCtrl+Tでテーブルの...
-
【マクロ】名前を保存する際に...
-
エクセルのクイックアクセスツ...
-
【マクロ】VLOOKUPにて参照元に...
-
Excel分数の表示について
-
【EXCEL】画像の黄色部分の抽出...
-
DATE関数で現在の年齢を出した...
-
Excelについて
-
マクロエクセルのブロック解除
-
Excelピボットテーブルの1行目
-
REGEXREPLACE関数について、
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XPath指定方法について(phpで)
-
エクセル マクロ 複数のhtml...
-
DreamweaverCS4で、テキスト...
-
ヤフオク エクセル VBA 通常...
-
HP作成のレイアウトで、ルーズ...
-
VBAでGoogle検索の上位にあるUR...
-
中央にそろえる。Dreamweaver8
-
(再質問)エクセルのマクロボ...
-
collection型を引数にしたファ...
-
プログラミング
-
新しいパソコンのネット設定な...
-
汎用機のJCLの入門書ありま...
-
iText セル内での自動改行について
-
mとnを入力 mからnまでを加算し...
-
アコーディオンメニューにする...
-
コンソール画面のクリアの方法
-
if else文のフローチャート
-
PCとモバイルで同一URLのWebサ...
-
【jQuery】MixltUPの複数フィル...
-
Progateの入力画面で使えるショ...
おすすめ情報