Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4192 / 13644 ツリー ←次へ | 前へ→

【57934】マクロのエラー処理 non 08/9/22(月) 0:11 質問[未読]
【57936】Re:マクロのエラー処理 りん 08/9/22(月) 7:12 回答[未読]
【57943】Re:マクロのエラー処理 non 08/9/23(火) 0:12 質問[未読]
【57951】Re:マクロのエラー処理 りん 08/9/23(火) 8:23 回答[未読]
【57963】Re:マクロのエラー処理 non 08/9/23(火) 21:59 お礼[未読]
【57941】Re:マクロのエラー処理 Yuki 08/9/22(月) 17:00 発言[未読]
【57944】Re:マクロのエラー処理 non 08/9/23(火) 0:21 質問[未読]

【57934】マクロのエラー処理
質問  non  - 08/9/22(月) 0:11 -

引用なし
パスワード
   エクセルシート上のボタンを押すと「ファイルを開く」ダイアログボックスが開き,その「ファイルを開く」ダイアログボックスから,任意のファイルを開いてマクロを実行させるという設定です。
ここで,同一ファイル名のファイルが既に開かれていて,2重に開こうとすると,以下のメッセージが表示されます。

「"ファイル名"は既に開いています。2重に開くと,これまでの変更内容は破棄されます。"ファイル名"を開きますか?」

ここで,「はい」を選択した時はそれ以降の処理がうまく行くのですが,「いいえ」を選択した時に「実行時エラー’1004’」というのが表示されてしまいます。
そこで,「いいえ」を選択した時に最初のボタンが表示されたエクセルシートに戻るようにマクロを組直したいのですがどのような構文を組めばよいかがわかりません。
教えていただけないでしょうか?

【57936】Re:マクロのエラー処理
回答  りん E-MAIL  - 08/9/22(月) 7:12 -

引用なし
パスワード
   non さん、おはようございます。
>エクセルシート上のボタンを押すと「ファイルを開く」ダイアログボックスが開き,その「ファイルを開く」ダイアログボックスから,任意のファイルを開いてマクロを実行させるという設定です。

既に開かれてい(て編集されてい)るかどうかをチェックしてから開くほうがいいとは思いますが、この部分だけエラースキップかけるという手もあります。

Sub Macro1()
  Dim wb As Workbook
  On Error Resume Next 'スキップ
  Set wb = Workbooks.Open(Filename:="C:\NFL\NFL2008.xls")
  On Error GoTo 0 '通常に戻す
  '結果の分岐
  If wb Is Nothing Then
   MsgBox "キャンセルしました", vbExclamation
  Else
   MsgBox wb.FullName, vbInformation, "Open"
  End If
End Sub

こんな感じです。

【57941】Re:マクロのエラー処理
発言  Yuki  - 08/9/22(月) 17:00 -

引用なし
パスワード
   ▼non さん:
>エクセルシート上のボタンを押すと「ファイルを開く」ダイアログボックスが開き,その「ファイルを開く」ダイアログボックスから,任意のファイルを開いてマクロを実行させるという設定です。
>ここで,同一ファイル名のファイルが既に開かれていて,2重に開こうとすると,以下のメッセージが表示されます。
>
>「"ファイル名"は既に開いています。2重に開くと,これまでの変更内容は破棄されます。"ファイル名"を開きますか?」
>
>ここで,「はい」を選択した時はそれ以降の処理がうまく行くのですが,「いいえ」を選択した時に「実行時エラー’1004’」というのが表示されてしまいます。
>そこで,「いいえ」を選択した時に最初のボタンが表示されたエクセルシートに戻るようにマクロを組直したいのですがどのような構文を組めばよいかがわかりません。
>教えていただけないでしょうか?

こんな感じで如何でしょうか。

  strFName = Application.GetOpenFilename("Excel File(*.xls), *.xls")
  If strFName = "False" Then Exit Sub

  On Error Resume Next
  intFNo = FreeFile
  Open strFName For Binary Access Write Lock Write As #intFNo
  Close #intFNo
  
  If (GetAttr(strFName) And vbReadOnly) = 0 And Err.Number Then
    MsgBox "他で開かれています。閉じてから実行して下さい。", _
         vbInformation
    Exit Sub
  End If

【57943】Re:マクロのエラー処理
質問  non  - 08/9/23(火) 0:12 -

引用なし
パスワード
   〉りん さんありがとうございます。

開くファイルを,ダイアログボックスから選択したいのですが,
>  Set wb = Workbooks.Open(Filename:="C:\NFL\NFL2008.xls")
のところを,
  Set wb = Application.GetOpenFilename("CSVファイル(*.csv), *.csv")
とすると,うまくいきません。
何か方法はありますでしょうか?

【57944】Re:マクロのエラー処理
質問  non  - 08/9/23(火) 0:21 -

引用なし
パスワード
   〉Yuki さんありがとうございます。

>  If (GetAttr(strFName) And vbReadOnly) = 0 And Err.Number Then
の Err.Number のところは,今回の例では 1004 を代入するということでOKでしょうか?

試してみたのですが,開いていないファイルを開こうとしてもメッセージが表示されてしまいます。(つまりはファイルが開けません)。
こちらの操作に何か問題があるのでしょうか?

【57951】Re:マクロのエラー処理
回答  りん E-MAIL  - 08/9/23(火) 8:23 -

引用なし
パスワード
   non さん、おはようございます。

>開くファイルを,ダイアログボックスから選択したいのですが,
>>  Set wb = Workbooks.Open(Filename:="C:\NFL\NFL2008.xls")
>のところを,
>  Set wb = Application.GetOpenFilename("CSVファイル(*.csv), *.csv")
>とすると,うまくいきません。

GetOpenFilenameメソッドは、
 ユーザーによって選択、または入力されたファイルの名前とパス名を返します。
 入力が取り消された場合には False が返されます。
ということなので、オブジェクト変数に直接Setはできません。

(案1)前回と同じくエラースキップ
Sub test()
  Dim wb As Workbook, Ifile As Variant
  'ファイル名取得
  Ifile = Application.GetOpenFilename("CSVファイル(*.csv), *.csv")
  If TypeName(Ifile) = "Boolean" Then
    MsgBox "キャンセルしました", vbExclamation, "ファイル選択"
  Else
   'ここでセットして分岐
   On Error Resume Next 'スキップ
   Set wb = Application.Workbooks.Open(Ifile)
   On Error GoTo 0 '通常に戻す
   '結果の分岐
   If wb Is Nothing Then
     MsgBox "キャンセルしました", vbExclamation, "同じファイルを開く"
   Else
     MsgBox wb.FullName, vbInformation, "Open"
   End If
  End If
End Sub

(案2)ファイル名を取得しているのでチェック
Sub test()
  Dim wb As Workbook, Ifile As Variant, s1 As String
  '
  Ifile = Application.GetOpenFilename("CSVファイル(*.csv), *.csv")
  If TypeName(Ifile) = "Boolean" Then
    MsgBox "キャンセルしました", vbExclamation, "ファイル選択"
  Else
   '総当たりチェック
   For Each wb In Application.Workbooks
     If wb.Name = Dir(Ifile) Then Exit For
   Next
   '分岐
   If wb Is Nothing Then
     'なかったら無条件で開く
     Set wb = Application.Workbooks.Open(Ifile): s1 = "開いた"
   Else
     'あったら分岐
     If MsgBox(Ifile & "を開きますか?", vbYesNo, "既存") = vbYes Then
      wb.Saved = True: wb.Close
      Set wb = Application.Workbooks.Open(Ifile): s1 = "開いた"
     Else
      wb.Activate: s1 = "そのまま"
     End If
   End If
   '結果を表示して終わり
   MsgBox wb.FullName, vbInformation, s1
   Set wb = Nothing
  End If
End Sub

こんな感じです。

【57963】Re:マクロのエラー処理
お礼  non  - 08/9/23(火) 21:59 -

引用なし
パスワード
   〉りんさん
解決いたしました。
わかりやすく,ご丁寧にご対応いただきありがとうございました。
また,何かありましたらよろしくお願いいたします。
取り急ぎ,お礼まで。

4192 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free