2013-07-01 174 views
2

我遇到了一些麻烦,我确信它是一个快速修复。我有一个带有“脚本状态”的自定义文档属性字段的Excel文档。脚本状态属性来自文档库中从其下载文档的列。我的目标是让用户下载表单,完成他们指定的任务,然后有一个“BeforeSave”宏运行,它将扫描工作并基于宏的结果更新该脚本状态属性(即,如果字段丢失,脚本会说“未完成”等)。在SharePoint中,这是一个选项下拉框,其选项为:未分配,分配,未完成,已完成/通过,失败,重新测试,&延期。我有检查工作集的逻辑,工作正常,而不是如何更新属性字段。我有,到目前为止,仅仅是:VBA设置自定义文档属性

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

一旦它运行时,我得到一个错误的行指出“无效的过程调用或arguement”。我试图研究这条线的正确语法,但一直无济于事。任何帮助将不胜感激!

+1

如果我的工作簿不包含指定的CustomDocumentProperties.Item,我可以复制该特定的错误消息。验证您的代码确保此属性*存在*,并且/或者您的代码不会在其他地方无意中删除它等。 –

+0

使用代码时,如何确保特定属性存在?手动,如果我单击文件,我可以看到屏幕右侧的属性,并且“脚本状态”与所有选项一起列出。 – NMacioce

+0

在我们走下那条路线之前......程序是从包含这个属性的工作簿运行的吗?或者这个宏是从另一个工作簿运行的吗? –

回答

1

从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("Script Status"),它会返回一个值TrueFalse,具体取决于是否找到指定的属性。

你可以从一个子程序调用它,e.g:

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

感谢David帮助我完成这一切!我试过这个函数,返回值是“不存在”。再次,我可以手动进入文件>属性(在右侧)并手动更改该属性。然后一旦更改,我可以点击保存并将其保存到我们的Sharepoint网站,您可以立即在网站上看到更改的状态。我们只是在寻找一种方法来实现这一过程的自动化。 它几乎看起来好像该物业在那里,但在其内部的独立区域,除了内建和自定义属性?也许这根本不是一个“财产”,有些不同? – NMacioce

+0

您可以添加屏幕截图(将图像上传到imgur.com)到您的原始问题,显示您在查看文件>属性时描述的内容吗?也许这会给我更多的信息。或者也许不会。但至少值得一试。 –

+0

所以做了一些混乱,我想我有一个解决方案(敲木头)。我知道我还没有上传截图,但现在,如果您单击文件>信息(我正在使用Excel 2010),您会在右侧看到一个适当的列表(例如作者,标题等),我可以在其中看到查看/修改脚本状态。看到该属性不存在,我将上面的行设置为ActiveWorkbook.BuiltInProperties。再次,没有运气。但我然后使用ActiveWorkbook.ContentTypeProperties和TA-DA,它的工作原理。古怪的Sharepoint不能将其设置为自定义文档道具,而应该将其设置为内容类型(因为它是SP,因此很有意义) – NMacioce

1

看来,使用Excel文档相关联的共享点属性既不是CustomDocumentProperty也不是BuiltInDocumentProperty。在涉及更多代码时,Sharepoint字段为“ContentTypeProperty”。使用ContentTypeProperty而不是定制属性在原始问题中发布的相同代码,代码成功运行。

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

0

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