2016-06-07 124 views
1

我正在修改旧工作表中的代码以更新它并使其更高效。使用范围(单元格,单元格)的VBA中的范围错误设置范围

我有一个格式数据表的子程序,但我得到一个错误,我不明白为什么我得到一个。我的VBA是有点生疏,但下面的代码应该是工作

Sub FormatPnLDataTable(tableRange As Range) 
    Dim tempRange As Range, ws As Worksheet 
    Dim lStartRow As Long, lEndRow As Long, lLastCol As Long 

    Set ws = Sheets("PandLDataTable") 
    Application.CutCopyMode = False 
    lStartRow = tableRange.Row 
    lEndRow = lStartRow + tableRange.Rows.Count 
    lLastCol = tableRange.Columns.Count 

    'format the whole table with border 
    With tableRange 
     'format borders 
     'code removed for brevity 
    End With 
    'set range for the top row of table 
    Set tempRange = ws.Range(Cells(lStartRow, 1), Cells(lStartRow, lLastCol)) 

的代码犯错在这条线

Set tempRange = ws.Range(Cells(lStartRow, 1), Cells(lStartRow, lLastCol)) 

但工作表(WS)是有效的,并且变量都有其合适的对于这个特定的实例值 ,lStartRow是1,lEndRow是15和lLastCol是35

+3

尝试完全限定'.Cells'属性,看看是否有帮助。它看起来像:'Set tempRange = ws.Range(ws.Cells(lStartRow,1),ws.Cells(lStartRow,lLastCol))' – user3561813

+0

如果活动工作表与ws不同,它将会出错 –

+0

另请参见: [是个 。在.Cells中定义时需要.Range?](http://stackoverflow.com/questions/36368220/is-the-in-range-necessary-when-defined-by-cells)。 – Jeeped

回答

2
Set tempRange = ws.Range(Cells(lStartRow, 1), Cells(lStartRow, lLastCol)) 

这里虽然你已经使用ws资格Range调用,它确实不是自动适用于Cells调用 - 在常规模块中,这些默认情况下会引用ActiveSheet。

这将更加强劲:

Set tempRange = ws.Range(ws.Cells(lStartRow, 1), ws.Cells(lStartRow, lLastCol)) 

参见:What is the default scope of worksheets and cells and range?

+0

是的,我通常将一张表的所有代码包装在一个With语句中,并使用.Cells,在这里也应该使用这种格式。 – dinotom