excel - 在 OneDrive 中创建新文件夹

标签 excel vba create-directory

多年来一直使用下面的代码。它创建新文件夹,并将其命名为下一个工作日的日期+在其中添加另一个文件夹,名为“VO”。 代码有两行“fPath”。暂停的那个是原来的那个。有了这个,我可以移动我的文件,代码仍然会根据 ThisWorkbook 的位置创建新文件夹。

但是,对于 OneDrive,原始“fPath”行以“运行时错误 52:错误的文件名或编号”结束,标记行 .CreateFolder (EndDir1)。 为什么此代码在 OneDrive 中不起作用?当我将“fPath”行更改为完整地址时,它工作得很好。

Sub NewFolderNextWorkDay()

Dim FSO As Object
Dim fsoObj As Object

Dim NeArbDg As Double
NeArbDg = Application.WorkDay(Date, 1)

Dim Dato As String
Dim fPath As String
Dim EndDir1, EndDir2 As String
Dato = Format(NeArbDg, "yyyy-mm-dd")

'fPath = ThisWorkbook.Path & "\..\"    '(old code, worked fine until OneDrive came along)
fPath = "C:\Users\MyId\OneDrive - MyJob\Mine dokumenter\PROD\TEST\2022\"   '(new code, works ok with OneDrive)

EndDir1 = (fPath & Dato & "\")
EndDir2 = (fPath & Dato & "\VO")

Set fsoObj = CreateObject("Scripting.FileSystemObject")
    
    With fsoObj
    
        If Not .FolderExists(EndDir1) Then
        .CreateFolder (EndDir1)
        End If
        
        If Not .FolderExists(EndDir2) Then
        .CreateFolder (EndDir2)
        End If
        
    End With

End Sub

最佳答案

链接帖子(https://stackoverflow.com/a/67582367/478884)中的这个功能似乎对我有用。当 strCID 没有内容时,我确实需要进行更改来解决问题。请参阅标记为 #### 的行

Function GetLocalFile(wb As Workbook) As String
    ' Set default return
    GetLocalFile = wb.FullName

    Const HKEY_CURRENT_USER = &H80000001

    Dim strValue As String

    Dim objReg As Object: Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    Dim strRegPath As String: strRegPath = "Software\SyncEngines\Providers\OneDrive\"
    Dim arrSubKeys() As Variant
    objReg.EnumKey HKEY_CURRENT_USER, strRegPath, arrSubKeys

    Dim varKey As Variant
    For Each varKey In arrSubKeys
        ' check if this key has a value named "UrlNamespace", and save the value to strValue
        objReg.getStringValue HKEY_CURRENT_USER, strRegPath & varKey, "UrlNamespace", strValue

        ' If the namespace is in FullName, then we know we have a URL and need to get the path on disk
        If InStr(wb.FullName, strValue) > 0 Then
            Dim strTemp As String
            Dim strCID As String
            Dim strMountpoint As String
        
            ' Get the mount point for OneDrive
            objReg.getStringValue HKEY_CURRENT_USER, strRegPath & varKey, "MountPoint", strMountpoint
        
            ' Get the CID
            objReg.getStringValue HKEY_CURRENT_USER, strRegPath & varKey, "CID", strCID
        
            ' strip off the namespace and CID
            If Len(strCID) > 0 Then strValue = strValue & "/" & strCID     '#####
            strTemp = Right(wb.FullName, Len(wb.FullName) - Len(strValue)) '#####
        
            ' replace all forward slashes with backslashes
            GetLocalFile = strMountpoint & "\" & Replace(strTemp, "/", "\")
            Exit Function
        End If
    Next
End Function

关于excel - 在 OneDrive 中创建新文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70606718/

相关文章:

macos - Visual Basic 编辑器 Excel 2016 中的边距

excel - 提取 zip 文件时出现错误 'run-time error -2147024894(80070002)' ...

带 Excel VBA 的 MySQL ODBC 连接器 - 无法删除记录

Excel - 如何在组内创建累积和列?

sql - ALTER USER 给出语法错误

java - 如何使用 Java 在 TOMCAT 中创建一个目录?

c++ - CreateDirectory 报告失败,但错误代码为 ERROR_SUCCESS

windows - 创建一个空目录(NSIS)

c# - LINQ 和 ExcelQueryFactory

excel - 简单的循环,但通过 50 000+ 行