PDA

Vollständige Version anzeigen : EXCEL2003: Gleiches VB-Script für alle Tabellen einer Datei


BernhardS
30.03.2012, 14:11
Hallo,

habe auf der Basis eines VB-Beispiels von Hajo - herzlichen Dank dafür - ein VB-Script erstellt. Meine Excel-Datei hat mehrere Arbeitsblätter. Das Script hat in allen Arbeitsblättern die gleiche Funktion.
Bis jetzt habe ich das VB-Script in jeder Tabelle eingefügt... hat den großen Nachteil, dass bei Änderungen das Script x-mal angefasst werden muss.
Wie mache ich das, um das VB-Script nur einmal anzulegen und dann von jeder Tabelle darauf zuzugreifen ?
Vielen Dank für alle Antworten.

MfG
BS

reiva
30.03.2012, 14:15
Hallo Berhard,
pack dein Code in ein Modul und rufe es von dort aus auf!

Gruß
Reiner

BernhardS
02.04.2012, 07:21
Hallo Reiner,

danke für die Antwort.
Habe das versucht, ist aber mit einer Fehlermeldung gescheitert. Hier mein Versuch:

Code für das Tabellenblatt:
Option Explicit
Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As
Boolean)
Zelleneintrag (Target)
End Sub

Code im Modul:
Sub Zelleneintrag(Target)
' erstellt von Hajo.Ziplies@web.de 12.11.02
' x in die Zelle
Dim RaBereich As Range
Set RaBereich = Range("d9:g100")
If Intersect(Target, RaBereich) Is Nothing Then Exit Sub
' Abbruch, wenn Aktion nicht im Zielbereich
Application.EnableEvents = False
Cancel = True
'Zelle erhält ein X
If Target.Value = "X" Then
Target.Value = ""
Else
Target.Value = "X"
End If
Application.EnableEvents = True
Set RaBereich = Nothing
End Sub

Die Fehlermeldung heißt:
Laufzeitfehler '424' : Objekt erforderlich
und wird in Zeile "if Intersect..." angezeigt.

Ich vermute mal, dass das mit der Übergabe der Variable 'Target as Range' zusammenhängt !?
Wie übergebe ich das richtig ?

Gruß
BS

hary
02.04.2012, 08:24
Hallo Bernhard
Code gehoert in den Code der Arbeitsmappe.
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
' erstellt von Hajo.Ziplies@web.de 12.11.02
' x in die Zelle
Dim RaBereich As Range
Set RaBereich = Range("d9:g100")
If Intersect(Target, RaBereich) Is Nothing Then Exit Sub
' Abbruch, wenn Aktion nicht im Zielbereich
Application.EnableEvents = False
Cancel = True
'Zelle erhält ein X oder nicht
Target = IIf(Target = "X", "", "X")
Application.EnableEvents = True
Set RaBereich = Nothing
End Sub
gruss hary

BernhardS
02.04.2012, 14:20
Hallo hary,
danke für die Antwort. Diese Version habe ich schon getestet und das funktioniert auch so.
Ich würde aber gerne diesen Code oder so ähnlich nur einmal haben wollen (wohl in einem Modul) und dann von meinen einzelnen Arbeitsblättern (8 Stück) aus aufrufen, so wie ich das in meinem Beitrag von weiter oben skizziert habe.
Ob das so geht?

Gruss
BS

chris-kaiser
02.04.2012, 14:55
Hallo BS

Ich würde aber gerne diesen Code oder so ähnlich nur einmal haben wollen

öhmm, ja? machte der Code doch!

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim rng As Range
Set rng = Columns(1) 'Spalte A
If Not Intersect(Target, rng) Is Nothing Then
Target = IIf(Target = "X", "", "X")
Cancel = True
End If
End Sub


siehe Bsp.datei
der Code ist nur einmal vorhanden!, bei doppelklick in Spalte A wird bei JEDEM Blatt wenn kein X ist eines gemacht, bzw. wieder entfernt. ;)

BernhardS
03.04.2012, 06:10
Hallo chris-kaiser,

vielen Dank für deinen Hinweis. Da meine Kenntnisse in Makro und VBA nicht so überwältigend sind, nochmal eine Rückfrage:
Was bedeutet das Objekt "Diese Arbeitsmappe" ? Wenn ich deine Beispieldatei richtig deute :-), dann gilt der Code, der in "Diese Arbeitsmappe" eingetragen ist, für alle Arbeitsblätter?? Das wäre dann meine Lösung ...

Gruss
BS

hary
03.04.2012, 06:32
Hallo Bernhard
Antwort auf den von mir geaenderten Code:
Diese Version habe ich schon getestet und das funktioniert auch so.
Ich würde aber gerne diesen Code oder so ähnlich nur einmal haben wollen
Hast Du wahrscheinich nicht, denn dieser gilt auch fuer alle Blaetter.
dann gilt der Code, der in "Diese Arbeitsmappe" eingetragen ist, für alle Arbeitsblätter??
Ja!
gruss hary

BernhardS
03.04.2012, 08:36
Hallo hary,
Hast Du wahrscheinich nicht, denn dieser gilt auch fuer alle Blaetter.
Habe ich schon aber ... ich hatte den Code in jedes Arbeitsblatt-Objekt eingefügt und dazu "Sub Worksheet_..." anstatt "Sub Workbook_" verwendet.

Die Version von chris-kaiser im Objekt "Dieses Arbeitsblatt" funktioniert tadellos.
Vielen Dank euch beiden, hat mir sehr geholfen !!

Eine Frage hätte ich noch ;) :
Meine Datei hat momentan 10 Arbeitsblätter. Wenn der VBA-Code nun nur auf bestimmte Arbeitsblätter angewendet werden soll, auf alle anderen nicht, wie könnte ich das lösen ?

Gruss
BS

hary
03.04.2012, 08:56
Hallo
Das hate ich aber in #4 geschrieben:
Code gehoert in den Code der Arbeitsmappe.

Nur auf bestimmte Blaetter:
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim rng As Range
Select Case ActiveSheet.Name
Case "Tabelle1", "Tabelle2": 'wirkt nur bei diesen Blaettern
Set rng = Columns(1) 'Spalte A
If Not Intersect(Target, rng) Is Nothing Then
Target = IIf(Target = "X", "", "X")
Cancel = True
End If
Case Else:
End Select
End Sub

gruss hary
Case kann gewechselt werden, wenn die Anzahl der Blaetter, in der nix passieren soll weniger sind als die wo er ausgefuehrt wird.

BernhardS
03.04.2012, 13:44
Hallo hary,

das war's ... Meine "Probleme" sind gelöst, meine Anfrage damit abgeschlossen.
Ganz herzlichen Dank für die schnelle Hilfe.

Gruss
BS