2013-05-01 27 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做到這一點不同,例如。