[VBA]Probleem met functie voorletters

Pagina: 1
Acties:

  • RvL
  • Registratie: Maart 2002
  • Laatst online: 26-05 07:15
Hallo allemaal,

ik kom even niet meer uit een deel van een functie om de invoer van een gebruiker voor voorletters in het formaat Letter.Letter. te zetten. Dus ab wordt A.B. maar ook a.b wordt A.B. en a..b wordt A.B. Alle soorten invoer wordt dus tot hetzelfde gemaakt.

Nu werkt ab en a.b goed. Echter a..b (meerdere punten ertussen kan ook) en a.b. werkt niet. a..b leidt tot de fout dat m'n array te klein is voor het aantal items dat er ingevoerd worden. Het probleem is alleen dat ik niet gevonden kan krijgen hoe hij aan die waarde komt.
a.b. krijgt aan het einde een punt teveel, dus a.b..

Dit is de code die hier voor zorgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
' Ingevoerde string in hoofdletters zetten
    strUpX = UCase(X)
        
    ' Het vullen van de matrix met alleen de letters van de string
    For intLoop = 1 To Len(strUpX)
        ' Grootte dynamisch array vaststellen aan de hand van het
        ' aantal ingevoerde karakters
        ReDim Preserve arrChars(intCountItems)
        intLoop2 = intLoop - 1
        ' String opsplitsen in karakters
        strTempChar = Mid(strUpX, intLoop, 1)
        
        ' Als karakter geen letter is, karakter overslaan en met
        ' volgend karakter verder gaan
        If strTempChar < "A" Or strTempChar > "Z" Then
            blnSkipped = True
            GoTo Nextitem
        ' Als karakter wel een letter is, kijken of vorig karakter
        ' overgeslagen is
        Else
            If blnSkipped = True Then
                intLoop2 = intLoop2 - 1
                'blnSkipped = False
            End If
            MsgBox (strTempChar)
            arrChars(intLoop2) = strTempChar
            intCountItems = intCountItems + 1
        End If
Nextitem:
    Next intLoop

Waarschijnlijk maak ik gewoon ergens een grote denkfout. Wie kan mij vertellen waar het hier fout gaat?

Liefde maakt een smal bed breed!
Nu de dekens nog...


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:39

mulder

ik spuug op het trottoir

Als je nou eens eerst alle punten uit die string verwijderd en dan de letters aan elkaar plakt

oogjes open, snaveltjes dicht


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Don Facundo schreef op 08 april 2004 @ 10:44:
Als je nou eens eerst alle punten uit die string verwijderd en dan de letters aan elkaar plakt
hmm, volgens mij valideert dat nog niet je hele string...

stel een array met toegestane samen, en valideer de userinput hiermee... aan het eind loop je door je string heen en voeg je de puntjes toe...

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Misschien Regular Expressions gebruiken?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Pathogen
  • Registratie: April 2004
  • Laatst online: 26-05 15:49

Pathogen

Shoop Da Whoop

Ik heb hetzelfde ongeveer met mijn nutteloze url opener gedaan:
Als er al http:// staat wordt het niet toegevoegd en anders wel
Dit is overigens in JavaScript
code:
1
2
3
4
5
6
7
8
9
10
11
function linkURL(url)
{
this.url = url;
http = url.slice(0,4);

if(http != "http")
{
url = "http"+"://"+url
}
window.open(url, "window");
}


Het is geen supercode maar goed ;)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Als je nu eens Split(...) gebruikt met als separator een punt, en alleen die array indices neemt waar wat in staat, en vervolgens die met een punt aan elkaar plakt ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Allereerst bega je een doodzonde met het gebruik van de GoTo instructie. Dit is alleen toegestaan voor een On Error ... GoTo.
Hier is een mogelijke oplossing voor je probleem:

Public Function ConvertLetters(ByVal sIn As String) As String
Const csLetters As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Do While Len(sIn) > 0
If InStr(csLetters, UCase(Left(sIn, 1))) > 0 Then
ConvertLetters = ConvertLetters & UCase(Left(sIn, 1)) & "."
End If
sIn = Right(sIn, Len(sIn) - 1)
Loop
End Function

[ Voor 11% gewijzigd door Verwijderd op 09-04-2004 12:47 ]


  • Skaah
  • Registratie: Juni 2001
  • Niet online
Houd je rekening met mensen zoals
A.F.Th. Dinges?

  • RvL
  • Registratie: Maart 2002
  • Laatst online: 26-05 07:15
Zo, er is weer internetverbinding, dus ik zal eens gaan replyen
Als je nou eens eerst alle punten uit die string verwijderd en dan de letters aan elkaar plakt
Dat is precies wat ik probeer te doen. Dat gaat alleen niet in alle gevallen goed.
Als je nu eens Split(...) gebruikt met als separator een punt, en alleen die array indices neemt waar wat in staat, en vervolgens die met een punt aan elkaar plakt ?
Dat heb ik inderdaad geprobeerd. Dat werkt gemakkelijk voor strings als a.b en a.b., maar strings als ab en a..b werken niet meer. Dit is dus geen goede oplossing. Het kan wel als onderdeel van het geheel gebruikt worden uiteraard.
Allereerst bega je een doodzonde met het gebruik van de GoTo instructie. Dit is alleen toegestaan voor een On Error ... GoTo.
Fijn dat je het verteld. Ze hebben mij als 4e jaars zonder ook maar enige kennis van VBA (wel andere programmeertalen als Java) een half afgemaakt afstudeerproject gegeven van een voorganger, zonder ook maar enige documentatie, dus alle verbeteringen zijn van harte welkom.
Vond het overigens wel gemakkelijk werken ;). Je functie heb ik nog niet kunnen proberen, want ze zijn aan het migreren van internetprovider en ben vanmiddag heerlijk vrij. Maar na de paasdagen zal ik hem zeker eens proberen!
Houd je rekening met mensen zoals
A.F.Th. Dinges?
Dat is inderdaad een goede, daar kwam m'n collega vandaag toevallig ook mee. Toch eens bedenken hoe ik daar rekening mee ga houden.

Liefde maakt een smal bed breed!
Nu de dekens nog...


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Namen zijn altijd kl*te... Het is toch erg afhankelijk van de gebruiker en hoe hij/zij deze invoert.

Een (héél erg oud) stukje code dat ik ooit heb geschreven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Private Function CleanName(ByVal strDirty As String) As String
    Dim arrTMP() As String
    Dim arrTMPSpace() As String
    Dim T As Long
    Dim U As Long
    
    strDirty = CleanDoubleChars(strDirty, ".")
    strDirty = CleanDoubleChars(strDirty, " ")
    strDirty = CleanDoubleChars(strDirty, ",")
    strDirty = Replace(strDirty, " .", ".")
    strDirty = CleanOtherChars(strDirty)
    arrTMP = Split(strDirty, ".")
    For T = 0 To UBound(arrTMP)
        arrTMP(T) = Trim(StrConv(arrTMP(T), vbProperCase))
        arrTMPSpace = Split(arrTMP(T), " ")
        For U = 0 To UBound(arrTMPSpace)
            arrTMPSpace(U) = StrConv(arrTMPSpace(U), vbProperCase)
            If (Len(arrTMPSpace(U)) = 1) Then
                If (Asc(arrTMPSpace(U)) >= 65) And (Asc(arrTMPSpace(U)) <= 90) Then _
                    arrTMPSpace(U) = arrTMPSpace(U) & "."
            End If
        Next
        arrTMP(T) = CleanDoubleChars(Join(arrTMPSpace, " "), " ")
    Next
    strDirty = Join(arrTMP, ". ")
    CleanName = Join(arrTMP, " ")
End Function

Private Function CleanDoubleChars(ByVal strDirty As String, ByVal strClean As String) As String
    While InStr(strDirty, strClean & strClean)
        strDirty = Replace(strDirty, strClean & strClean, strClean)
    Wend
    CleanDoubleChars = strDirty
End Function

Private Function CleanOtherChars(ByVal strDirty As String) As String
    Dim T As Long
    Const sOTHERCHARS = "-,/_"
    
    For T = 1 To Len(sOTHERCHARS)
        strDirty = Replace(strDirty, Mid(sOTHERCHARS, T, 1), " " & Mid(sOTHERCHARS, T, 1) & " ")
    Next T
    CleanOtherChars = strDirty
End Function


Roep deze aan met de volgende code:
code:
1
2
3
4
5
6
7
    Debug.Print CleanName("A..b. janssen")
    Debug.Print CleanName("Ab janssen")
    Debug.Print CleanName("A. b.    janssen")
    Debug.Print CleanName("A..b janssen")
    Debug.Print CleanName("A..b. janssen")
    Debug.Print CleanName("Ab. janssen-de vries")
    Debug.Print CleanName("A .b. janssen - de vries")


De output is dan als volgt:
code:
1
2
3
4
5
6
7
A. B. Janssen
Ab Janssen
A. B. Janssen
A. B. Janssen
A. B. Janssen
Ab Janssen - De Vries
A. B. Janssen - De Vries


Disclaimer: Dit stamt nog uit de vorige eeuw (letterlijk :P ) en is nooit echt ingezet of getest. De output is redelijk aardig, maar deze code kan best eruit klappen met exotische combinaties van letters ofzo. Ik heb geen zin/tijd om deze code voor je te testen, dat mag je zelf doen.

Overigens is een regex waarschijnlijk beter/sneller.

(En ja, ik weet dat "De Vries" met een kleine D is :+ )

[ Voor 20% gewijzigd door RobIII op 08-04-2004 14:17 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1