質問するログイン新規登録

質問編集履歴

2

コード修正

2021/07/10 04:08

投稿

mzn59
mzn59

スコア17

title CHANGED
File without changes
body CHANGED
@@ -18,14 +18,7 @@
18
18
  Dim wsIn As Worksheet, wsOut As Worksheet
19
19
  Dim iDstRow As Integer
20
20
  Dim rngList As Range, rng As Range
21
- Dim strURL As String
22
- Dim strYear As String
23
- Dim i As Integer
21
+ ~(略)~
24
- Dim strAddress As String
25
- Dim arrShopInfo As Variant
26
- Dim strProgress As String
27
- Dim strShopName As String
28
- Dim strShopInfo As String
29
22
 
30
23
  Set wsIn = ThisWorkbook.Worksheets("Sheet2")
31
24
  Set wsOut = ThisWorkbook.Worksheets("Sheet3")
@@ -56,31 +49,7 @@
56
49
  If iStatusCode = 200 Then
57
50
  objHtmlDoc.write objHttpReq.responseText
58
51
  For Each objHtmlElem In objHtmlDoc.getElementsByTagName("p")
59
- If InStr(objHtmlElem.innerText, strYear & "/") > 0 Or _
60
- InStr(objHtmlElem.innerText, strYear & "年") > 0 Then
61
- arrShopInfo = Split(objHtmlElem.innerText, vbCrLf)
62
- iDstRow = iDstRow + 1
63
- strShopName = ""
64
- strAddress = ""
65
- ' 抽出データをシートに出力
66
- For i = LBound(arrShopInfo) To UBound(arrShopInfo)
67
- If i = LBound(arrShopInfo) Then
68
- wsOut.Cells(iDstRow, 2).Value = Split(arrShopInfo(i), " - ")(0)
69
- ElseIf arrShopInfo(i) Like "*" & strYear & "/*" Or _
70
- arrShopInfo(i) Like "*" & strYear & "年*" Then
71
- wsOut.Cells(iDstRow, 4) = Split(Split(arrShopInfo(i), " - ")(0), " ")
72
- If InStr(arrShopInfo(i), " - ") > 0 Then
73
- wsOut.Cells(iDstRow, 5) = Split(arrShopInfo(i), " - ")(1)
74
- End If
52
+ ~(略)~
75
- ElseIf arrShopInfo(i) Like "※*" Then
76
- wsOut.Cells(iDstRow, 5).Value = wsOut.Cells(iDstRow, 5).Value & arrShopInfo(i)
77
- Else
78
- strAddress = strAddress & arrShopInfo(i)
79
- End If
80
- Next
81
- wsOut.Cells(iDstRow, 1) = strURL
82
- wsOut.Cells(iDstRow, 3) = strAddress
83
- End If
84
53
  Next
85
54
  End If
86
55
  Next

1

質問内容の追記

2021/07/10 04:08

投稿

mzn59
mzn59

スコア17

title CHANGED
File without changes
body CHANGED
@@ -89,4 +89,102 @@
89
89
  Set objHttpReq = Nothing
90
90
 
91
91
  End Sub
92
- ```
92
+ ```
93
+
94
+ (2021/06/19 20:00 質問内容の記載が途中で切れてしまっていたので、続きを下記に追記します。)
95
+ **期待結果**
96
+ 各URLから抽出したデータが、Excelシートに下記のように出力されること
97
+
98
+ ```ここに言語を入力
99
+ 1行目 URL1の抽出データ
100
+ 2行目 URL2の抽出データ
101
+ 3行目 URL3の抽出データ
102
+ ```
103
+
104
+ **実行結果**
105
+ 上記コードを実行したところ、各URLから抽出したデータが下記のように重複してExcelシートに出力されておりました。
106
+
107
+ ```ここに言語を入力
108
+ 1行目 URL1の抽出データ
109
+ 2行目 URL1の抽出データ ←1行目と重複
110
+ 3行目 URL2の抽出データ
111
+ 4行目 URL1の抽出データ ←1行目と重複
112
+ 5行目 URL2の抽出データ ←3行目と重複
113
+ 6行目 URL3の抽出データ
114
+ ```
115
+
116
+ **試したこと**
117
+ 当該コードを下記のように修正したところ、期待結果通りに抽出データが重複せずに出力されることが確認できました。ですが、実現したいこと(URL複数件からのデータ抽出)に対して、コードが適切か判断がつきません。そのため、修正コードが適切かご教示いただきたく、または参照すべきドキュメント等ご教示いただけますと幸いです。
118
+
119
+ 修正コード1(ループの中で、Set objHtmlDoc = CreateObject("htmlfile")とSet objHtmlDoc = Nothing を実施するように変更):
120
+ ```ここに言語を入力
121
+ Sub sub2()
122
+ ~(略)~
123
+ Set objHttpReq = CreateObject("MSXML2.XMLHTTP")
124
+ objHtmlDoc.DesignMode = "on"
125
+
126
+ iDstRow = 1
127
+ For Each rng In rngList
128
+ DoEvents
129
+
130
+ strURL = rng.Value
131
+ objHttpReq.Open "GET", strURL
132
+ objHttpReq.Send
133
+
134
+ ' ダウンロード待ち
135
+ Do While objHttpReq.readyState <> 4
136
+ DoEvents
137
+ Loop
138
+
139
+ iStatusCode = objHttpReq.Status
140
+ ' ステータス判定
141
+ If iStatusCode = 200 Then
142
+ Set objHtmlDoc = CreateObject("htmlfile")
143
+ ~(略)~
144
+ Set objHtmlDoc = Nothing
145
+ End If
146
+ Next
147
+
148
+ Set objHttpReq = Nothing
149
+
150
+ End Sub
151
+ ```
152
+ 修正コード2(データを抽出後、objHtmlDoc.Close を実行するように変更):
153
+ ```ここに言語を入力
154
+ Sub sub2()
155
+ ~(略)~
156
+ Set objHttpReq = CreateObject("MSXML2.XMLHTTP")
157
+ Set objHtmlDoc = CreateObject("htmlfile")
158
+ objHtmlDoc.DesignMode = "on"
159
+
160
+ iDstRow = 1
161
+ For Each rng In rngList
162
+ DoEvents
163
+
164
+ strURL = rng.Value
165
+ objHttpReq.Open "GET", strURL
166
+ objHttpReq.Send
167
+
168
+ ' ダウンロード待ち
169
+ Do While objHttpReq.readyState <> 4
170
+ DoEvents
171
+ Loop
172
+
173
+ iStatusCode = objHttpReq.Status
174
+ ' ステータス判定
175
+ If iStatusCode = 200 Then
176
+ objHtmlDoc.write objHttpReq.responseText
177
+ ~(略)~
178
+ objHtmlDoc.Close
179
+ End If
180
+ Next
181
+
182
+ Set objHtmlDoc = Nothing
183
+ Set objHttpReq = Nothing
184
+
185
+ End Sub
186
+ ```
187
+
188
+ **補足情報(FW/ツールのバージョンなど)**
189
+ OS: Windows10
190
+ Microsoft Visual Basic for Applications 7.1