2017-02-21 14 views
0

У меня есть большая серия диапазонов (> 500), которые я определил в своей книге, используя общие объявления: Public r1 As Range, Public r2 As Range и т. Д. Каждый диапазон всегда относится к одной и той же ячейке в документ. т.е. r1 всегда относится к Листу 1, B2.Как установить глобальный диапазон переменных, используемый в нескольких процедурах/модулях

Многие из моих событий принять меры на всех 500 диапазонов индивидуально, и я часто натыкаясь на 64k предел модуль памяти, потому что я должен объявить диапазон для каждой переменной в каждом модуле, который я делал с помощью: Set r1 = Sheets("Sheet 1").Range"B2"

Есть ли способ объявить диапазоны по всему миру, а затем вызвать их свободно во всех различных модулях, которые их используют? Это освободит 30 тыс. Памяти для каждого модуля.

+2

бы Именованные диапазоны работают? –

+1

В порядке предпочтения: 1) Именованные диапазоны, 2) класс, 3) подпрограмма, которая их устанавливает, вызывается из каждой подпрограммы, которая им нужна –

+0

Я пробовал использовать именованные диапазоны, но когда я пытаюсь вызвать диапазон, я получаю сообщение об ошибке говорит ошибка компиляции, аргумент не является обязательным. Я не уверен, как будет работать класс. Для вызова каждого из рутины я думаю, что это та самая идея, которая была предложена ниже, что я пытаюсь сделать работу в течение нескольких недель без успеха. – Mythranor

ответ

0

Возможно создание юга, который устанавливает все диапазоны, а затем следующие подсистемы, просто ссылающиеся на переменную.

Option Explicit 

Public r1 As Range 

Sub setup() 
Set r1 = Sheet1.Range("a1") 
End Sub 

Sub test() 
r1.Value = 1 
End Sub 

Sub test2() 
r1.Value = 2 
End Sub 
+0

Я видел это несколько раз, но, похоже, не может заставить его работать. Я построил тестовый файл, используя следующий код, который будет использовать две кнопки для изменения значения в ячейке между двумя параметрами, которые являются чрезвычайно упрощенной версией того, что делает макрос. Код я использовал: Sub Настройка() r1 = Sheet1.Range ("a1") End Sub Private Sub CommandButton1_Click() r1.Value = 1 End Sub Private Sub CommandButton2_Click() r1 .Value = 2 End Sub Но когда я нажимаю кнопки, я получаю ошибку времени выполнения 424. – Mythranor

+0

если вы просто скопируете и вставляете код, который я отправил в новый модуль, это сработает для вас? также для установки требуется 'set' для установки диапазона' r1' – ballsy26

+0

Это не так. Я получаю ошибку времени выполнения '91': переменная объекта или с переменной блока не установлена ​​ – Mythranor

1

Я уверен, что есть что-то ужасно неправильно с макро-дизайн, если он действительно нуждается в более чем 500 переменных диапазона, поэтому я бы рекомендовал https://codereview.stackexchange.com/ для этого.

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

Names.Add "n1", "='Sheet 1'!B2" ' results in error if already added 

Range("n1").Value2 = 42   ' sample use 

Другой альтернативой может быть глобальные строковые константы:

Public Const r1$ = "'Sheet 1'!B2" 

Sub test() 
    Range(r1).Value2 = 42 
End Sub 
+1

Имена диапазонов, которые совпадают с адресами ячеек, не допускаются – jkpieterse

+0

спасибо @jkpieterse Я не был уверен, разрешен ли он без c – Slai

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

  • Нет связанных вопросов^_^