Excel工作表页脚中的最后保存日期

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

这会更改每个工作表。我需要它仅更改已编辑过的工作表(以便每个工作表可以有不同的日期)。这是否可能?我应该使用单元格而不是页脚吗?还是我必须创建多个工作簿?
谢谢!
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”事件添加到每个工作表的代码部分中。

喜欢!我必须说,我很少使用VBA代码编写VBA代码,但在这种情况下,似乎是一个明智的选择。感谢您发布您的想法。 - Alex P
谢谢@Remnant和Doc Brown!我现在已经在一个表格上实现了这个代码,它完美地工作了。很抱歉没有回答你们的问题,我不知道如何登录。我的Cookie被删除了,因为我不知道它们被网站用来登录。感谢快速的回答 :) - deexcelerator

1

它修改每个工作表的原因是因为你正在执行“对于此工作簿中的每个工作表WS”。将其更改为仅查找要修改的工作表,然后您就可以开始了。

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


抱歉,但我认为您没有理解问题的要点。 - Doc Brown

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

用户可以像平常一样保存工作簿。
这个满足您的需求吗?

这个或许可以工作,但是问题在于Excel会将当前选择的改变视为工作表更改。 - Doc Brown
@Doc Brown - 同意。我能想到的唯一另一个解决方案是在每个工作表上使用 Worksheet_Change 事件。OP说他有“许多表格”,所以设置起来可能很麻烦,但也许是最健壮的解决方案。您对这种情况下最佳方法有何看法? - Alex P
经过一段时间的思考,我想出了一个利用你的建议解决问题的方案(请参见我的回答)。 - Doc Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接