5

シート数の多いブックでExcel2007を使用しています。ワークシートが最後に保存された日付をフッターに含める必要があります。私は以下を見つけることができました:

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

レムナントが示唆したように、最善のアプローチは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枚以上の)シートがある場合は、プログラムでコードを追加することをお勧めします。このコードを含む別のモジュールをブックに追加し、1回実行します。

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

すべてのワークシートを変更する理由は、「ThisWorkbook.Worksheetsの各WSに対して」を実行しているためです。これを変更して、変更するワークシートのみを検索すると、準備が整います。

たとえば、変更するワークシートへの参照がない場合は、For Eachループを維持しますが、各ループを変更する代わりに、シートをチェックして、目的のワークシートかどうかを確認します。そうである場合は、フッターを変更します。それ以外の場合は無視してください。

于 2011-05-06T16:14:31.377 に答える
1

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 に答える