错误1004使用Range.Columns – 使用与Range.Rows相同的语法
我遇到了一些VBA子程序的问题(Excel 2010)。
代码旨在调整给定原始块的范围对象的公式块的大小,以及新的行数和列数。 它通过删除多余的行/列和填充或如果需要更多行/列的权利。
我遇到的问题是,尽pipe使用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
我使用下面的“testing”代码调用子程序:
Call ResizeBlock(Range("C5:I11"), 10, 10)
select案例的顺序并不重要,即在行部分上方的列部分仍然存在错误。
编辑:解决
那么把这个问题写出来可能会让事情变得更加清晰,而我似乎已经解决了这个问题。
通过更改列select案例解决scheme:
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)
没有。
您将需要使用列的A1引用。
例如, range.Rows("1:3")
将返回范围的前三行,则需要使用range.Columns("A:C")
返回前三列。
就个人而言,我会做不同的,例如通过使用Range.Offset
和Range.Resize
。