我在VBA(Excel 2010)中遇到了一些子程序问题。
该代码旨在调整给定原始块的范围对象以及新的行数和列数的公式块。它通过删除多余的行/列并填充或右侧(如果需要更多行/列)来实现此目的。
我遇到的问题是,使用Range.Rows(...)时,行的代码运行得很好。清除,我得到一个错误1004 - 使用几乎相同的应用程序定义或对象定义的错误用于执行Range.Columns(...)的代码。清除。
下面的子程序:
Sub ResizeBlock(BlockRange As Range, Optional nRows As Variant, Optional nColumns As Variant)
If IsMissing(nRows) And IsMissing(nColumns) Then Exit Sub
Dim TopLeftCell, BottomRightCell As Range
Set TopLeftCell = BlockRange.Cells(1, 1)
Set BottomRightCell = BlockRange.Cells(BlockRange.Rows.Count, BlockRange.Columns.Count)
If Not IsMissing(nRows) Then Set BottomRightCell = BottomRightCell.Offset(nRows - BlockRange.Rows.Count, 0)
If Not IsMissing(nColumns) Then Set BottomRightCell = BottomRightCell.Offset(0, nColumns - BlockRange.Columns.Count)
Dim NewBlockRange As Range
Set NewBlockRange = Range(TopLeftCell, BottomRightCell)
Select Case BlockRange.Rows.Count - NewBlockRange.Rows.Count
Case Is > 0
BlockRange.Rows(NewBlockRange.Rows.Count + 1 & ":" & BlockRange.Rows.Count).Clear
Case Is < 0
NewBlockRange.Rows(BlockRange.Rows.Count & ":" & NewBlockRange.Rows.Count).FillDown
End Select
Select Case BlockRange.Columns.Count - NewBlockRange.Columns.Count
Case Is > 0
BlockRange.Columns(NewBlockRange.Columns.Count + 1 & ":" & BlockRange.Columns.Count).Clear
Case Is < 0
NewBlockRange.Columns(BlockRange.Columns.Count & ":" & NewBlockRange.Columns.Count).FillRight
End Select
End Sub
我使用以下'test'代码调用子程序:
Call ResizeBlock(Range("C5:I11"), 10, 10)
选择案例的顺序无关紧要,即当它位于行部分之上时,我仍然会在列部分中出现错误。
编辑:已解决
好吧,也许写出问题让我脑子里的东西更加清晰,我似乎已经解决了这个问题。
通过更改列选择案例的解决方案:
Select Case BlockRange.Columns.Count - NewBlockRange.Columns.Count
Case Is > 0
Range(BlockRange.Columns(NewBlockRange.Columns.Count + 1), BlockRange.Columns(BlockRange.Columns.Count)).Clear
Case Is < 0
Range(NewBlockRange.Columns(BlockRange.Columns.Count), NewBlockRange.Columns(NewBlockRange.Columns.Count)).FillRight
End Select
我不知道为什么Range.Rows(x:y)
有效但Range.Columns(x:y)
没有。
答案 0 :(得分:1)
您需要对列使用A1引用。
例如,虽然range.Rows("1:3")
将返回范围的前三行,但您需要range.Columns("A:C")
才能返回前三列。
就我个人而言,我的举动方式不同,例如使用Range.Offset
和Range.Resize
。