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 を次のように変更することによる解決策:

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")は範囲の最初の 3 行を返しますが、最初の 3 列を返す必要がありrange.Columns("A:C")ます。

個人的には、たとえば and を使用して、これを別の方法でRange.Offset行いRange.Resizeます。

于 2013-05-01T14:02:00.163 に答える