Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Zu komplizierte Formel bei einfachem Kopiervorgang
#1
Hallo,

für eine sehr einfache Aufgabe habe ich wahrscheinlich eine viel zu komplizierte Formel entwickelt, die es zu optimieren gilt.
Aus einem durch die Prozedur Stringkonstruktion (s.Code) in die Zelle A1 geschriebenen String sollen Teilstrings in einen zweiten String kopiert werden, der in der Zelle A2 steht. Die entsprechenden Zeichen des Strings in A2 werden dabei überschrieben.

Bei Wiederholung des Kopiervorgangs mit anderen Startparametern (s. Code) bleiben die Ergebnisse aus vorhergehenden Kopiervorgängen im String der Zelle A2 bestehen. Für diesen einfachen Kopiervorgang habe ich eine funktionierende Formel entwickelt. Diese Formel erscheint mir jedoch zu lang und zu kompliziert. D.h. ich habe entweder die Replace nicht richtig verstanden oder bin damit einen völlig falschen Weg gegangen.

Code:
Sub Stringkonstruktion()
'Schreiben von 2 Strings in die Zellen A1 + A2
'Einstellung der Proportionalschrift zum besseren Vergleich des Ergebnis
Range("A:A").Font.Name = "Courier New"
Range("A1") = "Teile dieses Strings sollen in Zelle A2 kopiert werden. Dabei wird der Startpunkt vbStart und " & _
"die Länge vbLänge angegeben. Wird der Kopiervorgang wiederholt, bleiben die kopierten Zeichen aus dem " & _
"vorhergenden Vorgang bestehen."
'Einstellen der Zellenbreite
Columns(1).EntireColumn.AutoFit
'String in Zelle A2 muss Aufgabe entsprechend mindestens so lang sein wie der in Zelle A1
Range("A2") = String(Len(Range("A1")) + 10, "X")
End Sub

'*******************  Eigentlicher Kopiervorang mit Problemformel:

Sub Kopieren_von_Teilstrings_in_Zelle_A2()
Dim vbZelleA1 As String, vbZelleA2 As String, vbStart As Integer, vbLänge As Integer
'Parameter um Teilstring aus Zelle A1 in Zelle A2 zu kopieren
'Beliebige Zahlen innerhalb der durch die Länge von A1 gegebenen Grenzen
vbStart = 55
vbLänge = 7

If vbStart + vbLänge <= Len(Range("A1")) Then
vbZelleA1 = Range("A1")
vbZelleA2 = Range("A2")

'!!! Problemstelle: Diese Formel soll optimiert werden !!!:
vbZelleA2 = Left(vbZelleA2, vbStart - 1) & Replace(Mid(vbZelleA2, vbStart, vbLänge), _
Mid(vbZelleA2, vbStart, vbLänge), Mid(vbZelleA1, vbStart, vbLänge), 1, 1) & Right(vbZelleA2, Len(vbZelleA2) - _
vbStart - vbLänge + 1)
'Ausgabe
Range("A2") = vbZelleA2
End If

End Sub
Antworten Top
#2
Hallo,

könntest Du vielleicht den Sinn des Ganzen erläutern und eine Musterlösung vorstellen?
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#3
Hallo,
danke für dein Interesse. Sinn: Ich möchte damit die verschiedenen Stringoperationen kennen und verstehen lernen, die VBA bietet.
Zur Musterlösung: Lass bitte erst die Prozedur "Stringkonstruktion" laufen. Es werden in den Zellen A1 und A2 deines Tabellenblattes 2 Strings geschrieben.

Dann gibts du irgendwelche Werte für vbStart und vbLänge aus der 2. Codeprozedur
"Sub Kopieren_von_Teilstrings_in_Zelle_A2()"  ein und lässt diese laufen.

Es wird ein Teilstring von der Zelle A1 in die Zelle A2 kopiert. Du kannst die Werte  für vbStart und vLänge verändern, die 2. Prozedur wiederholt durchlaufen lassen und es werden weitere Teilstrings in die Zelle A2 kopiert. Die zuvor kopierten Werte aus A1 bleiben in A2 stets bestehen.
Antworten Top
#4
Hallo,

sieht man mal davon ab, dass die meisten VBA-Funktionen ein Pendant in den Funktionen haben, bei dem man die Funktionsweise in der Hilfe nachlesen kann, Machen Deine Makros doch nur Folgendes:

Das eine schreibt einen Text in A1 und eine Reihe von X in A2.
Das andere ersetzt einen Teil der X durch ein Stück Text, egal wie oft es läuft, immer das Gleiche und ander gleichen Stelle.

Wo liegt jetzt Dein Problem?
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#5
Hallo,
nein es wird nicht immer an der gleichen Stelle ersetzt. Das liegt daran, dass du bei der 2 Codeprozedur  die Werte für vbStart und vbLänge (innerhalb der möglichen Grenzen vbStart + vbLänge müssen kleiner sein als Len(Range("A1")) selbst einsetzen musst. Ich habe keine Eingabeprozdur für diese geschrieben. Lasse den Code immer Einzelschritt-Modus laufen.

vbStart gibt die Anfangsposition in dem String von A1 an
und
vbLänge die Länge des Teilstrings aus A1

Veränderst du die Werte von vbStart und VbLänge bei jedem Kopiervorgang, wirst du feststellen, dass der String aus A1 den String in Zelle A2 Stück für Stück ersetzt.
Antworten Top
#6
Hallo,

immer noch die Frage, wo liegt das Problem?
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#7
Ich gehe jetzt mal davon, dass du und vor allem alle andere Leser dieses Themas wissen, dass sie die Werte vbStart und vbLänge bei jedem Durchlauf der Prozedur selber im Code(!) neu setzen müssen, um das gewünschte Resultat zu sehen. (vbStart = 55, vbLänge = 7 waren beliebig und nur als Beispiel gedacht).

Das eigentliche Problem ist das Herzstück der ganzen Sache, also  die Formel, die die Werte für die Zelle A2 liefert:

also:
Code:
vbZelleA2 = Left(vbZelleA2, vbStart - 1) & Replace(Mid(vbZelleA2, vbStart, vbLänge), _
Mid(vbZelleA2, vbStart, vbLänge), Mid(vbZelleA1, vbStart, vbLänge), 1, 1) & Right(vbZelleA2, Len(vbZelleA2) - _
vbStart - vbLänge + 1)
Das Ganze ist ein Monster! Ich kann mir beim besten Willen nicht vorstellen, dass ich die Formel richtig, d.h. optimal entwickelt habe.
Und das wiederum, weil ich die Anwendung von Stringoperationen nicht richtig beherrsche. Es gibt so einige Formel-Virtuosen in diesem Forum. Und da hoffe ich etwas von zu lernen und besser zu verstehen.
Antworten Top
#8
Hallo,

dann machs mal so:






Code:
Sub Kopieren_von_Teilstrings_in_Zelle_A2()
Dim vbZelleA1 As String, vbZelleA2 As String, vbStart As Integer, vbLänge As Long
'Parameter um Teilstring aus Zelle A1 in Zelle A2 zu kopieren
'Beliebige Zahlen innerhalb der durch die Länge von A1 gegebenen Grenzen
Randomize
vbLänge = Application.WorksheetFunction.RandBetween(1, Len(Range("a1")) / 2)
vbStart = Application.WorksheetFunction.RandBetween(1, Len(Range("a1")) - vbLänge)

Range("A2") = Application.WorksheetFunction.Replace(Range("A2"), vbStart, vbLänge, Mid(Range("A1"), vbStart, vbLänge))

End Sub
Die Hilfe in VBA funktioniert über F1!
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#9
Hallo Edgar,

genau das meinte ich. Danke für deinen Lösungsvorschlag, der scheint gut zu funktionieren und ich muss mir jetzt erst mal anschauen, wie du deine Formel aufgebaut hast. Habe gestern wirklich lange an meinem "Monster" rumgeschraubt.

Nichtsdestrotz, wenn es es noch andere Lösungen gibt, ich lerne gerne dazu. Je mehr Lösungen dafür, umso besser.
Antworten Top
#10
So ich habe mir die Lösung jetzt nochmal etwas genauer angesehen und muss dazu sagen, dass ich bei der Entwicklung meiner Formel mangels falscher Literatur wohl auch nie so richtig eine Chance hatte.

Deshalb erlaube ich mir hierzu mal folgenden Link zu posten, der die Funktion meiner Meinung nach sehr gut erklärt.

Erklärung für die WorksheetFunction.Replace Funktion

http://codevba.com/excel/WorksheetFuncti...5oCyhJGqUk
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste