Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1288to1292
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Range() im Code funzt nicht

Range() im Code funzt nicht
18.12.2012 17:57:01
Dave
Hallo zusammen,
folgender Code:
Sub schuetzen()
Dim wks As Worksheet, Area(2) As Range, i As Byte
Set Area(1) = Range("BA4:BA14")
Set Area(2) = Range("BA16:BA25")
For Each wks In Worksheets
If wks.Name = "DE0O" Then
wks.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, UserInterfaceOnly:= _
True
wks.EnableOutlining = True
For i = 1 To 2
wks.Protection.AllowEditRanges.Add Title:="KPMG", Range:=Area(i), Password:="xxx"
Next
End If
Next
End Sub

funktioniert nicht. Es kommt "Laufzeitfehler 1004". Irgendwie ist die Definition und Einbindung der Range-Variable fehlerhaft, ich kriegs nicht hin.
Kann jemand helfen?
Danke und Gruß
David

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Range() im Code funzt nicht
18.12.2012 18:02:53
Sheldon
Hi David,
ich tippe eher auf einen Fehler in der Reihenfolge. Wenn das Blatt erst geschützt ist, kannst Du keine Zellen mehr "entschützen". Versuch also mal so (ungetestet):
Sub schuetzen()
Dim wks As Worksheet, Area(2) As Range, i As Byte
Set Area(1) = Range("BA4:BA14")
Set Area(2) = Range("BA16:BA25")
For Each wks In Worksheets
If wks.Name = "DE0O" Then
For i = 1 To 2
wks.Protection.AllowEditRanges.Add Title:="KPMG", Range:=Area(i), Password:="xxx"
Next
wks.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, UserInterfaceOnly:= _
True
wks.EnableOutlining = True
End If
Next
End Sub
Gruß
Sheldon

Anzeige
AW: Range() im Code funzt nicht
18.12.2012 18:37:32
Dave
Hi Sheldon,
das dachte ich auch schon und hab's umgedreht, aber immer noch der gleiche Fehler.
Ich hab jetzt mal folgende Version ausprobiert:
Sub schuetzen()
Dim wks As Worksheet, KArea(1 To 5) As Range, i As Byte, FArea(1 To 25) As Range
Dim Area_KPMG As Range
Set KArea(1) = Range("BA4:BA14")
Set KArea(2) = Range("BA16:BA25")
'KArea(3) = ("BA28:BA30")
'KArea(4) = ("BA33:BA40")
'KArea(5) = ("BA42:BA52")
Set Area_KPMG = Union(KArea(1), KArea(2))
For Each wks In Worksheets
If wks.Name = "DE0O" Then
wks.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, UserInterfaceOnly:= _
True
wks.EnableOutlining = True
wks.Protection.AllowEditRanges.Add Title:="KPMG", Range:=Area_KPMG, Password:="xxx"
End If
Next
End Sub
Aber leider wieder der gleiche Fehler. Ich vermute, es ist nur die Art der Schreibweise und der Definition der Variablen, aber alle (für mich) sinnvollen Kombinationen haben keinen Erfolg gebracht.
Gruß
Dave

Anzeige
AW: Range() im Code funzt nicht
18.12.2012 21:42:33
Luschi
Hallo David,
AllowEditRanges ist ein Excel-Objekt und die Auflistung wird wird über den 'Titel' angesprochen, _ der nur einmal vorkommen darf. Deshalb muß man es vorher löschen und der Tabellenschutz muß vorher aufgeheben werden.

Sub schuetzen()
Dim wks As Worksheet, Area(2) As Range, i1 As Integer, i2 As Integer
For Each wks In Worksheets
If wks.Name = "DE0O" Then
Set Area(1) = wks.Range("BA4:BA14")
Set Area(2) = wks.Range("BA16:BA25")
wks.Unprotect "xxx"
i1 = wks.Protection.AllowEditRanges.Count
For i2 = 1 To i1
If wks.Protection.AllowEditRanges(i2).Title = "KPMG" Then
wks.Protection.AllowEditRanges(i2).Delete
End If
Next i2
wks.Protection.AllowEditRanges.Add Title:="KPMG", Range:=Union(Area(1), Area(2)), _
Password:="xxx"
wks.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, UserInterfaceOnly: _
=True
wks.EnableOutlining = True
End If
Next
End Sub
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Range() im Code funzt nicht
19.12.2012 08:55:41
Dave
Hallo Luschi,
das hat funktioniert, danke für die Hilfe.
Gruß
Dave

