1

我是 VBA 新手,正在尝试编写一个宏,该宏将包含多张数据的工作簿并将其格式化以进行打印。每张表都有信息表(如经营/损益表)。我希望此代码能够适用于任何人创建但具有相同基本信息的工作簿。这意味着我需要在每张纸上找到数据的开始和结束,因为它并不总是在同一个地方(有人可能从“A1”开始,而其他人可能从“B4”开始,等等)。

我在许多网站上寻找不同的方法来定位使用的第一行和使用的最后一列。到目前为止,我有时会正确定位起始行、结束行、起始列和结束列,而有时则不能。

Sub FormatWorkbook()
Dim ws As Worksheet
Dim rowStart As Long
Dim columnStart As Long
Dim rowEnd As Long
Dim columnEnd As Long
Dim printStart As String
Dim printEnd As String

Application.ScreenUpdating = False

'Turn off print communication
Application.PrintCommunication = False
'Loop through sheets
For Each ws In Worksheets
    'Make current sheet activesheet
    ws.Select
    'Set rowStart, columnStart, rowEnd, and columnEnd to the used range
    With ActiveSheet
        rowStart = .Cells.Find(what:="*", after:=.Range("A1"), LookAt:=xlPart, LookIn:=xlFormulas, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase:=False).Row
        columnStart = .Cells.Find(what:="*", after:=.Range("A1"), LookAt:=xlPart, LookIn:=xlFormulas, searchorder:=xlByColumns, searchdirection:=xlNext, MatchCase:=False).Column
        rowEnd = .Cells.Find(what:="*", after:=.Range("A1"), LookAt:=xlPart, LookIn:=xlFormulas, searchorder:=xlByRows, searchdirection:=xlPrevious, MatchCase:=False).Row
        columnEnd = .Cells.Find(what:="*", after:=.Range("A1"), LookAt:=xlPart, LookIn:=xlValues, searchorder:=xlByColumns, searchdirection:=xlPrevious, MatchCase:=False).Column
    End With

这只是程序的一部分,但我最困惑的一个。如果有人可以提供帮助,我将不胜感激。此外,如果有更好的方法来完成这项任务,我会全力以赴。我的其余代码在下面供参考。

'Insert or Delete Space above the first used row
    If rowStart < 4 Then
        Do While rowStart < 4
            Range("1:1").Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            ws.Select
            With ActiveSheet
                rowStart = .Cells.Find(what:="*", after:=.Range("A1"), LookIn:=xlValues, searchorder:=xlByRows, searchdirection:=xlNext).Row
            End With
        Loop
    ElseIf rowStart > 4 Then
        Do While rowStart > 4
            Range("1:1").Select
            Selection.Delete Shift:=xlUp
            ws.Select
            With ActiveSheet
                rowStart = .Cells.Find(what:="*", after:=.Range("A1"), LookIn:=xlValues, searchorder:=xlByRows, searchdirection:=xlNext).Row
            End With
        Loop
    End If

    'I think I need to adjust the columnStart, rowEnd, and columnEnd values after inserting and deleting rows
    ws.Select
    printStart = ActiveSheet.Cells(1, columnStart).Address
    printEnd = ActiveSheet.Cells(rowEnd, columnEnd).Address

    'Format headers, footers, and set the print area
    ActiveSheet.PageSetup.CenterHeaderPicture.Filename = _
        "\\antilles\MyDocs\xxxx\My Documents\My Pictures\xxxx.png"
    With ActiveSheet.PageSetup
        .CenterHeader = "&G"
        .LeftFooter = "&""Palatino Linotype,Regular""&F"
        .CenterFooter = "&""Palatino Linotype,Regular""Prepared By: xxxx"
        .RightFooter = "&""Palatino Linotype,Regular""&D"
        .PrintArea = printStart & ":" & printEnd
    End With

Next ws
Application.PrintCommunication = True

结束子

4

2 回答 2

1

我已经做了很多,我推荐简单粗暴的方法。没有编码整个事情,而是暗示......

dim iRow as integer
For iRow = 1 to ...
    cells(iRow,65000).end(xlup).select
    if activecell.row = 1 then
         activecell.entirecolumn.delete
         exit For
    endif
next iRow

尽可能在床单上施加一些结构。然后去看看 http://www.ozgrid.com/VBA/ExcelRanges.htm 谷歌搜索时,包括

ozgrid|Pearson|Tushar|“Excel 先生”|Erlandsen|Peltier|dailydoseofexcel

在搜索字符串中。

于 2013-09-09T01:41:09.227 回答
0

Excel VBA 提供了一系列用于查找第一个或最后一个使用的行或列的技术,但在任何情况下都不起作用。

您的代码存在一些问题:

  • 如果工作表包含某些内容,则 Find 返回一个范围。范围有一行,因此您的语句将起作用。但如果工作表为空,则 Find 返回 Nothing。在访问or之前,您必须使用Set Rng = .Cells.Find ...then test Rngto not be Nothing 。如果不清楚,请参阅下面我引用的代码。Rng.RowRng.Column

  • 注意后面After:=.Range("A1")。Find 不会检查.Range("A1"),直到它搜索了所有其他单元格并返回到开头。在起点为.Range("A1")搜索方向的任何示例中,搜索方向将为 xlPrevious,因此它会立即换行并从右下角的单元格开始搜索。After:=.Cells(Rows.Count, Columns.Count)当搜索方向为 xlNext 时 尝试。

之前有一个问题和你的类似。我发布了一些代码,其中展示了一些用于查找最后一行或最后一列的技术以及它们失败的情况。我建议您访问该答案并尝试代码:https ://stackoverflow.com/a/18220846/973283 。

祝你好运,快乐的 VBA 编程。

于 2013-09-08T22:46:01.623 回答