MS Excel:使用主电子表格中的宏更新多个工作簿

时间:2014-07-02 11:07:28

标签: excel vba excel-vba sharepoint

我有30多个关于SharePoint的工作簿,除了文件名和文件夹之外,它们都是彼此的副本。我们使用这些来记录项目的进度,因为我们无法在我们的共享点上放置访问数据库(不要不问!)

我需要更新所有电子表格上的数据验证,并且基于历史记录可能会在将来再次在所有电子表格中进行其他更改。

我有一个宏会改变电子表格中的验证。 在“主”电子表格中,我可以创建其他电子表格的路径并将其打开。 但是,当我尝试使用从单个工作表复制的宏对每个电子表格运行代码(在主服务器中)时,我收到错误:

runtime error 9 subscript out of range 

就行了

Set myDestinationWorkSheet = Workbooks(myFile).Sheets("Data")

我已经检查过,“数据”表肯定存在。为了以防万一,我甚至从工作表中复制并粘贴了工作表名称。我确信文件名在打开文件之前是正确的。我已尝试直接使用http://在构造的文件名中引用sharepoint文件,并通过映射驱动器(如果它是“路径太长”类型错误)。 这是代码(主要是来自其他Stackoverflow答案的东西的组合!)

Sub Macro1()
'
' Macro1 Macro
'

Dim namedRange As Range
Set namedRange = Range("Schools")

Dim i As Long
Dim rng As Range
Dim mySchool As String
Dim myFile As String
Dim myDestinationWorkSheet As Worksheet

' step through list of schools
For i = 5 To Range("D" & Rows.Count).End(xlUp).Row
    ' build file name
    mySchool = Range("D" & i).Value
    Set rng = Range("e" & i)
    'record filename in ppm master for bug tracking
    myFile = Range("b5").Value & mySchool & Range("b6").Value & Range("b7").Value & mySchool & Range("b8").Value
    'get filename
    rng.Value = myFile

    ' open file
    Workbooks.Open (myFile)

    Set myDestinationWorkSheet = Workbooks(myFile).Sheets("Data")
    myDestinationWorkSheet.Range("C2:J200").Select


    ' do stuff to file
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateDate, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=$L$13", Formula2:="=$L$15"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = "Date out of range"
        .InputMessage = ""
        .ErrorMessage = _
        "Please enter a date in between the values shown in Cell L13 and cell L15"
        .ShowInput = True
        .ShowError = True
    End With
    'mark as done
    myDestinationWorkSheet.Range("L30").Value = "date validation updated 2/7/2014 CJ)"


    'save and close file
    Workbooks(myFile).Save
    Workbooks(myFile).Close

'move to next in the list
Next i

'
    Range("D5:D27").Select
End Sub

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:0)

我认为问题可能来自您的MyDestinationWorksheet变量。它设置为Worksheet,工作表不需要具有工作簿名称。

我尝试将Set myDestinationWorkSheet = Workbooks(myFile).Sheets("Data")替换为Set myDestinationWorkSheet = ActiveWorkbook.Sheets("Data"),因为您已经打开了要将myDestinationWorksheet变量设置为的工作簿。

答案 1 :(得分:0)

虽然您的工作表不需要工作簿名称,但最好指定您打算使用的工作簿。问题是您的myFile是适用于Workbooks的文件路径和工作簿名称。打开(myFile),因为那些是.Open方法所必需的,但Workbooks(myFile)应该只有工作簿名称。您需要修剪文件路径。