Excel VBA设置自定义文档属性

Excel VBA设置自定义文档属性,excel,vba,Excel,Vba,我有一些问题,我相信这是一个快速修复。我有一个excel文档,其自定义文档属性字段为“脚本状态”。“脚本状态”属性来自文档库中下载文档的列。我的目标是让用户下载表单,完成分配的任务,然后运行“BeforeSave”宏,该宏将扫描工作并根据宏的结果更新脚本状态属性(即,如果缺少字段,脚本将显示“Not Completed”等)。在SharePoint中,这是一个选项下拉框,包含以下选项:未分配、已分配、未完成、已完成/通过、失败、重新测试和延迟。我有检查工作集的逻辑,工作正常,只是不知道如何更新属

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

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

一旦它运行,我会在“无效的过程调用或参数”的行中得到一个错误。我曾试图研究这句话的正确语法,但都没有用。任何帮助都将不胜感激

来自Sharepoint的文件可能有一些怪癖,诚然,这不是我所熟悉的,但从阅读其他文章中,我知道这些文件有一些困难。在这里,情况可能是这样,也可能不是这样

在任何情况下,我们都可以尝试诊断,也许我们会解决问题

正如我在评论中提到的,如果我的工作簿中不存在命名的
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(“脚本状态”)
,它将返回
True
False
的值,具体取决于是否找到命名属性

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

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

与excel文档关联的Sharepoint属性似乎既不是CustomDocumentProperty,也不是内置DocumentProperty。在对代码稍加涉猎之后,Sharepoint字段是“ContentTypeProperty”。使用原始问题中发布的相同代码,使用ContentTypeProperty而不是自定义属性,代码工作成功


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

我不知道这是否对任何人都有帮助,但我正在将一个.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

如果我的工作簿不包含命名的
CustomDocumentProperties.Item
,我可以复制该特定错误消息。验证您的代码是否确保此属性存在,和/或您的代码不会在其他地方无意中删除它,等等。使用代码,如何确保特定属性存在?手动,如果我单击文件,我可以在屏幕右侧看到属性,并且“脚本状态”与所有选项一起列出。。。是否从包含此属性的工作簿运行该过程?或者该宏是从其他工作簿运行的?该过程位于具有属性的工作簿中。具体来说,它位于工作簿\u BeforeSave声明中。此宏永远不会与外部工作簿关联。感谢David帮助我完成此操作!我尝试了这个函数,结果是“不存在”。不过,我可以再次手动进入文件>属性(在右侧)并手动更改该属性。然后,一旦更改,我可以单击“保存”,并将其保存到我们的Sharepoint网站,您可以立即在网站上看到更改的状态。我们只是在寻找一种自动化这个过程的方法。似乎该地产就在那里,但除了建筑和定制地产之外,它还是在自己的独立区域?也许它根本不是一个“属性”或者其他什么?你能在你的原始问题中添加一个屏幕截图(上传一张图片到imgur.com),显示你在查看文件>属性时所描述的内容吗?也许这会给我更多的信息。也许不会。但至少值得一试。也有一些混乱,我想我有一个解决办法(敲敲木头)。我知道我还没有上传屏幕截图,但现在,如果你点击文件>信息(我使用的是excel 2010),你会在右边看到一个属性列表(即作者、标题等),我可以在那里查看/修改脚本状态。看到该属性不存在,我将上面的行设置为ActiveWorkbook.BuiltInProperties。再一次,没有运气。但我随后使用了ActiveWorkbook.ContentTypeProperties和TA-DA,它可以工作。古怪的Sharepoint不能将其设置为自定义文档道具,而是一种内容类型(因为它是SP),再次感谢您的所有工作!这是我的第一篇帖子,很抱歉我只是为了自己解决这个问题。再次感谢你激发我的大脑思考“财产不存在”!没问题。如果它对你有帮助,请考虑投票我的答案。由于您是自己找到解决方案的,因此您可以提交自己的答案,并将其标记为已接受的答案,这样其他有类似问题的人可以从您找到的解决方案中受益。干杯