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

回答編集履歴

2

追記

2020/12/23 04:22

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -25,4 +25,42 @@
25
25
  Dim new_wb As Workbook
26
26
  Set new_wb = Workbooks.Open("ダウンロードしたブック名.csv")
27
27
  Debug.Print new_wb.Name
28
- ```
28
+ ```
29
+
30
+ 追記
31
+ ---
32
+ ループ処理の場合は、無限ループ対策を入れておいた方がいいでしょう。(試行回数を制限しておくとか)
33
+ また、別スレッドの終了(今回はブックを開く)を待つ場合は、ループ内に `DoEvents` を入れてOSに制御を返すようにします。
34
+
35
+ 上記を考慮して、
36
+
37
+ ```vba
38
+
39
+ '(4)自動で開かれたワークブックオブジェクトを取得する(★)
40
+ Dim wb As Workbook
41
+ Dim isFound As Boolean
42
+ isFound = False
43
+
44
+ Dim i As Long
45
+ For i = 1 To 1000 '試行回数1000回 適宜調整してください。
46
+ For Each wb In Workbooks
47
+ If wb.Name = "ダウンロードして開いたブック名.csv" Then
48
+ isFound = True
49
+ Exit For
50
+ End If
51
+ Next
52
+ If isFound Then Exit For
53
+ DoEvents
54
+ Next
55
+
56
+ If Not isFound Then
57
+ MsgBox "開いたブックを取得できませんでした。"
58
+ Exit Sub
59
+ End If
60
+
61
+ Debug.Print wb.Name
62
+ ```
63
+
64
+ DoEvents を入れるだけではうまくいかない場合、Sleep か Application.Wait での待機をいれてみてください。
65
+
66
+ [【VBA入門】Sleep関数(API)やWaitメソッドで処理を止める方法 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト](https://www.sejuku.net/blog/37388)

1

説明追記

2020/12/23 04:22

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -11,4 +11,18 @@
11
11
  Exit For 'ここだと1回目のループでループを抜けちゃいます。
12
12
  Next
13
13
  Loop
14
+ ```
15
+
16
+ ただ、`Workbooks.Open` で開いているなら、下記で取得できるはずです。
17
+
18
+ ```vba
19
+ Workbooks.Open "ANALYSIS.XLS"
20
+ Debug.Print ActiveWorkbook.Name
21
+ ```
22
+ あるいは、
23
+
24
+ ```vba
25
+ Dim new_wb As Workbook
26
+ Set new_wb = Workbooks.Open("ダウンロードしたブック名.csv")
27
+ Debug.Print new_wb.Name
14
28
  ```