Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 通过简单的覆盖保存了解IsFileOpen和outputtext的功能_Vba_Excel - Fatal编程技术网

Vba 通过简单的覆盖保存了解IsFileOpen和outputtext的功能

Vba 通过简单的覆盖保存了解IsFileOpen和outputtext的功能,vba,excel,Vba,Excel,我很难理解为什么几个月前我发现的一段代码(不知道源网站)在试图保存文件时做了这么奇怪的事情 在不断循环的代码的主要部分中,它具有以下内容: 主狙击手 IsFileOpen() 使用IsFileOpen()和outputtext()的目的是什么,当然只要用覆盖保存就足够了 对我来说,它看起来像是检查文件是否打开,锁定打开,然后杀死文件(解锁),然后保存 任何解释都将不胜感激这种设计的一些原因 如果文件在其他位置打开,则可能以非只读模式打开(这是正在检查的内容,即文件是否已锁定)。这在网络驱动器上尤

我很难理解为什么几个月前我发现的一段代码(不知道源网站)在试图保存文件时做了这么奇怪的事情

在不断循环的代码的主要部分中,它具有以下内容:

主狙击手 IsFileOpen() 使用
IsFileOpen()
outputtext()
的目的是什么,当然只要用覆盖保存就足够了

对我来说,它看起来像是检查文件是否打开,锁定打开,然后杀死文件(解锁),然后保存


任何解释都将不胜感激

这种设计的一些原因

  • 如果文件在其他位置打开,则可能以非只读模式打开(这是正在检查的内容,即文件是否已锁定)。这在网络驱动器上尤其重要

  • 如果文件已打开,并且您的代码试图保存它,它将抛出一个错误。所以你可以

    • 一旦抛出错误,请尝试处理该错误,或者
    • 抢占问题并向用户抛出受控错误或提示进一步操作等
  • 这是一种更干净的方法来避免文件损坏,尤其是在共享资源上


  • 您不能终止或覆盖在另一个程序中打开的文件-它将被该程序锁定。以前有人问过这个问题,之前的答案包括希望这样做的逻辑。根据我在Sid的回答中的评论,尽管在我尝试类似的方法时,实际打开托管在海外服务器上的大型模型的时间开销大约为2-3分钟。当它以只读方式打开时,它给出了一个“grrr”时刻,而上面的Sid函数给出了一个即时响应。FWIW Bob Phillips在vbaexpress上列出了一个类似的功能,这是一个更高级的版本,正在等待从Chip Pearson的其他地方关闭该书。代码有一行
    ,如果不是isCsvOpen,则输出ext delimiteddata,FullPath
    ,当然这意味着它仍然打开,但它仍然试图保存?为什么不简单地发出一个kill,然后保存呢?它是用命令
    kill FilePath
    删除文件。如果没有人使用它,用相同的名称在它的位置创建一个新的副本。如果用户想要附加它,那么这是没有必要的,但是由于用户想要替换整个文件的内容,这就更干净了,特别是如果文件写入操作需要很长时间,同时您不希望从公共驱动器进行任何访问尝试。我想我明白了,请问您是否可以对主要代码位进行注释,或者如果可能,对所有3部分进行注释???你为什么想要这个??无论是哪种情况,我都在用电话访问,这里的评论应该足够清晰
        path = "C:/"
        filename = "file.csv"
    
        If Dir(path) = "" Then
            FullPath = Environ("USERPROFILE") & "\Desktop\" & filename
        Else
            FullPath = path & filename
            If Dir(FullPath) <> "" Then
                isCsvOpen = IsFileOpen(FullPath)
                If Not isCsvOpen Then Kill (FullPath)
            End If
        End If
    
        If Not isCsvOpen Then outputtext delimiteddata, FullPath
    
    Function outputtext(text As String, path As String)
        Dim MyFile As String, fnum As String
        MyFile = path
        fnum = FreeFile() ' Get a free file number.
        Open MyFile For Output As fnum  'open file for output
        Print #fnum, text ' Print when you want the string without quotation marks
        Close #fnum
    End Function
    
    Function IsFileOpen(filename As String)
        Dim filenum As Integer, errnum As Integer
        On Error Resume Next   ' Turn error checking off.
        filenum = FreeFile()   ' Get a free file number.
        ' Attempt to open the file and lock it.
        Open filename For Input Lock Read As #filenum
        Close filenum          ' Close the file.
        errnum = Err
        On Error GoTo 0        ' Turn error checking back on.
    
        ' Check to see which error occurred.
        Select Case errnum
    
            ' No error occurred.
            ' File is NOT already open by another user.
            Case 0
             IsFileOpen = False
    
            ' Error number for "Permission Denied."
            ' File is already opened by another user.
            Case 70
                IsFileOpen = True
    
            Case Else
                Error errnum
        End Select
    
    End Function