Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1436to1440
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
Inhaltsverzeichnis

Flexible, verschachtelte Arrays zählen

Flexible, verschachtelte Arrays zählen
13.07.2015 15:54:15
Christian
Hallo zusammen,
ich hänge momentan an folgendem Problem.
Ich habe zwei Texte (ca. 100 Wörter), die ich miteinander vergleichen möchte.
Dazu habe ich mir folgendes Vorgehen überlegt, da ich prüfen muss, ob teilweise Sätze ähnlich sind.
Ich erstelle ein Array und lese den Text ein.
Dann teile ich den Text mittels Split, sodass jedes Wort im Array steht.
Als nächstes soll dann Wort 1 bis 4 in ein eigenes Array geschrieben werden.
Gefolgt von Wort 2 bis 5, dann 3 bis 6 usw.
Das Gleiche mache ich dann auch mit dem zweiten Text.
Anschließend erfolgt der Abgleich der Arrays.
Wie oft ist das Array mit den Wörtern 1 bis 4 in Text 2 vorhanden?
Wie oft 2 - 5 usw.
Ich bin bisher nur bis zum Split gekommen, also dass ich die Wörter als einzelne Positionen im Array habe.
Für den Rest benötige ich Eure Hilfe.
Besten Dank im Voraus

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Du könntest statt vbFkt 'Split' die ebenfalls ...
13.07.2015 19:46:22
Luc:-?
…auf Split basierende UDF Splint benutzen, Christian,
wenn du das nicht alles selbst pgmmieren willst. Die kannst du dann in einem PgmZyklus (sog Schleife), der von 1 bis anzahlWorteImSatz - 3 läuft, einsetzen. Die UDF enthält bereits einen Auswahl­Mechanismus, der auf jeweils 4 Elemente (Worte) bei flfd wechselndem Beginn eingestellt wdn kann. Anderenfalls müsstest du wohl WorksheetFunction.Index einsetzen bzw den entsprd Teil der UDF übernehmen. Die Einzel-Arrays könnten dem AuswahlStart analog indiziert wdn und bilden dann einen Variant mit einem Array, genauer, ein Array, dessen Elemente ebenfalls aus Arrays bestehen. Dieser Vektor ist vertikal orientiert, während seine Element­Vektoren horizontal orientiert sind. Der Index für alle Vektoren (auch den vertikalen HptVektor!) ist stets 1dimensional. Ein Element eines Element­Vektors wird mit (i)(j) indiziert.
Mit einer um diese (innere) Schleife herum­liegenden äußeren, könntest du einen Text­Satz nach dem anderen aufrufen. Wenn du für alle Sätze ebenfalls einen Vektor anlegst, der dann den jeweiligen vertikalen SatzVektor enthält, kommst du auf 3 separate Indizes (i)(j)(k). i für den jeweiligen Satz, j für dessen 4-Elemente-Variationen und k für ein einzelnes Wort in der jeweiligen Variation.
Nachfolgend wird das WirkungsPrinzip für einen Satz, bei Einsatz der UDF in einer ZellFml gezeigt:
 KLMN
1Franz fährt heute mit dem Zug von Berlin nach Dresden.
2Franzfährtheutemit
3fährtheutemitdem
4heutemitdemZug
5mitdemZugvon
6demZugvonBerlin
7ZugvonBerlinnach
8vonBerlinnachDresden.
9K2:N2;K3[:N8]: {=Splint(K$1;;ZEILEN(A$1:A1);ZEILEN(A$1:A1)+3)}

Der PgmCode der UDF ist dann hier zu finden. Dort sind aber marginale Korrekturen nicht enthalten, weshalb ich ausnahmsweise noch den letzten Stand einstelle:

Rem Bildet aus Einzeltexten TeilTextFelder von…bis…Pos (lfdElemNr) im Text
'   m.d.Möglichkeit Ersatz d.jeweiligen Endposition durch d.letzte Element
'   Vs 1.2a -Autor: LSr -CDate:20070427 -1Pub:20070428herber -LUpd:20080109n
Function Splint(Text, Optional Trenner As String = " ", Optional ByVal AnfPos As Integer, _
Optional ByVal EndPos As Integer, Optional ByVal LetztEnd As Boolean)
Dim i As Long, j As Long, l As Long, m As Long, TxtVkt, x, y() As String
If AnfPos = 0 And EndPos = 0 Then Splint = Split(Text, Trenner): Exit Function
If InStr(Text, Trenner) = 0 Then
m = Len(Text)
TxtVkt = Evaluate("if(row(1:" & m & ")=0,0,mid(""" & Text & """,row(1:" & m & "),1))")
Else: TxtVkt = Split(Text, Trenner): m = UBound(TxtVkt) + 1 - LBound(TxtVkt)
End If
If AnfPos = 0 Then AnfPos = 1
If EndPos = 0 Then EndPos = m
l = EndPos - AnfPos: If l = AnfPos And i  l) Then y(l) = x: Exit For
Next x
Splint = y
End Function
Übrigens, diese alte UDF ist nicht aktiv matrixfml-fähig, d.h., ihr Argument1 (Text) muss stets ein einzelner Text oder ein Bezug auf einen solchen (nur 1 Zelle!) sein.
Gruß, Luc :-?
Besser informiert mit …
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige