Avatar billede dsj1972 Juniormester
28. februar 2010 - 16:38 Der er 33 kommentarer og
1 løsning

Hjælp til små "skønheds fejl" i forbindelse med Userform og input i dokumenter

Hejsa,

jeg har nu fået bikset en Userform sammen med super god hjælp herinde fra. Det virker rigtig godt, men nu opdager man det som jeg vil kalde for små "skønheds" fejl i form at små detaljer som kunne laves bedre.

Her er eks. at jeg via Variables får indsat data fra min userform over i dokumenter, men problemet her er at hvis man undlader at skrive i nogle af felterne så kommer variablerne stadig ind og sammentidigt optager de en linie.

koden er sinsyg lang så her er et eks.

  With oDoc
      .Variables("VarNavn").Value = strNavn
      .Variables("VarEfterNavn").Value = strEfterNavn
      .Variables("VarPostnr").Value = strPostnr
      .Variables("VarBy").Value = strBy

Hvis vi så antager at vi undlader at indtaste strEfternavn
Så vil der komme fejl dokument variabler.

Her tænkte jeg om man kunne delete dokument Variablerne hvis der ingen værdi var, altså noget If sætning.

Jeg har Førsøgt mig lige med noget a´la´
    If strEfterNavn = True Then
        .Variables("VarEfterNavn").value = strEfterNavn
      Else
        .Variables("VarEfterNavn").Delete

Men den sidste linie fejler, så det er helt klart nok den forkerte måde at gribe det an.

Nogen bud på hvordan det kan gøres???

Og så har jeg en anden lille detalje som driller mig lidt.
Jeg ville gerne kunne lade min userform stå åben med alle indput indtil jeg har tjekket om alt er lavet rigtigt og derved ryder alt og starter en ny indtastning.

Men hvis jeg fjerner .Hide på den så låser den fast så jeg ikke kan gå ind og tjekke dokumenter.

Hvordan gribes den an.

Mvh dsj
Avatar billede tjp Mester
01. marts 2010 - 14:03 #1
Hos mig bliver 'tomme' variabler automatisk slettet. Detsamme er tilfældet for dig, hvis du ved Delete får fejlen:
Run-time error '5825':
Objektet er blevet slettet.

Anden del af dit spørgsmål forstår jeg ikke helt.. :-)
Avatar billede dsj1972 Juniormester
01. marts 2010 - 15:06 #2
Joe Variablen bliver da skam også slettet hos mig, meen jeg vil da mene at hvis man fremprovokere en fejl ved den kommando så er det ikke den rigtige måde at gøre det på, for ved hver fejl stopper proceduren jo, så derfor kan den jo ikke forsætte.

Nu skal du jo huske at det lille stykke kode kun er et eks. jeg har måske lige omkring 20 Variabler på forskellige dokumenter.


Anden del af mit spørgsmål går simpelt ud på at jeg gerne ville kunne have min Userform stående (altså den må ikk lukke ned), så jeg kan gå ind og se om alt er blevet lavet rigtigt og dernæst lave udprint og tjekke disse inden jeg forsætter med en ryd af data og start på en ny omgang.

Til at lukke Userform ned så står denne her:

Me.Hide

Hvis jeg disabler denne linie så står Userform ganske vist åben, men den låser fast således at jeg ingen mulighed har for at redigere eller tjekke de jobs som nu engang er blevet lavet.
Avatar billede tjp Mester
01. marts 2010 - 15:36 #3
Du misforstod mig vist. Hvis variablen ikke får nogen værdi under fx:
  With oDoc
      .Variables("VarNavn").Value = strNavn
      .Variables("VarEfterNavn").Value = strEfterNavn
      .Variables("VarPostnr").Value = strPostnr
      .Variables("VarBy").Value = strBy
  End With

