PDA

Vollständige Version anzeigen : Zeichen sofort zählen


dakawa
16.01.2005, 15:34
Hallo nochmal,

sicherlich für euch wieder eine kinderleichte Frage, aber alleine wills nicht klappen.

Ich möchte die Zeichen zählen, wenn in der Spalte Notizen (I) Text eingegeben wurde. Solange in der jeweiligen Zelle der Spalte Notizen nichts drinne steht, solange soll auch die Spalte Zeichen leer sein. Soweit habe ich es ja schonmal geschafft. Vielleicht nicht der schönste Code, aber er funktioniert zumindestens wenn ich ihn manuel auslösen.

Jetzt soll aber sofort gezählt weden, wenn eine Notiz gemacht wurde. Was fehlt da im Code noch?

Option Explicit
Dim RaBereich As Range, RaZelle As Range

Private Sub Zeichenlänge()
' bei Eingabe in Spalte Notizen wird die Zeichenlänge ermittelt
Set RaBereich = Range("K2:K999")

For Each RaZelle In RaBereich
If Not RaZelle.Offset(0, -2) = "" Then RaZelle.Value = Len(RaZelle.Offset(0, -2))
Next RaZelle

Set RaBereich = Nothing

End Sub

Gruß
dakawa

jinx
16.01.2005, 15:48
<font size="2" face="Century Gothic">Moin, dakawa,

meiner Meinung nach ein falscher Ansatz - überprüft werden sollte der Bereich der Eingabezellen in der folgenden Art:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
&nbsp;
<span class="TOKEN">Private Sub</span> Worksheet_Change(<span class="TOKEN">ByVal</span> Target <span class="TOKEN">As</span> Excel.Range)
<span class="REM">' Klassenmodul der Tabelle</span>
<span class="REM">' bei Eingabe in Spalte Notizen wird die Zeichenl&auml;nge ermittelt</span>
<span class="TOKEN">Dim</span> RaBereich <span class="TOKEN">As</span> Range
<span class="TOKEN">Set</span> RaBereich = Range(&quot;I2:I999&quot;)
<span class="TOKEN">If</span> Intersect(Target, RaBereich) <span class="TOKEN">Is</span> <span class="TOKEN">Nothing</span> <span class="TOKEN">Then</span> <span class="TOKEN">Exit Sub</span>
<span class="TOKEN">If</span> <span class="TOKEN">Not</span> Target.Value = &quot;&quot; <span class="TOKEN">Then</span>
Target.Offset(0, 2).Value = Len(Target.Value)
<span class="TOKEN">Else</span>
Target.Offset(0, 2).Value = &quot;&quot;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Set</span> RaBereich = <span class="TOKEN">Nothing</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)</font>

dakawa
16.01.2005, 16:06
hab ich so schön mich angestrengt und doch alles umsonst....
Dein Ansatz sieht auch schöner aus :D

Trotzdem geht das mit dem Code noch nicht so richtig. Wenn ich in der Spalte Notizen was eingebe, dann füllt sich die Spalte Zeichen nicht.
wieso? ich schließe mal aus, dass mich mein Computer ärgern will?? :)

gruß
dakawa

jinx
16.01.2005, 16:18
<font size="2" face="Century Gothic">Moin, dakawa,

ganz ehrlich: keine Ahnung ;) Ich habe den Code noch etwas angepasst, um Fehler beim Erfassen von mehreren Zellen zu verhindern:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
&nbsp;
<span class="TOKEN">Private Sub</span> Worksheet_Change(<span class="TOKEN">ByVal</span> Target <span class="TOKEN">As</span> Excel.Range)
<span class="REM">' Klassenmodul der Tabelle</span>
<span class="REM">' bei Eingabe in Spalte Notizen wird die Zeichenl&auml;nge ermittelt</span>
<span class="TOKEN">Dim</span> RaBereich <span class="TOKEN">As</span> Range
<span class="TOKEN">If</span> Target.Count &gt; 1 <span class="TOKEN">Then</span>
MsgBox &quot;Nur f&uuml;r einzlne Zellen&quot;
Application.EnableEvents = <span class="TOKEN">False</span>
Range(Target, Target.Offset(0, 2)).ClearContents
Application.EnableEvents = <span class="TOKEN">True</span>
<span class="TOKEN">Exit Sub</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Set</span> RaBereich = Range(&quot;I2:I999&quot;)
<span class="TOKEN">If</span> Intersect(Target, RaBereich) <span class="TOKEN">Is</span> <span class="TOKEN">Nothing</span> <span class="TOKEN">Then</span> <span class="TOKEN">Exit Sub</span>
<span class="TOKEN">If</span> <span class="TOKEN">Not</span> Target.Value = &quot;&quot; <span class="TOKEN">Then</span>
Target.Offset(0, 2).Value = Len(Target.Value)
<span class="TOKEN">Else</span>
Target.Offset(0, 2).Value = &quot;&quot;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Set</span> RaBereich = <span class="TOKEN">Nothing</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Anonsten solltest Du einen Blick in die angehängte Mappe werfen und kundtun, ob es da auch nicht läuft.</font>

dakawa
16.01.2005, 17:08
super. jetzt funktioniert es. aber nur einzeln.
ich habe nämlich schon eine Worksheet_Change Routine, die sich auf die Spalte A bezieht. Wie kann man beide Routinen mit einander koppeln, damit die eine Routine ausgeführt wird, wenn in A was geändert wird und die zweite Routine ausgeführt wird, wenn in I was geändert wird. Gibts sowas wie Column(A)_change?

Gruß Dakawa

jinx
16.01.2005, 17:16
<font size="2" face="Century Gothic">Moin, dakawa,

stand etwas davon in irgendeinem der ersten beiden Beiträge? Dann müssen die einzelnen Bereiche auch einzeln abgefragt werden - in jeweils einem Teil einer IF-ELSE- bzw. ELSEIF-Abfrage. </font>

dakawa
16.01.2005, 19:01
davon stand nichts in meinen ersten Beiträgen. Habe es ja selbst jetzt erst gemerkt. :rolleyes:
Gibt es eine Funktion, die mir sagt, welche Zelle zuletzt geändert wurde. Danach könnte man ja dann die If...ElseIf...Anweisung gestalten. Wenn also in Spalte A was geändert wurde, dann muss die Routine für A ausgeführt werden und wenn zuletzt in I was geändert wurde, dann eben die Routine für I.

gruß
Dakawa

jinx
16.01.2005, 19:08
<font size="2" face="Century Gothic">Moin, dakawa,

das kann man aus Target ableiten, wobei Target.Column die Spaltenzahl wiedergeben würde. Diese kann man dann entweder in einer Select Case-Anweisung direkt mit den einzelnen weiteren Befehlen auswerten oder von dort können die einzelnen Untermakros mit Übergabe des Bereiches aufgerufen werden.</font>

dakawa
16.01.2005, 19:11
Deine Antwortgeschwindigkeit ist ja wahnsinn! :boah: Schon fast wie Chatten :top:
Ich werd mich mal daran versuchen. Wenns nicht klappt, meld ich mich nochmal.

Danke erstmal
Dakawa