如何使用语句名称为

时间:2018-04-11 00:17:45

标签: excel vba excel-vba directory rename

美好的一天,

我有一个VBA项目,它根据给定的名称和ID(文件夹名称为ID_CategoryName)自动为某些特定数据类别创建文件夹。因此,当我更改或更新类别的名称时,我还想更新文件夹名称以表示新名称。

我使用语句名称重命名文件夹,如下所示:

Dim Fld1 as String
Dim Fld2 as String

Fld1 = "C:\Users\rapha\Desktop\1_Category1"
Fld2 = "C:\Users\rapha\Desktop\1_Category2"

If Dir(Fld1, vbDirectory) <> "" And Fld1 <> Fld2 Then
   Name Fld1 As Fld2
End if

问题:适用于空文件夹并重命名,但是包含文件的文件夹会返回错误75路径/文件访问错误

解决方案:我发现问题本身就是在复制Microsoft Office文件(在任务管理器中打开Word的一个实例)后,在我的窗口中重命名文件夹。但是我已经选择了@Ashleedawg解决方案,因为它可以解决我的问题或其他人的名称为语句,它还帮助我进一步检查是否有其他人在使用文件夹/文件与否(对于共享驱动器)。

其他信息:

1 - 不确定问题是否重复,但我发现有关VBA中文件夹重命名的所有问题(此处在stackoverflow中)都使用不同的方法(FileSystemObject)。如果知识渊博的人能告诉我使用名称为 FileSystemObject

的区别

2 - 我在即时窗口中测试了以下行:

Msgbox Dir("C:\Users\rapha\Desktop\Category1", vbDirectory)

它返回我&#34; 1_Category1&#34;,证明目录的存在

3 - 是否有更有效的重命名文件夹/文件的方法?

4 - 我在即时窗口上使用语法名称进行了一些手动测试。我只是通过拖动或使用Ctrl + C将文件放在文件夹中,有些文件会给我错误,其他文件则不会。例如,我放了300kb的PDF或Word文件,每当我运行名称 ThatFolder As ThatFolder2时,它会给我错误。

5 - 当我打开任务管理器时,它表示有一个Microsoft Word Open实例,即使它没有在我的Windows界面中显示。当我结束该过程时,我能够重命名该文件夹。因此,当我复制文件时,它会打开该应用程序的实例并保持打开状态。

6 - 文件夹中没有打开的文件,但我有另一个在它之前运行的代码,它使用文件夹中的对象。在listbox_click事件上,通常在您更改文件夹名称时选择该事件。

Sub DirectorylistActivate(FPath As String, SH As Worksheet, INPUTFRM As UserForm, FILELSTNAME As String)

    Dim objFSO As Object, objFolder As Object, objFile As Object
    Dim z As Integer
    Dim rnglastrow As Range
    Dim rng As Range
    Dim fName As String   

        'Create an instance of the FileSystemObject
        Set objFSO = CreateObject("Scripting.FileSystemObject")
        'Get the folder object
        Set objFolder = objFSO.GetFolder(FPath)
        z = 1

        SH.UsedRange.Clear

        'loops through each file in the directory
        For Each objFile In objFolder.Files

             Set rng = SH.Range(SH.Cells(z + 1, 1), SH.Cells(z + 1, 1))

            'create hyperlink in range
             SH.Hyperlinks.Add Anchor:=rng, Address:= _
             objFile.Path, _
             TextToDisplay:=objFile.name
             z = z + 1

        Next objFile

        'check if directory is empty
        fName = Dir(FPath & "\", vbNormal)

        Set rnglastrow = DirectoryList.Range("A2:A" & lrow(SH, "A"))
        rnglastrow.name = "Datafiles"

        'if directory empty clear rowsource
        If fName = "" Then
            INPUTFRM.Controls(FILELSTNAME).RowSource = ""
        Else
            INPUTFRM.Controls(FILELSTNAME).RowSource = "DataFiles"
        End If

        Set objFile = Nothing
        Set objFSO = Nothing
        Set objFolder = Nothing

End Sub

1 个答案:

答案 0 :(得分:1)

我敢打赌,您收到错误的原因是因为您有一个或多个文件位于当前打开的文件夹中。

如果所有文件都已关闭,Name..As命令可正常重命名文件夹,无论是否文件夹中是否有文件,都可以重命名文件夹。

在这种情况下导致错误的唯一其他(非显而易见)条件是尝试将文件夹“重命名”为新驱动器。

如果指定的文件已打开,则此函数返回TRUE

Function IsFileOpen(fileName As String) As Boolean
'returns TRUE if file [fileName] is locked/open
    Dim filenum As Long
    On Error Resume Next
    filenum = FreeFile()
    Open fileName For Input Lock Read As #filenum 'try to open (lock) file
    Close filenum
    If Err = 0 Then Exit Function
    If Err <> 70 Then 'not "permission denied"
        MsgBox "Error " & Err & ": " & Err.Description
    Else
        IsFileOpen = True
    End If
End Function

如果指定文件夹中的任何文件已打开,则此函数返回TRUE。 “立即窗口”中列出了打开的文件。 (此功能还需要上面的函数IsFileOpen。)

Function isFolderOpen(folderName As String) As Boolean
'returns TRUE if any files within folder [folderName] are locked/open
'names of open files are listed in the Immediate Window (CTRL+G to view)
    Dim dirStr As String
    If Right(folderName, 1) <> "\" Then folderName = folderName & "\"
    dirStr = Dir(folderName & "*.*", vbHidden)
    Do While dirStr <> ""
        If IsFileOpen(folderName & dirStr) Then
            isFolderOpen = True
            Debug.Print "File Open: " & folderName & dirStr
        End If
        dirStr = Dir
    Loop
End Function

更多信息