2015-01-22 3 views
2

У меня проблема при использовании переменной , содержащей диапазон.Использование переменной диапазона в нескольких листах

Я объявил переменную «ГСЧ» глобально в модуле рабочей книги:

Public rng As Range 

Теперь в модуле рабочего листа я установить переменную после нажатия на флажок и определить диапазон для него:

Sub CheckBox1_Click() 
    Set rng = Range("D8:Q51") 

    If Me.OLEObjects("checkbox1").Object.Value Then 
     Call clear(rng) 
    Else 
     Call aus(rng) 
    End If 
End Sub 

Я всегда получаю сообщение об ошибке при вызове подлодку «AUS (RNG)», который говорит:

ошибка 438, объект не поддерживает тыс это свойство или метод

«AUS (RNG)» содержит следующий код:

Worksheets(5).rng.Copy Worksheets("aktuell").rng 

Btw: с использованием диапазона переменной в том же листе модуль соединен с не выбрасывать ошибка. Таким образом, ошибка как-то должна коррелировать с «Worksheets (5)».

+0

Определить 'rng' в обычном модуле, а не рабочей книги или рабочего листа модуля. – Gareth

+0

@Gareth Когда определяется 'rng', не захватывает ли он книгу и лист по умолчанию? Итак, в основном это похоже на запись 'Set rng = ActiveWorkbook.ActiveSheet.Range (« D8: Q51 »)' ... – Chrismas007

+0

@ Chrismas007 - Даже если бы не было путаницы в родительском wb/ws 'rng',' Call aus (rng) 'пытается переопределить его как принадлежащий к' Worksheets (5) '. Кажется, он используется ближе к 'rng.Address', чем' rng'. Также нет необходимости даже передавать его в качестве параметра, если он объявлен глобально. – Jeeped

ответ

3

Когда вы определяете диапазон с Set и вы не определяете родительские объекты рабочей книги или рабочего листа, по умолчанию он будет равен ActiveWorkBook и ActiveWorkSheet. Поэтому, как письма:

Set rng = ActiveWorkbook.ActiveSheet.Range("D8:Q51") 

При использовании rng позже в коде, вы пытаетесь присвоить его под Sheet который в основном пишу:

Worksheets(5).ActiveWorkbook.ActiveSheet.Range("D8:Q51").Copy 

Что мы знаем неправильный синтаксис и будет ошибка.

В качестве обходного пути, вы можете использовать следующий код:

Worksheets(5).Range(rng.Address).Copy Worksheets("aktuell").Range(rng.Address) 
+0

Удивительный! Спасибо :) – bananabombo

+0

@bananabombo Если он работает, ответьте с помощью зеленой галочки. – Chrismas007