【问题标题】:Open an excel file read only but open with different file name以只读方式打开一个 Excel 文件,但以不同的文件名打开
【发布时间】:2020-07-02 16:46:13
【问题描述】:

场景

我有一个使用以下代码以只读方式打开的文件。

Set wbRead = Workbooks.Open(FilePath, ReadOnly:=True)

这里的 FilePath 是一个变量,它告诉该文件的文件位置

问题

我面临的问题是,如果用户第二次运行宏而不关闭这个已经打开的只读文件,由于打开了类似的文件名,它会给出运行时错误

我需要什么

有什么方法可以让excel以只读方式打开文件,但打开的文件显示一些随机名称? 例如:实际文件名是A。但是当excel以只读方式打开时,它以A123打开? 123 就像一个随机数。

【问题讨论】:

  • 没有。可以做到这一点的唯一方法是在打开文件之前实际重命名文件,您将无法这样做,因为 Excel 已将其打开。但无论如何,你问错了问题。您的问题应该是如何在文件仍处于打开状态时阻止我的用户运行我的宏两次?
  • 您真的希望他们能够两次打开同一个文件吗?
  • @KenWhite 用户需要根据需要多次运行宏。目前,他们必须将只读文件保存到某个地方并在他们不喜欢的第二次运行之前将其关闭。所以这个问题是正确的。只是,如果有办法做到这一点。
  • @TimWilliams 是的。不止两次。他们想要多少次都可以
  • 将文件复制到临时文件夹下,随机命名,并打开副本。

标签: excel vba


【解决方案1】:

另一个解决方案是始终(打开或不打开)使用Workbooks.Add 创建文件的新副本。关闭时 Excel 会自动提示您以新名称保存:

Set wbRead = Workbooks.Add(FilePath)

【讨论】:

    【解决方案2】:

    如果文件已经打开,请在临时文件夹中以不同的名称复制一份,然后从那里打开。

    Sub OpenFile()
    
        Const fPath As String = "C:\users\tim\desktop\tmp.xlsm"
    
        Dim fso, wb As Workbook, fName, p
        Set fso = CreateObject("scripting.filesystemobject")
    
        p = fPath
        fName = fso.getfilename(p)
    
        On Error Resume Next
        Set wb = Workbooks(fName)
        On Error GoTo 0
    
        If Not wb Is Nothing Then
            p = fso.GetSpecialFolder(2) & "\" & Round(Rnd() * 1000, 0) & "_" & fName
            fso.copyfile fPath, p
        End If
        Workbooks.Open p
    
    
    End Sub
    

    【讨论】:

    • 我试过这段代码,但它不起作用。仅当我将If Not wb Is Nothing 更改为If wb is Nothing 时它才有效。顺便问一下,如果使用这种方法,会不会有一些对象会保存在内存中?因为我的应用程序是一种内存消耗型,我需要确保没有不必要地使用内存。
    • 文件只有在打开时才会在内存中
    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 2012-09-29
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多