VBA - 动态选择范围的问题

时间:2013-09-07 00:41:20

标签: excel vba excel-vba

我是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

End Sub

2 个答案:

答案 0 :(得分: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

在搜索字符串中。

答案 1 :(得分:0)

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

您的代码存在一些问题:

  • 如果工作表包含某些内容,则Find返回一个范围。范围有一行,因此您的语句将起作用。但是如果工作表为空,则Find返回Nothing。在访问Set Rng = .Cells.Find ...Rng之前,您必须先使用Rng.Row然后测试Rng.Column才能无效。如果不清楚,请参阅下面引用的代码。

  • 请注意After:=.Range("A1")中的 之后的。在查找每个其他单元格并回到开头之前,查找不会检查.Range("A1")。在起始点为.Range("A1")的任何示例中,搜索方向将是xlPrevious,因此它立即包装并从右下方单元格开始搜索。当搜索方向为xlNext时,请尝试After:=.Cells(Rows.Count, Columns.Count)

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

祝你好运并享受快乐的VBA节目。