Avatar billede lsskaarup Nybegynder
17. maj 2006 - 15:25 Der er 24 kommentarer og
1 løsning

Tjekke om variabel er tom

Jeg har en stump kode, som bruger nogle data jeg får ud fra Active Directory (AD). Disse bruges til at lave en afsenderperson på et brev.

Jeg vil derfor godt lave et tjek, der sørger for at der ikke opstår tomme linier i mellem kontaktoplysningerne på afsenderen af brevet.

Opbygningen er så følger:
navn
stilling
telefon
mobil
email

Hvis telefon og mobil er tomt for en person, så vil jeg få 2 tomme linier, dem vil jeg undgå.

Jeg har denne kodestump, der ligger data fra AD over i nogle variabler.

While (Not found) And (Not rs.EOF)
  If LCase(cbAfsender.Value) = LCase(rs.Fields("name")) Then
    found = True

    Me.afsName = rs.Fields("name")
    Me.afsTlf = rs.Fields("telephoneNumber")
    Me.afsMail = rs.Fields("mail")
    Me.afsTitle = rs.Fields("title")
    Me.afsMobile = rs.Fields("mobile")
    Me.afsDistName = rs.Fields("distinguishedName")
                   
  End If
 
  rs.MoveNext
Wend


Senere når jeg opretter brevet, ved klik på OK, så har jeg følgende:

    'afsender
    Dim strAfsender As String
    strAfsender = Me.afsName & vbCrLf & _
                  Me.afsTitle & vbCrLf & _
                  Me.afsMail & vbCrLf & _
                  Me.afsTlf & vbCrLf & _
                  Me.afsMobile
                 
   
    If IsEmpty(Me.afsTlf) Then
   
        Debug.Print strAfsender
   
    End If

Den fanger ikke på IsEmpty for afsTlf er åbenbart ikke tom, men hvordan sikre jeg mig så imod tomme linier.
Avatar billede thesurfer Nybegynder
17. maj 2006 - 15:38 #1
Du kan prøve med:

    If Me.afsTlf = "" Then

eller

    If ("" & Me.afsTlf) = "" Then
Avatar billede lsskaarup Nybegynder
17. maj 2006 - 15:44 #2
Den første har jeg også prøvet uden held, men jeg faldt over IsNull() og den virker, men nu skal jeg bare have tænkt mig om.

For jeg har som du kan se både navn, stilling/titel, telefon, mobil og mail.

Jeg skal reelt have tjekket for de 4 sidste på en smart måde, så tilfælge hvor kun én af dem er tom og tilfælde hvor flere er tomme.
Avatar billede thesurfer Nybegynder
17. maj 2006 - 15:50 #3
Hvad skal der ske, hvis en linie er tom? Gælder denne regel for alle linier?
Avatar billede lsskaarup Nybegynder
17. maj 2006 - 15:55 #4
Du skal forstille dig en afsender på et brev.

Hanseman Lugther
Brandmand
hanseman (@) lugther (.) dk
112
221

Der må så ikke forekomme tomme linier, hvis f.eks. mailen ikke er oprettet på personen, så det hele skal rykkes sammen.

Men jeg sådan set selv løst den, men ikke særligt elegant, så der er point hvis du kender en pænere metode.

Jeg kommer lige med det jeg har gjort
Avatar billede lsskaarup Nybegynder
17. maj 2006 - 15:56 #5
Jeg bygge sådan set bare på strengen, hvis variablen IKKE er tom.

    Dim strAfsender As String

    If Not IsNull(Me.afsName) Then
   
        strAfsender = Me.afsName
   
    End If
   
    If Not IsNull(Me.afsTitle) Then
   
        strAfsender = strAfsender & vbCrLf & Me.afsTitle
   
    End If
   
    If Not IsNull(Me.afsMail) Then
   
        strAfsender = strAfsender & vbCrLf & Me.afsMail
   
    End If
   
        If Not IsNull(Me.afsTlf) Then
   
        strAfsender = strAfsender & vbCrLf & Me.afsTlf
   
    End If
   
        If Not IsNull(Me.afsMobile) Then
   
        strAfsender = strAfsender & vbCrLf & Me.afsMobile
   
    End If
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:01 #6
Hvad med:

