Wort und Buchstabenabfragen?

Hallo liebe WWWler-Experten,

ich wüsste gerne, wie man folgende Abfragen realisieren kann?

Ich habe eine Tabelle mit Sätzen, diese bestehen aus Wörtern. Es tauchen Buchstaben, Zahlen und Sonderzeichen auf.

  1. Das längste Wort

Pro Feld möchte ich, dass man per Abfrage das längste Wort des Feldes und daneben die Zeichenlänge anzeigen kann.

Beispiel:

Hamburg ist schön / Hamburg / 7
Bonn ist der Hammer / Hammer / 5

  1. Welches Zeichen taucht am häufigsten auf?

Für eine ganze Tabelle möchte ich alle auftauchenden ZEichen (Buchstaben, Zahlen, Sonderzeichen) abfragen, mit denen dann in einer Abfrage zum Schluss herauskommt, welches Zeichen am häufigsten auftaucht:

A 9342
S 8393
T 3449
6 3432

  1. Mit welchem Wort fangen die Sätze an?

Wie splittet man in den Feldern das erste Wort, so dass man herausfinden kann, mit welchem Wort die Sätze anfangen? Danach mache ich dann daraus eine Abfrage, welches Wort am häufigsten am Satzanfang steht.

  1. Welches Wort taucht am häufigsten auf? Praktisch wie 2. nur halt hier mit Wort statt mit Zeichen.

  2. Die meisten Wörter pro Satz

Pro Satz soll die Anzahl der Wörter angezeigt werden.

  1. Die meisten verschiedenen Buchstaben bzw. Zeichen pro Satz

Praktisch wie 2. aber nicht für die gesamte Tabelle, sondern pro Satz.

Hallo lieber Analytiker,

ich wüsste gerne, wie man folgende Abfragen realisieren kann?

mit Abfragen allein gar nicht.

Ich habe eine Tabelle mit Sätzen, diese bestehen aus Wörtern.

Du meinst sicher Tabellenfelder, die jeweils einen Satz aus unterschiedlichen Wörtern beinhalten. (Wobei sich hier die Frage stellt, Was ist überhaupt ein Wort?)

Es tauchen Buchstaben, Zahlen und Sonderzeichen auf.

  1. Das längste Wort

Pro Feld möchte ich, dass man per Abfrage das längste Wort des
Feldes und daneben die Zeichenlänge anzeigen kann.

Beispiel:

Hamburg ist schön / Hamburg / 7
Bonn ist der Hammer / Hammer / 5

Solche Textuntersuchungen sind nur mit einer VBA-Funktion zu realisieren, die eben den Feldinhalt in die einzelnen Wörter aufsplittet (–> Split()-Funktion) und die jeweilige Länge ermittelt Die Anzahl der Splittungen (–>Anzahl der Wörter) und das längste Wort wird dann zurückgegeben. Der Aufruf dieser Funktion kann dann schon in einer Abfrage geschehen, damit die gesamte Tabelle durchlaufen wird.

  1. Welches Zeichen taucht am häufigsten auf?

Für eine ganze Tabelle möchte ich alle auftauchenden ZEichen
(Buchstaben, Zahlen, Sonderzeichen) abfragen, mit denen dann
in einer Abfrage zum Schluss herauskommt, welches Zeichen am
häufigsten auftaucht:

A 9342
S 8393
T 3449
6 3432

Sowas kann m. E. mit einer Abfrage eher nicht realisiert werden.

Das Prinzip zur Lösung ist ähnlich aus P1: Mittels VBA-Prozedur wird diese Sachlage berechnet. In einer Recordset-Schleife
wird die gesamte Tabelle (Datensätze) durchlaufen und bei jedem Durchlauf die Anzahl der Zeichen entspr. ihres Ascii-Codes in einem Array (das den gesamten Zeichensatz repräsentiert) aufsummiert. Danach kann eine Array-Sortierung nach absteigender Häufigkeit angesetzt werden.

  1. Mit welchem Wort fangen die Sätze an?

Wie splittet man in den Feldern das erste Wort, so dass man
herausfinden kann, mit welchem Wort die Sätze anfangen? Danach
mache ich dann daraus eine Abfrage, welches Wort am häufigsten
am Satzanfang steht.

Oben schon gesagt: dafür gibt es die Split()-Funktion. Die ist aber in einer berechneten Abfragespalten nicht direkt verwendbar, so dass auch hier eine Public-Funktion, die diese Splittung erledigt, herhalten muss.

  1. Welches Wort taucht am häufigsten auf? Praktisch wie 2. nur
    halt hier mit Wort statt mit Zeichen.

dito wie oben, wobei halt ein dynamisches Array (wird mit jedem neu auftauchenden Wort erweitert) benutzt wird, um die Anzahl der selben Wörter zu ermitteln.

  1. Die meisten Wörter pro Satz

Pro Satz soll die Anzahl der Wörter angezeigt werden.

Das erledigt auch die Splitfunkton. Diese liefert ein Array mit genaus der Anzahl Elementen, wie Wörter vorhanden sind. Mit der UBound()-Funktion läßt sich die Anzahl der Elamente des Arrays auslesen.

  1. Die meisten verschiedenen Buchstaben bzw. Zeichen pro Satz

Praktisch wie 2. aber nicht für die gesamte Tabelle, sondern
pro Satz.

dito wie oben, halt auf einen Datensatz (Berechnung bei jedem Durchlauf) beziehen.

Gruß
Franz, DF6GL

PS: für einen Teil der Aufgaben käme auch der Einsatz der „Regular Expressions“ in Frage… Diese Regulären Ausdrucke sind aber ziemlich kryptisch in der Handhabung…

Hi Marco,

für

  1. Mit welchem Wort fangen die Sätze an?

Wie splittet man in den Feldern das erste Wort, so dass man
herausfinden kann, mit welchem Wort die Sätze anfangen? Danach
mache ich dann daraus eine Abfrage, welches Wort am häufigsten
am Satzanfang steht.

hätte ich einen Lösungsvorschlag mit einer Abfrage:

Beispiel:
• Ausgangstabelle: tblSatz
• Tabellenfeld in der Ausgangstabelle: Satz

Mit folgender Abfrage erhält man die entsprechende Liste mit dem ersten Wort eines Satzes und der betreffenden Anzahl:

SELECT Left(Trim(Replace(Replace([Satz] & „“,Chr$(13)," „),Chr$(10),“")),InStr(Trim(Replace(Replace([Satz] & „“,Chr$(13)," „),Chr$(10),“")) & " „,“ „)-1) AS ErstesWort,
Count(Left(Trim(Replace(Replace([Satz] & „“,Chr$(13),“ „),Chr$(10),“")),InStr(Trim(Replace(Replace([Satz] & „“,Chr$(13)," „),Chr$(10),“")) & " „,“ „)-1)) AS ErstesWortAnzahl
FROM tblSatz
GROUP BY Left(Trim(Replace(Replace([Satz] & „“,Chr$(13),“ „),Chr$(10),“")),InStr(Trim(Replace(Replace([Satz] & „“,Chr$(13)," „),Chr$(10),“")) & " „,“ „)-1)
ORDER BY Count(Left(Trim(Replace(Replace([Satz] & „“,Chr$(13),“ „),Chr$(10),“")),InStr(Trim(Replace(Replace([Satz] & „“,Chr$(13)," „),Chr$(10),“")) & " „,“ „)-1)) DESC,
Left(Trim(Replace(Replace([Satz] & „“,Chr$(13),“ „),Chr$(10),“")),InStr(Trim(Replace(Replace([Satz] & „“,Chr$(13)," „),Chr$(10),“")) & " „,“ ")-1);
Es werden dabei auch eventuell am Satzanfang stehende Leerzeichen ignoriert, und eventuell im Tabellenfeld vorhandene Zeilenumbrüche (z.B. durch Strg+ENTER) wie Leerzeichen behandelt.

Der o. a. Beispiel-Tabellenname und -Tabellenfeldname muss natürlich noch auf Deine Bezeichnungen umgeändert werden.

mfg
Huber

Hi Marco,

und für

  1. Die meisten Wörter pro Satz

Pro Satz soll die Anzahl der Wörter angezeigt werden.

hätte ich auch einen Lösungsvorschlag mit einer Abfrage:

Beispiel:
• Ausgangstabelle: tblSatz
• Tabellenfeld in der Ausgangstabelle: Satz

Mit folgender Abfrage erhält man die entsprechende Liste mit den Sätzen und daneben die Anzahl der Worte:
SELECT tblSatz.Satz,
Len(Trim(Replace(Replace(Replace(Replace(Replace([Satz] & „“,Chr$(13)," „),Chr$(10),“"),Space$(4)," „),Space$(3),“ „),Space$(2),“ „)) & " „)-Len(Trim(Replace(Replace(Replace([Satz] & „“,Chr$(13),““),Chr$(10),"")," „,“")))+(Len(Trim(Replace(Replace(Replace([Satz] & „“,Chr$(13),""),Chr$(10),"")," „,“")))=0) AS WorteProSatz
FROM tblSatz
ORDER BY Len(Trim(Replace(Replace(Replace(Replace(Replace([Satz] & „“,Chr$(13)," „),Chr$(10),“"),Space$(4)," „),Space$(3),“ „),Space$(2),“ „)) & " „)-Len(Trim(Replace(Replace(Replace([Satz] & „“,Chr$(13),““),Chr$(10),"")," „,“")))+(Len(Trim(Replace(Replace(Replace([Satz] & „“,Chr$(13),""),Chr$(10),"")," „,“")))=0) DESC;

Es werden dabei auch eventuelle doppelte oder mehrfache Leerzeichen als einzelne Leerzeichen behandelt, und eventuell im Tabellenfeld vorhandene Zeilenumbrüche (z.B. durch Strg+ENTER) wie Leerzeichen behandelt.

Der o. a. Beispiel-Tabellenname und -Tabellenfeldname muss natürlich noch auf Deine Bezeichnungen umgeändert werden.

mfg
Huber

Hi Marco,

für

  1. Das längste Wort

Pro Feld möchte ich, dass man per Abfrage das längste Wort des
Feldes und daneben die Zeichenlänge anzeigen kann.

Beispiel:

Hamburg ist schön / Hamburg / 7
Bonn ist der Hammer / Hammer / 5

hätte ich folgenden Lösungsvorschlag:

Zuerst eine Public Function anlegen:
Option Compare Database
Option Explicit

Public Function fctLaengstesWort(ByRef varZeile As Variant) As Variant

Dim varWorte As Variant
Dim strLaengstesWort As String
Dim lngI As Long

If Len(varZeile) > 0 Then
varWorte = Split(Replace$(Replace$(varZeile & vbNullString, Chr$(13), " "), Chr$(10), vbNullString), " ")

For lngI = LBound(varWorte) To UBound(varWorte)

If Len(strLaengstesWort) 0 Then
fctLaengstesWort = strLaengstesWort

End If

End If

End Function
Beispieltabelle:
• Ausgangstabelle: tblSatz
• Tabellenfeld in der Ausgangstabelle: Satz

Mit folgender Abfrage erhält man die entsprechende Liste mit den Sätzen und daneben das längste Wort, daneben die Länge des Wortes:
SELECT tblSatz.Satz,
fctLaengstesWort([Satz]) AS LaengstesWort,
Len(fctLaengstesWort([Satz])) AS LaengstesWortLanege
FROM tblSatz
ORDER BY Len(fctLaengstesWort([Satz])) DESC;
Es werden dabei eventuell im Tabellenfeld vorhandene Zeilenumbrüche (z.B. durch Strg+ENTER) wie Leerzeichen behandelt.

Wenn mehrere Wörter die gleiche Länge haben, dann wird das erste im Satz vorkommende Wort angezeigt.

Der o. a. Beispiel-Tabellenname und -Tabellenfeldname muss natürlich noch auf Deine Bezeichnungen umgeändert werden.

mfg
Huber

Hi Marco,

für

  1. Welches Wort taucht am häufigsten auf? Praktisch wie 2. nur
    halt hier mit Wort statt mit Zeichen.

hätte ich folgenden VBA-Lösungsvorschlag:

Zuerst folgende Public Sub in einem globalen Modul anlegen:

Option Compare Database
Option Explicit

Public Sub subWortTabelleErstellen(Optional ByRef strQuellTabelle As String = „tblSatz“, _
Optional ByRef strQuellFeld As String = „Satz“, _
Optional ByRef strZielTabelle As String = „tblWort_aus_tblSatz“)

Dim db As DAO.Database
Dim rsQuell As DAO.Recordset
Dim rsZiel As DAO.Recordset
Dim varWorte As Variant
Dim lngI As Long

On Error GoTo Sub_FehlerBehandlung

DoCmd.Hourglass True
Set db = CurrentDb

If DCount("*", „[MSysObjects]“, „[Name]=’“ & strZielTabelle & „’“) 0 Then
db.Execute "DROP TABLE " & strZielTabelle

End If

db.Execute „CREATE TABLE " & strZielTabelle & " ( [Wort] TEXT (255) CONSTRAINT [Wort] PRIMARY KEY , [WortAnzahl] LONG NOT NULL )“, dbFailOnError
db.Execute „CREATE INDEX WortAnzahl ON " & strZielTabelle & " ( [WortAnzahl] )“, dbFailOnError
Set rsQuell = db.OpenRecordset(strQuellTabelle, dbOpenSnapshot)
Set rsZiel = db.OpenRecordset(strZielTabelle, dbOpenDynaset)

Do While rsQuell.EOF = False

varWorte = Split(Replace$(Replace$(rsQuell(strQuellFeld) & vbNullString, Chr$(13), " "), Chr$(10), vbNullString), " ")

For lngI = LBound(varWorte) To UBound(varWorte)

If Len(varWorte(lngI)) > 0 Then
rsZiel.FindFirst „[Wort] = '“ & varWorte(lngI) & „’“

If rsZiel.NoMatch = True Then
rsZiel.AddNew
rsZiel!Wort = varWorte(lngI)
rsZiel!WortAnzahl = 1

Else
rsZiel.Edit
rsZiel!WortAnzahl = rsZiel!WortAnzahl + 1

End If

rsZiel.Update

End If

Next lngI

rsQuell.MoveNext

Loop

Sub_VerlassenRoutine:

rsQuell.Close
rsZiel.Close
Set rsQuell = Nothing
Set rsZiel = Nothing
Set db = Nothing

Sub_Verlassen:

DoCmd.Hourglass False
Exit Sub

Sub_FehlerBehandlung:

Select Case Err.Number

Case 3211 ’ … „Das Datenbankmodul konnte die Tabelle ‚|‘ nicht sperren, da sie bereits von einem anderen Benutzer oder Vorgang bearbeitet wird.“-Fehler
MsgBox Err.Description & " ( " & Err.Number & " )", vbOKOnly + vbCritical + vbMsgBoxHelpButton, „Import“, Err.HelpFile, Err.HelpContext
Resume Sub_Verlassen

Case Else ’ … Sonstiger Fehler
MsgBox Err.Description & " ( " & Err.Number & " )", vbOKOnly + vbCritical + vbMsgBoxHelpButton, „Import“, Err.HelpFile, Err.HelpContext
Resume Sub_VerlassenRoutine

End Select

End Sub
Beispieltabelle:
• Ausgangstabelle: tblSatz
• Tabellenfeld in der Ausgangstabelle: Satz

Mit dem Aufruf der o. a. ProzedurCall subWortTabelleErstellen( „tblSatz“ , „Satz“ , „tblWort_aus_tblSatz“ )(z. B. im Direktbereich oder in einem Formular mittels Button) wird eine neue Tabelle erstellt, welche die einzelnen Worte sowie deren Anzahl enthält.

Es werden dabei eventuell im Tabellenfeld vorhandene Zeilenumbrüche (z.B. durch Strg+ENTER) wie Leerzeichen behandelt.

Der o. a. Beispiel-Tabellenname und -Tabellenfeldname in der Zeile
„Call subWortTabelleErstellen( „tblSatz“ , „Satz“ , „tblWort_aus_tblSatz“ )“-Aufruf
muss natürlich noch auf Deine Bezeichnungen umgeändert werden.

mfg
Huber

Hi Marco,

für

  1. Welches Zeichen taucht am häufigsten auf?

Für eine ganze Tabelle möchte ich alle auftauchenden ZEichen
(Buchstaben, Zahlen, Sonderzeichen) abfragen, mit denen dann
in einer Abfrage zum Schluss herauskommt, welches Zeichen am
häufigsten auftaucht:

A 9342
S 8393
T 3449
6 3432

hätte ich folgenden VBA-Lösungsvorschlag:

Zuerst folgende Public Sub in einem globalen Modul anlegen:

Option Compare Database
Option Explicit

Public Sub subZeichenTabelleErstellen(Optional ByRef strQuellTabelle As String = „tblSatz“, _
Optional ByRef strQuellFeld As String = „Satz“, _
Optional ByRef strZielTabelle As String = „tblZeichen_aus_tblSatz“)

Dim db As DAO.Database
Dim rsQuell As DAO.Recordset
Dim rsZiel As DAO.Recordset
Dim strZeichen As Variant
Dim lngI As Long

On Error GoTo Sub_FehlerBehandlung

DoCmd.Hourglass True
Set db = CurrentDb

If DCount("*", „[MSysObjects]“, „[Name]=’“ & strZielTabelle & „’“) 0 Then
db.Execute "DROP TABLE " & strZielTabelle

End If

db.Execute „CREATE TABLE " & strZielTabelle & " ( [Zeichen] TEXT (1) CONSTRAINT [Zeichen] PRIMARY KEY , [ZeichenAnzahl] LONG NOT NULL )“, dbFailOnError
db.Execute „CREATE INDEX ZeichenAnzahl ON " & strZielTabelle & " ( [ZeichenAnzahl] )“, dbFailOnError
Set rsQuell = db.OpenRecordset(strQuellTabelle, dbOpenSnapshot)
Set rsZiel = db.OpenRecordset(strZielTabelle, dbOpenDynaset)

Do While rsQuell.EOF = False

For lngI = 1 To Len(rsQuell(strQuellFeld) & vbNullString)

strZeichen = UCase$(Mid$(rsQuell(strQuellFeld) & vbNullString, lngI, 1))

If strZeichen " " And _
strZeichen Chr$(10) And _
strZeichen Chr$(13) Then
rsZiel.FindFirst „[Zeichen] = '“ & strZeichen & „’“

If rsZiel.NoMatch = True Then
rsZiel.AddNew
rsZiel!Zeichen = strZeichen
rsZiel!ZeichenAnzahl = 1

Else
rsZiel.Edit
rsZiel!ZeichenAnzahl = rsZiel!ZeichenAnzahl + 1

End If

rsZiel.Update

End If

Next lngI

rsQuell.MoveNext

Loop

Sub_VerlassenRoutine:

rsQuell.Close
rsZiel.Close
Set rsQuell = Nothing
Set rsZiel = Nothing
Set db = Nothing

Sub_Verlassen:

DoCmd.Hourglass False
Exit Sub

Sub_FehlerBehandlung:

Select Case Err.Number

Case 3211 ’ … „Das Datenbankmodul konnte die Tabelle ‚|‘ nicht sperren, da sie bereits von einem anderen Benutzer oder Vorgang bearbeitet wird.“-Fehler
MsgBox Err.Description & " ( " & Err.Number & " )", vbOKOnly + vbCritical + vbMsgBoxHelpButton, „Import“, Err.HelpFile, Err.HelpContext
Resume Sub_Verlassen

Case Else ’ … Sonstiger Fehler
MsgBox Err.Description & " ( " & Err.Number & " )", vbOKOnly + vbCritical + vbMsgBoxHelpButton, „Import“, Err.HelpFile, Err.HelpContext
Resume Sub_VerlassenRoutine

End Select

End Sub
Beispieltabelle:
• Ausgangstabelle: tblSatz
• Tabellenfeld in der Ausgangstabelle: Satz

Mit dem Aufruf der o. a. ProzedurCall subZeichenTabelleErstellen( „tblSatz“ , „Satz“ , „tblZeichen_aus_tblSatz“ )(z. B. im Direktbereich oder in einem Formular mittels Button) wird eine neue Tabelle erstellt, welche die einzelnen Zeichen sowie deren Anzahl enthält.

Es werden dabei eventuell im Tabellenfeld vorhandene Zeilenumbrüche (z.B. durch Strg+ENTER) wowie Leerzeichen nicht angeführt und nicht gezahlt.

Der o. a. Beispiel-Tabellenname und -Tabellenfeldname in der Zeile
„Call subZeichenTabelleErstellen( „tblSatz“ , „Satz“ , „tblZeichen_aus_tblSatz“ )“
muss natürlich noch auf Deine Bezeichnungen umgeändert werden.

mfg
Huber

Hallo,

vielen vielen Dank für die Lösungsvorschläge.

Ich probiere das dann mal aus.

Gruß
Marco

Hi Marco,

ich habe alle drei - in meinen vorherigen Forumbeiträgen angeführten Funktionen/Prozeduren - geringfügig verändert/verbessert, hier in diesem Forumbeitrag unten nochmal angeführt.

Alle drei alten Funktionen/Prozeduren sind damit hinfällig und können durch die nachfolgend angeführten ersetzt bzw. in ein globales Modul eingefügt werden.

An der Funktionsweise bzw. wie diese angewendet werden müssen hat sich nichts geändert.

Option Compare Database
Option Explicit

Public Function fctLaengstesWort(ByRef varZeile As Variant) As Variant

Dim varWorte As Variant
Dim strLaengstesWort As String
Dim lngI As Long

If Len(varZeile) > 0 Then
varWorte = Split(Replace$(Replace$(varZeile, Chr$(13), " "), Chr$(10), vbNullString), " ")

For lngI = LBound(varWorte) To UBound(varWorte)

If Len(strLaengstesWort) 0 Then
fctLaengstesWort = strLaengstesWort

End If

End If

End Function

Public Sub subWortTabelleErstellen(Optional ByRef strQuellTabelle As String = „tblSatz“, _
Optional ByRef strQuellFeld As String = „Satz“, _
Optional ByRef strZielTabelle As String = „tblWort_aus_tblSatz“)

Dim db As DAO.Database
Dim rsQuell As DAO.Recordset
Dim rsZiel As DAO.Recordset
Dim varWorte As Variant
Dim lngI As Long

On Error GoTo Sub_FehlerBehandlung

DoCmd.Hourglass True
Set db = CurrentDb

If DCount("*", „[MSysObjects]“, „[Name] = '“ & strZielTabelle & „’“) 0 Then
db.Execute "DROP TABLE " & strZielTabelle

End If

db.Execute „CREATE TABLE " & strZielTabelle & " ( [Wort] TEXT(255) NOT NULL CONSTRAINT Wort_PK PRIMARY KEY , [WortAnzahl] LONG NOT NULL )“, dbFailOnError
Application.RefreshDatabaseWindow
db.Execute „CREATE INDEX WortAnzahl ON " & strZielTabelle & " ( [WortAnzahl] )“, dbFailOnError
Set rsQuell = db.OpenRecordset(strQuellTabelle, dbOpenSnapshot)
Set rsZiel = db.OpenRecordset(strZielTabelle, dbOpenDynaset)

Do While rsQuell.EOF = False

varWorte = Split(Replace$(Replace$(rsQuell(strQuellFeld) & vbNullString, Chr$(13), " "), Chr$(10), vbNullString), " ")

For lngI = LBound(varWorte) To UBound(varWorte)

If Len(varWorte(lngI)) > 0 Then
rsZiel.FindFirst „[Wort] = '“ & varWorte(lngI) & „’“

If rsZiel.NoMatch = True Then
rsZiel.AddNew
rsZiel!Wort = varWorte(lngI)
rsZiel!WortAnzahl = 1

Else
rsZiel.Edit
rsZiel!WortAnzahl = rsZiel!WortAnzahl + 1

End If

rsZiel.Update

End If

Next lngI

rsQuell.MoveNext

Loop

Sub_VerlassenRoutine:

rsQuell.Close
rsZiel.Close
Set rsQuell = Nothing
Set rsZiel = Nothing

Sub_Verlassen:

Set db = Nothing
DoCmd.Hourglass False
Exit Sub

Sub_FehlerBehandlung:

Select Case Err.Number

Case 3211 ’ … „Das Datenbankmodul konnte die Tabelle ‚|‘ nicht sperren, da sie bereits von einem anderen Benutzer oder Vorgang bearbeitet wird.“-Fehler
MsgBox Err.Description & " ( " & Err.Number & " )", vbOKOnly + vbCritical + vbMsgBoxHelpButton, „Import“, Err.HelpFile, Err.HelpContext
Resume Sub_Verlassen

Case Else ’ … Sonstiger Fehler
MsgBox Err.Description & " ( " & Err.Number & " )", vbOKOnly + vbCritical + vbMsgBoxHelpButton, „Import“, Err.HelpFile, Err.HelpContext
Resume Sub_VerlassenRoutine

End Select

End Sub

Public Sub subZeichenTabelleErstellen(Optional ByRef strQuellTabelle As String = „tblSatz“, _
Optional ByRef strQuellFeld As String = „Satz“, _
Optional ByRef strZielTabelle As String = „tblZeichen_aus_tblSatz“)

Dim db As DAO.Database
Dim rsQuell As DAO.Recordset
Dim rsZiel As DAO.Recordset
Dim strZeichen As String
Dim lngI As Long

On Error GoTo Sub_FehlerBehandlung

DoCmd.Hourglass True
Set db = CurrentDb

If DCount("*", „[MSysObjects]“, „[Name] = '“ & strZielTabelle & „’“) 0 Then
db.Execute "DROP TABLE " & strZielTabelle

End If

db.Execute „CREATE TABLE " & strZielTabelle & " ( [Zeichen] TEXT(1) NOT NULL CONSTRAINT Zeichen_PK PRIMARY KEY , [ZeichenAnzahl] LONG NOT NULL )“, dbFailOnError
Application.RefreshDatabaseWindow
db.Execute „CREATE INDEX ZeichenAnzahl ON " & strZielTabelle & " ( [ZeichenAnzahl] )“, dbFailOnError
Set rsQuell = db.OpenRecordset(strQuellTabelle, dbOpenSnapshot)
Set rsZiel = db.OpenRecordset(strZielTabelle, dbOpenDynaset)

Do While rsQuell.EOF = False

For lngI = 1 To Len(rsQuell(strQuellFeld) & vbNullString)

strZeichen = UCase$(Mid$(rsQuell(strQuellFeld) & vbNullString, lngI, 1))

If strZeichen " " And _
strZeichen Chr$(10) And _
strZeichen Chr$(13) Then
rsZiel.FindFirst „[Zeichen] = '“ & strZeichen & „’“

If rsZiel.NoMatch = True Then
rsZiel.AddNew
rsZiel!Zeichen = strZeichen
rsZiel!ZeichenAnzahl = 1

Else
rsZiel.Edit
rsZiel!ZeichenAnzahl = rsZiel!ZeichenAnzahl + 1

End If

rsZiel.Update

End If

Next lngI

rsQuell.MoveNext

Loop

Sub_VerlassenRoutine:

rsQuell.Close
rsZiel.Close
Set rsQuell = Nothing
Set rsZiel = Nothing

Sub_Verlassen:

Set db = Nothing
DoCmd.Hourglass False
Exit Sub

Sub_FehlerBehandlung:

Select Case Err.Number

Case 3211 ’ … „Das Datenbankmodul konnte die Tabelle ‚|‘ nicht sperren, da sie bereits von einem anderen Benutzer oder Vorgang bearbeitet wird.“-Fehler
MsgBox Err.Description & " ( " & Err.Number & " )", vbOKOnly + vbCritical + vbMsgBoxHelpButton, „Import“, Err.HelpFile, Err.HelpContext
Resume Sub_Verlassen

Case Else ’ … Sonstiger Fehler
MsgBox Err.Description & " ( " & Err.Number & " )", vbOKOnly + vbCritical + vbMsgBoxHelpButton, „Import“, Err.HelpFile, Err.HelpContext
Resume Sub_VerlassenRoutine

End Select

End Sub

mfg
Huber