excel 如何编写宏来创建工作簿的“可发布”版本(已删除公式)并将其保存到指定的SharePoint位置?

ss2ws0br  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(101)

无法编写宏来自动创建excel工作簿的“可发布”版本(以便其他人可以访问但不能覆盖任何公式或查看查阅工作表)。
我需要创建6个工作簿每月可出版的版本。
所有工作簿都保存在Sharepoint Library中,使用相同的命名约定(“2023 Training Matrix NOps”、“2023 Training Matrxi SOps”等)
可发布的版本需要保存在Sharepoint库的子文件夹中。
下面的代码是我能找到的最适合我的需求的代码:

实际结果

  • 创建仅包含值和格式的工作簿副本。
  • 将文件保存到与原始文件相同的位置。
  • 从原始工作簿中删除公式。
  • 要跑很长时间。

预期结果

1.将原始工作簿(称为“2023 Training Matrix NOps”)的副本保存到原始SharePoint文件夹的子文件夹中
1.将副本命名为“2023 Training Matrix NOps -保存Date”(例如,“2023 Training Matrix NOps - 20_06_2023”)
1.工作簿的副本应为:

  • macro free(file type xlsx);
  • 将所有公式转换为值;
  • 保留所有格式;
  • 删除全部为黄色的查找工作表(工作表名称为“ADMIN”、SF_Item_Extract_SF_Item_Status_EC_Report)。
    务必将原始工作簿保存在原始位置,所有公式和工作表均保持完整。
Sub mcrSet_All_Values_and_Save_XLSX()

    Dim w As Long
    For w = 1 To Sheets.Count
        Sheets(w).UsedRange = Sheets(w).UsedRange.Value
    Next w

    Application.DisplayAlerts = False

    ThisWorkbook.SaveAs _
      ThisWorkbook.Path & Chr(92) & _
      Left(ThisWorkbook.Name, InStr(1, ThisWorkbook.Name, Chr(46)) - 1) & Format(Date, "dd-mm-yyyy"), _
      xlOpenXMLWorkbook

End Sub
iswrvxsc

iswrvxsc1#

我预计转换/重写所有单元格内容比循环遍历. UsedRange中包含公式的单元格需要更多的时间。我还没有做过任何性能测试,但希望这会更快

Sub test()
    Dim sht As Worksheet, r As Integer, c As Integer
    For Each sht In Worksheets
        With sht.UsedRange
            For r = 1 To .Rows.Count
                For c = 1 To .Columns.Count
                    If WorksheetFunction.IsFormula(.Cells(r, c)) Then
                       .Cells(r, c).Value = .Cells(r, c).Value
                    End If
                Next
            Next
        End With
    Next
End Sub

要删除黄色标记的选项卡,请在循环的开头添加以下内容:

Dim bDisplayAlertsBefore As Boolean
    For Each sht In Worksheets
        If sht.Tab.Color = vbYellow Then
           bDisplayAlertsBefore = Application.DisplayAlerts
           Application.DisplayAlerts = False
           sht.Delete
           Application.DisplayAlerts = bDisplayAlertsBefore
        Else
           With ...

由于在同一循环中修改单元格和删除引用数据,因此可能需要在执行过程中关闭计算。把这个放在开头:

Dim iCalculationBefore As Integer
    iCalculationBefore = Application.Calculation
    Application.Calculation = xlCalculationManual

最后:

Application.Calculation = iCalculationBefore

相关问题