【问题标题】:VBA Set custom document propertyVBA设置自定义文档属性
【发布时间】:2022-01-27 00:46:26
【问题描述】:

我在确定是快速修复时遇到了一些问题。我有一个带有“脚本状态”的自定义文档属性字段的 excel 文档。脚本状态属性来自文档库中从中下载文档的列。我的目标是让用户下载表单,完成他们分配的任务,然后运行“BeforeSave”宏,它将扫描工作并根据宏的结果更新脚本状态属性(即,如果缺少字段,脚本会说“未完成”等)。在 SharePoint 中,这是一个选项下拉框,其中包含以下选项:未分配、已分配、未完成、已完成/通过、失败、重新测试和推迟。我有检查工作集的逻辑并且工作正常,只是不知道如何更新属性字段。到目前为止,我所拥有的只是:

Application.ThisWorkbook.CustomDocumentProperties.Item("Script Status").Value = "Fail"

一旦运行,我会收到一条错误消息,指出“无效的过程调用或争论”。我试图研究这条线的正确语法,但无济于事。任何帮助将不胜感激!

【问题讨论】:

  • 如果我的工作簿包含命名CustomDocumentProperties.Item,我可以复制该特定错误消息。验证您的代码确保此属性存在,和/或您的代码不会在其他地方无意中删除它,等等。
  • 使用代码,如何确保特定属性存在?手动,如果我单击文件,我可以在屏幕右侧看到属性,并且列出了“脚本状态”以及所有选项。
  • 在我们走这条路之前... 是否从包含此属性的工作簿运行该过程?或者这个宏是从另一个工作簿运行的?
  • 程序在具有属性的工作簿中。具体来说,它位于 Workbook_BeforeSave 声明中。此宏永远不会与外部工作簿关联。

标签: excel vba


【解决方案1】:

似乎与 excel 文档关联的 Sharepoint 属性既不是 CustomDocumentProperty 也不是 BuiltInDocumentProperty。在对代码进行更多尝试后,Sharepoint 字段为“ContentTypeProperty”。使用与 ContentTypeProperty 而不是自定义属性的原始问题中发布的相同代码,该代码成功运行。

请参考 David 的代码以确定您的“属性”是否真的是自定义属性而不是内容类型。这很有帮助!

【讨论】:

    【解决方案2】:

    Sharepoint 中的文件可能有些怪癖,诚然,这不是我所熟悉的,但通过阅读其他线程,我知道这些文件存在一些困难。这可能是,也可能不是,在这里。

    无论如何,我们可以尝试诊断它,也许我们会解决问题。

    正如我在 cmets 中提到的,如果命名的 DocumentProperty(“脚本状态”)在我的工作簿中不存在,我可以复制此错误。这可能就像一个错字一样简单,也许。你可以使用这个函数来测试一个名为DocumentProperty的是否存在:

    Function CustomPropertyExists(propName As String) As Boolean
        Dim wb As Workbook
        Dim docProp As DocumentProperty
        Dim propExists As Boolean
        Set wb = Application.ThisWorkbook
        For Each docProp In wb.CustomDocumentProperties
            If docProp.Name = propName Then
                propExists = True
                Exit For
            End If
        Next
        CustomPropertyExists = propExists
    End Function
    

    如果你把它放在一个标准模块中,你可以从工作表中调用函数,比如:

    =CustomPropertyExists("Script Status") 它将根据是否找到命名属性返回 TrueFalse 值。

    您可以从子程序中调用它,例如:

    If CustomPropertyExists("Script Status") Then
        MsgBox "Exists!",vbInformation
    Else 
        MsgBox "Does not exist", vbCritical
    End If
    

    【讨论】:

    • 感谢大卫帮助我!我尝试了该功能,返回“不存在”。不过,我可以再次手动进入文件>属性(在右侧)并手动更改该属性。然后一旦更改,我可以单击保存并将其保存到我们的 Sharepoint 站点,您可以立即在网站上看到更改的状态。我们只是在寻找一种方法来自动化这个过程。除了内置和自定义属性之外,似乎该属性就在那里,但在它自己的单独区域中?也许它根本就不是“财产”,或者是不同的东西?
    • 您能否在原始问题中添加屏幕截图(将图像上传到 imgur.com),显示您在查看文件 > 属性时所描述的内容?也许这会给我更多的信息。或者也许不会。但至少值得一试。
    • 所以做了一些乱七八糟的事情,我想我有一个解决方案(敲木头)。我知道我还没有上传屏幕截图,但是现在,如果您单击文件>信息(我使用的是 excel 2010),您会在右侧看到我可以看到的属性列表(即作者、标题等)查看/修改脚本状态。看到该属性不存在,我将上面的行设置为 ActiveWorkbook.BuiltInProperties。再一次,没有运气。但是我随后使用了 ActiveWorkbook.ContentTypeProperties 和 TA-DA,它可以工作。 Quirky Sharepoint 不能将其设置为自定义文档道具,而应设置为内容类型(因为它是 SP,所以有意义)
    • 再次感谢您的所有工作!这是我的第一篇文章,很抱歉只要求自己解决。再次感谢您激发我的大脑思考“财产不存在”!
    • 没问题。如果对您有帮助,请考虑对我的回答进行投票。由于您自己找到了解决方案,因此您可以提交自己的答案并将其标记为已接受的答案,这样其他有类似问题的人就可以从您找到的解决方案中受益。干杯。
    【解决方案3】:

    我不知道这是否会帮助任何人,但我正在努力将 .xlsm 文件保存到已设置自定义属性的 Sharepoint 站点。 我找不到解决方案,但我设法使用它来解决它。

    Private Sub SaveToSharePoint()
    'set the save location of the document and name
    Dim FolderPath As String: FolderPath = "//sharepoint.com/sites/Shared Documents/"
    Dim Type As String: Type = "Doc"
    Dim CurrentYear As String: CurrentYear = CStr(Year(Date))
    Dim FileName As String: FileName = Type & "_" & CurrentYear & ".xlsm"
    Dim FullFilePath As String: FullFilePath = FolderPath + FileName
    
    'Creates the initial file and saves it as .xlsm
    On Error Resume Next
    ThisWorkbook.SaveAs FullFilePath, FileFormat:=52
    
    'Sets the custom properties
    ThisWorkbook.ContentTypeProperties("Type").Value = Type
    ThisWorkbook.ContentTypeProperties("Year").Value = CurrentYear
    
    'Updates the file
    On Error Resume Next
    ThisWorkbook.SaveAs FullFilePath, FileFormat:=52 End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-17
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多