我是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
答案 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节目。