Så eksisterer den ikke bagefter - VBA gør altså automatisk det du ville gøre med Delete. Derfor fejler Delete, fordi du prøver at slette et ikke-eksisterende objekt og kaldet til Delete skal derfor bare fjernes.
Avatar billede dsj1972 Juniormester
01. marts 2010 - 16:27 #4
Hmm, ja ok misforstod dig vist.
Men selv om den er tom og derved automatisk slettes, så biholdes pladsen hvis man kan sige det sådan, så hvis du forestiller dig at følgende på dokumentet står under hinanden på hver selvstændig linie, så vil der bare fremkomme en tom linie imellem, så derfor sletter den da  ikke helt Variablen på dokumentet.

Men forstår godt hvad du vil frem til med Delete delen.

Men hvad gør man så for at fysisk fjerne

{DocVariable varEfterNavn}

På dokumentet/erne, hvis der ingen værdi er i strEfterNavn f.eks

Det var det jeg mente
Avatar billede dsj1972 Juniormester
02. marts 2010 - 14:49 #5
Hmm, måske jeg skulle oprette et nyt spm med ledende tekst til netop dette problem.
Avatar billede tjp Mester
02. marts 2010 - 15:16 #6
Jeg tror ikke jeg helt forstår hvad du mener: hvis variablen ikke modtager nogen værdi, eksisterer den ikke bagefter tilskrivningen, den regnes ikke med i Variables.Count og kommer heller ikke med i en 'For Each'. Altså der er ikke noget at fjerne så vidt jeg kan se..
---
Hvis du viser UserForm med 'Show vbModeless', fx 'UserForm1.Show vbModeless', opnår du vist det ønskede i spørgsmål 2.
Avatar billede dsj1972 Juniormester
02. marts 2010 - 18:33 #7
Hmm, altså hos mig så kommer der til at stå.

" Fejl! Der er ingen dokumentvariabler"

Hvis der ingen værdi kommer i felterne.


Den med vbModeless, prøver jeg lige....
Avatar billede dsj1972 Juniormester
02. marts 2010 - 20:54 #8
Den er helt super med vbModeless, så den er i vinkel.

Men forstår ikk at jeg får Variable fejl på dukomenter ved ingen værdi når du ikke gør?????
Avatar billede tjp Mester
02. marts 2010 - 22:04 #9
Ah, nu er jeg med! Det er fordi du har et felt der prøver at tilgå en ikke-eksisterende variabel..

Så hvis du ønsker at slette noget, så er det feltet, fx:

ThisDocument.Fields.Update
For Each v In ThisDocument.Fields
  If v.Result = "Fejl! Der er ikke nogen dokumentvariabler." Then
    v.Delete   
  End If
Next

Alternativt, og nok også bedre, er at give de tomme variabler et mellemrumstegn, så de ikke slettes, fx:

If strEfterNavn <> "" Then
  ThisDocument.Variables("VarEfterNavn").value = strEfterNavn
Else
  ThisDocument.Variables("VarEfterNavn").value = " "
End If
Avatar billede dsj1972 Juniormester
02. marts 2010 - 22:22 #10
Joe men sådan som jeg læser din kode så bliver den stadig stående ude i dokumentet.

hvis nu flg. står i dokumentet således.

{DocVariable varNavn}
{DocVariable varEfterNavn}
{DocVariable varPostnr}
{DocVariable varBy}

Og vi så antager at vi undlader at indtaste en værdi i strEfterNavn

If strEfterNavn Then
    .Variables("varEfterNavn").Value = strEfterNavn
Else
    .Variables("VarEfterNavn").Value = " "
End If

Så efterlades strengen ganske vist tom, men der vil stadig være en tom linie imellem varNavn og varPostnr

Fordi DocVariable stadig er der, den er bare tom.

Har jeg ikk ret i det??

Det jeg er ude efter er at hvis der ingen værdi er i strEfterNavn, så skal den DocVariable fjernes således at det ville se sådan ud hvis ingen værdi er i strEfterNavn.

{DocVariable varNavn}
{DocVariable varPostnr}
{DocVariable varBy}
Avatar billede tjp Mester
02. marts 2010 - 23:13 #11
Hmm, et hack kunne jo være efterfølgende at slette alle afsnit med fejlteksten ved at indsætte en tom streng:

Dim p As Paragraph
For Each p In ThisDocument.Paragraphs
  Debug.Print p.Range.Text
  If Left(p.Range.Text, 42) = "Fejl! Der er ikke nogen dokumentvariabler." Then
    p.Range.Text = ""
  End If
Next

Kan det bruges? :-)
Avatar billede dsj1972 Juniormester
02. marts 2010 - 23:59 #12
Æhh, nu har jeg ikke prøvet det kode stykke, men for mig lyder det bare som om at der igen bare indsættes tomt, altså dvs at der stadig er en optaget linie som så bare er tom.
Men vil jo gerne have linien slettet.

Og det gør

  .Variables("VarEfterNavn").Delete

Sådan set også, den har bare den uheldige effekt at den stopper koden pga en fejlmeddelse og det har du sådan set også forklaret mig hvorfor, fint nok.....men har på fornemmelsen af at der skal noget "Delete" til et eller andet sted for at kunne få den til at slette variablen på dokumentet.

Eller er jeg helt ude i skoven med det og det bare ikk kan lade sig gøre, andet end manuelt rette
Avatar billede tjp Mester
03. marts 2010 - 00:30 #13
Ved at indsætte "" i Paragraph.Range.Text overskrives paragraffens afsnitstegnet, hvilket "sletter" den.
Det er ikke variablerne du ser i dokumentet, men derimod en feltreference til dem. Derfor nytter det ikke at slette dem.
Og sletter man felterne, bliver afsnitstegnene stående og dermed de tomme linjer.
Avatar billede dsj1972 Juniormester
03. marts 2010 - 00:54 #14
Hmm, det vil så sige at det ikke kan lade sig gøre at undgå de tomme linier......Hmmmm
Avatar billede tjp Mester
03. marts 2010 - 01:01 #15
Nej, indlæg #11 fjerner fejllinjerne...
Avatar billede dsj1972 Juniormester
03. marts 2010 - 12:45 #16
Hmm, jeg har prøvet det nu men syns ikk rigtig det virker, den skriver stadig:

"Fejl! Der er ingen Dokumentvariabler"

hvis der ingen værdi er i:

  .Variables("VarEfterNavn").Value = strEfterNavn

Virker det hos dig???
Avatar billede tjp Mester
03. marts 2010 - 13:38 #17
Æhh, ja.. :-)
Er der en 'ThisDocument.Fields.Update' før loop'et med paragraphs?Står der evt. mere i afsnittet end lige fejlmeddelelsen?...
Avatar billede dsj1972 Juniormester
03. marts 2010 - 14:08 #18
Nej, min UpdateFilds står efter den Paragraph

Jeg bruger denne her til at opdatere mine fields.

  Sub myUpdateFields()

Dim oStory As Range

    'Hvert område i et dokument er en 'Story'
    'Gennemløb alle stories og opdater felter deri
    For Each oStory In ActiveDocument.StoryRanges
    oStory.Fields.Update
    If oStory.StoryType <> wdMainTextStory Then
    While Not (oStory.NextStoryRange Is Nothing)
    Set oStory = oStory.NextStoryRange
    oStory.Fields.Update
    Wend
    End If
    Next oStory
   
    'Ryd op
    Set oStory = Nothing

End Sub

Jeg skulle måske lige nævne en anden vigtig ting her, jeg har et Array med Case select som vælger hvilke skabeloner som skal tages udgangs punkt i og i alle 3 tilfælde bliver der indslæst 5-6 skabeloner efter Array.

Hvis du med at der står mere i afsnittet mener Variablen på dokumentet nej så står der ikke mere på den linie, så nej, alle Variablerne står under hinanden på hver sin linie.
Avatar billede tjp Mester
03. marts 2010 - 14:20 #19
Prøv evt. at sætte et break point i linjen:

If Left(p.Range.Text, 42) = "Fejl! Der er ikke nogen dokumentvariabler." Then

og tjek om værdien af p.Range.Text er forskellig fra "Fejl! Der er ikke nogen dokumentvariabler."
Avatar billede dsj1972 Juniormester
03. marts 2010 - 15:47 #20
ok, da jeg gjorde det, stoppede den ved det første dokument og der er kun variable i som har fået værdi i Userform, men den stopper ved det og læser værdien som " ' (sådan ser det ihvertfald ud)


Giver det nogen mening???
Avatar billede dsj1972 Juniormester
03. marts 2010 - 16:50 #21
Hmm, det var vist ikke så lige til som jeg havde håbet på.
det kan ihverfald ikk kaldes nogen "skønheds fejl".

Jeg tror jeg kommer til at smække et nyt spm op omkring lige dette problem og se om der ikk kommer flere bud.
Avatar billede dsj1972 Juniormester
03. marts 2010 - 16:57 #22
Nu har jeg oprettet et spm omkring lige dette problem.

Her http://www.eksperten.dk/spm/903442
Avatar billede tjp Mester
03. marts 2010 - 17:07 #23
Prøv lige at sætte break point ved linjen:

p.Range.Text = ""

bare for at se om den overhovedet kommer ind i if'en.
Avatar billede dsj1972 Juniormester
03. marts 2010 - 17:50 #24
Når der sættes break point ved den sidst foreslået linie så kører hele koden igennem, for den når at kører hele Array igennem på 5 dokumenter, men jeg kunne ikke læse nogen værdi.
Avatar billede tjp Mester
03. marts 2010 - 18:06 #25
Hvis du stadig har linjen:
Debug.Print p.Range.Text
burde der komme noget i dit immediate vindue.
Avatar billede dsj1972 Juniormester
03. marts 2010 - 18:38 #26
Ja den linie står der stadig.
Måtte lige aktivere view på Immediate vinduet.

Men det er totalt underligt der der kommer frem i det.

det er nemlig det sidste tekst som er fast tekst i det sidste dokument i Array (altså den som bliver lavet sidst)
Avatar billede tjp Mester
03. marts 2010 - 22:05 #27
Nåe, det er nok fordi at det er en begrænset mængde text der kan stå i Immediate vinduet. Sæt fx et break point efter For Each-loop'et.
Avatar billede dsj1972 Juniormester
04. marts 2010 - 17:21 #28
Hej igen,

Ja havde jo slået det problem op som nyt spm, og har fået svar på den fra Lene fredborg, som virker lige som jeg ville have det.

Beklager!

Vil gerne give dig point for den vbModeless, den var sgu god!

Og du kan snuppe alle point hvis du lige kan hjælpe mig med hvordan jeg får tidspunkt lavet formateret.

Forklaring.

Jeg vil gerne have det sådan at jeg i mit strTid felt kan intaste f.eks 2245 og så kommer output ud som 22:45

Jeg har prøvet alle mulige måde med Date, men kan skisme ikk få den til at virke.
Avatar billede tjp Mester
04. marts 2010 - 20:25 #29
Den er lidt problematisk, medmindre at man altid skal taste 4 og kun 4 cifre:

strFormatTid  = Mid(strTid, 1, 2) & ":" & Mid(strTid, 3, 2)
Avatar billede dsj1972 Juniormester
04. marts 2010 - 22:10 #30
Ja, syns også den var lidt tricky, men tror godt jeg kan leve med at taste 4 ciffer hvergang, er ikke svært at skrive 0445 f.eks.

Men den køber jeg ihvertfald ;-)
Avatar billede dsj1972 Juniormester
04. marts 2010 - 22:13 #31
Kan du klare en lille nem (forhåbentlig) mere???

Jeg syns at kunne huske at man kan sætte felterne på Userform til at altid lave stort bokstav......men kan skisme ikk huske hvad den hed
Avatar billede dsj1972 Juniormester
04. marts 2010 - 22:22 #32
Du får i alle fald point efter en hård kamp ;-)
Avatar billede tjp Mester
05. marts 2010 - 00:55 #33
Kender umiddelbart kun:
string = UCase(string)

:-)
Avatar billede dsj1972 Juniormester
05. marts 2010 - 18:10 #34
Nåe ok, jeg huskede det noget som AutoCorrect eller sådan noget, men det har noget været i noget andet sammenhæng.

hvordan skulle det så lige bruges???

Sådan her:

strNavn = UCase(strNavn)

eller hva???
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
Tag et kursus i Word og øg effektiviteten

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