>?選択したブックにパスワードが設定されている場合、
> ダイアログが出るが、その時点でキャンセルを押すと
> 当然ながらエラーになってしまう。
は、
On Error Resume Next
Workbooks.Open fileToOpen
On Error GoTo 0
で回避すればいいと思います。
パスワードの問題以外は
> ?下記のコードとは関係なく、コンボボックスにしてしまって、
> そのリストに、指定フォルダ内の選択ブック名(Bookではじまるブック名全て)
> を流し込み、リストから選択して開くようにしたい。
を解決すれば済む話のような気がします。
コンボボックスに入れるには、
Dim wkDir As String
Dim wkFileName As String
wkDir = "D:\test\Atest\Btest\" 'フォルダの指定
Me.ComboBox1.Clear
wkFileName = Dir(wkDir & "Book*.xls")
Do Until wkFileName = ""
Me.ComboBox1.AddItem wkFileName
wkFileName = Dir()
Loop
といった感じでできます。
開くときには、
fileToOpen = "D:\test\Atest\Btest\" & Me.ComboBox1.Text
If Not Dir(fileToOpen) = "" Then
On Error Resume Next
Workbooks.Open fileToOpen
On Error GoTo 0
End If
とすればいいです。多分。。。
Sub Sample1()
Dim wkFName As String
wkFName = "D:\BookX.xls"
On Error Resume Next
Workbooks.Open wkFName
If Not Err.Number = 0 Then
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical
Exit Sub
End If
On Error GoTo 0
MsgBox "ブックを開きました。", vbInformation
End Sub
Sub Sample2()
Dim wkFName As String
Dim wkPassword As String
wkPassword = "123"
wkFName = "D:\BookX.xls"
On Error Resume Next
Workbooks.Open wkFName, , , , wkPassword
If Not Err.Number = 0 Then
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical
Exit Sub
End If
On Error GoTo 0
MsgBox "ブックを開きました。", vbInformation
End Sub
Do Until wkFileName = "" '空欄になるまで繰り返す
Me.Hコンボ1.AddItem wkFileName
wkFileName = Dir() ←◆
Loop
End Sub
Private Sub H開く1_Click()
Dim wkDir As String
Dim wkFileName As String
Dim fileToOpen As String
'開く
fileToOpen = "D:\test\Atest\Btest\" & Me.Hコンボ1.Text
If Not Dir(fileToOpen) = "" Then
On Error Resume Next
Workbooks.Open fileToOpen
On Error GoTo 0
msgbox "キャンセルされました。" ←■ 開いた時にも当然ながら表示。
End If
2005年02月26日 23:40のSample1のコードが参考になりませんか?
こう↓してみてください。
>'開く
>fileToOpen = "D:\test\Atest\Btest\" & Me.Hコンボ1.Text
>If Not Dir(fileToOpen) = "" Then
> On Error Resume Next
> Workbooks.Open fileToOpen
If Not Err.Number = 0 Then
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical
UNLOAD ME '←ユーザーフォームを閉じる
Exit Sub
End If
> On Error GoTo 0
>End If
>Private Sub Hキャンセル1_Click()
> UserForm1.Hide ←●消えますが、これで合っているのでしょうか?
>End Sub
個人的には、
UNLOAD ME
の方が好みです。余分なものがメモリに残らないので。
If Not Err.Number = 0 Then
MsgBox "キャンセルされました。"
Unload Me 'ユーザーフォームを閉じる
Exit Sub
End If
の部分を
If Not Err.Number = 0 Then
If Left(Err.Description, 19) = "'Open' メソッドは失敗しました:" Then
MsgBox "キャンセルしました。", vbCritical
Else
MsgBox Err.Description, vbCritical
End If
Unload Me 'ユーザーフォームを閉じる
Exit Sub
End If
補足までに。
On Error ステートメントでトラップしたエラーは上記のコーディング例で出てる通り、Errオブジェクトでエラー番号が拾えます。
On Error ステートメントを仕込まない状態で処理を実行し、エラーを発生させると、どのエラー番号でエラーが起こっているのかわかりますので、そのエラー番号にしぼって分岐をすると特定のエラーが発生した時の処理を追加する事ができますよん♪