dim navn, titel, mail, tlf, mobil, afsender

navn = ""
If Not IsNull(Me.afsName) Then navn = navn & vbCrlF

titel = ""
If Not IsNull(Me.afsTitle) Then titel = titel & vbCrlF

mail = ""
If Not IsNull(Me.afsMail) Then mail = mail & vbCrlF

tlf = ""
If Not IsNull(Me.afsTlf) Then tlf = tlf & vbCrlF

mobil = ""
If Not IsNull(Me.afsMobile) Then mobil = mobil & vbCrlF

strAfsender = navn & titel & mail & tlf & mobil
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:02 #7
dim navn, titel, mail, tlf, mobil, afsender As String

navn = ""
If Not IsNull(Me.afsName) Then navn = navn & vbCrlF

titel = ""
If Not IsNull(Me.afsTitle) Then titel = titel & vbCrlF

mail = ""
If Not IsNull(Me.afsMail) Then mail = mail & vbCrlF

tlf = ""
If Not IsNull(Me.afsTlf) Then tlf = tlf & vbCrlF

mobil = ""
If Not IsNull(Me.afsMobile) Then mobil = mobil & vbCrlF

strAfsender = navn & titel & mail & tlf & mobil
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:03 #8
Doh! :-)

Retter lige koden..
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:04 #9
dim navn, titel, mail, tlf, mobil, afsender As String

navn = ""
If Not IsNull(Me.afsName) Then navn = navn & Me.afsName & vbCrlF

titel = ""
If Not IsNull(Me.afsTitle) Then titel = titel & Me.afsTitle & vbCrlF

mail = ""
If Not IsNull(Me.afsMail) Then mail = mail & Me.afsMail & vbCrlF

tlf = ""
If Not IsNull(Me.afsTlf) Then tlf = tlf & Me.afsTlf & vbCrlF

mobil = ""
If Not IsNull(Me.afsMobile) Then mobil = mobil & Me.afsMobile & vbCrlF

strAfsender = navn & titel & mail & tlf & mobil
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:04 #10
Man kunne vel også bare nøjes med:

dim navn, titel, mail, tlf, mobil, afsender As String

navn = ""
If Not IsNull(Me.afsName) Then navn = Me.afsName & vbCrlF

titel = ""
If Not IsNull(Me.afsTitle) Then titel = Me.afsTitle & vbCrlF

mail = ""
If Not IsNull(Me.afsMail) Then mail =  Me.afsMail & vbCrlF

tlf = ""
If Not IsNull(Me.afsTlf) Then tlf =  Me.afsTlf & vbCrlF

mobil = ""
If Not IsNull(Me.afsMobile) Then mobil =  Me.afsMobile & vbCrlF

strAfsender = navn & titel & mail & tlf & mobil
Avatar billede lsskaarup Nybegynder
17. maj 2006 - 16:11 #11
Det er jo sådan set næsten det samme som jeg gør nu, kan man ikke gør noget rekursivt?
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:15 #12
Hmmm.. det kan næsten ikke betale sig, når du kun har 5 værdier.

Koden til det rekursive, fylder garanteret mere end koden i 17/05-2006 16:04:44.
Avatar billede lsskaarup Nybegynder
17. maj 2006 - 16:18 #13
Okay, smide et svar, så er pointene dine.
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:19 #14
Jeg prøver lige at lave et eksempel..

- Svar
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:31 #15
option explicit

' --------------------- simulering af database ----------------
dim sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil
sim_navn = "Hanseman Lugther"
sim_titel = null ' titel er sat til NULL
sim_mail = "hanseman (@) lugther (.) dk"
sim_tlf = "112"
sim_mobil = "221"
' ----------------------------------------------------------


' -------- her starter koden: --
dim arr(4)
arr(0) = sim_navn
arr(1) = sim_titel
arr(2) = sim_mail
arr(3) = sim_tlf
arr(4) = sim_mobil

dim navn, titel, mail, tlf, mobil, afsender
dim i

for i = 0 to ubound(arr)
    If Not IsNull(arr(i)) then afsender = afsender & arr(i) & vbCrLf
next

' Egentligt skal du fjerne det sidste mellemrum:
afsender = left(afsender, len(afsender) - 2)

' ---  her slutter koden ---

msgbox afsender
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:34 #16
Hmmm..

17/05-2006 16:04:44 = 12 linier
17/05-2006 16:31:38 = 11 linier (man kan smide "i" op sammen med de andre variabler, for at spare 1 linie)

:-)
Avatar billede lsskaarup Nybegynder
17. maj 2006 - 16:41 #17
Ja hold da op en forskel... ;-)
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:41 #18
Da jeg ikke lige har Visual Basic, har jeg bare lavet en VBS fil.. og der er jo nogen begrænsninger..

Du burde kunne erstatte

dim arr(4)
arr(0) = sim_navn
arr(1) = sim_titel
arr(2) = sim_mail
arr(3) = sim_tlf
arr(4) = sim_mobil

med

Dim arr() As String = {sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil }

Så sparer du yderliger 5 linier.. :-)
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:42 #19
Prøv det her (så er du nede på 6 linier):

option explicit ' denne tæller ikke med som linie

' --------------------- simulering af database ----------------
dim sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil
sim_navn = "Hanseman Lugther"
sim_titel = null ' titel er sat til NULL
sim_mail = "hanseman (@) lugther (.) dk"
sim_tlf = "112"
sim_mobil = "221"
' ----------------------------------------------------------

' -------- her starter koden: --
Dim arr() As String = { sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil }
dim navn, titel, mail, tlf, mobil, afsender, i

for i = 0 to ubound(arr)
    If Not IsNull(arr(i)) then afsender = afsender & arr(i) & vbCrLf
next

' Egentligt skal du fjerne det sidste mellemrum:
afsender = left(afsender, len(afsender) - 2)

' ---  her slutter koden ---

msgbox afsender ' denne tæller ikke med som en linie, da det bare er en test
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:43 #20
Takker for points :-)
Avatar billede thesurfer Nybegynder
17. maj 2006 - 16:50 #21
Hvis den ikke accepterer Dim arr() As String = { sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil }

kan du prøve med:

option explicit ' denne tæller ikke med som linie

' --------------------- simulering af database ----------------
dim sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil
sim_navn = "Hanseman Lugther"
sim_titel = null ' titel er sat til NULL
sim_mail = "hanseman (@) lugther (.) dk"
sim_tlf = "112"
sim_mobil = "221"
' ----------------------------------------------------------

' -------- her starter koden: --


dim navn, titel, mail, tlf, mobil, afsender, i, arr
arr = Array(sim_navn, sim_titel, sim_mail, sim_tlf, sim_mobil)

for i = 0 to ubound(arr)
    If Not IsNull(arr(i)) then afsender = afsender & arr(i) & vbCrLf
next

' Egentligt skal du fjerne det sidste mellemrum:
afsender = left(afsender, len(afsender) - 2)

' ---  her slutter koden ---

msgbox afsender ' denne tæller ikke med som en linie, da det bare er en test

6 linier :-)

:-)
Avatar billede martin_moth Mester
20. maj 2006 - 15:39 #22
Denne kode er hurtigere:

"gammel kode"
for i = 0 to ubound(arr)
    If Not IsNull(arr(i)) then afsender = afsender & arr(i) & vbCrLf
next
afsender = left(afsender, len(afsender) - 2)

"Hurtigere kode:"

for i = 0 to ubound(arr)-1
    If Not IsNull(arr(i)) then afsender = afsender & arr(i) & vbCrLf
next
afsender = afsender & arr(ubound(arr)))



Så slipper du for først at skrive noget til variablen for dernæst at slette det.

Og det fylder lige mange linier, nu det åbenbart er succeskriteriet :o)
Avatar billede thesurfer Nybegynder
20. maj 2006 - 17:35 #23
Hehe.. Gad vide om den kan reduceres mere..? :-)

PS: Du har en slut-parentes for meget i denne linie: afsender = afsender & arr(ubound(arr)))
Avatar billede martin_moth Mester
20. maj 2006 - 19:52 #24
Jeg skammer mig!
Avatar billede thesurfer Nybegynder
20. maj 2006 - 20:00 #25
Hehe.. så slemt er det heller ikke.. :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester