| |
| Blechfertigung: Leitfaden zur Materialauswahl, ein Fachartikel
|
Autor
|
Thema: excel vba | text formatierung aus zelle uebernehmen (3346 / mal gelesen)
|
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 68 Registriert: 23.07.2010
|
erstellt am: 03. Feb. 2016 21:34 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, leider ist der Titel nicht wirklich gelungen, aber mir ist keine besser Beschreibung mit wenigen Zeichen eingefallen. Hier die ausfuehrliche Variante: Ich habe ein Makro, welches auf Doppelklick in eine Zelle den Zelleninhalt ausliest und in eine Variable speichert. Darauf hin geht ein Eingabefenster auf, in das der Anwender einen beliebigen Text eingeben kann. Bestaetigt er die Eingabe wird in die Zelle der vorherige Inhalt eingefuegt, eine nuee Zeile in der Zelle (Zeilenumbruch) angewaehlt und ein Datumsstempel eingesetzt, in einer weiteren neuen Zeile der selben Zelle wird dann der Inhalt aus der Usereingabe eingefuegt. Soweit so unkompliziert. Nun moechte ich aber zur besseren Lesbarkeit die Zeitstempel formatieren. Im Prinzip reicht ein simples "fett" des Zeitstempels. Zudem soll das Format des "alten" Inhaltes natuerlich beim neu Einfuegen wieder korrekt uebernommen werden (zBsp. die alteren Zeitstempel vorn vorherigen Eingaben "fett"). Der Makrorekorder ist natuerlich reichlich nutzlos, weil er einfach die Zeichen einzeln ansteuert und einzeln formatiert. Ein automatismus ist da nicht wirklich von abzuleiten. Ich hoffe ihr habt ein paar gute Ansaetze fuer mich. (Im unten dargestelten Code sind keine eigenen Ansaetze eingebunden) Vielen Dank im Voraus. Der Beispiel Code: Deklarationen
Code: Public TimeDate As String 'Variable fuer Zeitpunkt mit Datum Public valTarget As String 'Variable zum speichern Inhalt von aktueller Zelle Public newTxT As String 'Variable fuer Texteingabe Form InsertTask Public AdrTarget As Range 'Target in Range konvertieren Public doCancel As Boolean 'Case ob cancel oder nicht fuer Form InsertTask
Code Doppelklick Event
Code: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean)valTarget = Target.Value Set AdrTarget = Target Call Main.newTask End Sub
Code Eingabemaske
Code: Private Sub CmdCANCEL_Click()doCancel = True Unload Me End Sub Private Sub CmdOK_Click() newTxT = InsertTask.inputTXT.Value doCancel = False Unload Me End Sub
Ausfuehrender Code
Code: Sub DblClick() TimeDate = Format(Now, "mm-dd-yyyy\ | hh:mm")If Not Intersect(AdrTarget, Range("h:h")) Is Nothing Then On Error GoTo ErrorHandler2 Application.EnableEvents = False InsertTask.TaskHistory.Caption = valTarget InsertTask.TimeStamp.Caption = TimeDate InsertTask.Show Select Case doCancel Case Is = False newTxT = valTarget & Chr(10) & TimeDate & Chr(10) & newTxT WSnael.Cells(AdrTarget.Row, AdrTarget.Column).Value = newTxT TimeDate = "" valTarget = "" newTxT = "" Case Is = True GoTo ErrorHandler2 End Select ErrorHandler2: Application.EnableEvents = True Cells(AdrTarget.Row, AdrTarget.Column + 1).Select End If End Sub
[Diese Nachricht wurde von sto.teac am 03. Feb. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2799 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 04. Feb. 2016 01:31 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
Hallo sto.teac Du weigerst Dich beharrlich zur Vereinfachung Excelblätter hochzuladen ... Beispiel zum Markieren Code: newTxT = valTarget & Chr(10) & TimeDate & Chr(10) & newTxT iStart = Len(valTarget) + 2 ' wegen des automatischen setzens von vbCrLf iLaenge = Len(TimeDate) With WSnael.Cells(AdrTarget.Row, AdrTarget.Column) .Value = newTxT .Characters(Start:=iStart, Length:=iLaenge).Font.FontStyle = "Fett" End With
Grüße Klaus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 68 Registriert: 23.07.2010
|
erstellt am: 04. Feb. 2016 04:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Klak, danke fuer den Ansatz, so etwas aehnliches habe ich auch fuer das Datum des neuen Eintrages zusammen gebastelt. Funktioniert soweit auch (den Code kann ich morgen von Arbeit aus hochladen). Aber das loest nicht das Problem mit den bereits vorhandenen Inhalten, da die Formatierung des textes verloren geht, sobald ich ihn in eine Variable schreibe. Und alle Zeichen einzeln auszulesen ist glaube nicht wirklich eine Loesung. PS: wegen des hochladens der Tabellen bekomme ich aerger von meinem Chef, daher muesste ich immer komplett neue Anlegen die das Problem simulieren. Weiss net ob das wirklich sinnvoll ist. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2799 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 04. Feb. 2016 08:21 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
Es geht darum dass es sehr schwierig ist aus dem geposteten Code herauszufinden wo nun die einzelnen Programmteile stehen und wie die Elemente benannt sind. Die wenigsten wollen ein Ratespiel machen. Ist Main der Name eines Modules oder der des Formular, könnte InsertTask der Formularname sein und was könnte die Prozedur Main.newTask machen? Insofern entweder alles posten oder rein beschränken auf das eigentliche Problem (werde es mir später ansehen). Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 68 Registriert: 23.07.2010
|
erstellt am: 04. Feb. 2016 18:16 <-- editieren / zitieren --> Unities abgeben:
So hier mal eine Beispieltabelle. Was mir gerade noch aufgefallen ist, ich kann in der Eingabe keinen Zeilenumbruch machen. Was muss man dafuer einstellen? Danke. edit: das mit dem Zeielnumbruch habe ich gerade gefunden. Eigenschaften der TextBox MultiLine = true EnterKeyBehavior = true
[Diese Nachricht wurde von sto.teac am 04. Feb. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2799 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 04. Feb. 2016 20:02 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
Habe noch ein wenig nachgeforscht aber leider nichts passendes gefunden. Persönlich hatte ich so eine Vorgabe auch noch nicht. Denke es wird nur die Möglichkeit geben über eine Schleife die ursprüngliche Formatierung zeichenweise zu kopieren, wenn man das so beibehalten möchte. Solltest Du etwas anderes finden wäre es hilfreich dies hier zu posten Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 68 Registriert: 23.07.2010
|
erstellt am: 04. Feb. 2016 20:21 <-- editieren / zitieren --> Unities abgeben:
Als Idee habe ich noch eine andere Variante, aber ich weiss nicht ob das ueberhaupt umsetzbar ist. Wie waere es, wenn man den vorhanden Text in der Zelle nicht in eine Variable speichert und loescht, sondern wie mit der F2-Funktion in die Zelle eintaucht und den neuen Text einfach hinten anfuegt. Ich habe mal versucht es aufzuzeichnen, aber leider bringt der Rekorder da keinen brauchbaren Ansatz. Wie sieht es bei euch aus? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pablo Mitglied Techniker
Beiträge: 453 Registriert: 23.01.2002 Win10 Office 365 SE 2020
|
erstellt am: 04. Feb. 2016 20:52 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
Zitat: Original erstellt von sto.teac: So hier mal eine Beispieltabelle. [Diese Nachricht wurde von sto.teac am 04. Feb. 2016 editiert.]
sto.teac, Fette Buchstaben in einen Array schreiben und beim Einfügen wieder formatieren (siehe Beispiel). pablo ------------------ PST => Parametersteuerung für Solid Edge TB Haberl Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 68 Registriert: 23.07.2010
|
erstellt am: 05. Feb. 2016 15:32 <-- editieren / zitieren --> Unities abgeben:
@ pablo ja das hatte ich befuerchtet, dass es auf diesem Wege gemacht werden muss. allerdings haette ich mich nicht so davor gescheut, wenn ich die Eleganz deiner Variante selbst haette entwickeln koennen. vielen Dank dafuer @klak auch dir vielen dank fuer deine Unterstuetzung edit: ich habe gerade festgestellt, dass man noch den Fehler abfangen muss, wenn das Feld vorher leer (keine Zeichen) hat. Ist kein Problem, ich wollte es nur als Hinweis da lassen [Diese Nachricht wurde von sto.teac am 05. Feb. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2799 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 06. Feb. 2016 18:53 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
Doch noch eine geschicktere Variante gefunden : Code: Sub Test_Zelle_Erweitern()Dim tZelle As Range ' übernimmt aktive Zelle Dim sNeu As String ' neuer Text Dim iAlt As Integer ' speichert die Länge des alten Zellinhaltes Dim iNeu As Integer ' Länge des neuen Textes Set tZelle = ActiveCell ' zu bearbeitende Zelle übernehmen iAlt = Len(tZelle.Text) ' Länge des alten Textes sNeu = Chr(10) & " ergänzt " & Chr(10) & Format(Now, "dd.mm.yyyy - hh:mm") ' damit wird ergänzt iNeu = Len(sNeu) ' Länge des neuen Textes tZelle.Characters(iAlt + 1, iNeu).Insert (sNeu) ' Neuen Text an das Ende der Zelle ein- bzw. anfügen tZelle.Characters(iAlt + 12, 18).Font.FontStyle = "Fett" ' Neuen Text formatieren (nur Datum) End Sub
Damit werden auch bestehende Farbgebungen und Unterstriche beibehalten ... einfach mal eine Zelle markieren und Sub mit F5 im VBA-Editor starten Grüße Klaus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 68 Registriert: 23.07.2010
|
erstellt am: 06. Feb. 2016 19:24 <-- editieren / zitieren --> Unities abgeben:
|
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2799 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 08. Feb. 2016 09:52 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
Das "Wissen" war eher Zufall als ich mir das Characters - Objektmodell einmal näher angesehen und dabei die Methoden .Insert und .Delete entdeckt habe. Mußt halt beim Umsetzen noch aufpassen dass die Zelle wirklich Text enthält bzw. bei Zahlen oder Datum vorher eine entsprechende Umformatierung ( zelle = CStr(zelle) ) machen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 68 Registriert: 23.07.2010
|
erstellt am: 09. Feb. 2016 15:27 <-- editieren / zitieren --> Unities abgeben:
Hallo Klak, deine Loesung gefaellt mir super, danke nochmal. Aber mir ist etwas anderes aufgefallen. Wenn der Zelleninhalt eine gewisse Laenge ueberschreitet, wird der neue Inhalt nicht mehr eingefuegt. Manuell (ueber F2 und dann normal tippen) kann man jedoch weiter Text eingeben. Es ist also keine Einschraenkung der Zelle selbst. Hast du einen Ansatz wo die Begrenzung herkommen koennte? Anbei der aktualisierte Code im Anhang. edit: was ich so gelesen habe scheint es mit der Funktion characters zusammenzuhaengen. Diese scheint noch das alte Limit von 255 chars zu haben und ignoriert das Einfuegen daher einfach. so ein Mist, dabei war die Loesung bis dahin so gut. [Diese Nachricht wurde von sto.teac am 09. Feb. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2799 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 20. Feb. 2016 12:04 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
Hallo sto.teac, Sorry für die späte Antwort aber Du hast recht und ich habe keine Erklärung dazu, leider. Da wirst Du wohl pablos Lösungsansatz verwenden müssen ... Aber wenn ich mir die Tabelle so ansehe wäre das für mich ein typischer Fall für eine echte Datenbank, die könnte man ganz anders aufbauen. Alternative wäre in Excel vielleicht noch das Zusammenfassen mehrerer Zeilen (wo nur ein Wert möglich ist) und ergänzen um einer weitere Zeile für jeden neuen Task. Dabei könnte man noch Datum und Text in verschieden Spalten schreiben, was die Lesbarkeit erhöhen könnte. Stell Dir mal vor der Zellwert wäre höher als der Bildschirm ... Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 68 Registriert: 23.07.2010
|
erstellt am: 20. Feb. 2016 16:18 <-- editieren / zitieren --> Unities abgeben:
Danke fuer den Hinweis Mit Datenbanken kenne ich mich leider nicht aus und im Moment habe ich auch keine Zeit dies zu aendern. Aktuell werden ja pro Task eine neue Zeile angelegt. Was mit der DoppelKlickFunktion eingfuegt wird ist quasi eine art History zum Verlauf und den Ereignissen. Geloest habe ich es jetzt so, dass ich die Gesamtzeichenlaenge (alter Text + neuer Text) abfrage. Ist der ueber 254 Zeichen nutze ich papblos Ansatz, der super funktioniert, aber leider etwas langsamer ist (somal ich noch die Farbcodierung implementiert habe). Isst der Text nicht so lang kommt deine Variante zum Einsatz
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |