Anzeige
Archiv - Navigation
464to468
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
464to468
464to468
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

worksheet change nur einmal ausführn

worksheet change nur einmal ausführn
09.08.2004 04:04:15
Sandy
Hallo,
ich möchte in einer Zelle addieren und zwar, daß die Neueingabe zu dem vorherigen Wert in der Zelle hinzuaddiert wird.
Also speicher ich beim Öffnen des Sheets alle Werte in einem array.
Über die Worksheet_change methode ermittel ich dann die Position und den Inhalt der Änderung, der dann über den entsprechenden Index im array hinzuaddiert wird und in das Sheet zurückgeschrieben wird.
Leider hab ich dabei 2 Probleme :
Beim Zurückschreiben des neuen Wertes vom array ins sheet, hab ich wieder ein worksheet_change ereignis, was nicht sein soll.
Und der range vom array ist nur beim 1ten Öffnen bekannt, Public sarray() funzt net in einem Objektmodul
Vielleicht kennt jemand eine Lösung für das Problem oder eine andere Vorgehensweise ?
viele grüsse, sandy

Option Explicit
Public sarray() As String
Public icells As Integer
Public sRange As String

Sub worksheet_activate()
Dim iIndex As Integer           'Zähler für den Index
Dim iRow As Integer             'Schleifenzähler für die Zeilen
Dim iCol As Integer             'Schleifenzähler für die Spalten
sRange = "A1:b7"               ' Range festlegen
' Die Anzahl der Zellen ermitteln
icells = Range(sRange).Cells.Count
' Das Array per Redim dimensionieren
ReDim sarray(icells - 1)
'nun über alle Zeilen und Spalten die Werte ins Array einlesen
For iCol = 1 To Range(sRange).Columns.Count
For iRow = 1 To Range(sRange).Rows.Count
sarray(iIndex) = Range(sRange).Cells(iRow, iCol).Value
iIndex = iIndex + 1
Next
Next
Debug.Print sarray(1)
End Sub


Sub Worksheet_Change(ByVal Target As Range)
If Target.Column > 3 Then
Exit Sub
Else
sRange = ("a1:" & Target.Address)
icells = (Range(sRange).Cells.Count) ' Anzahl der Zellen bis zum Target
Debug.Print sarray(icells) ' alter Zellwert
sarray(icells) = sarray(icells) + Target.Value 'neuer Zellwert
Target.Value = sarray(icells) ' neuen Zellwert ins Sheet übertragen
End If
End Sub

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: worksheet change nur einmal ausführn
09.08.2004 07:34:20
Nepumuk
Hallo Sandy,
Die Ereignisroutinen kannst du so unterdrücken:
Application.EnableEvents = False
Target.Value = sarray(icells)
Application.EnableEvents = True
Die Deklaration von Public-Variablen muss in einem "normalen" Modul erfolgen.
Gruß
Nepumuk
AW: worksheet change nur einmal ausführn
09.08.2004 09:19:46
public sarray()
Hallo,
super, super funktioniert mit application.enableEvents, Danke.
Nur das sarray hab ich in einem Modul mit der Sub Worksheet_activate() als public definiert, nur wenn worksheet_change(), was im Tabellenblatt stehen muß aufgerufen wird, ist dort das public sarray() nicht bekannt.
viele Grüsse, sandy
Anzeige
AW: worksheet change nur einmal ausführn
09.08.2004 09:26:34
Nepumuk
Hallo Sandy,
die Deklaration von öffentlichen (Public) Variablen muss außerhalb einer Prozedur erfolgen.
Gruß
Nepumuk
AW: worksheet change nur einmal ausführn
09.08.2004 13:50:46
public sarray()
Hallo Nepumuk,
ist die Deklaration in folgendem code nicht außerhalb der prozedur ? Das modul funktioniert, nur die worksheet_change auf dem Tabellenblatt kennt dann das sarray() nicht mehr, Wie muß ich das umschreiben oder aufrufen, damit das sarray() bekannt ist.
gruss, sandy
Modul1
Option Explicit
Public sarray() As String
Public icells As Integer
Public sRange As String

Sub worksheet_activate()
Dim iIndex As Integer           'Zähler für den Index
Dim iRow As Integer             'Schleifenzähler für die Zeilen
Dim iCol As Integer             'Schleifenzähler für die Spalten
sRange = "A1:b7"               ' Range festlegen
' Die Anzahl der Zellen ermitteln
icells = Range(sRange).Cells.Count
' Das Array per Redim dimensionieren
ReDim sarray(icells - 1)
'nun über alle Zeilen und Spalten die Werte ins Array einlesen
For iCol = 1 To Range(sRange).Columns.Count
For iRow = 1 To Range(sRange).Rows.Count
sarray(iIndex) = Range(sRange).Cells(iRow, iCol).Value
iIndex = iIndex + 1
Next
Next
Debug.Print sarray(1)
End Sub

Anzeige
AW: worksheet change nur einmal ausführn
09.08.2004 19:16:51
Nepumuk
Hallo Sandy,
die Routine Worksheet_Activate musste natürlich auch in das Modul der Tabelle. Aber Achtung: Da Ereignis wird nicht beim öffnen der Mappe ausgelöst, auch wenn die Tabelle die aktive Tabelle ist. Ich habe dir mal eine Beispielmappe gebastelt, in der du siehst, wie es trotzdem funktioniert.

Die Datei https://www.herber.de/bbs/user/9403.xls wurde aus Datenschutzgründen gelöscht

Schau dir auch das Makro in dem Klassenmodul "DieseArbeitsmappe" an. Die Ereignisroutine der Tabelle muss dabei als Public deklariert sein.
Gruß
Nepumuk

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige