人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

http://mik39.dousetsu.com/hatena_test.htm
今、このように白と黒の星が3つ並んだ表が、あるWebにあります。
パターンはこの4種類です。
(あくまでこれはサンプルで、実際の表は10行あります。4種類がランダムに10行並んでいます。)

これをExcelに10行分取得し、白の星は「☆」に、黒の星は「★」として変換したいです。

取得から☆、★の変換までVBAで実施できれば理想です。
やり方が思いつかないため質問いたします。

どうぞよろしくお願い致します。


●質問者: yoshifuku
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● oil999
●50ポイント

このマクロを試して下さい。
変換後のHTMLファイルはローカルディスクに保存します。
hogeConvの第1引数に変換対象のURLを、第2引数に変換後のフォルダ名+ファイル名をセットしてください。

白い☆は、HTMLタグが

<font color="dcdcdc">★★★</font>

になっているかどうかで判断しています。
これ以外のHTMLタグの場合は認識できないので、お知らせ下さい。
★の数は任意個数に対応しています。

Option Explicit

'メインプログラム
Sub main()
 Call hogeConv("http://mik39.dousetsu.com/hatena_test.htm", "C:/test/test.html")
End Sub

'Web読み込み・変換処理
Sub hogeConv(url As String, outfname As String)
  'Web読み込み処理
 Dim oHttp As Object
 Dim str As String

 On Error Resume Next
 Set oHttp = CreateObject("MSXML2.XMLHTTP")
 If (Err.Number <> 0) Then
 Set oHttp = CreateObject("MSXML.XMLHTTPRequest")
 End If
 On Error GoTo 0
 If oHttp Is Nothing Then
 MsgBox "内部エラー", vbCritical
 Exit Sub
 End If
 
 With oHttp
 .Open "GET", url, False
 .Send
 str = StrConv(.responseBody, vbUnicode)  '文字コード変換
 End With
 Set oHttp = Nothing

  '変換処理
 Dim re, mc, m As Object
 Dim s2 As String
 
 Set re = CreateObject("VBScript.RegExp")
 re.Pattern = "<font color=""dcdcdc"">([★]+)</font>"  '検索パターン
 re.Global = True
 Set mc = re.Execute(str)
 For Each m In mc
 s2 = Replace(m.Value, "★", "☆")
 str = Replace(str, m.Value, s2)
 Next

  '書き出し
 Open outfname For Output As #1
 Print #1, str
 Close #1
End Sub

yoshifukuさんのコメント
oil999さんのコードも試してみました。 http://mik39.dousetsu.com/new_page_1.htm もう1つサンプルを作り、試してみたところ、上手くいきました。 htmlがローカルに生成されるので、それを再度Excelに読みこめばいけそうです。 ただ、Silvanusさんのときと同様、実は本番用(会員制サイト)のサイトではダメでした。サンプルがよくなかったかなぁとも思いますが、個別に報酬含めご相談できたらいいなぁなんて思っております。

oil999さんのコメント
会員制サイトは、IDとパスワードで認証していると思うので、回答のようなマクロでは読むことができないと思います。どのような認証方式を使っているのかお知らせいただければ、対応できるかもしれません。 それと回答にも書きましたが、☆印の出現パターン(HTMLタグのパターン)が一定していないと、検索・置換ができません。

yoshifukuさんのコメント
会員制サイトなのですが、IDとPWを入力してログイン状態を保っているため、この状況下では私にとっては通常のWebと同じような状態になっているかなぁとは思います。 htmlの記述 → Excelでの読み込み <font color="dcdcdc">★★★</font> → ☆☆☆ ★<font color="dcdcdc">★★</font> → ★☆☆ ★★<font color="dcdcdc">★</font> → ★★☆ ★★★ → ★★★ こんな法則で変換できれば上手くいきそうです。(私にその技術はありませんが^^) いろいろありがとうございます!

2 ● Silvanus
●50ポイント ベストアンサー

エラー処理も施していない、芸の無いものですが。
Sheet1のセルA1からA2,A3と下方へ、URLのリストを入力していただくと
取得・変換結果が各シートに格納されます。

Option Explicit
Option Base 0

Sub Main()

Const strShtUrlList As String = "Sheet1"
Const strShtPrf As String = "Result"

Dim lngCntR As Long
Dim strURL As String
Dim strHTMLsrc As String

Sheets(strShtUrlList).Activate
 For lngCntR = 1 To Columns(1).SpecialCells(xlCellTypeLastCell).Row
 strURL = Cells(lngCntR, 1).Value
 If Left(strURL, 7) = "http://" Then
 strHTMLsrc = GetHTMLSource(strURL)
 Worksheets.Add After:=Worksheets(Worksheets.Count)
 ActiveSheet.Name = strShtPrf & Worksheets.Count
 Cells(1, 1).Value = strURL
 ConvStarChart strHTMLsrc
 End If
 Next

End Sub

Function GetHTMLSource(ByVal strURL As String) As String

Dim objXmlHttp As Object

Set objXmlHttp = CreateObject("MSXML2.XMLHTTP")

objXmlHttp.Open "GET", strURL, False
objXmlHttp.send (Null)

GetHTMLSource = objXmlHttp.ResponseText

Set objXmlHttp = Nothing

End Function

Sub ConvStarChart(ByVal strHTMLsrc As String)

Dim objRegExp As Object
Dim varMatch
Dim lngCntM As Long
Dim strStar(3) As String

strStar(1) = "☆☆☆"
strStar(2) = "★☆☆"
strStar(3) = "★★☆"
strStar(0) = "★★★"

Set objRegExp = CreateObject("VBScript.RegExp")

With objRegExp
 .IgnoreCase = True
 .Global = False
 Do
 .Pattern = "<td class=""col13Td"".*?>"
 Set varMatch = .Execute(strHTMLsrc)
 If varMatch.Count = 0 Then
 Exit Do
 End If
 With varMatch(0)
 strHTMLsrc = Mid(strHTMLsrc, .FirstIndex + .Length + 1)
 End With
 .Pattern = "</td>"
 Set varMatch = .Execute(strHTMLsrc)
 With varMatch(0)
 Cells(lngCntM + 2, 1).Value = strStar(InStr(Left(strHTMLsrc, varMatch(0).FirstIndex), "<font color=""dcdcdc"">"))
 strHTMLsrc = Mid(strHTMLsrc, .FirstIndex + .Length + 1)
 End With
 lngCntM = lngCntM + 1
 Loop
End With

End Sub

あれっ!?、データをExcelに読み込むものだと思っていたのですが
HTMLソースを置換することが目的なのですか!?
???
星の数がずれるミスは「Cells(lngCntM + 2, 1).Value =…」で
始まる行に誤りがありましたので訂正いたしました。


Silvanusさんのコメント
Replaceメソッド使えば良い話なのに…我ながらアホです…orz。

yoshifukuさんのコメント
Silvanusさんのコードでまず試してみました。 http://mik39.dousetsu.com/new_page_1.htm もう1つサンプルを作り、試してみたところ、上手くいきました。 ですが、実は本番用(会員制サイト)のサイトではダメでした。★と☆を誤認識する箇所が出ました。htmlソースが複雑なのかもしれません。 もし可能でしたら、報酬1000Pくらいで実サイトで見てもらうことは可能でしょうか。勝手なお願いで申し訳ありませんが、ご相談まで。

Silvanusさんのコメント
報酬額は高過ぎな様な気がしますが(汗) 実サイトを拝見するのは勿論OKです!

Silvanusさんのコメント
あ、それと、今の様な結果出力形式が 質問者様のご希望に適っているとは思いませんので ご指摘いただければ改善いたします。

yoshifukuさんのコメント
ありがとうございます! そういえばSilvanusさんには長きに渡りお世話になっている気がします。 該当のサイトはIDがないと閲覧できないため、私がローカル保存したhtmlファイルをWebにアップし、そのURLをお伝えできればと思っています。 はてなシステムに疎いのですが、ここのコメント欄に書くのではなく、個別にSilvanus様にメッセージを送る方法などありますでしょうか?

Silvanusさんのコメント
正直私もよく解っていないのですがorz、以前は利用できた 「ポイント付きメッセージ送信」機能が今は利用できないようですね。 もし差し支えなければ hatena[atmark]rct3jp.info に URLをメールして下さい。 メール送信に差し支えがある様でしたら…どうしたらいいですかね!?(苦w)

yoshifukuさんのコメント
大丈夫です。1時間以内くらいに送ります。とり急ぎお礼まで。

Silvanusさんのコメント
了解です。お待ちしております。 確かに以前幾度か回答差し上げたことがあった様な気がいたします。

Silvanusさんのコメント
メール拝領いたしました。暫くお待ち下さい。

Silvanusさんのコメント
お返事お送りいたしました。動作確認宜しくお願いいたします。

質問者から

ありがとうございます!!
まだ試せていませんが、htmlファイルを書き換えることが目的ではなく、Excelに取り込んだ時☆と★で表現されることが目的です。

補足等ありましたらお願いします。報酬を少し増やしたいと思います。


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