Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1724to1728
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

Inhalt einer Zelle mit Formel

Inhalt einer Zelle mit Formel
25.11.2019 12:11:13
Steve
Moin Leute,
ich habe eine Tabelle die normalerweise eine Spalte in eine andere Tabelle als Zeile umschreibt und Änderungen ständig überwacht. (diese benötige ich später für Serienbriefe und als Übersichtsliste)
Nun wollte ich der ganzen Sache etwas mehr Flexibilität verleihen. Der Plan war diese Spalte in die Spalte Z zu verschieben und mit Formeln zu befüllen. Diese verweisen auf einen anderen Ort in demselben Tabellenblatt.
Das würde mich befähigen unterschiedliche Formulare zu erstellen ohne das die Funktion an sich gestört wird.
DAS PROBLEM:
VBA nimmt die Werte die als Ergebnis einer Formel stehen nicht an. Würde ich die Werte per Hand in der Spalte Z notieren würde das ganze funktionieren.
Ich denke ich brauche sowas wie "WERT einfügen" für target.value. Ich habe schon gegoogelt aber ich finde nichts dergleichen.
Ich habe mal eine Tabelle vorbereitet. Die grünen Felder sind die Felder in die die Daten notiert werden sollen. Deren Position und Verteilung kann sich immer wieder ändern. Diese sollen dann in die blauen Felder übernommen und von dort in das Sheet "LISTE" übertragen werden.
Kann mir da Bitte jemand helfen?
Hier die Datei:
https://www.herber.de/bbs/user/133422.xlsm
Und hier der Code aus "Diese Arbeitsmappe":
Option Explicit
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal target As Range)
Dim blattno, bereich
Dim quellbereich, zelle
'die blätter bei denen nix passierne soll
blattno = Array("Daten", "Startseite", "Liste", "Master")
quellbereich = Array("Z5:Z24")
If InStr(1, "@" & Join(blattno, "@") & "@", "@" & sh.Name & "@", vbTextCompare) > 0 Then Exit _
Sub
If target.Count = 1 Then
'nur ein Eintrag erfolgte
If Not Intersect(target, sh.Range(quellbereich(0))) Is Nothing Then
aktualisieren sh, target
End If
Else
'mehrere Einträge erfolgen
For Each zelle In target
If Not Intersect(zelle, sh.Range(quellbereich(0))) Is Nothing Then
aktualisieren sh, zelle
End If
Next
End If
End Sub

Sub aktualisieren(sh As Object, ByVal target As Range)
Dim ziel
Dim spalte
Set ziel = Worksheets("LISTE").Columns(1).Find(sh.Name, LookIn:=xlValues, lookat:=xlWhole)
If ziel Is Nothing Then Exit Sub
spalte = target.Row - 1
Worksheets("LISTE").Cells(ziel.Row, spalte) = target.Value
End Sub
Liebe Grüße
Steve

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Ergänzung mit Teilerfolg
25.11.2019 12:36:53
Steve
Hallo Leute,
ich hab noch eine Ergänzung. Hab noch was rumprobiert.
Das problem scheint wie folgt zu sein.
Steht in der Zelle lediglich z.B. =B5, dann scheint es zu funktionieren.
Steht in der Zelle aber z.B. =WENN(B5="";"";B5), funktioniert es nicht mehr.
Warum das so ist verstehe ich allerdings nicht. Immerhin ist das Ergebnis doch genauso Eindeutig wie wenn da nur =B5 steht. Oder nicht?
Liebe Grüße
Steve
Kein Teilerfolg aber vielleicht Problem gefunden
25.11.2019 12:49:27
Steve
Ich nocheinmal..
ich glaube ich habe das Problem gefunden. Es ist nicht die Formel die das Problem darstellt sondern irgendwie die aktualisierung oder so.
Würde ich nach einer Änderung die Formel (in Spalte Z) einfach kopieren und an Ort und Stelle einfügen, dann wird der entsprechende Wert auch in Sheet "LISTE" übertragen.
Das Ändert wohl meine Anfrage. Die müsste also lauten:
Wie füge ich diese aktualisierung ein, damit diese automatisch abläuft?
Liebe Grüße
Steve
Anzeige
AW: Kein Teilerfolg aber vielleicht Problem gefunden
25.11.2019 17:18:30
ChrisL
Hi Steve
Ja das hast du richtig erkannt. Die Änderung eines Formelergebnis löst kein Change-Ereignis aus.
Entweder nimmst du ein Calculate-Ereignis, das bei jeder Neuberechnung pauschal (ohne Eingrenzung auf Bereiche) abläuft. Oder du wendest das Change-Ereignis auf diejenigen Zellen an, welche das Formelergebnis herbeiführen.
Hier ein Vorschlag:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal target As Range)
Dim arrBezug As Variant, strBezug As String
Dim rngZelle As Range, rngZiel As Range
If Not IsNumeric(Sh.Name) Then Exit Sub
strBezug = "B5,B6,B13,B14,J20,J21,J22,B25,B26,B27,D9,D10,D26,D27,H10,H11,H12,M24,M25,M26"
If Intersect(target, Sh.Range(strBezug)) Is Nothing Then Exit Sub
arrBezug = Array(Split(strBezug, ","))
For Each rngZelle In target
If Not Intersect(rngZelle, Sh.Range(strBezug)) Is Nothing Then
Set rngZiel = Worksheets("LISTE").Columns(1).Find(Sh.Name, LookIn:=xlValues, lookat:=xlWhole)
If rngZiel Is Nothing Then
Exit Sub
Else
Worksheets("LISTE").Cells(rngZiel.Row, _
Application.Match(rngZelle.Address(0, 0), arrBezug, 0) + 3) = rngZelle
End If
End If
Next rngZelle
End Sub

cu
Chris
Anzeige
Ergänzung
25.11.2019 18:19:01
ChrisL
Die Hilfsspalte Z brauchst du mit meinem Vorschlag nicht mehr.
Der String:
strBezug = "B5,B6,B13,B14,J20,J21,J22,B25,B26,B27,D9,D10,D26,D27,H10,H11,H12,M24,M25,M26"

wird in ein Array/Datenfeld (quasi eine virtuelle Tabelle) umgewandelt:
arrBezug = Array(Split(strBezug, ","))

was dann mit der Formel VERGLEICH (Match) abgeglichen wird:
Application.Match(rngZelle.Address(0, 0), arrBezug, 0) + 3

womit sich automatisch der Spaltenindex (der wievielte Eintrag im Datenfeld) ergibt.
Ein Datenfeld speichert also mehrere Werte in einer einzigen Variable ab.
In deinem ursprünglichen Code hast du den Text-String "Z5:Z24" in einem Array gespeichert, was zwar auch funktioniert, jedoch nicht im Sinne des Erfinders ist.
Dim quellbereich As Variant
quellbereich = Array("Z5:Z24")
If Not Intersect(target, sh.Range(quellbereich(0))) Is Nothing Then

Dein Code entspricht:
Dim strQuellbereich As String
strQuellbereich = "Z5:Z24"
If Not Intersect(target, sh.Range(strQuellbereich)) Is Nothing Then

Im vorliegenden Fall kann man aber auch gleich eine Range definieren:

Dim rngQuellbereich As Range
rngQuellbereich = sh.Range("Z5:Z24")
If Not Intersect(target, rngQuellbereich) Is Nothing Then

Anzeige
AW: Ergänzung
25.11.2019 18:32:47
ChrisL
Korrektur:
Set rngQuellbereich = sh.Range("Z5:Z24")
und wenn ich schon dabei bin :)
strBezug = "B5,B6,B13,B14,J20,J21,J22,B25,B26,B27,D9,D10,D26,D27,H10,H11,H12,M24,M25,M26"
arrBezug = Array(Split(strBezug, ","))
entspricht
arrBezug = Array("B5", "B6", "B13", ...)
Split macht also aus dem langen Text-String viele einzelne String-Variablen, die alle im gleichen Array gespeichert werden.
Im Gegensatz zu diesem Schnipsel, wo nur ein einziger Text-String ins Array übernommen wird.
quellbereich = Array("Z5:Z24")
Dass man auch ganze Bereiche in ein Array übergeben kann, ist eine andere Geschichte resp. für deine Aufgabe m.E. nicht relevant. Hierfür müsste man eine Range übergeben.
MyArray = Range("Z5:Z24")
Anzeige
AW: Ergänzung
26.11.2019 14:42:34
Steve
Hi Chris,
Zunächst einmal danke ich dir für deine wirklich umfangreiche Hilfe. Sehe ich das richtig, das dein Code nun in "Diese Arbeitsmappe" eingefügt werden muss aber nur den ersten der beiden Sub´s ersetzt?
Wenn ich aber deinen Vorschlag umsetze, dann habe ich mir die Flexibilität genommen die Felder immer wieder zu verschiebenohne diese in VBA anzupassen, richtig?
Mein Ziel war eigentlich sowohl in der Menge, der Verteilung wie auch der Position der Felder flexibel zu bleiben. Deshalb werden die Ergebnisse immer in die Spalte Z gespiegelt.
Mein Grundgedanke war, das durch die Spiegelung aus der Spalte Z ich egal welche Zelle als "übertragungswürdig" deklarieren kann ohne dabei den VBA Code anpassen zu müssen.
Ich weiss nicht ob du dir meine Datei runtergeladen hast. Deshalb als Erklärung: Per Button wird ein verstecktes Sheet "MASTER" kopiert und umbenannt. Die Master wäre also die einzige Anpassung die bei einer Neueinrichtung der Datei geändert werden muss. (Bzw. Das würde sich erübrigen wenn ich genügend Felder bereitstelle) Und das würde ohne Eingriff in VBA funktionieren, also auch von einem Laien umsetzbar sein.
Zum bereitstellen der Felder habe ich mir das so gedacht: Ich lege diese Felder (die grünen die jetzt wirr verteilt sind) neben den blauen an. Wer auch immer dann seine Datei zusammenbastelt, kann die dann einzeln so wie er es braucht verschieben. Die Formel die auf Spalte Z verweist ändert sich ja automatisch mit und schon ist das ganze ein wenig ein Formularbaukasten mit Karteikartenfunktion.
Kann man sowas überhaupt umsetzen?
PS.: Bitte nicht als undankbar bewerten. Ich bin durchaus für deinen Vorschlag dankbar, alleine deshalb weil ich dadurch wieder etwas gelernt habe. Aber so ganz das was ich suche ist es nicht (Es sei denn ich habe deine Lösung falsch verstanden. )
Liebe Grüße
Steve
Anzeige
Bezugstabelle
26.11.2019 17:33:16
ChrisL
Hi Steve
Es ersetzt allen Code unter DieseArbeitsmappe d.h. Sub aktualisierung ist nicht mehr notwendig.
Wenn der Bereich Z5:Z24 die einzige Konstante ist, dann würde ich die Daten halt pauschal bei jeder Änderung (ohne Einschränkung auf einzelne Zellen) übergeben.
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal target As Range)
Dim rngZiel As Range
If Not IsNumeric(Sh.Name) Then Exit Sub
Set rngZiel = Worksheets("LISTE").Columns(1).Find(Sh.Name, LookIn:=xlValues, lookat:=xlWhole)
If rngZiel Is Nothing Then
Exit Sub
Else
Sh.Range("Z5:Z24").Copy
Worksheets("LISTE").Range("D" & rngZiel.Row).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=True
End If
Application.CutCopyMode = False
End Sub
cu
Chris
Anzeige
AW: Bezugstabelle
27.11.2019 07:41:17
Steve
Moin Chris,
das klappt ja wunderbar. Ich danke dir für deine Hilfe. Das
Eine letzte Frage habe ich noch. Wenn ich jetzt eine Eingabe mache, dann springt man ja ganz schnell zwischen den Sheets. Kann man das irgendwie unterbinden?
Liebe Grüße
Steve
AW: Bezugstabelle
27.11.2019 08:24:44
ChrisL
Guten Morgen
Effektiv zwischen den Blättern gewechselt wird nicht, aber es läuft halt oft das Event ab und das führt dann zum "Flackern". Jedenfalls kannst du mit ScreenUpdating etwas dagegen wirken.
Zudem hatte ich in meiner ursprünglichen Antwort eigentlich das Calculate-Ereignis empfohlen. Keine Ahnung warum ich dann doch Change genommen habe.
Calculate ist etwas präziser, weil es bei Änderungen, welche keinen Formel-Bezug haben (somit keine Neuberechnung auslösen) nicht ausgeführt wird.
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Dim rngZiel As Range
If Not IsNumeric(Sh.Name) Then Exit Sub
Application.ScreenUpdating = False
Set rngZiel = Worksheets("LISTE").Columns(1).Find(Sh.Name, LookIn:=xlValues, lookat:=xlWhole)
If Not rngZiel Is Nothing Then
Sh.Range("Z5:Z24").Copy
Worksheets("LISTE").Range("D" & rngZiel.Row).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=True
Application.CutCopyMode = False
End If
End Sub
cu
Chris
Anzeige
AW: Bezugstabelle
27.11.2019 10:36:53
Steve
Hallo Chris,
das funktioniert wunderbar.
SOLLTE ich nun mehr als 20 Zellen haben wollen, müsste ich nun einfach die Range ändern.
Mehr wäre dann nicht zu tun, korrekt?
Vielen Dank für deine Hilfe
Herzlichst
Steve
PS.: "If Not IsNumeric(Sh.Name) Then Exit Sub" - prüft ob das Sheet Nummerisch ist und ersetzt damit den separaten Ausschluss jedes anderen Sheets, richtig?
AW: Bezugstabelle
27.11.2019 11:01:55
ChrisL
ja und ja... genau so :)
cu
Chris

311 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige