[[20180725130156]] 『VBAでフォルダの中にあるExcelファイルの保護パス』(たいやき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAでフォルダの中にあるExcelファイルの保護パスワードを、自動入力した後のエラー処理』(たいやき)

こんにちは。

VBAを勉強してから一週間が経ちました。

フォルダの中にある複数のExcelファイルを、キーワード検索で開きたいファイルを抽出して、ブックの保護パスワードを自動入力する。もし、パスワードが間違っていたら、繰り返し入力して、合っていたら処理を続行するというVBAを作成しております。

しかし、1004のエラーで「パスワードが間違っています」とエラー表示され、VBAが終了してしまいます。どうすればパスワードが合うまでループし、パスワードが合っていたら処理を続行することができるのか、ご教授いただきたく投稿させていただきました。

よろしくお願いします。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Sub macro1()

    Application.ScreenUpdating = False
    ファイルパス = ThisWorkbook.Path & "\"
    ファイル名 = Dir(ファイルパス & "*キーワード*")
    行 = Range("A65536").End(xlUp).Row + 1
    Do While ファイル名 <> ""
    Workbooks.Open Filename:=ファイルパス & ファイル名, Password:="パスワード"

    (セルを指定し一覧にする処理)
    Loop

End Sub

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

< 使用 Excel:Excel2010、使用 OS:Windows10 >


Sub macro1()

    Application.ScreenUpdating = False

    ファイルパス = ThisWorkbook.Path & "\"

    ファイル名 = Dir(ファイルパス & "*キーワード*")

    行 = Range("A65536").End(xlUp).Row + 1

    Do While ファイル名 <> ""

        pw = "パスワード"
        Do While fileopen(ファイルパス & ファイル名, pw) = False
            pw = InputBox(ファイルパス & ファイル名, "パスワード入力")
        Loop

' (セルを指定し一覧にする処理)

       ファイル名 = Dir()
    Loop

End Sub

Function fileopen(arg1, arg2) As Boolean

    Dim wb As Workbook
    On Error GoTo ere
     Set wb = Workbooks.Open(Filename:=arg1, Password:=arg2)
    fileopen = True
    wb.Close False
ere:
End Function
(mm) 2018/07/25(水) 14:04

ご回答ありがとうございます!

まだ、エラーが直せない状況ではありますが、再度行き詰まったら、また質問させていただきたいと思います。
(たいやき) 2018/07/25(水) 14:46


度々失礼します。

コードを自分なりに調べて改良してみたのですが、どうしてもエラーが出て直せないです。。

何度も厚かましいですが、ご教授お願い致します。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Sub macro1()

    Application.ScreenUpdating = False
    ファイルパス = ThisWorkbook.Path & "\"
    ファイル名 = Dir(ファイルパス & "*休暇届*")
    行 = Range("A65536").End(xlUp).Row + 1
    Do While ファイル名 <> ""
    pw = "1234"
        Do While fileopen(ファイルパス & ファイル名, pw) = False
            pw = InputBox(ファイルパス & ファイル名, "パスワード入力")
        Loop

    区分 = Range("B1").Value
    申請日 = Range("D10").Value
    所属 = Range("D13").Value
    氏名 = Range("J13").Value
    期間始 = Range("E18").Value
    期間終 = Range("E23").Value
    日数 = Range("L21").Value
    休暇区分 = Range("D26").Value
    休暇出勤事由 = Range("D28").Value
    備考 = Range("D31").Value

    ActiveWindow.Close

    Range("A" & 行).Value = 区分
    Range("B" & 行).Value = 申請日
    Range("C" & 行).Value = 所属
    Range("D" & 行).Value = 氏名
    Range("E" & 行).Value = 期間始
    Range("F" & 行).Value = 期間終
    Range("G" & 行).Value = 日数
    Range("H" & 行).Value = 休暇区分
    Range("I" & 行).Value = 休暇出勤事由
    Range("J" & 行).Value = 備考
    Range("K" & 行).Value = "-"
    Range("L" & 行).Value = "-"
    Range("M" & 行).Value = ファイル名
    Range("N" & 行).Value = FileDateTime(ThisWorkbook.Path & "\" & ファイル名)

    行 = 行 + 1
    ファイル名 = Dir()
    Loop

End Sub

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Sub macro2()

    ファイルパス = ThisWorkbook.Path & "\"
    ファイル名 = Dir(ファイルパス & "*休日出勤届*")
    行 = Range("A65536").End(xlUp).Row + 1
    Do While ファイル名 <> ""
     pw = "1234"
        Do While fileopen(ファイルパス & ファイル名, pw) = False
            pw = InputBox(ファイルパス & ファイル名, "パスワード入力")
        Loop

    区分 = Range("A1").Value
    申請日 = Range("C10").Value
    所属 = Range("C13").Value
    氏名 = Range("I13").Value
    期間自 = Range("D18").Value
    期間至 = Range("D23").Value
    日数 = Range("K21").Value
    休暇区分 = Range("C48")
    出勤事由 = Range("C26")
    備考 = Range("C31").Value
    処理方法 = Range("E39").Value
    代休予定日 = Range("I39").Value

    ActiveWindow.Close

    Range("A" & 行).Value = 区分
    Range("B" & 行).Value = 申請日
    Range("C" & 行).Value = 所属
    Range("D" & 行).Value = 氏名
    Range("E" & 行).Value = 期間自
    Range("F" & 行).Value = 期間至
    Range("G" & 行).Value = 日数
    Range("H" & 行).Value = 休暇区分
    Range("I" & 行).Value = 出勤事由
    Range("J" & 行).Value = 備考
    Range("K" & 行).Value = 処理方法
    Range("L" & 行).Value = 代休予定日
    Range("M" & 行).Value = ファイル名
    Range("N" & 行).Value = FileDateTime(ThisWorkbook.Path & "\" & ファイル名)

    行 = 行 + 1
    ファイル名 = Dir()
    Loop

End Sub

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Function fileopen(arg1, arg2) As Boolean

    Dim wb As Workbook
    On Error GoTo ere
     Set wb = Workbooks.Open(Filename:=arg1, Password:=arg2)
    fileopen = True
    wb.Close False
ere:
End Function

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Sub クリア()

    Range("A3").CurrentRegion.Offset(2, 0).ClearContents

End Sub
Sub 更新日時の追加()

    Dim fso As FileSystemObject
    Set fso = New FileSystemObject
    Dim f As File
    Set f = fso.GetFile("D:\Tips.txt")
    Dim d As Date
    d = f.DateLastModified
    Range("N1").Value = d

End Sub

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Sub TOTAL()

    Call macro1
    Call macro2
    MsgBox "書き出しが完了しました"
    Application.ScreenUpdating = True

End Sub
(たいやき) 2018/07/25(水) 18:05


>コードを自分なりに調べて改良してみたのですが、どうしてもエラーが出て直せないです。。
どのようなエラーが出て困っているのかも、提示すると良いアドバイスがもらえるかもしれません。(たぶん、実行時エラー'1004 だとおもいますが・・・)

以下、気づきの点で。
「パスワードが間違っていたら、繰り返し入力して、合っていたら処理を続行」とのことですから、
少なくとも、違うパスワードを入れてブックが開けないというエラーが発生したら、再度パスワードを入力させるという処理に移行しないとダメですよね。
さらに言えば、上記の処理に移行したらしたで、正しいパスワードを入れるまでずっと聞いてくるわけですから、「あきらめる」って選択肢がないですよね。
これだと困ると思うので、キャンセルボタン押したたら、聞くのをやめて次の処理に行くなり、プログラムを終了させるなどにしないと使い勝手がわるいとおもいます。

なので、とりあえず全体の部分は置いておいて↑の部分だけ実験で作ってみては如何でしょうか。

#当然ですが、フォルダパスやファイル名は適時自分の環境に合わせて変えて下さい。
#このままですと、1004以外のエラーが発生しても、同じエラー処理をしてしまいます。
#本来は、エラーナンバーでの分岐などをしたほうがよいのでしょうけど長くなるので割愛します

    Sub 実験1()
        Const MyPath As String = "D:\Work\"

        Dim パスワード As String
        Dim MyFile As String

        MyFile = Dir(MyPath & "*実験*")

        パスワード = Application.InputBox(Prompt:=MyFile & "のパスワードを入力してください", Title:=MyFile & "がみつかりました")
        If パスワード = "False" Then
            MsgBox "キャンセルが押されたためプログラムを強制終了します"
            Exit Sub
        End If

        On Error GoTo エラー処理
        Workbooks.Open Filename:=MyPath & MyFile, Password:=パスワード

    Exit Sub

    エラー処理:
        Err.Clear
        パスワード = Application.InputBox( _
                        Prompt:=MyFile & "のパスワードを入力してください" & vbCrLf & "あきらめる場合はキャンセルをクリック", _
                        Title:="パスワードが違うようです")
        If パスワード = "False" Then
            MsgBox "キャンセルが押されたためプログラムを強制終了します"
            Exit Sub
        End If
    Resume

    End Sub

と、ここまで書いてパスワードを自動入力って言ってるから、いくつかの候補から総当たりで試して、合うものがあればブックを開くってことでしょうか?

そうであれば、ループで処理する必要かあると思います。

(もこな2) 2018/07/25(水) 20:02


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.