excel 避免硬编码路径和错误处理

xytpbqjk  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(122)

我是VBA新手,但似乎无法理解这一点。因此,我有一个Excel源文件,在其中从选定的工作表复制必要的数据,然后将其粘贴到主工作簿(日常使用)到确切的工作表使用我的宏。我想做的是avopid硬编码源文件的路径,这样,如果源文件名更改,它仍然可以找到并打开必要的源文件文件并获得所需的数据。我还想实现错误处理,以确保源文件存在,并可以在运行宏之前打开。

Sub MacroCopy()
Workbooks.Open "C:\Users\xxxx\OneDrive\Desktop\OneDrive_0000-00-00\Project\Sources\sourcefile.xlsx"

ActiveSheet.ListObjects("Sourcesheet").Range.AutoFilter Field:=16, Criteria1:=Array("1", "2", "3", "4", "5"), Operator:=xlFilterValues

Workbooks("sourceworkbook.xlsx").Worksheets("sourceworksheet").Range("B5:EO11332").Copy _
ThisWorkbook.Worksheets("targetworksheet").Range("B5")

Workbooks("sourceworksheet.xlsx").Close SaveChanges:=True
 
End Sub
7nbnzgx9

7nbnzgx91#

有几个想法:
这段代码将尝试打开文件夹中的任何文件-在您的评论中,您认为这不一定是正确的。

Sub MacroCopy_v2()

    Dim fldr As String, fnm As String, wbSource As Workbook
    fldr = "C:\Users\xxxx\OneDrive\Desktop\OneDrive_0000-00-00\Project\Sources\"

    fnm = Dir(fldr & "*.xlsx")
    
    If fnm = "" Then
        MsgBox "No file found. Aborting."
    Else
        Set wbSource = Workbooks.Open(fldr & fnm)
        wbSource.ActiveSheet.ListObjects("Sourcesheet").Range.AutoFilter Field:=16, Criteria1:=Array("1", "2", "3", "4", "5"), Operator:=xlFilterValues
        wbSource.Worksheets("sourceworksheet").Range("B5:EO11332").Copy _
                            ThisWorkbook.Worksheets("targetworksheet").Range("B5")
        wbSource.Close SaveChanges:=True
    End If
    
End Sub

如果有多张图纸可用,您可能需要指定图纸名称,而不是使用ActiveSheet
我对SaveChanges:=True也有点困惑--因为你没有改变源工作簿(据我所知)。
这段代码查找默认文件名,如果文件夹中没有该文件名,则会打开一个提示,让用户手动选择一个文件。

Sub MacroCopy_v3()

    Dim fldr As String, defaultfnm As String, openpath As String, wbSource As Workbook
    fldr = "C:\Users\xxxx\OneDrive\Desktop\OneDrive_0000-00-00\Project\Sources"
    
    defaultfnm = "sourcefile.xlsx"
    
    openpath = fldr & "\" & defaultfnm
    If Dir(openpath) = "" Then
        ChDrive "C:"
        ChDir fldr
        openpath = Application.GetOpenFilename("Source file (*.xlsx),*.xlsx")
    End If
    
    If openpath <> "False" Then
        Set wbSource = Workbooks.Open(openpath)
        wbSource.ActiveSheet.ListObjects("Sourcesheet").Range.AutoFilter Field:=16, Criteria1:=Array("1", "2", "3", "4", "5"), Operator:=xlFilterValues
        wbSource.Worksheets("sourceworksheet").Range("B5:EO11332").Copy _
                            ThisWorkbook.Worksheets("targetworksheet").Range("B5")
        wbSource.Close SaveChanges:=True
    Else
        MsgBox "No file selected. Aborting."
    End If
    
End Sub

检测工作表是否存在-您可以在此处找到执行此操作的函数:
Test or check if sheet exists
您可以执行类似的操作来检测ListObject是否也存在。

相关问题