Clever-Excel-Forum

Normale Version: Zu komplizierte Formel bei einfachem Kopiervorgang
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
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
Hallo,

könntest Du vielleicht den Sinn des Ganzen erläutern und eine Musterlösung vorstellen?
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.
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?
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.
Hallo,

immer noch die Frage, wo liegt das Problem?
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.
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!
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.
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
Seiten: 1 2