Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
944to948
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
944to948
944to948
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Formatierung mit VBA
22.01.2008 21:10:18
alex
Hallo zusammen,
ich habe folgendes Problem:
ich möchte durch die Eingabe in Zellen der (Bsp:) Spalte A Begriffe wie z. B. 100 m oder 1000 m eintragen.
Die benachbarten Zellen der Spalte B sollten dann mit einer entsprechenden Formatierung reagieren.
Also für 100 m mit 0,0 (ss,0) und für 1000 m mit 00:00 (mm:ss). Dadurch möchte ich in meinen Eingaben flexibel bleiben. Also jenachdem was in der linken Zelle steht reagiert dann die rechte Zelle mit der Formatierung. In diese Zelle schreibe ich nur noch den erreichten Wert, der dann richtig formatiert ist. Puhh! Der unten stehende Code ist mir empfohlen worden, aber ohne dass es läuft. Keine Ahnung.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Leerstelle As Integer
Dim Zahl As Integer
On Error Resume Next
If Not Target.Address = "$A$1" Then Exit Sub
Leerstelle = Application.WorksheetFunction.Find(" ", Range("A1"))
Zahl = Left(Range("A1"), Leerstelle - 1)
If Zahl = 100 Then
Range("B1").NumberFormat = "0.0"
ElseIf Zahl = 1000 Then
Range("B1").NumberFormat = "mm:ss"
End If
End Sub


22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Formatierung mit VBA
22.01.2008 21:46:00
Ulf
Hallo Alex
1. bei dem cde geht es nur wenn du einen Eintrag in Zelle A1 machst
Nutz du die ganze Spalte 1 ?
2. wie gibst du die Werte in Spalte2 ein?
mfg Ulf

AW: Formatierung mit VBA
22.01.2008 21:52:46
alex
hi ulf,
hab schon gewartet.
ich möchte jede zelle der spalte 1 nutzen können. einträge sind wie schon erwähnt 100 m oder 1000 m ...
(kann ich ja dann im code beliebig ändern).
in spalte 2 gebe ich dann neben 100 m : 13,1 ein und bei 1000 m : 03:30 oder 3:30
weiß auch nicht wieso der 1. code nicht lief.

AW: Formatierung mit VBA
22.01.2008 21:49:00
Daniel
HI
der Code kann nicht funktionieren, weil ZAHL als INTEGER deklariert ist (ne Zahl bis c.a. 32000)
die Funktioin LEFT gibt aber immer einen Text zurück, deswegen kannst du das Ergebnis der LEFT-Funktion nicht der Variablen ZAHL zuweisen, weil hier unterschiedliche Tatentypen aufeinanderstossen (Integerzahl und Text)
Und ein Text ist ein Text, auch wenn er nur aus Ziffern besteht, dh "100" (als Text) ist grundsätzlich was anderes als 100 als Zahl.
damit dein Makro funktioniert, musst du den Text erst mit einer speziellen Funktion in eine Zahl umwandeln.
das geht, wenn der Text nur aus Ziffern besteht (bzw genau wie eine Zahl aussieht)

Zahl = CInt(Left(Range("A1"), Leerstelle - 1))


oder mit ZAHL as Stringvarible arbeiten, der Code sieht dann so aus:


Private Sub Worksheet_Change(ByVal Target As Range)
Dim Leerstelle As Integer
Dim Zahl As String
On Error Resume Next
If Not Target.Address = "$A$1" Then Exit Sub
Leerstelle = Application.WorksheetFunction.Find(" ", Range("A1"))
Zahl = Left(Range("A1"), Leerstelle - 1)
If Zahl = "100" Then
Range("B1").NumberFormat = "0.0"
ElseIf Zahl = "1000" Then
Range("B1").NumberFormat = "mm:ss"
End If
End Sub


hier die Anführungszeichen beachten, da 100 und 1000 hier keine Zahlen mehr sind, sondern Texte.
Gruß, Daniel

Anzeige
AW: Formatierung mit VBA
22.01.2008 22:06:34
Ulf
Hi
Habe es abgeändert
Wenn du eine Eingabe zBsp. 03:30 machst heißt es 3 Std und 30 min
Ich habe es geändert, das er dir den Wert gleich umwandelt in 3 min und 30 sek

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Leerstelle As Integer
Dim Zahl As Integer
On Error Resume Next
If Target.Column = 1 Then
Leerstelle = Application.WorksheetFunction.Find(" ", Target)
Zahl = CInt(Left(Target.Value, Leerstelle - 1))
If Zahl = 100 Then
Target.Offset(0, 1).NumberFormat = "0.0"
ElseIf Zahl = 1000 Then
Target.Offset(0, 1).NumberFormat = "mm:ss"
End If
End If
If Target.Column = 2 Then
Leerstelle = Application.WorksheetFunction.Find(" ", Target.Offset(0, -1))
Zahl = CInt(Left(Target.Offset(0, -1).Value, Leerstelle - 1))
If Zahl = 1000 Then
Application.EnableEvents = False
Target.Value = Target.Value / 60
Application.EnableEvents = True
End If
End If
End Sub


mfg Ulf

Anzeige
AW: Formatierung mit VBA
22.01.2008 22:07:00
alex
hallo daniel,
vielen dank für deine beteiligung.
klappt auch nicht. vielleicht kappiere ich nicht und hab mich falsch ausgedrückt.
wenn ich jetzt in zelle a1 eine zeichenfolge (100 m oder nur 100) eingebe soll er die nachbarzelle rechts in 0,0 sodass ich nur noch Bsp. 13,4 eingeben muss. das gleiche bei 1000m nur dann 03:30.
bei dem code gebe den wert für 1000 m rechts daneben ein, die zelle nimmt das format an.
danach schreibe ich 100 links daneben, geben in die rechte nachbarzelle 13,5 ein, und dann wandelt er es wieder in das 1000 m - format. mist.

AW: Formatierung mit VBA
22.01.2008 22:27:00
Ulf
Hi
mal ein Versuch von mir
Habe ja nicht gewusst das deine Eingaben mal 100 m oder 100m oder 100 sein kann
Hab mal versucht es so zu lösen
viel Glück

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
Dim Zahl As Integer
If Target.Column = 1 Then
For i = 1 To Len(Target.Value)
On Error GoTo w1
Zahl = Zahl & Mid(Target.Value, i, 1)
Next i
w1:
If Zahl = 100 Then
Target.Offset(0, 1).NumberFormat = "0.0"
ElseIf Zahl = 1000 Then
Target.Offset(0, 1).NumberFormat = "mm:ss"
End If
End If
If Target.Column = 2 Then
For i = 1 To Len(Target.Value)
On Error GoTo w2
Zahl = Zahl & Mid(Target.Offset(0, -1).Value, i, 1)
Next i
w2:
If Zahl = 1000 Then
Application.EnableEvents = False
Target.Value = Target.Value / 60
Application.EnableEvents = True
End If
End If
End Sub


mfg Ulf

Anzeige
AW: Formatierung mit VBA
22.01.2008 22:37:00
alex
oh mann ulf,
du hasts geschafft (glaub ich), aber sieht bisher gut aus (is nich leicht mit mir, ich weiss)
ich teste noch und melde mich morgen wieder wenns noch fragen gibt.
danke auch an daniel
c.u.

AW: Formatierung mit VBA
22.01.2008 22:30:00
alex
hallo ulf,
tut mir leid aber geht immer noch nicht; liegt bestimmt an mir.
wenn ich vorher in spalte A 1000 stehen hatte und daneben dann in spalte B 03:30
und ich dann in der selben zelle der spalte A 100 schreibe und daneben in spalte B 13,3
dann zeigt er mir in dieser Zelle 12:00 an ( will aber 13,3) und in der bearbeitungszeile oben zeigt er gar einen datumswert nämlich: 13.01.1900 07:12:00 an.
muss ich vielleicht im Modul selber noch die optionen der beiden dropdownfelder verändern.
bei mir steht da: (allgemein) und worksheet_change
ich hab den code sogar in "tabellenblatt 1" und in "diese arbeitmappe" eingefügt. auch nischt.
bin verzweifelt!

Anzeige
AW: Formatierung mit VBA
22.01.2008 22:39:26
Daniel
Hallo
Probier mal das hier:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column  1 Then Exit Sub
If Target.Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Target, "*1000*") > 0 Then
Target.Offset(0, 1).NumberFormat = "mm:ss"
ElseIf WorksheetFunction.CountIf(Target, "*100*") > 0 Then
Target.Offset(0, 1).NumberFormat = "0.0"
End If
End Sub


das sollte zuverlässiger funktionieren als dein Code, es wird einfach nur geprüft, ob 1000 oder 100 im der Zelle vorkommt. durch die Reihenfolge ist sichergesellt, daß der Zweig für 100 nicht auch bei 1000 ausgeführt wird.
Allerdings musst du auch bei diesem Code die Eingabe der 1000m-Zeiten in der Form 00:32:12 (also hh:mm:ss) machen, damit Excel die Eingaben auch richtig interpretiert
btw. Code, bei dem einfach mal ein pauschales ON ERROR RESUME NEXT drinnen steht, ohne das es dafür
einen zwingenden Grund gibt, weist darauf hin, daß der Ersteller des Codes von Programmierung keine Anhnung hat.
nochwas, für die 1000 m ist der Code eigentlich auch über
Gruß, Daniel

Anzeige
danke für die Backfeife
22.01.2008 22:43:00
Ulf
Hallo Daniel
Habe nie geschrieben das ich Programierprofi bin
Ich Helfe nur gerne und wenn du es besser kannst dann Helfe
Ich lerne auch gerne dazu
mfg Ulf

AW: danke für die Backfeife
22.01.2008 22:58:00
alex
hey leute,
war meine schuld, bin halt (noch) zu blöd dafür und hab mich oft falsch ausgedrückt.
kein knatsch deswegen.
daniel,
hab deinen auch probiert, hat aber leider nicht geklappt, weiss nicht was ich falsch mach.
aber ulf sein funzt jetzt. saugeil!!
ihr seid echt spitze, danke an euch zwei nochmal.
bis evtl. morgen

AW: nachfrage
22.01.2008 23:17:00
Daniel
Hi
mal ne Frage, was hat nicht geklappt ?
würde mich jetzt schon mal interessieren, denn bei mir gings einwandfrei
allerdings hab ich nur das Eintragen der Formate umgesetzt, nicht das Umrechnen der Eingabewerte.
Gruß, Daniel

Anzeige
AW: nachfrage
22.01.2008 23:55:00
alex
hi daniel,
habe den code in tabelle 1 eingefügt, dann in der 1. zelle der 1. Spalte (A) 1000 eingegeben.
nebenzelle (Spalte B) hab ich wie du gesagt hast als beispiel: 00:03:30 für 3 minuten und 30 sec eingegeben. dann hat er das format hh:mm:ss angenommen.
dann bin ich wieder auf A1 zurück und hab 100 eingegeben.das format hat es dann nicht verändert.
trotzdem bin ich dann auf nebenzelle, also B1 und hab 13,7 eingegeben. das format hat er nicht angenommen, sondern den wert 13,7 umgewandelt in hh:mm:ss also 16:48:00.
das war alles.
bin morgen wieder da um deine antwort zu lesen, muss morgen früh raus
bis dann
alex

Anzeige
AW: nachfrage
23.01.2008 00:33:00
Daniel
Hi
am Anfang hast du geschrieben, du gibst "1000 m" und "100 m" ein und brauchst deswegen den aufwendigen Code, um das abzufragen.
jetzt gibst du plötzlich nur noch 100 und 1000 ein,damit hast du Zahlen und das passt für meine Code wieder nicht. Im Prinzip das gleiche Problem wie beim ersten Code, nur anders rum
mein Vorschlag, übe ein wenig Selbstdisziplin, entscheide dich ob du nur die Zahl oder Zahlen und buchstaben eingeben willst.
Solltet du dich für Zahlen entscheiden, reicht natürlich das hier aus:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column  1 Then Exit Sub
If Target.Cells.Count > 1 Then Exit Sub
if target.value = 100 then Target.offset(0,1).numberformat = "0.0"
if Target.Value = 1000 then Target.offset(0,1).Numberformat = "mm:ss"
End Sub


wenn du dich nicht entscheiden kannst und es mal so und mal so eingeben willst (was in der Liste dann aber scheisse aussieht), sollte es so funktionieren:


Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column  1 Then Exit Sub
If Target.Cells.Count > 1 Then Exit Sub
If InStr(Target.Text, "1000") > 0 Then
Target.Offset(0, 1).NumberFormat = "mm:ss"
ElseIf InStr(Target.Text, "100") > 0 Then
Target.Offset(0, 1).NumberFormat = "0.0"
End If
End Sub


Gruß Daniel

Anzeige
AW: danke für die Backfeife
23.01.2008 00:13:00
Daniel
Hi
ist ja kein Problem,
aber ein Pauschales On Error Resume Next wirkt sich in einem Programm oft fatal aus, weil das Programm bei einem Fehler nicht mehr stoppt, sondern fröhlich weiter rechnet.
Man wundert sich dann zwar über seltsame, falsche oder unerwünschte Ergenisse, aber die Suche nach den Fehlerursachen gestaltet sich ungleich schwieriger, weil man keinen Anhaltspunkt hat, wo der Fehler liegen könnte.
Bei einem Programmabbruch bekommt man einen klaren Hinweis, an welcher Stelle man ansetzen muss, um den Fehler zu beheben (meistens zumindest).
kurz gesagt, es ungefähr so sinnvoll, wie wenn man sich mit einem Strick um den Hals am Autositzt festbindet und trotzdem glaubt, man wäre sicher angeschnallt.
Ich hoffe, du verstehts jetzt meinen ersten Kommentar zum Thema.
wenn man ein Problem mit Fehlern hat und mit ON ERROR RESUME NEXT arbeiten will, sollte man folgende Regeln beachtgen:
1. ON ERROR RESUME NEXT steht immer möglichst dicht vor der Programmzeile, von der man weiss, daß sie Fehler erzeugen kann.
2. danach schreibt man möglichst bald wieder ON ERROR GOTO 0, damit bei unbabsichtigten Fehlern wieder abgebrochen wird.
3. sollte danach eine Prüfung erfolgen, ob ein Fehler vorliegt und im Programm entsprechend darauf reagiert werden.

hier mal ein Beispiel, wie sowas aussehen kannt:
- per Inputbox wird eine Zahl eingegeben. Weil man bei einer Inputbox ja auch Text eingeben kann, kann es hier zu Fehlern im Programmablauf kommen.

Sub Test()
Dim Eingabe As Integer
Eingabe = 0 ' oder ein anderer, zulässiger Wert, der aber in der Regel nicht vorkommt
'--- Eingabe wegen Fehlermöglichkeit in On Error gekapslt
On Error Resume Next
Eingabe = InputBox("Bitte Zahl eingeben")
On Error GoTo 0
'--- Prüfung auf Fehler und berechnung, wenn es zu einem Fehler kam
'--- bleibt der Ausganswert der Variabel Eingabe (0) unverändert
If Eingabe = 0 Then
MsgBox "Es wurde keine gültige Zahl eingegeben, es wird nichts berechnet" 'das passiert  _
beim Fehler
Else
MsgBox "Das Quadrad von " & Eingabe & " ist " & Eingabe ^ 2 ' Berechnung, wenn kein Fehler
End If
End Sub


Eine weiter Mehtode zu prüfen, ob ein Fehler passiert ist, ist die Abfrage der Systemvariable err
diese hat normalerweise den Wert 0, bei einem Fehler bekommt sie einen anderen Wert zugewiesen (im Prinip den Fehlercode).
eine Typische Prüfung sähe dann so aus (Beispielhaft)


on error resume next
... hier folgt Code, der Fehler erzeugen kann
if err = 0 then
msgbox "alles Paletti"
else
msgbox "Achtung Fehler, Fehlercode ist " & err
end if
On error goto 0


On error goto 0 kann man in diesem Fall erst dann verwenden, nachdem man err abgefragt hat, weil dabei err wieder auf 0 gesetzt wird.
Es gibt noch die Variable ERROR, die einen Hinweistext zum Fehler enthält.
Schließlich gibt es noch ein paar fälle, wo man es auch ohne Prüfung einsetzen kann, aber auch hier wird nur der Codeteil in die OnErrors gekapselt, der den Fehler erzeugen kann.
Beispiel:
ich will das Tabellenblatt mit dem Namen "xxx" per Makro-Code löschen.
da es aber sein könnte, daß es nicht vorhanden ist, weil ein Aufmerksamer Anwender es schon von Hand gelöscht hat, müsste ich hier um fehler zu vermeiden vorab prüfen, ob es überhaupt vorhanden ist.
das ist etwas aufwendig viel einfacher geht es in diesem Fall mit:


On Error Resume Next
Sheets("xxx").delete
On Error Goto 0


