2016-06-07 9 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

См. Также : [Это . in. Изменить, если это определено .Cells?] (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

Смежные вопросы