14. oktober 2007 - 15:55Der er
13 kommentarer og 1 løsning
Brugeroplysninger - igen - VBA
Fået stor hjælp til en forståelse af mulighederne for oprettelse af brugeroplysninger i Word. Nu begynder begrænsningerne at dukke op - 1) I forhold til dialogboks 2) i forhold til skabeloner der bruger informationerne:
1) Lavet en simpel kode i en dialogboks, som gemmer nogle vilkårlige brugeroplysninger på brugerens maskine. Se kode:
Private Sub CommandButtonOK_Click() Afdnavn = TextBoxAfd.Value Email = TextBoxEmail.Value Titel = TextBoxTitel.Value Tlf = TextBoxTlf.Value SaveSetting "EgneOplysninger", "Underskriver", "Afdnavn", Afdnavn SaveSetting "EgneOplysninger", "Underskriver", "Email", Email SaveSetting "EgneOplysninger", "Underskriver", "Titel", Titel SaveSetting "EgneOplysninger", "Underskriver", "Tlf", Tlf Brugeropl.Hide End Sub
Denne kode virker fint. Oplysninger bliver gemt uden problemer.
Spm.1A Men hvordan kan jeg sikre mig at brugeren fx. skriver telefonnummer som 'XX XX XX XX' og ikke som 'XXXX XXXX', og hvordan sikre jeg mig, at der fx indgår et '@' i mailadressen osv.?
Spm.1B Kan man få den til at oplyse brugeren om allerede registreret data i de enkelte felter?
Spm.1C Pt lavet den i normal.dot. I excel ville jeg lave den i et særskilt dokument - og gemme det som et tilføjelsesprogram, for derefter at installere det på de forskellige maskiner. Hvordan gør man det lettest i Word?
Spm.1D I excel ville jeg lave det som en macro, hvor jeg bad den om at bruge dialogboksen ved et kald '.show' og herefter bruge dataene fra indtastningerne i dialogbokse i det videre forløb i macroen. Men det er måske ikke det smarteste?
Skabelonerne, der skal bruge disse brugeoplysninger
Spm 2A I alle skabelonerne ville jeg gerne checke om oplysninger lå på brugerens maskine - hvis ikke - så skal macroen i spm1 starte op. Men det kan jeg ikke få til at fungere. Kan nogen hjælpe?
Spm 2B Imidlertid kan jeg godt få dataene (brugeroplysninger) over i skabelonen ved at indsætte et bogmærke i skabelonen og skrive følgende kode i en opstartsmakro: ActiveDocument.Bookmarks("Afdnavn").Range = _ GetSetting("EgneOplysninger", "Underskriver", "Afdnavn") Er det den smarteste metode?
Mange spørgsmål - håber at kunne få hjælp til nogle af dem. På forhånd tak for hjælpen.
Angående 2A kan jeg sagtens checke om fx titel har værdien "" med en IF-sætning a la:
Private Sub Document_Open() If GetSetting("EgneOplysninger", "Underskriver", "titel") = "" Then MsgBox "Du har ikke registreret en Titel" Else MsgBox "Titel: " & GetSetting("EgneOplysninger", "Underskriver", "Titel") End If End Sub
Men hvordan får jeg den makro startet, som jeg har gerne skulle have installeret på brugerens maskine jf spm 1C?
1A. Du skal ikke sikre dig, at brugeren skriver tlf.nummer sådan - tværtimod. Du skal derimod sørge for at formatere det korrekt, når det bliver indsat i de dokumenter, hvor det skal bruges.
If Email <> "" then If Instr(1, Email, "@") = 0 then '@ mangler i emailadressen End if End if
1B. Når du fyrer dialogboksen i luften, udfylder du de forskellige kontroller med de værdier, der allerede er i registreringsdatabasen.
1C. Fy! ;-) Aldrig bruge Normal.dot - det er brugerens egen "legeplads". Du laver en helt normal skabelon, som du derefter placerer i Words startfolder (aflæses/ændres via Office-knappen, Word-indstillinger, Avanceret, Filplaceringer). Den bliver så indlæst som en global skabelon, når Word startes.
1D. Jo.
2A. Du skal bruge Application.Run og så navnet på den procedure, der befinderr sig i din globale skabelon (som din Normal.dot nu også er), og som derefter smider din form i luften. Hvis det altså er det, der er problemet? Ellers må du lige skrive, hvad problemet er.
2B. Ja, det lyder som en god idé at få indsat de oplysninger, som nu findes i registreringsdatabasen, når man danner et nyt dokument. Så kan du også indsætte præcis de oplysninger, der er behov for (og det rigtige sted) i de respektive dokumenttyper.
1C. Med på start-folder. Supert 1D. Fik det til at fungere alligevel - men det er jo også reelt ligegyldigt om koden er i selve macroen eller i macroen bag userformen. Den er jo ikke så omfattende. 2A. Tak for det. Jeg skal således blot skrive: Application.Run.Brugeroplysningsmakronavn. Ej testet endnu. 2B. Supert. Det kan jeg nemlig få til at fungere.
1A. Jo, man kan jo sige at al tilpasning skal ske i skabelonen og ikke i dialogboksen. Men det er vel under forudsætning, at man styre hvor mange data, som kan indtastes af brugere. Ved indtastning af tlf som 'xx xx xx xx', så har man pludselig 11 karakterer - hvor nogen slipper af sted med 8 karakterer ('xxxxxxxx'). Eller?
1A. Fjern alle mellemrum, når brugeren klikker OK i dialogboksen (TextBoxTlf = replace(TextBoxTlf, " ", "")
1B. Du spurgte, hvordan man informerede brugeren om allerede indtastede værdier. Det er vel kun nødvendigt, hvis dialogboksen, hvor brugeren skal indtaste sine oplysninger, bliver vist (kan være ved mgl. oplysninger eller hvis brugeren har behov for at rette de allerede eksisterende oplysninger). Når du så smider formen i luften, sørger du for at hente værdierne fra registreringsdatabasen og indsætter dem i de respektive felter i dialogboksen. Hvis det var noget helt andet, du mente, må du lige sige til.
1b. Enig. Men hvordan smider jeg dem ind i indtastningsfeltet (eller evt. ved siden af). Jeg kan ikke gennemskue hvordan jeg laver koden....
Suppl.spørgmål: Hvis jeg istedet for en TextBox vil lave en ComboBox (fx under titel med variablerne eksempelvis 'Skorstensfejer' og 'Malersvend'). Jeg kan ikke gennemskue hvorledes Combobox'en finder variablerne
Hej igen. Jeg har testet indlæggelse af skabelon med makroer i Start-biblioteket. Det fungere rigtig fint. Jeg kan se det i VBA. Ved ikke om du har 2007 - men jeg kan ikke finde makroen når jeg gerne vil tilføje den som 'Hurtig Adgangs Knap'. Den er heller ikke vist under 'Tilføjelsesprogrammer'.
på enten Initialize- eller Activate-eventet på din form.
Hvad mener du med, hvordan comboboxen finder variablerne? Er det, fordi du ikke ved, hvordan du tilføjer tekster til comboboxen? I så fald kan du bruge Me.ComboBox1.AddItem "Malersvend" osv.
Mht. brugergrænseflade (og ja, jeg har 2007) Du kan for det første ikke finde din procedure, fordi den befinder sig i en global indlæst skabelon. For det andet skal du være opmærksom på, at din Hurtig adgangs-knap er din egen, og den vil IKKE eksistere hos de andre brugere, med mindre de også tilføjer den (dårlig løsning, hvis du spørger mig).
Fanen tilføjelsesprogrammer viser kun værktøjslinjer, som enten er dannet i en tidligere version af Word eller som du har oprettet via kode.
Hvis du har mod, synes jeg, at du skulle overveje at kaste dig ud i at ændre Ribbon/Båndet i stedet. Det giver et meget bedre resultat og du har flere muligheder. Du kan downloade en Custom UI Editor, som kan hjælpe dig med det. Jeg har i øvrigt lige lavet nøjagtig det trick med en global indlæst skabelon (på under 2 min.).
Enig i at hurtig adgangs knappen er fuldstændig håbløs - når man taler flere brugere. Der er mange fordele i Office 2007 - men en af bagdelene er da vist at egenudviklet værktøjslinierne forsvandt.
Jeg prøver med dine løsninger og forslag.
Tusind tak for al din hjælp. Jeg har de seneste dage virkelig fået øjnene op for en virkelig god standardisering af skabelonerne for lige p.t. 20 kollegaer. Men lur mig om resten af organisationen (over 100) ikke snart vil bruge de samme værktøjer.
Dit link ser rigtig godt ud. Jeg kan nok ikke nøjes med 2 minutter. Det kræver noget xmlviden og sammenhængen med ribbons - som jeg ikke lige p.t. har - forsøger p.t. at 'tygge' mig igennem.......
Har downloadet og ser blandt andet på de 2 eksempler for excel og word - som er inkluderet. Hvorledes får man dem gemt - og hvor?
Du får lige en hurtig-"fætter" til, hvad jeg har gjort. Åbn Custom UI Editor. Klik på "Åbn"-ikonet, find og udvælg din skabelon. Klik på Sample, vælg Custom Tab. Så får du strukturen forærende. Jeg har så rettet til følgende:
Så har jeg gemt og lukket UI Editoren. Åbnet min skabelon og lavet følgende 2 procedurer:
Public Sub ShowMyForm() UserForm1.Show End Sub
'Callback for customButton onAction Sub Callback(control As IRibbonControl) If control.ID = "EnterUserInfo" Then Call ShowMyForm End If End Sub ************
Gem og luk skabelonen. Indlæs den som en global skabelon - vupti - du har nu fået en ekstra fane og en knap.
Ovenstående er ikke særlig kønt, men til en test er det ok.
Supert. Jeg har kikket på det. Det lykkes ikke helt.
Kan være fordi jeg blot kopierede din tekst ind og slettede 'sample'-teksten Kan være fordi at skabelonen ikke lå det rigtige sted (altså i skabelonbiblioteket)(flyttede rundt på filen) De 2 makroer skal de ligge i 'thisdocument' eller som særskilt modul.
Skal og skal.... Koden kan være begge steder, men jeg har placeret den i et særskilt modul. Jeg vil ikke placere kode, der ikke skal fyres i luften automatisk (New, Open, Close) i ThisDocument.
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.