Auf Fehler braucht hier nicht geprüft zu werden, weil im Fehler - wie im Nicht-Fehlerfall das gleiche Ergebnis vorliegt: Blatt "xxx" ist nicht mehr vorhanden.
Allerdings sollte man sowas nur selten einsetzen und lieber vorab mit Fehlerfreien Methoden prüfen (wenn es nicht zuviel aufwand macht).
so, genug damit , ich hoffe du hast was dazu gelernt und bist wieder ein etwas besserer Programmierer geworden.
Gruß, Daniel

Anzeige
Eine Zusatzpfeife...
23.01.2008 08:51:15
Renee
Hi Daniel,
Da InputBox immer einen String zurückgibt, halte ich dein Code-Beispiel mit einer Fehlerbehandlung für ziemlich unsinnig.
GreetZ Renée

Soso! Eingabe wurde aber als Integer...
23.01.2008 13:54:53
Luc:-?
...deklariert, Reneé;
da klappt die automatische Typumwandlung nur bei Zahlen. Alles andere führt zu Fehler, weshalb ich auch nicht so arbeiten würde. Der Fehler wird ja erst mit On Error Resume Next ignoriert und dann mit On Error GoTo 0 ins Fehler-Nirvana gedrückt. Ob es dann noch irgendwo zur Eingabe-0-Prüfung kommt, scheint mir fraglich...
Aber was das mit "Quadrädern" zu tun hat, ist mir doch schleierhaft, Daniel... ;-)
Übrigens scheint Ulf Berliner zu sein - da hat man die deutsche Lautverschiebung bereits vollendet (Berlin ist auch hierbei - wie meist - vorneweg): anlautendes pff und dito zß oder gar s
Gruß aus B-Bb
Luc :-?

Das mit dem Integer...
23.01.2008 14:10:26
Renee
habe ich nicht übersehen, Lucius.
Ich wehre mich gegen implizite Typenumwandlungen, indem ich sie nicht anwende (oder mir zumindest 100% bewusst bin, wenn ich's tue) !
Wenn Daniel schon Programmierunterricht erteilen will, würde ich ihm raten, das nicht mit Beispielen zu tun, bei denen SchülerInnen 'solche internas' untergejubelt wird und die/der sich dann die Haare raufen, da sie doch im 'heiligen Buch' der Online-Hilfe gelesen haben, das da ein String zurückkommt und dann in einer Ganzzahl landet und überhaupt.... etc.etc.
De programmibus non disputandum est.
GreetZ Renée

Von dir hier aber eigentl ohne NON oder... ;-) orT
23.01.2008 14:21:00
Luc:-?
Gruß Luc :-?

AW: Das mit dem Integer...
23.01.2008 20:17:05
Daniel
Hi
wenn euch das hier besser gefällt:

Sub Test()
Dim Eingabe As Integer
Eingabe = 0 ' oder ein anderer, zulässiger Wert, der aber in der Regel nicht vorkommt
'--- Eingabe wegen Fehlermöglichkeit in On Error gekapslt
On Error Resume Next
Eingabe = CInt(InputBox("Bitte Zahl eingeben"))
Debug.Print Err
On Error GoTo 0
'--- Prüfung auf Fehler und berechnung, wenn es zu einem Fehler kam
'--- bleibt der Ausganswert der Variabel Eingabe (0) unverändert
If Eingabe = 0 Then
MsgBox "Es wurde keine gültige Zahl eingegeben, es wird nichts berechnet" 'das passiert  _
_
beim Fehler
Else
MsgBox "Das Quadrat von " & Eingabe & " ist " & Eingabe ^ 2 ' Berechnung, wenn kein  _
Fehler
End If
End Sub


klar gibts methoden, hier den Fehler grundsätzlich zu vermeiden, aber es ging hier ums prinzip, wie ne ON ERORROR RESUME NEXT einzusezten ist (wenn überhaupt)
Gruß, Daniel

AW: Das mit dem Integer...
23.01.2008 22:39:00
Daniel
Hi
was spricht denn gegen die Implizite Typumandlung ? gibts da ein wirklich ein Problem, wenn man das einsetzt oder ist das mehr ne Philosopie- und "Programmierer-Ethik"-Frage?
Wenn wir und dann genügend über die Nebensächlichkeiten ausgelassen haben, könntet ihr uns vielleichtg noch ein paar Tipps zum eigentlichen Thema, umgang mit Fehlern und korrektem Einsatz von On Error Resume Next geben?
Gruß, Daniel
btw. erst testen, dann behaupten.

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige