質問編集履歴

2

改善したコードを書き足しました。

2018/03/28 08:14

投稿

sumire_cl
sumire_cl

スコア228

test CHANGED
File without changes
test CHANGED
@@ -355,3 +355,171 @@
355
355
  「目的のページ1枚だけを戻すほうがいいっぽい…」
356
356
 
357
357
  ということに気づきましたので、もういっかい考えます。
358
+
359
+
360
+
361
+ ###追加2(できた!)
362
+
363
+ ```VBA
364
+
365
+ Sub entryDenpyo()
366
+
367
+
368
+
369
+ Dim sh As Object '起動中のShellWindow一式を格納する
370
+
371
+ Dim ie As InternetExplorer 'FindPages関数で見つけたIEを格納する
372
+
373
+ Dim inputbutton As HTMLAnchorElement 'ボタンとかを探すときに要素を格納する
374
+
375
+ Dim i As Long 'イテレータ
376
+
377
+ Dim endRow As Long: endRow = ThisWorkbook.Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row 'Sheet1の最終行
378
+
379
+
380
+
381
+
382
+
383
+ '*-- 起動中のShellWindow一式を変数shに格納 --*
384
+
385
+ Set sh = CreateObject("Shell.Application")
386
+
387
+
388
+
389
+ '*-- IEで開かれている[伝票番号入力]ページを探す、1個だけ開かれてるんじゃなかったら処理はしない。 --*
390
+
391
+ Set ie = FindPages(sh,"伝票番号入力")
392
+
393
+
394
+
395
+ If (Not (ie Is Nothing)) Then
396
+
397
+ '*-- シートの伝票番号の数だけ繰り返す --*
398
+
399
+ For i = 1 To endRow Step 1
400
+
401
+ '*-- 伝票番号を入れて登録ボタンを押す --*
402
+
403
+ ie.document.getElementsByName("denpyoNo")(0).Value = ThisWorkbook.Worksheets("Sheet1").Cells(i, 1).Value
404
+
405
+ For Each inputbutton In ie.document.getElementsByTagName("input")
406
+
407
+ If inputbutton.Value = "登録" Then
408
+
409
+ inputbutton.Click
410
+
411
+ Exit For
412
+
413
+ End If
414
+
415
+ Next
416
+
417
+ Do While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE
418
+
419
+ DoEvents
420
+
421
+ Loop
422
+
423
+ Next i
424
+
425
+ else
426
+
427
+ MsgBox "登録画面がみつかりません!"
428
+
429
+ End If
430
+
431
+
432
+
433
+ '*-- いろいろ解放 --*
434
+
435
+ Set sh = Nothing
436
+
437
+ Set ie = Nothing
438
+
439
+ MsgBox "おわりました"
440
+
441
+
442
+
443
+ End Sub
444
+
445
+
446
+
447
+ '*-- 開いているIEのページを目的の1個だけ戻す。ページがなかったり複数だったりしたらNothingを戻す。 --*
448
+
449
+ Function FindPages(ByVal shs As Object, ByVal pagetitle As String) As InternetExplorer
450
+
451
+
452
+
453
+ Dim win As Object '各ShellWindowを格納する
454
+
455
+ Dim document_title As String 'IEのドキュメントタイトルを格納する
456
+
457
+ Dim ie As InternetExplorer 'ShellWindowから見つけたIEを格納する
458
+
459
+
460
+
461
+ Set FindPages = Nothing
462
+
463
+ For Each win In shs.Windows
464
+
465
+ 'ドキュメントタイトル取得失敗を無視(処理継続)--*
466
+
467
+ On Error Resume Next
468
+
469
+
470
+
471
+ If TypeName(win.document) = "HTMLDocument" Then
472
+
473
+ document_title = ""
474
+
475
+ document_title = win.document.Title
476
+
477
+ On Error GoTo 0
478
+
479
+
480
+
481
+ '*-- IEだったらタイトルで探す --*
482
+
483
+ Set ie = win
484
+
485
+ If InStr(document_title, pagetitle) > 0 Then
486
+
487
+ If FindPages Is Nothing Then
488
+
489
+ Set FindPages = ie
490
+
491
+ Else
492
+
493
+ MsgBox pagetitle & ("画面を1個だけ開いて、あとは閉じてください。")
494
+
495
+ Set FindPages = Nothing
496
+
497
+ Exit Function
498
+
499
+ End If
500
+
501
+ End If
502
+
503
+ End If
504
+
505
+ Next
506
+
507
+
508
+
509
+ End Function
510
+
511
+ ```
512
+
513
+ 皆様のご指導のもとに、とても改善して書けました!
514
+
515
+ 「開いているIEのページを目的の1個だけ戻す」というのは
516
+
517
+ 他にも1件ずつエントリするような作業がいろいろありますので(社内システムがイケてないので……)
518
+
519
+ この部分を関数にできたので、使いまわせそうな気がします。
520
+
521
+
522
+
523
+ ベストアンサーっていっぱいつけられないのですね……
524
+
525
+ teratailは先生がいっぱいいるので嬉しいです!ありがとうございます。

1

改善したコードを書き足しました。

2018/03/28 08:14

投稿

sumire_cl
sumire_cl

スコア228

test CHANGED
File without changes
test CHANGED
@@ -195,3 +195,163 @@
195
195
 
196
196
 
197
197
  Win10、Excel2016、IE11です。
198
+
199
+
200
+
201
+ ###追加1
202
+
203
+ 皆様ありがとうございます!
204
+
205
+ 教えていただいた内容を踏まえて、関数にしてみました。
206
+
207
+ ```VBA
208
+
209
+ Sub entryDenpyo()
210
+
211
+
212
+
213
+ Dim sh As Object '起動中のShellWindow一式を格納する
214
+
215
+ Dim win As New Collection '各ShellWindowを格納する
216
+
217
+ Dim ie As InternetExplorer 'ShellWindowから見つけたIEを格納する
218
+
219
+ Dim document_title As String 'IEのドキュメントタイトルを格納する
220
+
221
+ Dim inputbutton As HTMLAnchorElement 'ボタンとかを探すときに要素を格納する
222
+
223
+ Dim i As Long 'イテレータ
224
+
225
+ Dim endRow As Long: endRow = ThisWorkbook.Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row 'Sheet1の最終行
226
+
227
+
228
+
229
+
230
+
231
+ '*-- 起動中のShellWindow一式を変数shに格納 --*
232
+
233
+ Set sh = CreateObject("Shell.Application")
234
+
235
+
236
+
237
+ '*-- IEで開かれている[伝票番号入力]ページを探す、1個だけ開かれてるんじゃなかったら処理はしない。 --*
238
+
239
+ Set win = FindPages(sh,"伝票番号入力")
240
+
241
+ If win.Count = 1 Then
242
+
243
+ Set ie = win(1)
244
+
245
+ Else
246
+
247
+ MsgBox ("伝票番号入力画面を1個だけ開いて、あとは閉じてください。")
248
+
249
+ Exit Sub
250
+
251
+ End If
252
+
253
+
254
+
255
+ '*-- シートの伝票番号の数だけ繰り返す --*
256
+
257
+ For i = 1 To endRow Step 1
258
+
259
+ '*-- 伝票番号を入れて登録ボタンを押す --*
260
+
261
+ ie.document.getElementsByName("denpyoNo")(0).Value = ThisWorkbook.Worksheets("Sheet1").Cells(i, 1).Value
262
+
263
+ For Each inputbutton In ie.document.getElementsByTagName("input")
264
+
265
+ If inputbutton.Value = "登録" Then
266
+
267
+ inputbutton.Click
268
+
269
+ Exit For
270
+
271
+ End If
272
+
273
+ Next
274
+
275
+ Do While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE
276
+
277
+ DoEvents
278
+
279
+ Loop
280
+
281
+ Next i
282
+
283
+
284
+
285
+ '*-- いろいろ解放 --*
286
+
287
+ Set sh = Nothing
288
+
289
+ Set ie = Nothing
290
+
291
+
292
+
293
+ End Sub
294
+
295
+
296
+
297
+ '*-- 開いているIEのページをcollectionに入れて戻す --*
298
+
299
+ Function FindPages(ByVal shs As Object,ByVal pagetitle as string) As Collection
300
+
301
+
302
+
303
+ Dim win As Object '各ShellWindowを格納する
304
+
305
+ Dim document_title As String 'IEのドキュメントタイトルを格納する
306
+
307
+ Dim ie As InternetExplorer 'ShellWindowから見つけたIEを格納する
308
+
309
+ Dim clIE As New Collection 'コレクション格納用
310
+
311
+
312
+
313
+ For Each win In shs.Windows
314
+
315
+ 'ドキュメントタイトル取得失敗を無視(処理継続)--*
316
+
317
+ On Error Resume Next
318
+
319
+
320
+
321
+ If TypeName(win.document) = "HTMLDocument" Then
322
+
323
+ document_title = ""
324
+
325
+ document_title = win.document.Title
326
+
327
+ On Error GoTo 0
328
+
329
+
330
+
331
+ '*-- タイトルで探す --*
332
+
333
+ Set ie = win
334
+
335
+ If InStr(document_title, pagetitle) > 0 Then
336
+
337
+ clIE.Add ie '合致したページをコレクションに格納
338
+
339
+ Set FindPages = clIE
340
+
341
+ End If
342
+
343
+ End If
344
+
345
+ Next
346
+
347
+
348
+
349
+ End Function
350
+
351
+ ```
352
+
353
+ ここまで書いてから、h.horikoshiさんの回答を見て
354
+
355
+ 「目的のページ1枚だけを戻すほうがいいっぽい…」
356
+
357
+ ということに気づきましたので、もういっかい考えます。