Sub MyXlScNp()
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem 山陰中央新報サイト[新着情報]ページ取り込み処理
  Rem 言語:Excel VBA
  Rem 機能...
  Rem   山陰中央新報サイトの[新着情報]ページを、[外部データの取り込み]とHttpRequestで取り込む。
  Rem 注記...
  Rem   1. 不具合:<新着ニュース[山陰]>の本文は、取り込みに失敗することがある。
  Rem   2. MyXlScNpを起動し、ポップアップメニューをクリックして、処理を開始する。
  Rem      サイト上の本文のタグが不定のため、C列にタグ内容を標示する。
  Rem   3. なぜか、IEの「Visible = False」が機能しないので、
  Rem      ExcelのWindowStateの操作で対処。
  Rem 履歴...
  Rem   第01版:2007/02/18 作成。
  Rem   第02版:2007/03/02 OnActionの指定を変更
  Rem   第03版:2007/05/06:WindowState操作を追加。
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem 参照設定する場合...
  Rem   Microsoft Internet Controls
  Rem   Microsoft HTML Object Library
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Dim myCmmdBar As CommandBar
  Dim myCtrlBttn As CommandBarControl
  Dim myCtrlBttnDeTail As CommandBarControl
  Dim myCtrlBttnOk As CommandBarControl
  Dim myCtrlBttnCancel As CommandBarControl
  Dim x As Long
  Dim y As Long
  Dim myFaceId As Long
  Dim myMsg As String
  '
  Dim myHTTP As Variant ' IXMLHTTPRequest
  Dim myIE As Variant ' InternetExplorer
  Dim myDoc As Variant ' MSHTML.HTMLDocument
  Dim myLink As Variant ' MSHTML.AnchorElement
  Dim myStream As Variant '
  Dim myResponseBody As Variant ' Byte()
  Dim mySource As String
  '
  Dim myMax As Long
  Dim myText As String
  Dim myString As String
  '
  Dim myURL As String
  Dim myHref As String
  Dim myStatusBar As String
  '
  Dim i  As Long
  Dim myAns  As Long
  Dim myCbox As Boolean
  Dim myTitle As String
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  myTitle = "MyXlScNp"
  '
  On Error Resume Next
  CommandBars(myTitle).Delete
  On Error GoTo 0
  '
  Set myCmmdBar = CommandBars.Add(Name:=myTitle, Position:=msoBarPopup, Temporary:=True)
  Set myCtrlBttn = myCmmdBar.Controls.Add(Type:=msoControlButton, Before:=1, Temporary:=True)
  Set myCtrlBttnDeTail = myCmmdBar.Controls.Add(Type:=msoControlButton, Before:=2, Temporary:=True)
  Set myCtrlBttnOk = myCmmdBar.Controls.Add(Type:=msoControlButton, Before:=3, Temporary:=True)
  Set myCtrlBttnCancel = myCmmdBar.Controls.Add(Type:=msoControlButton, Before:=4, Temporary:=True)
  '
  myMsg = myTitle & vbCrLf & vbCrLf
  myMsg = myMsg & "山陰中央新報サイト" & vbCrLf
  myMsg = myMsg & "[ニュース]ページ" & vbCrLf
  myMsg = myMsg & "取り込み処理" & vbCrLf & vbCrLf
  '
  With myCtrlBttn
    .DescriptionText = "山陰中央新報サイト[新着情報]ページ取り込み処理ポップアップメニュー"
    .Style = msoButtonIconAndWrapCaption
    .Caption = myMsg & "処理を実行しますか?"
    .TooltipText = "処理を実行しますか?"
    .FaceId = 1089
    myFaceId = .FaceId
  End With
  '
  With myCtrlBttnDeTail
    .DescriptionText = "山陰中央新報サイト[新着情報]ページ取り込み処理:「新着ニュース[山陰]」の本文も取り込む]ボタン"
    .BeginGroup = True
    .Style = msoButtonIconAndCaption
    .Caption = "<新着ニュース[山陰]>の本文も取り込む"
    .TooltipText = "ニュースの本文は取り込まない。"
    .FaceId = 6963
    .OnAction = "MyXlScNpBttnMyDetail"
    .OnAction = "'" & myTitle & "BttnMyDetail" & " " & Chr(&H22) & myTitle & ChrW(&H22) & "'"
    ' .OnAction = "'MyXlScNpBttnMBttnMyDetail ""MyXlScNp""'"
  End With
  '
  With myCtrlBttnOk
    .DescriptionText = "山陰中央新報サイト[新着情報]ページ取り込み処理:[OK]ボタン"
    .BeginGroup = True
    .Style = msoButtonIconAndCaption
    .Caption = "OK"
    .TooltipText = "処理をを実行します。"
    .FaceId = 459
    .OnAction = "'" & myTitle & "BttnMyValue" & " " & Chr(&H22) & myTitle & ChrW(&H22) & ", " & "459" & "'"
    ' .OnAction = "MyXlScNpBttnMyValue(myTile, 459)"
  End With
  '
  With myCtrlBttnCancel
    .DescriptionText = "山陰中央新報サイト[新着情報]ページ取り込み処理:[キャンセル]ボタン"
    .Style = msoButtonIconAndCaption
    .Caption = "キャンセル" & Space(24)
    .TooltipText = "処理を中止します。"
    .FaceId = 330
    .OnAction = "'" & myTitle & "BttnMyValue" & " " & Chr(&H22) & myTitle & ChrW(&H22) & ", " & "330" & "'"
    ' .OnAction = "MyXlScNpBttnMyValue(myTile, 330)"
  End With
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  x = ActiveWindow.PointsToScreenPixelsX(0)
  y = ActiveWindow.PointsToScreenPixelsY(0)
  Beep
  Do
    On Error Resume Next
    myCmmdBar.ShowPopup x, y
    On Error GoTo 0
    DoEvents
    If myCmmdBar.Controls(1).FaceId <> myFaceId Then Exit Do
  Loop
  '
  Select Case myCmmdBar.Controls(1).FaceId
    Case 459
      myAns = vbOK
    Case 330
      myAns = vbCancel
  End Select
  '
  If myCmmdBar.Controls(2).FaceId = 220 Then
    myCbox = True
  Else
    myCbox = False
  End If
  '
  On Error Resume Next
  myCmmdBar.Delete
  On Error GoTo 0
  '
  If myAns = vbCancel Then Exit Sub
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  ActiveSheet.Range("A1").Select
  Application.CommandBars("Task Pane").Visible = False
  ActiveSheet.Name = "新着ニュース[山陰地域]"
  '
  myMax = Worksheets.Count - ActiveSheet.Index + 1
  If myMax < 3 Then
    myMax = 3 - myMax
    For i = 1 To myMax
      Worksheets.Add After:=Sheets(Worksheets.Count), Count:=1
    Next ' i
    Sheets("新着ニュース[山陰地域]").Activate
  End If
  '
  myURL = "http://www.sanin-chuo.co.jp/"
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  myStatusBar = "□山陰中央新報サイト[新着情報]ページ 取り込み開始"
  Application.StatusBar = myTitle & ": " & myStatusBar
  '
  With ActiveSheet.QueryTables.Add(Connection:="FINDER;" & myURL & "modules/information", Destination:=Range("A2"))
    .WebSelectionType = xlSpecifiedTables
    .WebFormatting = xlWebFormattingAll
    .WebTables = "18,20"
    .Refresh BackgroundQuery:=False
  End With
  Range("A1").Select
  Application.ScreenUpdating = False
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  ActiveCell.SpecialCells(xlLastCell).Select
  myMax = ActiveCell.Row
  Range("A1").Select
  For i = 2 To myMax
    If Range("A" & i).Value = "" Then
      Range("A" & i).Select
      Exit For
    End If
  Next ' i
  Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
  Selection.Copy
  ActiveSheet.Next.Select
  Range("A1").Select
  ActiveSheet.Name = "新着ニュース[国内・海外]"
  Selection.PasteSpecial Paste:=xlPasteColumnWidths
  ActiveSheet.Paste
  Range("A1").Select
  '
  Sheets("新着ニュース[山陰地域]").Activate
  Selection.ClearContents
  Range("A1").Select
  '
  ActiveSheet.Next.Select
  ActiveSheet.Next.Select
  Range("A1").Select
  '
  myStatusBar = "□山陰中央新報サイト[新着情報]ページ 取り込み開始"
  Application.StatusBar = myTitle & ": " & myStatusBar
  Application.ScreenUpdating = True
  '
  Set myIE = CreateObject("InternetExplorer.Application")
  With myIE
    .Navigate "http://www.sanin-chuo.co.jp/uploads/shinchaku.html"
    .Visible = False ' True
    Do While .Busy
      DoEvents
    Loop
    DoEvents
    Set myDoc = .Document
  End With
  Application.WindowState = xlMinimized
  Application.WindowState = xlNormal
  '
  ActiveSheet.Name = "新着情報"
  Application.ScreenUpdating = False
  i = 2
  For Each myLink In myDoc.Links
    Cells(i, 1).Select
    ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:=myLink.href, TextToDisplay:=myLink.innerText
    i = i + 1
  Next ' myLink
  Columns("A:A").EntireColumn.AutoFit
  Range("A1").Select
  Application.ScreenUpdating = True
  myIE.Visible = False ' True
  myIE.Quit
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Sheets("新着ニュース[山陰地域]").Activate
  ActiveWindow.Zoom = 50
  '
  If myCbox = True Then
    ActiveSheet.UsedRange.Select
    ActiveCell.SpecialCells(xlLastCell).Select
    myMax = ActiveCell.Row
    For i = myMax To 1 Step -1
      If Range("A" & i).Value <> "" Then
        Exit For
      End If
    Next ' i
    myMax = i
    '
    For i = 2 To myMax
      Range("A" & i).Select
      If Selection.Hyperlinks.Count <> 0 Then
        Range("B" & i).Value = Selection.Hyperlinks(1).Address
      End If
    Next ' i
    '
    Set myIE = CreateObject("InternetExplorer.Application")
    DoEvents
    Range("B1").Select
    For i = 2 To myMax
      If Range("B" & i).Value <> "" Then
        Range("B" & i).Select
        Call MyXlScNpBody(Range("B" & i).Value, myIE)
      End If
      myStatusBar = "□山陰中央新報サイト[新着情報]ページ 本文 取り込み中 "
      myStatusBar = myStatusBar & i * 100 \ myMax & "% "
      myStatusBar = myStatusBar & i & "/" & myMax & "行 "
      Application.StatusBar = myTitle & ": " & myStatusBar
      DoEvents
    Next ' i
    myIE.Visible = False ' True
    myIE.Quit
  End If
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Range("A1").Select
  Application.ScreenUpdating = True
  myStatusBar = "処理が終了しました。"
  Application.StatusBar = myTitle & ": " & myStatusBar & Now()
  Application.Speech.Speak myStatusBar, False
  Set myIE = Nothing
  Set myDoc = Nothing
End Sub ' MyXlScNp *----*----*    *----*----*    *----*----*    *----*----*

Sub MyXlScNpBody(myURL As String, myIE As Variant)
  Dim myHTTP As Variant ' IXMLHTTPRequest
  Dim myDoc As Variant ' MSHTML.HTMLDocument
  Dim myResponseBody As Variant ' Byte()
  Dim myStream As Variant ' Stream
  Dim mySubTags As Variant ' DispHTMLElementCollection
  Dim mySubTag As Variant ' HTMLHeaderElement
  '
  Dim myText As String
  Dim myValue As String
  Dim myStatusBar As String
  '
  Dim myRegExp As Variant ' VBScript_RegExp_55.RegExp
  Dim myMatches As Variant ' MatchCollection
  Dim myMatch As Variant ' Match
  Dim myPttn As String
  Dim myString As String
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  Set myHTTP = CreateObject("MSXML2.XMLHTTP") ' ("Microsoft.XMLHTTP")
  With myIE
    .Navigate "about:blank"
    .Visible = False  ' True
    Do While .Busy
      DoEvents
    Loop
    DoEvents
    Set myDoc = .Document
  End With
  DoEvents: DoEvents: DoEvents: DoEvents: DoEvents
  DoEvents: DoEvents: DoEvents: DoEvents: DoEvents
  '
  Call myHTTP.Open("GET", myURL, False)
  On Error Resume Next
  myHTTP.Send
  If Err.Number <> 0 Then
    Range("C" & ActiveCell.Row).Value = "Send Error"
    Exit Sub
  End If
  On Error GoTo 0
  If myHTTP.readyState <> 4 Then ' 4:READYSTATE_COMPLETE
    myStatusBar = "接続できません。" & vbCr & myHTTP.statusText & vbCr
    myStatusBar = myStatusBar & "myHTTP.readyState: " & myHTTP.readyState & vbCr
    myStatusBar = myStatusBar & "URL: " & myURL
    MsgBox myStatusBar, vbOKOnly, "MyXlKanaloco"
    GoTo MyXlScNpBodySubExit
  End If
  If myHTTP.Status <> 200 Then
    myStatusBar = "接続できません。" & vbCr & myHTTP.statusText & vbCr
    myStatusBar = myStatusBar & "myHTTP.Status: " & myHTTP.Status & vbCr
    myStatusBar = myStatusBar & "URL: " & myURL
    MsgBox myStatusBar, vbOKOnly, "MyXlKanaloco"
    GoTo MyXlScNpBodySubExit
  End If
  myResponseBody = myHTTP.responseBody
  '
  Const AdBinary = 1
  Const AdTypeText = 2
  Set myStream = CreateObject("ADODB.Stream")
  myStream.Type = AdBinary
  myStream.Open
  myStream.write (myResponseBody)
  myStream.Position = 0
  myStream.Type = AdTypeText
  myStream.Charset = "EUC-JP"
  myText = myStream.ReadText()
  ' myFile = "C:\Documents and Settings\User\My Documents\Zzz\Zzz.html"
  ' Call myStream.SaveToFile(myFile, 2)
  myStream.Close
  '
  myText = Replace(myText, "<link ", "<!-- link ")
  myText = Replace(myText, "<title>", " --> <title>")
  myText = Replace(myText, "<img ", "<!-- img ")
  myText = Replace(myText, "<script ", "<!-- script ")
  myText = Replace(myText, " src=", " Zzzsrc=")
  myText = Replace(myText, " SRC=", " Zzzsrc=")
  myText = Replace(myText, "<BR><BR>", "<BR>")
  '
  Set myRegExp = CreateObject("VBScript.RegExp") ' New VBScript_RegExp_55.RegExp
  myPttn = "<p>(\s|\S)*</p>" ' "<p>(.*?)</p>" '
  With myRegExp
    .Pattern = myPttn ' パターンを指定
    .IgnoreCase = False ' 大文字小文字を区別する。
    .Global = True ' 文字列全体を検索
  End With
  '
  Set myMatches = myRegExp.Execute(myText)
  myString = ""
  If myMatches.Count <> 0 Then
    For Each myMatch In myMatches
      myString = myString & myMatch.Value
    Next ' myMatch
  Else
    myText = Replace(myText, vbCrLf, "")
    myText = Replace(myText, vbTab, "")
    '
    If InStr(myText, "<td valign=" & ChrW(&H22) & "top" & ChrW(&H22) & ">") > 0 Then
      Range("C" & ActiveCell.Row).Value = "Tag <td>"
      myText = Mid(myText, InStrRev(myText, "<td valign=" & ChrW(&H22) & "top" & ChrW(&H22) & ">"))
      myText = Left(myText, InStr(myText, "</td>") + 5)
      myString = "<p>" & myText & "</p>"
    Else
      Range("C" & ActiveCell.Row).Value = "Tag </table>"
      myPttn = "(</table>|</TABLE>)(.*?)<BR></font>" ' "(</table>|</TABLE>)(\s|\S)+<BR></font>"
      '
      With myRegExp
        .Pattern = myPttn ' パターンを指定
        .IgnoreCase = False ' 大文字小文字を区別する。
        .Global = True ' 文字列全体を検索
      End With
      '
      Set myMatches = myRegExp.Execute(myText)
      If myMatches.Count <> 0 Then
        For Each myMatch In myMatches
          myString = myString & myMatch.Value
        Next ' myMatch
        myString = Replace(myString, "</TABLE>", "</table>")
        myString = Replace(myString, "</table>", "<p>", InStrRev(myString, "</table>"), 1)
        myString = Replace(myString, "<BR></font>", "</p>")
      End If
    End If
  End If
  '
  myDoc.write myString
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  myValue = ""
  With ActiveCell
    .ColumnWidth = 120
    .VerticalAlignment = xlTop
    .WrapText = True
  End With
  '
  Set mySubTags = myDoc.getElementsByTagName("p")
  If Not mySubTags Is Nothing Then
    For Each mySubTag In mySubTags
      myValue = myValue & mySubTag.innerText & vbLf
      DoEvents
    Next ' mySubTag
  End If
  ActiveCell.Value = myValue
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
MyXlScNpBodySubExit:
  Set myDoc = Nothing
  Set myHTTP = Nothing
End Sub ' MyXlScNpBody *----*----*    *----*----*    *----*----*    *----*----*
  
Sub MyXlScNpBttnMyValue(myTitle As String, myValue As Long)
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem コマンドボタンOnAction処理
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  CommandBars(myTitle).Controls(1).FaceId = myValue
End Sub ' MyXlScNpBttnMyValue *----*----*    *----*----*    *----*----*    *----*----*
  
Sub MyXlScNpBttnMyDetail(myTitle As String)
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  Rem [ニュースの本文も取り込む]ボタン処理
  Rem *----*----*    *----*----*    *----*----*    *----*----*
  '
  With CommandBars(myTitle).Controls(2)
    If .FaceId = 6963 Then
      .FaceId = 220
      .TooltipText = "ニュースの本文も取り込む。"
    Else
     .FaceId = 6963
     .TooltipText = "ニュースの本文は取り込まない。"
    End If
  End With
End Sub ' MyXlScNpBttnMyDetail *----*----*    *----*----*    *----*----*    *----*----*
inserted by FC2 system