Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1192to1196
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
Bereich.Value=Bereich.Value ändert Werte
Reinhard
Hallo Wissende,
nachstehend der Code aus einem Standardmodul, Gibt nur noch einen Einzeiler in ComboBox1_Change, der Call Berechne(...) ausführt .
Je nach Auswahl in der Combobox des Blattes sollen Werte in F unterschiedlich berechnet/ausgewertet werden, Ergebnis dann nach G. Gelöst habe ich das so daß je nach Auswahl in G unterschiedliche Formeln reinkommen.
Klappt auch, wenn auch erstaunlich langsam für 150 Zellen !?
Aber, deshalb frage ich an, wenn ich bei gewältem "Primzahl" diese Codezeile in "Berechne"
'Ber.Value = Ber.Value
auskommentiere, ist 103, 311, usw. eine Primzahl
Mach ich das Hochkomma weg, sind alle Zahlen keine Primzahlen.
Ich kann mir das nicht erklären, auf welchem Schlauch stehe ich denn?
Hier die Datei (495 KB):
http://www.file-upload.net/download-3092610/kwTabbi-Online.xls.html
Danke ^ Gruß
Reinhard
Option Explicit
Sub Berechne(Was As String)
Dim Zei As Long, Ber As Range
With Worksheets("Tabbi")
For Zei = 8 To 158 Step 5
If Not Ber Is Nothing Then
Set Ber = Union(Ber, .Range(.Cells(Zei, 7), .Cells(Zei + 3, 7)))
Else
Set Ber = .Range(.Cells(Zei, 7), .Cells(Zei + 3, 7))
End If
Next Zei
Application.ScreenUpdating = False
If Was = "Quersumme" Then Ber.Formula = "=Quersumme(F8)"
If Was = "Durchdrei" Then Ber.Formula = "=DurchDrei(F8)"
If Was = "Primzahl" Then Ber.Formula = "=Primzahl(F8)"
'Ber.Value = Ber.Value
Application.ScreenUpdating = True
End With
End Sub
Function Quersumme(Zelle As Range) As Integer
Dim intI As Integer
For intI = 1 To Len(Zelle.Value)
Quersumme = Quersumme + CInt(Mid(Zelle.Value, intI, 1))
Next
End Function
Function DurchDrei(Zelle As Range) As String
DurchDrei = IIf(Zelle.Value Mod 3 = 0, "ja", "nein")
End Function
Function Primzahl(Zelle As Range) As String
Dim N As Integer, p As Boolean
For N = Zelle.Value - 1 To 2 Step -1
If Zelle.Value Mod N = 0 Then
p = True
Exit For
End If
Next N
Primzahl = IIf(p = False, "ist", "keine")
End Function

Das hatten wir schon,...
31.12.2010 18:51:36
Luc:-?
…Reinhard,
nämlich hier!
GRutsch! Luc :-?
AW: Das hatten wir schon,...
31.12.2010 19:07:58
Reinhard
Hallo Luc,
erstmal das Wichtigste, Guten Rutsch ins neue jahr für dich und Gesundheit für 2011 *wünsch*
Zum Thema, ich habe mir jetzt mehrmals deinen alten Beitrag durchgelesen.
Irgendwie verstehe ich da was ganz gewaltig nicht.
Die Funktion "Durchdrei" liefert genauso wie "Primzahl" einen String zurück.
Da klappt es wie gewohnt. Bislang habe ich schon oft .Value=.Value benutzt um Formeln durch ihre Ergebnisse zu ersetzen, nie Probleme.
Warum nur wird bei Primzahl aus
keine
keine
keine
ist
ist
keine
dann nach .Value=.Value
keine
keine
keine
keine
keine
keine
?
Okay, eine Warteschleife mit wait oder sleep muß ich noch austesten.
Gruß
Reinhard
Anzeige
Evtl ist das zu schnell und .Formula=:Value...
31.12.2010 22:38:41
Luc:-?
…ist bestimmt besser, Reinhard,
auch wenn Value die Standard­eigenschaft ist.
Ciao im Neuen & danke für die Wünsche!
Luc :-?
AW: Evtl ist das zu schnell und .Formula=:Value...
31.12.2010 23:07:47
Reinhard
Hallo Luc.
.Formula=.Value klingt gut, mal testen bei dem fall.
Zu schnell glaube ich nicht, ich habe wait mit sogar 10sec eingebaut bevor
.Value = .Vlue
kommt. Gleiches Ergebins, überall steht "keine".
Macht aber nix, nächstes Jahr findest du bestimmt eine Lösung :-)
Und immernoch ist bei allem mein größtes Problem, warum klappt es bei der einen Funktion, bei der anderen nicht?
WO ist da der Unterschied? *rätsel*
Danke für dein Interesse
Gruß
Reinhard
Anzeige
Gesundes Neues dir und allen hier!
01.01.2011 00:35:40
Luc:-?
Bis bald! Ein neues Jahr bringt neue Probleme u. den Überhang der alten! ;-)
Prosit 2011!
Luc :-?
wünsch ich Dir und allen ebenso! owT
01.01.2011 04:24:40
silex1
VG, Rene
AW: Bereich.Value=Bereich.Value ändert Werte
01.01.2011 10:19:29
Gerd
Hallo Reinhard,
erste Übung vorweg. Schicke die Zellen auf die Entbindungsstation.
Second: .Value=.Value im Flickenteppich geht nicht.
Am Speed kannst noch etwas feilen. :-)
Sub Berechne(Was As String)
Dim Zei As Long, Ber As Range
With Worksheets("Tabbi")
For Zei = 8 To 158 Step 5
If Not Ber Is Nothing Then
Set Ber = Union(Ber, .Range(.Cells(Zei, 7), .Cells(Zei + 3, 7)))
Else
Set Ber = .Range(.Cells(Zei, 7), .Cells(Zei + 3, 7))
End If
Next Zei
Application.ScreenUpdating = False
For Zei = 1 To Ber.Areas.Count
If Was = "Quersumme" Then Range(Ber.Areas(Zei).Address).Formula = "=Quersumme()"
If Was = "Durchdrei" Then Range(Ber.Areas(Zei).Address).Formula = "=DurchDrei()"
If Was = "Primzahl" Then Range(Ber.Areas(Zei).Address).Formula = "=Primzahl()"
Next
For Zei = 1 To Ber.Areas.Count
Range(Ber.Areas(Zei).Address).Value = Range(Ber.Areas(Zei).Address).Value
Next
Application.ScreenUpdating = True
End With
End Sub

Function Quersumme() As Integer
Dim intI As Integer
Dim Zelle As Range
For intI = 1 To Len(Application.ThisCell.Offset(0, -1).Value)
Quersumme = Quersumme + CInt(Mid(Application.ThisCell.Offset(0, -1).Value, intI, 1))
Next
End Function

Function DurchDrei() As Variant
DurchDrei = IIf(Application.ThisCell.Offset(0, -1) Mod 3 = 0, "ja", "nein")
End Function

Function Primzahl() As Variant
Dim N As Integer, p As Boolean
For N = Application.ThisCell.Offset(0, -1).Value - 1 To 2 Step -1
If Application.ThisCell.Offset(0, -1).Value Mod N = 0 Then
p = True
Exit For
End If
Next N
Primzahl = IIf(p = False, "ist", "keine")
End Function
Ein gutes Neues
Gruß
Gerd
Anzeige
AW: Bereich.Value=Bereich.Value ändert Werte
01.01.2011 11:33:48
Reinhard
Gutes neues Gerd,
::::erste Übung vorweg. Schicke die Zellen auf die Entbindungsstation.
ob sich da rechteckige Zellen in einem runden Saal wohlfühlen? :-)
::::Second: .Value=.Value im Flickenteppich geht nicht.
Aha, die gezeigte Mappe ist mir wurscht, mein Hauptaugenmerk ist, .Value =:value hat bislang immer funktioniert, diesmal nicht.
Wenn es nur daran liegt, daß es ein Bereich ist der nicht zuusammenhängend ist wäre ja die Welt für mich wieder in Ordnung, naja fast.
Wieso klappt es bei der einen Funktion und nicht bei der anderen?
Am Speed kannst noch etwas feilen. :-)
? Ich denke/dachte, eine Kombination aus Excelformeln und Vba ist das Schnellste was man machen kann!?
Deinen Code muß ich noch testen, aber er löst ja, auch wenn er funktioniert, nicht die Fragen die ich allgemein zu der Sachlage habe.
Gruß
Reinhard
Anzeige
Worum geht's dir eigentl wirklich,...
01.01.2011 11:57:12
Luc:-?
…Reinhard,
(1) um Quersummen, Primzahlen oder was ganz Anderes…? (2) Muss das unbedingt eine Subroutine mit udF-Unterstützung oder kann das auch gleich eine udF für den Einsatz im TabBlatt sein? (3) Willst du das selbst schaffen oder tut's ggf auch ein Fertigprodukt? Eine leistungsfähige Quersummen-udF hätte ich nämlich — leistet mehr als das StandardFml-Konstrukt auf excelformeln…
Gruß + schöNeujahrWE, Luc :-?
PS: Fmln eintragen und gleich hinterher durch Wert ersetzen ist auch bei Wait-Anwendung so'ne Sache, vor allem, wenn man .Value = .Value schreibt. Das bringt Xl ggf ins Stolpern. Eine physische Trennung beider Aktionen über _Calculate ist da sicherer.
Anzeige
@Luc und Gerd
01.01.2011 15:33:08
Reinhard
Hallo,
es geht mir nicht um die Funktionen. Es geht mir da einzig darum versuchen zu verstehen, warum in dem Fall .Value=.Value nicht funktioniert, genauer, falsche Werte liefert.
Wieso macht es aus "ist" ein "kein"?
Wait und Application.Calculate davor eingebaut bringt nix.
Den Code von Gerd habe ich immer noch nicht getestet.
Ich habe es jetzt so gelöst wie nachstehend ersichtlich, also den Bereich nicht mehr in Teilbereichen sondern als Gesamtblock. Schon klappt es problemlos.
Irritieren tut mich immer noch die recht lange Rechenzeit von 3-4 Sekunden für die 150 Zellen.
Sub Berechne(Was As String)
With Worksheets("Tabbi").Range("G8:G161")
Application.ScreenUpdating = False
If Was = "Quersumme" Then .FormulaLocal = "=WENN(F8"""";Quersumme(F8);"""")"
If Was = "Durchdrei" Then .FormulaLocal = "=WENN(F8"""";DurchDrei(F8);"""")"
If Was = "Primzahl" Then .FormulaLocal = "=WENN(F8"""";Primzahl(F8);"""")"
.Value = .Value
Application.ScreenUpdating = True
End With
End Sub
Gruß
Reinhard
Anzeige
Stelle Berechnung vorher auf manuell,...
01.01.2011 16:09:21
Luc:-?
…Reinhard,
Application.Calculation = xlCalculationManual, dann zurück (xlCalculationAutomatic) und dann den Ersetzungsdurchgang nicht hier, sondern in der EventProc Worksheet_Calculate. Das sollte dann evtl etwas schneller sein. Ggf musst du auch oder nur vor dem Ersetzen den Berechnungs­modus umstellen.
Gruß Luc :-?
AW: Stelle Berechnung vorher auf manuell,...
01.01.2011 16:47:56
Reinhard
Hallo Luc,
ja, als du auf Calculate hingewiesen hast dachte ich auch an Worksheet.Calculate aber dann dachte ich mir, kann doch nicht sein nur wegen der einen winzigen Funktion, bei jeder Blattberechnung da in dem kleinen Bereich zu ersetzen oder über glöbale Variable oder ähnlich das zumindest immer irgendwie abzuprüfen ob ersetzt werden soll.
Wie auch immer, wäre das sowieso nur Wirkungsbekämpfung, mir fehlt aber das Wissen der Ursache.
Bzw. die Ursache an sich ist klar, zumindest für mich, liegt daran daß der Zllbereich mehrere Areas hatte.
Ohne Aufteilung in Areas, also als ein Block klappt ja .Value=.Value wie immer.
Und, auch die lange Zeit ist mir ein großes Rätsel.
Geschätze (abgezählt, einundzwanzig, usw.) 3-4 Sekunden ist ein haufen Holz.
Ich habe den letzten von mir gezeigten Code genommen und in einer neuen leeren Mappe laufen lassen.
Zeit nicht messbar, hätte ich nur mit Timer messen können.
Ich stelle den Beitrag nicht auf offen, würde mich schon interessieren wenn dir dazu was einfällt oder Gerd falls er noch mitliest oder einem Zufallsmitleser, aber wenn nix kommt, isses auch gut, dann kommen beide Unklarheiten als Unklarheit714 und Unkrarheit715 in meinen Kopfordner "unerledigt" :-)))
Danke für deine Mühen
Gruß
Reinhard
Anzeige
AW: Bereich.Value=Bereich.Value ändert Werte
01.01.2011 12:37:40
Gerd
Hallo Reinhard!
aber er löst ja, auch wenn er funktioniert, nicht die Fragen die ich allgemein zu der Sachlage habe
In Excel kommt es fast immer mit auf die Konstellationen an. Auf ein normales Rechteck angewendet, verursacht dein Code bei mir keine Probleme.
By the Way: Du schreibst unter xl2000. Da wird "ThisCell" wohl noch nicht funktionieren.
Gruß Gerd
AW: Bereich.Value=Bereich.Value ändert Werte
01.01.2011 17:48:29
Gerd
Hallo Reinhard,
vielleicht waren auch die Zelladresse in deinen Formeln beim Bereich mit Lücken fehlerhaft?
Mich irritiert, dass Du bei diesem Thread die Reihenfolge nicht einhalten kannst
u. in deiner Primzahlenfunktion bereits mit Wert-1 auf Primzahl prüfst. :-)
Sub Berechne(Was As String)
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With Worksheets("Tabbi").Range("G8:G161")
.ClearContents
.FormulaLocal = "=WENN(F8"""";" & Was & "(F8);"""")"
.Value = .Value
End With
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Was jetzt noch "dauert" ist die Neuberechnung der übrigen Formeln.
Gruß Gerd
Anzeige
AW: Bereich.Value=Bereich.Value ändert Werte
01.01.2011 18:01:56
Reinhard
Hallo Gerd,
::::vielleicht waren auch die Zelladresse in deinen Formeln beim Bereich mit Lücken fehlerhaft?
nein, ich habe .Value=.Value auskommentiert und die Formeln der ersten 10 zellen überprüft, alles okay.
::::Mich irritiert, dass Du bei diesem Thread die Reihenfolge nicht einhalten kannst
Ups, mein Name ist Hase und ich weiß von nix :-) Wenn dem so ist, sorry.
::::u. in deiner Primzahlenfunktion bereits mit Wert-1 auf Primzahl prüfst. :-)
Ach, für die Primzahlen hab ich mir keinen Kopp gemacht, einfach gegoogelt und die erstbeste Routine genommen ohne die nachzuchecken.
Gruß
Reinhard
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige