5

我正在将 Excel 2007 与包含许多工作表的工作簿一起使用。我需要知道上次保存工作表的日期 - 在页脚中。我能够找到以下内容:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets
With ws.PageSetup
.LeftFooter = "Last Save Time: &T"
.RightFooter = "Last Save Date: &D"
End With
Next ws

Set ws = Nothing

End Sub

这会更改每个工作表。我只需要更改已编辑的工作表(因此每个工作表可以有不同的日期)。这甚至可能吗?我应该使用单元格而不是页脚吗?还是我必须创建多个工作簿?

谢谢!

4

3 回答 3

2

正如 Remnant 建议的那样,最好的方法是利用该Worksheet_Change事件。这意味着,您需要此 VBA 代码

Private Sub Worksheet_Change(ByVal Target As Range)
    With Me.PageSetup
        .LeftFooter = "Last Change Time: " & Format(VBA.Time, "hh:mm:ss")
        .RightFooter = "Last Change Date: " & Format(VBA.Date, "dd/mm/yy")
    End With
End Sub

在您的每个工作表中。此事件仅在您更改单元格内容时引发,而不是在您更改选择时引发,因此它可能是您想要的。

Remnant 还写道,如果您有很多工作表,这将是“设置的痛苦”。我认为这取决于你所说的“许多”。对于多达 20~40 个工作表,可以在几分钟内轻松地将上面的代码手动复制到每个工作表。

如果您已经有一本工作簿和很多(例如,超过 40 张)工作表,那么以编程方式添加代码可能是个好主意。将包含此代码的单独模块添加到您的工作簿,然后运行一次:

Option Explicit
Sub InsertCode()
    Dim VBProj As Object
    Dim VBComp As Object
    Dim CodeMod As Object
    Dim sh As Worksheet
    Dim LineNum As Long

    Set VBProj = ActiveWorkbook.VBProject
    For Each sh In ThisWorkbook.Sheets
        Set VBComp = VBProj.vbcomponents(sh.Name)
        Set CodeMod = VBComp.CodeModule
        With CodeMod
            .DeleteLines 1, .CountOfLines
            LineNum = .CreateEventProc("Change", "Worksheet")
            LineNum = LineNum + 1
            .InsertLines LineNum, "Me.Pagesetup.LeftFooter = ""Last Change Time: "" & Format(VBA.Time, ""hh:mm:ss"")"
            .InsertLines LineNum + 1, "Me.Pagesetup.RightFooter = ""Last Change Date: "" & Format(VBA.Date, ""dd/mm/yy"")"
        End With
    Next
End Sub

这会将上面的“Worksheet_Change”事件添加到每个工作表的代码部分。

于 2011-05-06T22:14:56.160 回答
1

一种选择可能是每次更改工作表时更新页脚。这意味着各个工作表将具有不同的日期/时间,具体取决于它们的更新时间。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    With Sh.PageSetup
        .LeftFooter = "Last Save Time: " & Format(VBA.Time, "hh:mm:ss")
        .RightFooter = "Last Save Date: " & Format(VBA.Date, "dd/mm/yy")
    End With
End Sub

然后,用户可以正常保存工作簿。

这能满足你的需要吗?

于 2011-05-06T17:02:29.527 回答
1

它修改每个工作表的原因是因为您正在执行“对于 ThisWorkbook.Worksheets 中的每个 WS”。将其更改为仅找到您要修改的工作表,您就可以开始了。

例如,如果您没有要修改的工作表的引用,请保留 For Each 循环,但不要修改每个循环,而是检查工作表以查看它是否是您想要的。如果是,请修改页脚。否则,忽略它。

于 2011-05-06T16:14:31.377 回答