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

回答編集履歴

3

さらにコード追加

2019/10/16 04:26

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -50,4 +50,50 @@
50
50
  End Sub
51
51
  ```
52
52
 
53
- 処理の部分が長いなら、関数に分割するといいでしょう。
53
+ 処理の部分が長いなら、関数に分割するといいでしょう。
54
+
55
+ ---
56
+
57
+ SelectedItemsに対してはForで回せば、ファイルが存在しないということは通常はあり得ないですか、
58
+ 処理途中で削除されたとか、排他ロックさていて開けないとか、ファイルが壊れていて開けないとか、、、
59
+ いろいろあると思いますので、その場合のエラー処理も追加したコード例
60
+
61
+ ```vba
62
+ Public Sub OpenBooks()
63
+
64
+ With Application.FileDialog(msoFileDialogOpen)
65
+ .AllowMultiSelect = True
66
+ .Filters.Clear
67
+ .Filters.Add "Excelブック", "*.xls; *.xlsx; *.xlsm", 1
68
+ .Title = "ワークブックを開く"
69
+
70
+ If Not .Show Then Exit Sub
71
+
72
+ Dim SelectedBook As Variant
73
+ For Each SelectedBook In .SelectedItems
74
+ Call ProcessToBook(ProcessToBook)
75
+ Next
76
+ End With
77
+
78
+ End Sub
79
+
80
+ Public Sub ProcessToBook(BookName As String)
81
+ Dim wb As Workbook
82
+ Set wb = Workbooks.Open(BookName)
83
+ If Err.Number <> 0 Then
84
+ MsgBox Err.Description
85
+ ProcessToBook = False
86
+ Exit Sub
87
+ End If
88
+ On Error GoTo 0
89
+
90
+ 'ここにブックへの処理を記述
91
+ 'これ以降でエラー処理が必要なら、上記のブックが開けなかった場合のエラー処理とは別に
92
+ ’ここからOn Error を記述
93
+
94
+ wb.Close: Set wb = Nothing
95
+ End Sub
96
+ ```
97
+
98
+ この辺りはいろいろ好みがあると思いますので、自分が書くならというコード例です。
99
+ 参考までに。

2

コード追記

2019/10/16 04:26

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -24,4 +24,30 @@
24
24
  End With
25
25
 
26
26
  End Sub
27
- ```
27
+ ```
28
+
29
+ コード例2
30
+ For Each でループしてみました。個人的にはこちらの方が読みやすいと思います。
31
+
32
+ ```vba
33
+ Public Sub OpenBooks2()
34
+
35
+ With Application.FileDialog(msoFileDialogOpen)
36
+ .AllowMultiSelect = True
37
+ .Filters.Clear
38
+ .Filters.Add "Excelブック", "*.xls; *.xlsx; *.xlsm", 1
39
+ .Title = "ワークブックを開く"
40
+
41
+ If Not .Show Then Exit Sub
42
+
43
+ Dim SelectedBook As Variant
44
+ For Each SelectedBook In .SelectedItems
45
+ Workbooks.Open SelectedBook
46
+ ' 処理
47
+ Next
48
+ End With
49
+
50
+ End Sub
51
+ ```
52
+
53
+ 処理の部分が長いなら、関数に分割するといいでしょう。

1

コード追記

2019/10/16 02:21

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -1,3 +1,27 @@
1
1
  SelectedItems自体はコレクションで配列みたいなものですので、わざわざ配列に入れなおすのは無駄ですね。
2
2
 
3
- SelectedItemsにファイル名が格納されているので、それに対して、Forループで回して処理すればいいのでは。
3
+ SelectedItemsにファイル名が格納されているので、それに対して、Forループで回して処理すればいいのでは。
4
+
5
+ ---
6
+ コード例
7
+
8
+ ```vba
9
+ Public Sub OpenBooks()
10
+
11
+ With Application.FileDialog(msoFileDialogOpen)
12
+ .AllowMultiSelect = True
13
+ .Filters.Clear
14
+ .Filters.Add Description:="全てのファイル", Extensions:="*.*"
15
+ .Title = "ファイルを開く"
16
+
17
+ If Not .Show Then Exit Sub
18
+
19
+ Dim i As Integer
20
+ For i = 1 To .SelectedItems.Count
21
+ Workbooks.Open strFiles(i)
22
+ ' 処理i
23
+ Next
24
+ End With
25
+
26
+ End Sub
27
+ ```