VBA Excel错误运行时错误“53”

时间:2017-08-14 09:30:49

标签: excel vba excel-vba runtime-error

我希望你能提供帮助。我有一个宏,它是广泛的。基本上它的作用是它有一个用户表单见图1

此用户表单允许用户导航到存储数据的模板(参见图2)并选择此完成的模板。

在Pic 1中的用户表单上。然后用户单击单选按钮DTOV(没有会议信息),然后单击按钮预验证。

单击此预验证按钮后,Excel模板上的数据将从此Excel文件中复制转换为文本文件。 (管道)分隔符,并要求用户确认新创建的文本文件所在的目录路径。见图3

应该发生的是,这个新创建的文本文档被放置到一个文件夹中,文本文档再次被拾取并发送到另一个数据库

我遇到的问题是新创建的文本文件没有进入要由其他数据库拾取的文件夹。

我收到错误运行时错误'53'这是在线上发生的

' create the file on the network folder Name DTOV_Directory & newfilename & "txt" As network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"

位于私人子Private Sub Pre_validate_Click()

这个宏中有很多其他代码,你可以在Pic 4中看到很多模块。如有必要,可以提供其他代码,但错误出现在EFPIA_Macro用户表单

所以我只在下面提供了这个用户表单代码,请参阅CODE

再次发生错误' create the file on the network folder Name DTOV_Directory & newfilename & "txt" As network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"

位于私人子Private Sub Pre_validate_Click()

我真的很难解决这个问题

因此,我们非常感谢所有人的帮助。

谢谢

图1

enter image description here

图2 enter image description here

图3

enter image description here

图4

enter image description here

代码

Dim DTOV_Directory As String
Dim DTOV_fname As String
Dim ITOV_Directory As String
Dim ITOV_fname As String
Dim txtFileName As String


Private Sub Clear_form_Click()
Unload Me
EFPIA_Macro.Show
End Sub

Private Sub Close_form_Click()
Unload Me
ThisWorkbook.Close savechanges:=False
Application.Quit


End Sub

Private Sub DTOV_chkbox_Change()
    If txtFileName = "" Then
       DTOV_chkbox = False
       DTOV_filename = ""
       Call dtov_file_processing
    End If
    txtFileName = ""
End Sub

Private Sub DTOV_chkbox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Call dtov_file_processing
End Sub

Private Sub dtov_file_processing()
    Dim fd As Office.FileDialog
    Dim varFile As Variant

    ' check if either of graphical/raw file is selected
    If Graphical_file.Value <> True And Raw_file.Value <> True Then
        MsgBox "Please select the type of file - Graphical/Raw"
        DTOV_chkbox = False
        DTOV_filename = ""
        txtFileName = ""
    ElseIf DTOV_filename <> "" Then
        DTOV_chkbox = False
        DTOV_filename = ""
        txtFileName = ""
    Else
        txtFileName = ""
        Set fd = Application.FileDialog(msoFileDialogFilePicker)
        With fd
            .AllowMultiSelect = False
            .Title = "Please select the file."

            ' Clear out the current filters, and add our own.
            .Filters.Clear
            .Filters.Add "All Files", "*.*"
            .Filters.Add "Excel 2003", "*.xls"

            If .Show = True Then
                txtFileName = .SelectedItems(1)
            End If
         End With

         If Graphical_file.Value = True And (InStr(txtFileName, "DTOV") = 0 Or InStr(txtFileName, ".xls") = 0 Or txtFileName = "") Then
            MsgBox "Incorrect DTOV file selected. Please re-select the file"
            DTOV_chkbox = False
            DTOV_filename = ""
         ElseIf Raw_file.Value = True And InStr(txtFileName, ".xls") = 0 Then
            MsgBox "Incorrect RAW file selected. Please re-select the file"
            DTOV_chkbox = False
            DTOV_filename = ""
         Else
            DTOV_filename = txtFileName
            DTOV_chkbox = True
         End If
    End If
End Sub

Private Sub Graphical_file_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    File_category_frame_1.Caption = "Choose DTOV File"
    DTOV_chkbox.Caption = "DTOV (Without Meeting Information)"
    File_category_frame_2.Visible = True
    ITOV_chkbox.Visible = True
    DTOV_chkbox = False
    DTOV_filename = ""
    ITOV_chkbox = False
    ITOV_filename = ""
    txtFileName = ""
End Sub


Private Sub ITOV_chkbox_Change()
    If txtFileName = "" Then
       ITOV_chkbox = False
       ITOV_filename = ""
       Call itov_file_processing
    End If
    txtFileName = ""
End Sub

Private Sub ITOV_chkbox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Call itov_file_processing
End Sub

Private Sub itov_file_processing()
    Dim fd As Office.FileDialog

    ' check if either of graphical/raw file is selected
    If Graphical_file.Value <> True And Raw_file.Value <> True Then
        MsgBox "Please select the type of file - Graphical/Raw"
        ITOV_chkbox = False
        ITOV_filename = ""
        txtFileName = ""
    ElseIf ITOV_filename <> "" Then
        ITOV_chkbox = False
        ITOV_filename = ""
        txtFileName = ""
    Else
        txtFileName = ""
        Set fd = Application.FileDialog(msoFileDialogFilePicker)
        With fd
            .AllowMultiSelect = False
            .Title = "Please select the file."

            ' Clear out the current filters, and add our own.
            .Filters.Clear
            .Filters.Add "All Files", "*.*"
            .Filters.Add "Excel 2003", "*.xls"

            If .Show = True Then
                txtFileName = .SelectedItems(1)
            End If
         End With

         If InStr(txtFileName, "ITOV") = 0 Or InStr(txtFileName, ".xls") = 0 Then
            MsgBox "Incorrect file selected. Please re-select the file"
            ITOV_chkbox = False
            ITOV_filename = ""
         Else
            ITOV_filename = txtFileName
            ITOV_chkbox = True
         End If
    End If
End Sub

Private Sub Pre_validate_Click()
 Dim newfilename As String
 Dim network_path As String
 Dim final_msg As String

 ' user interface to accept network folder path
 PreVal_Dir_Path.Show
 network_path = EFPIA_Macro.Pre_validate.ControlTipText
 EFPIA_Macro.Pre_validate.ControlTipText = ""
 final_msg = "The below files are submitted for the prevalidation:"

 If Not Dir(network_path, vbDirectory) = vbNullString Then
    DTOV_fname = ""
    ITOV_fname = ""

    ' call the procedure to create files.
    Call Process_template_Click

    ' note - we need to change the destination directory (DTOV_Directory, ITOV_Directory) to the place where pre-val tool n/w folder
    If DTOV_fname <> "" Then
       newfilename = Left(DTOV_fname, InStrRev(DTOV_fname, "."))

       If Dir(DTOV_Directory & newfilename & "txt") <> "" Then
          ' remove the file with same name if already exists on the network folder
          If Dir(network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt") <> "" Then
             Kill network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
          End If

          ' create the file on the network folder
          Name DTOV_Directory & newfilename & "txt" As network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
          final_msg = final_msg & " " & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
       End If

       If Dir(DTOV_Directory & Replace(newfilename, "DTOV", "CUST") & "txt") <> "" Then
          ' get the new generated txt TOV file name
          newfilename = Replace(newfilename, "DTOV", "CUST")
          ' remove the file with same name if already exists on the network folder
          If Dir(network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt") <> "" Then
             Kill network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
          End If

          ' create the file on the network folder
          Name DTOV_Directory & newfilename & "txt" As network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
          final_msg = final_msg & " " & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
       End If
     End If

     If ITOV_fname <> "" Then
        newfilename = Left(ITOV_fname, InStrRev(ITOV_fname, "."))

        If Dir(ITOV_Directory & newfilename & "txt") <> "" Then
           ' remove the file with same name if already exists on the network folder
           If Dir(network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt") <> "" Then
              Kill network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
           End If
           ' create the file on the network folder
           Name ITOV_Directory & newfilename & "txt" As network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
           final_msg = final_msg & " " & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
        End If

        If Dir(ITOV_Directory & Replace(newfilename, "ITOV", "CUST") & "txt") <> "" Then
           ' get the new generated txt TOV file name
           newfilename = Replace(newfilename, "ITOV", "CUST")
           ' remove the file with same name if already exists on the network folder
           If Dir(network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt") <> "" Then
              Kill network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
           End If
           ' create the file on the network folder
           Name ITOV_Directory & newfilename & "txt" As network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
           final_msg = final_msg & " " & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
        End If
     End If

     If DTOV_fname <> "" Or ITOV_fname <> "" Then
        final_msg = final_msg & vbNewLine & "The processing will take upto 10 minutes."
        final_msg = final_msg & vbNewLine & "You will receive email notification once validation process is complete."
        final_msg = final_msg & vbNewLine & "You can track the status of the file and review the error using the cognos browser - link to which will be present in the email to you"
        MsgBox final_msg
     End If

 Else
    MsgBox ("Network folder is un-accessible. Please verify your access or the network folder path")
 End If


End Sub


Private Sub Process_template_Click()

 If DTOV_filename <> "" Then
    DTOV_Directory = Left(DTOV_filename, InStrRev(DTOV_filename, "\"))
    DTOV_fname = Dir(DTOV_filename)
 End If

 If ITOV_filename <> "" Then
    ITOV_Directory = Left(ITOV_filename, InStrRev(ITOV_filename, "\"))
    ITOV_fname = Dir(ITOV_filename)
 End If

 If DTOV_chkbox.Value = True And ITOV_chkbox.Value = True And DTOV_filename <> "" And ITOV_filename <> "" Then
    Call Template_Process.Process_Templates(DTOV_Directory, DTOV_fname, ITOV_Directory, ITOV_fname)
 ElseIf DTOV_chkbox.Value = True And DTOV_filename <> "" And Raw_file.Value = False Then
    Call Template_Process.Process_template(DTOV_Directory, DTOV_fname, "D")
 ElseIf DTOV_chkbox.Value = True And DTOV_filename <> "" And Raw_file.Value = True Then
    Call Process_Raw(DTOV_Directory, DTOV_fname)
 ElseIf ITOV_chkbox.Value = True And ITOV_filename <> "" Then
    Call Template_Process.Process_template(ITOV_Directory, ITOV_fname, "I")
 Else
    MsgBox "No file selected. Please select a file to proceed"
 End If

End Sub


Private Sub Raw_file_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    File_category_frame_1.Caption = "Choose RAW File"
    DTOV_chkbox.Caption = "RAW (Without Graphical Information)"
    DTOV_chkbox = False
    DTOV_filename = ""
    File_category_frame_2.Visible = False
    ITOV_chkbox.Visible = False
    ITOV_filename.Visible = False
End Sub

新错误PIC enter image description here

2 个答案:

答案 0 :(得分:1)

通常,52是错误的文件名错误 - https://msdn.microsoft.com/en-us/library/aa231024(v=vs.60).aspx

因此,如果你在文件名和.之间放置一个点txt,它可能会起作用:

    Name DTOV_Directory & newfilename & ".txt" As network_path & _
    Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & ".txt"

答案 1 :(得分:1)

 

您没有提供确切的文件路径(其中一个无效[=错误52]),但您可以通过替换失败的声明来自己帮助

Name DTOV_Directory & newfilename & "txt" As network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt" 

(临时)扩展等价物:

' assign file names to variables and perform renaming
oldFileName = DTOV_Directory & newfilename & "txt" 
newFileName = network_path & Replace(newfilename, "EFPIA", "EFPIA_PVLDTN") & "txt"
Name oldFileName As NewFileName

当程序停止时(使用Stop语句或(更好)使用断点 - F9 键),将鼠标悬停在变量名称上以检查其内容(或使用watch或{立即窗口中的{1}}命令,......等等。

也许你会发现这些潜在的问题:

  • 文件扩展名中缺少点
  • 缺少将目录与文件分开的反斜杠
  • 其他问题,例如网络路径问题。

编辑:错误处理

在子print中,您有3个Pre_validate_Click()命令。围绕每个Name

On Error Goto

在子程序结束时On Error Goto RenameError ' error handling on Name ... As ... On Error Goto 0 ' error handling off 之前添加以下内容:

End Sub