2

我在 VBA(Excel 2010)中的子例程遇到了一些问题。

该代码旨在根据原始块的范围对象以及新的行数和列数调整公式块的大小。它通过删除多余的行/列并在需要更多行/列时向下填充或向右填充来做到这一点。

我遇到的问题是,虽然行的代码使用 Range.Rows(...).Clear 运行得很好,但我得到一个错误 1004 - 使用几乎相同的代码执行的应用程序定义或对象定义错误Range.Columns(...).Clear 。

下面的子程序:

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

1 回答 1

1

您需要对列使用 A1 引用。

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

就我个人而言,我会以不同的方式执行此操作,例如使用Range.Offsetand Range.Resize

于 2013-05-01T14:02:00.163 回答