2015-09-10 34 views
0

我在片「A」編寫的宏選擇範圍,不能在Excel VBA

在表的變化,我想從片「C」複製一個範圍,在片粘貼「 D「

這個流程很好,我可以實現它。問題是當我試圖選擇表B中的範圍。

rownum= 83 (I get it dynamically) 

colnum = 31 (Number of columns in rownum) 

現在我想複製第83行到第31列。

問題開始:

Sheets("B").Range("A83:AO83").Select ~ works like Charm 

正如上面是不是動態的,我想用

Sheets("B").Range(Cells(rownum,1),Cells(rownum,colnum)).Select ~ Object Defined Error 

任何想法!我被卡住了2小時..它沒有發生。

這是代碼的一部分,爲了減少混淆,我沒有發佈所有代碼,代碼停在最後一行!對象定義錯誤。

Dim rownum As Integer 
    Dim colnum As Integer 

rownum = Application.Match(searchFE, Sheets("Attendance").Range("D:D"), 0) 
colnum = Cells(rownum, Columns.Count).End(xlToLeft).Column 
Sheets("Attendance").Range(Cells(rownum, 1), Cells(rownum, colnum)).Select 

rownum和colnum都獲得價值。

+0

但是你不需要選擇它。您可以直接在該範圍內執行操作。你可能想看到[這是](http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) –

+0

你的代碼在我的電腦上工作正常..它在colnum或rownum沒有被首先定義時返回錯誤。 – Balinti

+0

它被定義,讓我看看,如果我可以在這裏粘貼更多的代碼 –

回答

2

讓我們來看看

Sheets("Attendance").Range(Cells(rownum, 1), Cells(rownum, colnum)).Select

Cells(rownum, 1)不是完全限定。不清楚從哪個Sheet應該採取Cells。假設ActiveSheet.Cells(rownum, 1)。這就是爲什麼如果Sheets("Attendance")不是活動工作表,上述命令將失敗。

... 
With Sheets("Attendance") 
.Range(.Cells(rownum, 1), .Cells(rownum, colnum)).Select 
End With 
... 
1

在我看來,這只是一個.address的問題。 當你選擇你的範圍,你需要給的地址作爲輸入,所以基本上你唯一的錯誤就是寫:

Sheets("B").Range(Cells(rownum,1),Cells(rownum,colnum)).Select 

相反的:

Sheets("B").Range(Cells(rownum,1).Address(0,0),Cells(rownum,colnum).Address(0,0)).Select 

我喜歡寫.address(0,0)因爲它提醒我,這是絕對地址(ROW和COL開始= 0)

我也不能確定:

Sheets("Attendance").Range(Cells(rownum, 1), Cells(rownum, colnum)).Select 

通常我會寫:

Worksheets("Attendance").Range(Cells(rownum, 1).address(0,0), Cells(rownum, colnum).address(0,0)).Select 

而且要小心指一個特定的Workbook如果您正在使用一個以上的工作!

1

如果你想獲得到最後一排,然後如果你真的想要做的,如將其複製到不同的位置範圍內的東西,然後用這個代碼中使用此代碼

Sub GetThere() 

    Dim sh As Worksheet 
    Dim r As Long 
    Dim c As Long 
    Dim rng As Range 

    Set sh = Sheets("Attendance") 

    With sh 
     r = .Cells(.Rows.Count, "D").End(xlUp).Row 
     c = .Cells(r, .Columns.Count).End(xlToLeft).Column 
     Set rng = .Range(.Cells(r, 1), .Cells(r, c)) 
    End With 

    Application.Goto Reference:=rng 

End Sub 

Sub GetThere2() 

    Dim sh As Worksheet 
    Dim r As Long 
    Dim c As Long 
    Dim rng As Range 

    Set sh = Sheets("Attendance") 

    With sh 
     r = .Cells(.Rows.Count, "D").End(xlUp).Row 
     c = .Cells(r, .Columns.Count).End(xlToLeft).Column 
     Set rng = .Range(.Cells(r, 1), .Cells(r, c)) 
    End With 

    rng.Copy Sheets("Sheet2").Range("A1") 

End Sub 

如果您確實想選擇範圍,那麼您必須確保也選擇了工作表。

Sub GetThere3() 

    Dim sh As Worksheet 
    Dim r As Long 
    Dim c As Long 
    Dim rng As Range 

    Set sh = Sheets("Attendance") 

    With sh 
     r = .Cells(.Rows.Count, "D").End(xlUp).Row 
     c = .Cells(r, .Columns.Count).End(xlToLeft).Column 
     Set rng = .Range(.Cells(r, 1), .Cells(r, c)) 
     .Select 
    End With 

    rng.Select 

End Sub