2017-02-21 1 views
0

Ich habe eine große Reihe von Bereichen (> 500), die ich in meiner Arbeitsmappe mit allgemeinen Deklarationen definiert habe: Public r1 As Range, Public r2 As Range usw. Jeder Bereich bezieht sich immer auf dieselbe Zelle in das Dokument. dh r1 bezieht sich immer auf Blatt 1, B2.So legen Sie einen globalen Variablenbereich fest, der in mehreren Prozeduren/Modulen verwendet werden kann

Viele meiner Ereignisse nehmen Aktion für alle 500 Bereiche einzeln und ich bin oft in die 64k-Modul Speichergrenze stoßen, weil ich den Bereich für jede Variable in jedem Modul zu erklären habe, die ich unter Verwendung getan: Set r1 = Sheets("Sheet 1").Range"B2"

Gibt es eine Möglichkeit, die Bereiche global zu deklarieren und sie dann in allen verschiedenen Modulen, die sie verwenden, frei zu nennen? Dies würde 30k Speicher für jedes Modul freigeben.

+2

Would Benannte Bereiche arbeiten? –

+1

In der Reihenfolge der Präferenz: 1) Benannte Bereiche, 2) eine Klasse, 3) eine Subroutine, die sie setzt, aufgerufen von jeder Routine, die sie benötigt –

+0

Ich versuchte mit benannten Bereichen, aber wenn ich versuche, den Bereich aufrufen, bekomme ich einen Fehler, dass sagt Kompilierfehler, Argument nicht optional. Ich bin mir nicht sicher, wie eine Klasse funktionieren würde. Für den Anruf jeder von einer Routine, ich denke, das ist die gleiche Idee, wie unten vorgeschlagen wurde, dass ich versucht habe, Arbeit für Wochen ohne Erfolg zu machen. – Mythranor

Antwort

0

Es ist möglich, ein Sub zu erstellen, das alle Bereiche einstellt, und dann folgen die Subs nur auf die Variable.

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

Ich habe das schon mehrmals vorgeschlagen, aber ich kann es nie zum Laufen bringen. Ich erstellte eine Testdatei mit dem folgenden Code, der zwei Schaltflächen verwenden würde, um den Wert in der Zelle zwischen zwei Optionen zu ändern, was eine extrem vereinfachte Version dessen ist, was das Makro tut. Der Code, den ich verwendet wurde: Sub setup() r1 = Sheet1.Range ("a1") End Sub Private Sub CommandButton1_Click() r1.Value = 1 End Sub Private Sub CommandButton2_Click() r1 .Value = 2 End Sub Aber wenn ich auf die Schaltflächen klicke, bekomme ich Laufzeitfehler 424. – Mythranor

+0

Wenn Sie nur den Code kopieren und einfügen, den ich in ein neues Modul gepostet hat funktioniert es für Sie? auch das Setup benötigt ein 'set', um den Bereich von' r1' – ballsy26

+0

zu setzen, tut es nicht. Ich erhalte Laufzeitfehler '91': Objektvariable oder Mit Blockvariable nicht gesetzt – Mythranor

1

Ich bin mir ziemlich sicher, dass es etwas schrecklich falsch mit dem Makro-Design ist, wenn es wirklich mehr als 500 Bereich Variablen benötigt, so würde ich https://codereview.stackexchange.com/ dafür empfehlen.

Der allgemeine empfohlene Weg besteht darin, sie als benannte Bereiche hinzuzufügen, wie sie in der Arbeitsmappe beim ersten Hinzufügen gespeichert werden, und automatisch angepasst, wenn Zeilen/Spalten davor oder ähnliche Änderungen eingefügt werden. Sie können benannte Bereiche auf die derzeit aktive Arbeitsmappe wie folgt hinzu:

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

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

Eine weitere Alternative globale String-Konstanten sein könnte:

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

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

Bereich Namen, die die gleichen wie Zelladressen sind nicht erlaubt – jkpieterse

+0

danke @jkpieterse Ich war mir nicht sicher, ob es ohne die c erlaubt ist – Slai

Verwandte Themen