AW: Range() im Code funzt nicht
19.12.2012 09:03:35
Dave
Hallo Luschi,
der komplette Code sieht jetzt so aus:
Sub schuetzen()
Dim wks As Worksheet, KArea(1 To 5) As Range, i As Byte, FArea(1 To 25) As Range, i1 As Byte,  _
i2 As Byte
Dim Area_KPMG As Range, Area_FAG As Range
Set KArea(1) = Range("BA4:BA14")
Set KArea(2) = Range("BA16:BA25")
Set KArea(3) = Range("BA28:BA30")
Set KArea(4) = Range("BA33:BA40")
Set KArea(5) = Range("BA42:BA52")
Set Area_KPMG = Union(KArea(1), KArea(2), KArea(3), KArea(4), KArea(5))
Set FArea(1) = Union(Range("C4:C14"), Range("C16:C25"), Range("C28:C30"), Range("C33:C40"),  _
Range("C42:C52"))
Set FArea(2) = Union(Range("BB4:BC14"), Range("BB16:BC25"), Range("BB28:BC30"), Range("BB33: _
BC40"), Range("BB42:BC52"))
Set FArea(3) = Union(Range("BE4:BE14"), Range("BE16:BE25"), Range("BE28:BE30"), Range("BE33: _
BE40"), Range("BE42:BE52"))
Set FArea(4) = Union(Range("BG4:BH14"), Range("BG16:BH25"), Range("BG28:BH30"), Range("BG33: _
BH40"), Range("BG42:BH52"))
Set FArea(5) = Union(Range("BM4:BV14"), Range("BM16:BV25"), Range("BM28:BV30"), Range("BM33: _
BV40"), Range("BM42:BV52"))
Set Area_FAG = Union(FArea(1), FArea(2), FArea(3), FArea(4), FArea(5))
For Each wks In Worksheets
If wks.Name = "DE0O" Then 'für Testzwecke nur 1 Blatt
wks.Unprotect
i1 = wks.Protection.AllowEditRanges.Count
For i2 = 1 To i1
wks.Protection.AllowEditRanges(i2).Delete
Next i2
wks.Protection.AllowEditRanges.Add Title:="KPMG", Range:=Area_KPMG, Password:="x"
wks.Protection.AllowEditRanges.Add Title:="FAG", Range:=Area_FAG, Password:="y"
wks.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, UserInterfaceOnly:= _
True
wks.EnableOutlining = True
End If
Next
End Sub
Das funktioniert auch grundsätzlich, so lange keine Bereiche vorher bereits definiert sind. Lasse ich den Code zweimal durchlaufen, steigt er an der Stelle
wks.Protection.AllowEditRanges(i2).Delete
aus, wenn die Variable den Wert '2' hat, das heißt, der def. Bereich "FAG" wird nicht gelöscht.
Hast du eine Idee, warum das so ist?
Gruß
Dave

Anzeige
AW: Range() im Code funzt nicht
19.12.2012 09:25:32
Dave
jetzt verstehe ich gar nichts mehr:
Ist kein Bereich definiert, läuft der Code durch.
Sind die Bereiche bereits definiert, steigt er mit Fehler 1004 aus. Gehe ich bei der Fehlermeldung in den Debug-Modus, schalte dann dort auf 'STOP' und lasse den Code nochmal durchlaufen, funzt es wieder.
?!!!?
Ich bin verwirrt. Bitte um Hilfe.
Gruß
Dave

AW: Range() im Code funzt nicht
19.12.2012 09:34:01
Dave
Ha, hab's doch rausbekommen:
wenn der def. Bereich gelöscht wird, "rücken alle anderen im Index nach". Die Komplettlöschung geht dann so:
i1 = wks.Protection.AllowEditRanges.Count
For i2 = 1 To i1
wks.Protection.AllowEditRanges.Item(1).Delete
Next i2
das heißt, es wird x-mal Item(1) gelöscht.
Gruß
Dave

Anzeige
AW: Range() im Code funzt nicht
19.12.2012 09:44:07
Luschi
Hallo Dave,
so geht es auch. Ich lasse lieber die Schleife rückwärts laufen.
Außerdem habe ich die Bereichsdefinition nach unten gezogen, um Range() auf die richtige Tabelle zu referenzieren.
Sollte mal die Vba-Routine gestartet werden, ohne daß die richtige Tabelle aktiviert ist, gibt _ es wieder nur Vba-Fehler:

Dim wks As Worksheet, KArea(1 To 5) As Range, i As Byte, FArea(1 To 25) As Range, _
i1 As Integer, i2 As Integer
Dim Area_KPMG As Range, Area_FAG As Range
For Each wks In Worksheets
If wks.Name = "DE0O" Then 'für Testzwecke nur 1 Blatt
wks.Unprotect
Set KArea(1) = wks.Range("BA4:BA14"):  Set KArea(2) = wks.Range("BA16:BA25")
Set KArea(3) = wks.Range("BA28:BA30"): Set KArea(4) = wks.Range("BA33:BA40")
Set KArea(5) = wks.Range("BA42:BA52")
Set Area_KPMG = Union(KArea(1), KArea(2), KArea(3), KArea(4), KArea(5))
Set FArea(1) = Union(wks.Range("C4:C14"), wks.Range("C16:C25"), _
wks.Range("C28:C30"), wks.Range("C33:C40"), wks.Range("C42:C52"))
Set FArea(2) = Union(wks.Range("BB4:BC14"), wks.Range("BB16:BC25"), _
wks.Range("BB28:BC30"), wks.Range("BB33:BC40"), wks.Range("BB42:BC52") _
)
Set FArea(3) = Union(wks.Range("BE4:BE14"), wks.Range("BE16:BE25"), _
wks.Range("BE28:BE30"), wks.Range("BE33:BE40"), wks.Range("BE42:BE52") _
)
Set FArea(4) = Union(wks.Range("BG4:BH14"), wks.Range("BG16:BH25"), _
wks.Range("BG28:BH30"), wks.Range("BG33:BH40"), wks.Range("BG42:BH52" _
))
Set FArea(5) = Union(wks.Range("BM4:BV14"), wks.Range("BM16:BV25"), _
wks.Range("BM28:BV30"), wks.Range("BM33:BV40"), wks.Range("BM42:BV52") _
)
Set Area_FAG = Union(FArea(1), FArea(2), FArea(3), FArea(4), FArea(5))
i1 = wks.Protection.AllowEditRanges.Count
For i2 = i1 To 1 Step -1
wks.Protection.AllowEditRanges(i2).Delete
Next i2
wks.Protection.AllowEditRanges.Add Title:="KPMG", Range:=Area_KPMG, Password:="x"
wks.Protection.AllowEditRanges.Add Title:="FAG", Range:=Area_FAG, Password:="y"
wks.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
UserInterfaceOnly:=True
wks.EnableOutlining = True
End If
Next
End Sub
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Range() im Code funzt nicht
19.12.2012 10:19:59
Dave
Ok, gute Hinweise.
Nach noch einigen Versuchen mit Fehlern habe ich noch folgendes rausgefunden:
das wks.Protection.AllowEditRanges.Item(1).Delete funzt nur richtig, wenn das Blatt aktiv ist (also mit .Activate aufgerufen) ansonsten steigt der Code bei jedem Blatt wieder aus.
Vermutlich gibt's da auch noch eine "richtige" Lösung, aber soweit komme ich erst mal klar.
Danke für deine Hilfe.
Gruß
Dave

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige