2013-05-01 17 views
2

我有一些问题,在VBA子程序(Excel 2010中)。错误1004使用Range.Columns - 使用相同的语法Range.Rows

代码旨在调整给定的原始块的范围对象式的块,并且行和列的新的号码。它通过删除多余的行/列并填充或如果需要更多行/列来实现这一点。

我遇到的问题是,而行的代码运行就好用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 

我使用下面的“测试”代码调用子程序:

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)没有。

+4

如果已经解决,而不是编辑的标题是“解决”了,请把你的答案,并接受它。 – LittleBobbyTables 2013-05-01 13:51:30

+1

“*我不知道为什么Range.Rows(x:y)是由Range.Columns(x:y)工作的。*”因为这不是你正在做的。你实际上是这样做的:'Range.Rows(“5:10”)'这是有效的,但'Range.Columns(“5:10”)'不是,因为列地址字符串必须使用字母,而不是行使用的数字。如果您不使用地址*字符串*,则行和列的工作方式相同。 – RBarryYoung 2013-05-01 14:11:04

+0

如果您有以下未提供的工作解决方案,则应提取该信息并将其添加为以下问题的答案,然后将其作为正确答案接受。 – Gaffi 2013-05-01 15:32:23

回答

1

您需要为列使用A1引用。

例如,虽然range.Rows("1:3")将返回范围的前三行,但您需要range.Columns("A:C")才能返回前三列。

个人而言,我会用Range.OffsetRange.Resize做到这一点不同,例如。