28. februar 2010 - 16:38Der 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.
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.
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
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.. :-)
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.
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.
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
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.
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.
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
Æ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
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.
'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.
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)
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.
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???
Synes godt om
Ny brugerNybegynder
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.