Tellen van letters voor cryptogrammen.

  • Onderwerp starter Onderwerp starter Saalk
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Saalk

Gebruiker
Lid geworden
3 jan 2011
Berichten
85
Goedenavond. Ik heb een vraag ik maak cryptogrammen en sla ze op in een database.
Hoe tel je het aantal karakters van een niet uit een woord bestaand antwoord?
bvb Dit is de vraag "Het kraambezoek zag een opening om iets af te zetten" en het antwoord zou dan moeten zijn "Een gat in de markt" dus is de telling (3,3,2,2,5) en dit ook zo weer te geven in een tekstvak. BVB Hartelijk dank. Klaas
 
Twee oplossingen, allebei via een functie die je dan wel eerst moet maken in een module.

Code:
Function LettersTellen(Veld As String) As Integer
Dim i As Integer, iAantal As Integer
Dim tmp

    If InStr(1, Veld, " ") > 0 Then
        tmp = Split(Veld, " ")
        For i = LBound(tmp) To UBound(tmp)
            iAantal = iAantal + Len(tmp(i))
        Next i
    Else
        iAantal = Len(Veld)
    End If
    LettersTellen = iAantal

End Function

Deze functie kijkt of er een spatie in de tekst zit, en zet vervolgens alle woorden apart in een matrixvariabele. Vervolgens wordt de lengte van alle woord bij elkaar opgeteld.

Code:
Function TelLetters(Veld As String) As Integer
Dim i As Integer, iAantal As Integer
Dim tmp As String

    If InStr(1, Veld, " ") > 0 Then
        tmp = Replace(Veld, " ", "")
        iAantal = Len(tmp)
    Else
        iAantal = Len(Veld)
    End If
    TelLetters = iAantal

End Function
Deze functie kijkt of er spaties in de tekst zitten, en vervangt die door niks. De lengte van de tijdelijke variabele wordt dan geteld. In een query gebruik je hem als volgt: Expr1: LettersTellen([Veldnaam]) of TelLetters([Veldnaam]).
 
Ten eerste vriendelijk bedank voor u snelle reactie. Ik heb ze allebij uit geprobeerd en geven allebij dezelfde uitkomst. Als ik bvb AA AA AAA type is de uitkomst 7 maar wat ik eigenlijk bedoel is dat daar komt te staan (2,2,3) dat het aantal letter niet totaal maar per stuk worden opgeteld. Of is dat niet te doen? Ik hoop dat ik het u goed heb uitgelegen. Bvb Hartelijk dank voor u moeite en tijd. Groet Klaas
 
In dat geval moet je de eerste functie gebruiken, met een kleine aanpassing.

Code:
Function LettersTellen(Veld As String) As String
Dim i As Integer, sTmp As String
Dim tmp

    If InStr(1, Veld, " ") > 0 Then
        tmp = Split(Veld, " ")
        For i = LBound(tmp) To UBound(tmp)
            sTmp = sTmp & Len(tmp(i))
            If i < UBound(tmp) Then sTmp = sTmp & ","
        Next i
    Else
        sTmp = Len(Veld)
    End If
    LettersTellen = sTmp

End Function
 
Hartelijk dank het werkt prima! Alleen in een nieuw record staat in het veld tellen een # Type! is dat misschien weg te krijgen? BVB hartelijk dank. Groet Klaas
 
In een nieuw record heb je uiteraard nog geen waarde ingevuld; ik zou de functie dan ook niet als standaard waarde gebruiken, zoals je nu vermoed ik gedaan hebt. Maak een gebeurtenis <Na bijwerken> op het veld, die bij een ingevuld veld de functie aanroept, en bij een leeg veld niks doet. Dan voorkom je de foutmelding.
 
Ik heb het gedaan alleen iets anders =IIf([Woord] Is Null;"";letterstellen([Woord])) het werkt priema dus ik ben Blij en dank u voor u Moeite en Tijd. Ik heb nog wel een vraag hierover maar morgen maar. Nogmaals dank:d:d
 
Goedenavond. Ik heb nog een vraag de letter ij moet als één karakter geteld worden
u heeft dat al eens voor me gemaakt nu voor de nieuwe Crypto's telling is dit weg. Kan dat zo bij elkaar worden gedaan? Ik ben al aan het proberen geweest maar krijg de melding dat het een dubbele functie aanroept en dat gaat denk ik niet.
Dit is de Module die ik heb.
-----------------------------------------------
Function Tellen(Woord As String) As Integer

Dim i As Integer, Num As Integer
Woord = Replace(Woord, "IJ", "\")
Woord = Replace(Woord, "Ij", "\")
Woord = Replace(Woord, "ij", "/")
Num = Len(Woord)
Woord = Replace(Woord, "/", "ij")
Woord = Replace(Woord, "\", "IJ")
Tellen = Num

End Function
----------------------------------------------------------------------
Function LettersTellen(Woord As String) As String

Dim i As Integer, sTmp As String
Dim tmp

If InStr(1, Woord, " ") > 0 Then
tmp = Split(Woord, " ")
For i = LBound(tmp) To UBound(tmp)
sTmp = sTmp & Len(tmp(i))
If i < UBound(tmp) Then sTmp = sTmp & " , "
Next i
Else
sTmp = Len(Woord)
End If
LettersTellen = sTmp

End Function

Zo staat het nu de bovenste functie gebruik ik voor Kruiswoord puzzels want daar bestaat het antwoord altijd uit uit één woord. Ik hoop dat ik duidelijk ben. BVB Hartelijk dank.
 
Volgens mij moet het met deze twee functies wel lukken...

Code:
Function LettersTellen(Woord As String) As String
Dim i As Integer, sTmp As String
Dim tmp
sTmp = ""

    If InStr(1, Woord, " ") > 0 Then
        tmp = Split(Woord, " ")
        For i = LBound(tmp) To UBound(tmp)
            sTmp = sTmp & LenWoord(tmp(i))
            If i < UBound(tmp) Then sTmp = sTmp & " , "
        Next i
    Else
        sTmp = Len(LenWoord(Woord))
    End If
    LettersTellen = sTmp

End Function

En de tweede:

Code:
Function LenWoord(Woord As String) As Integer
Dim temp As String
    temp = Replace(Woord, "IJ", "\")
    temp = Replace(Woord, "Ij", "\")
    temp = Replace(Woord, "ij", "/")
    LenWoord = Len(temp)
End Function

Ik heb ze niet uitgetest :)
 
Bedankt voor u snelle Reactie. Ik heb het geprobeerd maar krijg een foutmelding en ik begrijp daar niets van wat er bedoeld wordt. Ik doe er even een plaatje bij BVB Hartelijk dank.:d
 

Bijlagen

  • Crypto.JPG
    Crypto.JPG
    69,6 KB · Weergaven: 57
Zoals ik al zei: ik had 'm nog niet uitgetest :)
De variabele is verkeerd gedefinieerd; de oorspronkelijke functie deed het goed omdat je daar een stringvariabele in kon zetten. Omdat er nu een matrix moet worden gecontroleerd, moet het type anders worden aangeroepen. Deze doet het dus wel:

Code:
Function LettersTellen(Woord As String) As String
Dim i As Integer, sTmp As String
Dim tmp
sTmp = ""

    If InStr(1, Woord, " ") > 0 Then
        tmp = Split(Woord, " ")
        For i = LBound(tmp) To UBound(tmp)
            sTmp = sTmp & LenWoord(tmp(i))
            If i < UBound(tmp) Then sTmp = sTmp & " , "
        Next i
    Else
        sTmp = LenWoord(Woord)
    End If
    LettersTellen = sTmp

End Function

Code:
Function LenWoord(Woord As Variant) As Integer
Dim temp As String
    temp = Replace(Woord, "IJ", "\")
    temp = Replace(Woord, "Ij", "\")
    temp = Replace(Woord, "ij", "/")
    LenWoord = Len(temp)
End Function
 
Het werkt super!!!!!!!! Heel hartelijk bedankt voor u tijd en goede wil. Ik wil nog wel iets vragen kan je de uitkomst van zo'n invoervak opslaan in een tabel? Maar in iedergeval nogmaals heel hartelijk dank. Groet Klaas.:d:d
 
Dat kan, als je het tekstvak koppelt aan een tabelveld.
 
Ik begrijp niet hoe ik dat teksvak aan die tabel moet krijgen. Ik heb dit in het tekstveld staan als besturingselementbron =IIf([woord] Is Null;"";LettersTellen([Woord])) en de uitslag moet dan in de tabel Cryptogrammen met daarin het veld tekst. Of moet je een gebeurtenis maken bvb na bijwerken? Ik weet ook niet hoe je dat moet maken. BvB Hartelijk dank.:d
 
Een veld dat je in een formulier koppelt aan een tabelveld heeft dat veld als besturingselementbron. Dan kun je daar dus geen formule in hebben. Die formule met de berekening moet dus op een ander moment plaatsvinden. Ik zou zeggen: de gebeurtenis <Bij Aanwijzen> van het formulier, of de gebeurtenis <Na bijwerken> van het veld dat je als basis voor de berekening gebruikt.
 
Ik ben even het pad kwijt> moet ik nu deze formule =IIf([woord] Is Null;"";LettersTellen([Woord])) plaatsen bij gebeurtenis na bijwerken? Ik had deze formule staan bij Gegevens Besturingselementenbon, BVB Hartelijk dank.:d
 
Je hebt de IIF niet nodig,; wel een IF THEN op basis van het veld dat je gebruikt om de omschrijving te genereren. Ik neem aan, dat dat het veld [Woord] is. De functie wordt dan iets als:

Code:
Private Sub txtWoord_AfterUpdate()
    If Not Me.txtWoord & "" = "" Then
        Me.txtAantal = LettersTellen(Me.txtWoord)
    End If
End Sub

In dit voorbeeldje heb ik het veld Woord txtWoord genoemd (altijd aan te bevelen om formuliervelden anders te noemen dan de velden waarop ze gebaseerd zijn) en het veld Aantal heeft een tekstvak met de naam txtAantal.
 
Ik ben aan het prutsen geweest en kom er niet uit. Zou u misschien er naar willen kijken?
Het is de bedoeling dat de waarde van het tekstveld in de tabel aant Let terecht komt zodat ik ook kan sorteren op aantal letters. Ik moet nu het totaal aantal letters met de hand invoeren om ze dus in de Tabel te krijgen. Ik doe een stukje van de database erbij. BVB Hartelijk dank. Groet Klaas :d
 

Bijlagen

Ik moet me verontschuldigen voor de stomme fout(en) die ik gemaakt heb. Ik heb alles door de war gegooid maar naar lang en nuchter denken ben ik toch eruit gekomen. Eerst alles weg gedaan en opnieuw begonnen. U heeft mij alles bijna met de paplepel ingegeven. Maar ik was kompleet de weg kwijt. Nogmaals heel Hartelijk Dank voor u Tijd en Moeite. Groet Klaas:d:d:d Ik zal de database erbij doen.
 

Bijlagen

Dan kan-ie denk ik wel op slot. Al snap ik niet helemaal waarom je de IIF er nog in hebt zitten, want die is a) erg traag, en b) niet nodig. Ook kun je de procedure beter op de <Na bijwerken> van Woord zetten. Zoals in deze variant.
 

Bijlagen

Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan