VBA Access: captions in formulierontwerp wijzigen via code

Status
Niet open voor verdere reacties.

reneemettrie

Terugkerende gebruiker
Lid geworden
1 aug 2006
Berichten
1.281
Ik geef Access opleidingen in NL en UK. Onlangs moest ik die in het Frans geven. ZEER veel werk, o.a. alle veldnamen en bijschriften gewijzigd maar ondanks de "automatische naamcorrectie" zowat alle queries en forms en reports moeten aanpassen.
Eén van de problemen: als je in het tabelontwerp de captions wijzigt worden die niet overgenomen in formulieren en rapporten. Nu had ik wegens tijdsgebrek wel een sub gemaakt die bij het openen van een formulier met een lus alle captions van elke control vertaalt, in de trent van "if ... . caption =" naam" then .... . caption = "nom". Maar dit verandert die captions natuurlijk niet definitief, de correcte captions worden getoond in de formulierweergave maar in het ontwerp wijzigt er niets.
Ik heb geen idee hoe je zoiets moet doen???
 
Toch is het vrij simpel: met een vertaaltabel. Je maakt een tabel met daarin de velden
1. Objectnaam (formulier, rapport etc.)
2. Controlnaam (label)
3. Taal
4. Vertaling

Deze tabel open je bij het openen van het formulier met een functie die met de gewenste parameters (formuliernaam, taal) de controls netjes instelt.
 
Ik denk dat ik me niet duidelijk heb uitgedrukt.
Ik heb het nu primitief opgelost (sub bij Load event)
Met een tabel zou het eleganter zijn maar daarvoor had ik geen tijd.
Maar het punt is: in de formulieren worden de captions niet DEFINITIEF gewijzigd.
Als je bvb direct naar de DESIGN mode gaat (load event wordt niet uitgevoerd) staat daar alles nog in het Nederlands.
Het gaat om oefenbestanden waarbij de deelnemers de design moeten bekijken.
Als de code wordt uitgevoerd krijg je in form view afbeelding 1, maar in design view afbeelding 2.
Zelfs de naam van de control is niet aangepast
Knipsel.JPG
Knipsel1.JPG

Code:
Sub vertalen()
Dim r As Form, c As Control
Code:
For Each r In Forms
For Each c In r.Controls
If TypeOf c Is Label Then
Select Case c.Caption
Case "Datum"
c.Caption = "Date"
Case "Nummer"
c.Caption = "Numéro"
Case "Omschrijving"
c.Caption = "Nom"
Case "Plaats"
c.Caption = "Ville"
Case "Tijd"
c.Caption = "Depart"
Case "Prijs"
c.Caption = "Prix"
Case "Opmerkingen"
c.Caption = "Remarques"
Case "hyperlink"
c.Caption = "Hypertexte"

' enz
End Select

End If

Next c

Next r
End Sub
 
Ook dat is mogelijk volgens mij, maar dan moet je een formulier openen in Design mode in VBA. Dat moet dus vanuit een ander formulier gebeuren. Overigens zou ik het hele probleem omzeilen door met generieke namen te werken, Engels lijkt mij dan gezien je doel een logische keuze. Dus geen labels met de namen [Datum] en [Nummer], maar [Label1] en [Label2]. En dat doe je dan ook met de controls.
Ik denk trouwens dat ik sneller een tabel vul met vertalingen dan dat ik daar een functie voor moet maken waar toch exact dezelfde teksten in terug te vinden moeten zijn :).
 
In principe heb je gelijk, voor VBA cursussen gebruik ik Engels.(Maar wie dat niet verstaat kan best niet naar VBA komen)
Maar recente Access bestanden had ik alleen in NL, en een versie van 10 jaar geleden in UK, en toen moest ik plots op heel korte termijn Access basis en advanced in FR geven :(
En de Franstaligen in België zijn niet zo polyglot. Bedoeling was dat het niet meer zou te zien zijn dat het oorspronkelijk in NL was.
Als je met een tabel met vertalingen werkt veronderstel ik dat je met DLOOKUP moet werken? Maar dat lost mijn probleem dus niet op. "Label1" e.d. is ook wel niet zo gebruikersvriendelijk hé, is niet omdat Microsoft zulke namen gebruikt dat ik dat ook wil doen :)
Ondertussen opleiding gedaan, goed verlopen, dus probleem stelt zich niet meer direct maar ik vroeg me dus af of zoiets op te lossen is.
 
Als je met een tabel met vertalingen werkt veronderstel ik dat je met DLOOKUP moet werken?
Nee, dat is zo'n beetje de rotste variant die je kunt bedenken :). Gewoon met een tabel, een recordset en de Controls verzameling van je formulier. Overigens vind ik het ergens vreemd dat je wél problemen hebt met de namen van de labels, maar niet met de gekoppelde velden. Dat lijkt mij toch veel belangrijker, dat je, als je toch alles naar het Frans vertaalt, ook de velden omzet? Dan ben je dus goed in de aap gelogeerd, want dan doet echt niks het meer op je formulier :). Maar zo'n functie kan ook dat uiteraard voor je oplossen.
 
Met een array voor iedere taal lijkt mij ook weinig mis.

s_nl=split("een twee drie")
s_fr=split("un deux trois")
 
... typisch een antwoord van iemand die, vermoed ik, geen databases maakt, maar alles programmeert :).
 
Gewoon met een tabel, een recordset en de Controls verzameling van je formulier.
Kan je een klein concreet voorbeeld geven van de code hiervoor?
Ikzelf moet slechts uiterst zelden programmeren :)
De namen die op de controls getoond worden verwijzen naar de vertaalde veldnamen, maar in de eigenschappen is er niks veranderd.
Eén ding is zeker: die zogenaamde automatische naamcorrectie is zo goed als waardeloos :evil:
 
Nou, zo goed als waardeloos.... Hij is niet gemaakt waar jij de 'vertaalfunctie' voor wilt gebruiken :). Sowieso is een formulier altijd een 'harde' kopie van de gegevens die je in de tabel hebt ingesteld. Objecten in een formulier of rapport zijn nooit gekoppeld aan een tabel, en daarom kan het formulier ook nooit automatisch worden bijgewerkt. Het idee is natuurlijk ook dat je eerst de structuur in orde hebt, en daarna pas aan de formulieren gaat werken. Zo is het ook uiterst onhandig als je een huis bouwt en begint met de bovenverdieping, en dan pas wilt nadenken over de fundering :).
Ik heb niet zo snel een vertaaltabel klaar staan; als jij een voorbeeldje maakt met een tabel/formulier en een tabel met vertalingen, dan kan ik daar de juiste code wel onder plakken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan