Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/06/2011, 16h33   #1
Membre du Club
 
Homme Yves
Inscription : novembre 2006
Messages : 114
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : Belgique

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2006
Messages : 114
Points : 50
Points : 50
Par défaut Mise a jour de zone de liste et combo ne se réalisent pas

Bonjour,

Je suis en train d'implémenter un possibilité de rajoutter une nouvelle langue pour remplacer tous les intitulés de ma base de données.

J'ai un formulaire principal qui contient une grande liste avec les différentes commandes et une combobox avec le choix des langues (il y en a 2 au départ).
Aucun problème jusque là quand je switche d'une langue à l'autre ma zone de liste s'actualise.

J'ai par ailleurs un btn pour que l'utilisateur puisse ajouter une langue. Après click je lui demande quelle langue il veut ajouter et je met a jour la combobox (rajouter une ligne) et la liste principale (rajouter une colonne et la mettre à 0cm). Par ailleurs, je rajoutte aussi une colone dans les 2 tables qui contiennent tous les caption, labels et autres textes de tous les controles de la DB.

Quand je mets un Exit Sub à la position indiquée dans le code par '***
C'est OK, ma combo est actualisée, la liste principale aussi gagne une colonne, la table tblfrmctrl gagne un champs.

je me suis appercu que je ne pouvais pas modifier la table qui sert de source à la liste car celle-ci était ouverte dans le formulaire principal.
Donc je me dis, il suffit de fermer le formulaire (ou de le mettre en mode design) puis de le réouvrir. Et ce sera OK. et bien non...

Ce qui ce passe c'est que les tables sont alors bien actualisées (elles gagnent chacune une colonne) MAIS la liste principale et la combobox ne sont plus du tout actualisées...

C'est comme si Me.frmlng.RowSource et Me.lstMenuPrincipal.ColumnWidths ne s'effectuaient pas... alors que ca marchait précédemment.

Vous avez des idées?

Merci!!


voici le code:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Private Sub lblAddlng_Click()
Dim result As String, str As String
Dim nomfld1 As String, nomfld2 As String
Dim fldnew1 As Field, fldnew2 As Field
Dim Nbr As Integer, i As Integer
 
'récupération du nom de la nouvelle langue
result = InputBox("Nom/Naam?", "Ajout d'une nouvelle langue")
If Len(result) = 0 Then
    Exit Sub
End If
 
'reactualise le cmb de choix des langues
'compte le nbr de guillements dans le rowsource de la combobox
str = Me.frmlng.RowSource
For i = 1 To Len(str)
    'InStr(1,str,chr(34))
    If Mid(str, i, 1) = Chr(34) Then
        Nbr = Nbr + 1
    End If
Next
'réaffecte la rowsource
Me.frmlng.RowSource = Me.frmlng.RowSource & ";" & ((Nbr / 2) + 1) & ";" & Chr(34) & UCase(Left(result, 2)) & Chr(34)
Me.frmlng.Requery
 
'on réactualise le nombre de colonne de la liste principale
Me.lstMenuPrincipal.ColumnCount = Me.lstMenuPrincipal.ColumnCount + 1
Me.lstMenuPrincipal.ColumnWidths = Me.lstMenuPrincipal.ColumnWidths & ";0cm"
Me.lstMenuPrincipal.Requery
 
nomfld1 = "Caption" & Left(result, 3) 'construction du nom du champs
'creation du champ avec une valeur par défaut
Set fldnew1 = CurrentDb.TableDefs!tblFrmctrl.CreateField(nomfld1, dbText)
fldnew1.DefaultValue = "txt " & result
CurrentDb.TableDefs("tblFrmctrl").Fields.Append fldnew1
 
 
'on ferme d'abord le formulaire menu principal car il utilise la table en question
DoCmd.Save acForm, "MenuPrincipal"
'***
 
DoCmd.Close acForm, "MenuPrincipal"
'DoCmd.OpenForm "MenuPrincipal", acDesign, , , , acHidden
 
'Idem pour la seconde table
nomfld2 = "txt" & Left(result, 3)
Set fldnew2 = CurrentDb.TableDefs!tblMenuPrincipal.CreateField(nomfld2, dbText)
fldnew2.DefaultValue = "txt " & result
CurrentDb.TableDefs("tblMenuPrincipal").Fields.Append fldnew2
 
'on réouvre le formulaire menu principal
'DoCmd.OpenForm "MenuPrincipal"
'DoCmd.OpenForm "MenuPrincipal", acNormal
 
MsgBox "Vous venez d'ajouter la langue " & result
End Sub
Dermochelys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 21h52   #2
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Bonsoir,

Que se passe-t-il si tu procèdes dans cet ordre :
fermer le formulaire MenuPrincipal
Modifier "tblMenuPrincipal"
Modifier "tblFrmctrl"
et ensuite t’occuper de la RowSource ?
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 09h16   #3
Membre du Club
 
Homme Yves
Inscription : novembre 2006
Messages : 114
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : Belgique

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2006
Messages : 114
Points : 50
Points : 50
Bonjour Claude,

Je viens d'essayer ta solution. Dans l'ordre que tu suggère , les 2 tables sont mises à jour. Puis je réouvre mon formulaire principal avec un DoCmd.OpenForm...
Et là un joli message d'erreur 2467 apparait quand on arrive sur la ligne qui s'occupe de remettre à jour les contrôles.
Il semblerait que le formulaire soit fermé ou n'existe pas.

Je pense que je ne peux pas faire de modification de contrôle sur une ouverture de formulaire. Dans l'idéal faudrait que je passe ça sur l'évènement OnLoad
Mais comment faire ça dans la même procédure?

Je continue ma recherche en attendant tes suggestions
Dermochelys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 09h31   #4
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Bonjour,

Citation:
Puis je réouvre mon formulaire principal avec un DoCmd.OpenForm...
en mode design ?

Poste ton code modifié.
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 09h41   #5
Membre du Club
 
Homme Yves
Inscription : novembre 2006
Messages : 114
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : Belgique

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2006
Messages : 114
Points : 50
Points : 50
Re bonjour Claude,

Bon j'ai résolu le problème en modfiant l'ordre comme tu le suggérai, il y avait encore ce fichu message, Ce qui m'a fait pensé que peut-être la commande Me.etc.etc ne reconnaissais pas le formulaire qui venait de se réouvrir.
En changeant les Me par Forms!MenuPrincipal! ... ca fonctionne.

Le requery du formulaire avant les modif des rowsources n'est pas indispensable.

En tout cas un grand merci pour ta solution qui m'a été utile.

A une prochaine!

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Private Sub lblAddlng_Click()
Dim result As String, str As String
Dim nomfld1 As String, nomfld2 As String
Dim fldnew1 As Field, fldnew2 As Field
Dim Nbr As Integer, i As Integer
 
'récupération du nom de la nouvelle langue
result = InputBox("Nom/Naam?", "Ajout d'une nouvelle langue")
If Len(result) = 0 Then
    Exit Sub
End If
 
'reactualise le cmb de choix des langues
str = Me.frmlng.RowSource
For i = 1 To Len(str)
    'InStr(1,str,chr(34))
    If Mid(str, i, 1) = Chr(34) Then
        Nbr = Nbr + 1
    End If
Next
 
'on ferme d'abord le formulaire menu principal car il utilise la table en question
DoCmd.Close acForm, "MenuPrincipal"
 
'on modifie la première table
nomfld1 = "Caption" & Left(result, 3) 'construction du nom du champs
'creation du champ avec une valeur par défaut
Set fldnew1 = CurrentDb.TableDefs!tblFrmctrl.CreateField(nomfld1, dbText)
fldnew1.DefaultValue = "txt " & result
CurrentDb.TableDefs("tblFrmctrl").Fields.Append fldnew1
 
'Idem pour la seconde table
nomfld2 = "txt" & Left(result, 3)
Set fldnew2 = CurrentDb.TableDefs!tblMenuPrincipal.CreateField(nomfld2, dbText)
fldnew2.DefaultValue = "txt " & result
CurrentDb.TableDefs("tblMenuPrincipal").Fields.Append fldnew2
 
'on réouvre le formulaire menu principal
'DoCmd.OpenForm "MenuPrincipal"
DoCmd.OpenForm "MenuPrincipal", acNormal
'DoCmd.OpenForm "MenuPrincipal", acDesign, , , , acHidden
 
MsgBox "Vous venez d'ajouter la langue " & result
 
Forms!MenuPrincipal.Requery
 
'on s'occupe de modifier les contrôles
Forms!MenuPrincipal!frmlng.RowSource = Forms!MenuPrincipal!frmlng.RowSource & ";" & ((Nbr / 2) + 1) & ";" & Chr(34) & UCase(Left(result, 2)) & Chr(34)
Forms!MenuPrincipal!frmlng.Requery
 
'on réactualise le nombre de colonne de la liste principale
Forms!MenuPrincipal!lstMenuPrincipal.ColumnCount = Forms!MenuPrincipal!lstMenuPrincipal.ColumnCount + 1
Forms!MenuPrincipal!lstMenuPrincipal.ColumnWidths = Forms!MenuPrincipal!lstMenuPrincipal.ColumnWidths & ";0cm"
Forms!MenuPrincipal!lstMenuPrincipal.Requery
 
'on ouvre ici un formulaire qui permet d'éditer les textes des 2 tables en affichant toutes les langues
 
End Sub
Dermochelys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 09h51   #6
Membre du Club
 
Homme Yves
Inscription : novembre 2006
Messages : 114
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : Belgique

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2006
Messages : 114
Points : 50
Points : 50
Bon c'est pas encore tout à fait ça.

Tout fonctionne mais quand je ferme le formulaire MenuPrincipal puis le réouvre, la combobox et la liste sont revenu à leurs paramètres initiaux....
On dirait que cela n'a pas été sauvé.
Un DoCmd.Save ne résoud rien...

Une idée?
Dermochelys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 09h51   #7
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
"Me" se réfère au formulaire dans lequel ton code se trouve, en l'occurrence :
celui qui contient le bouton cliqué.

À la prochaine.
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 10h00   #8
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Je ne vois pas le sauvetage dans le code affiché.
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 10h06   #9
Membre du Club
 
Homme Yves
Inscription : novembre 2006
Messages : 114
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : Belgique

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2006
Messages : 114
Points : 50
Points : 50
Cette fois-ci c'est la bonne. En effet, il n'y a pas de save dans le code précédent car je l'avais enlevé pour d'autres essais.

En final, au lieu d'ouvrir le formulaire en mode nomral, je l'ouvre en mode design et caché. Puis j'édite les row sources et les contrôles qu'il faut. Je l'affiche.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
'avant c'est le même code que précédemment*********
DoCmd.OpenForm "MenuPrincipal", acDesign, , , , acHidden
 
 
'Forms!MenuPrincipal.Requery
 
'on s'occupe de modifier les contrôles
Forms!MenuPrincipal!frmlng.RowSource = Forms!MenuPrincipal!frmlng.RowSource & ";" & ((Nbr / 2) + 1) & ";" & Chr(34) & UCase(Left(result, 2)) & Chr(34)
'Forms!MenuPrincipal!frmlng.Requery
 
'on réactualise le nombre de colonne de la liste principale
Forms!MenuPrincipal!lstMenuPrincipal.ColumnCount = Forms!MenuPrincipal!lstMenuPrincipal.ColumnCount + 1
Forms!MenuPrincipal!lstMenuPrincipal.ColumnWidths = Forms!MenuPrincipal!lstMenuPrincipal.ColumnWidths & ";0cm"
'Forms!MenuPrincipal!lstMenuPrincipal.Requery
 
DoCmd.OpenForm "MenuPrincipal", acNormal
MsgBox "Vous venez d'ajouter la langue " & result
Puis je le ferme (c'est sur ce bouton que je mets un
Code :
    DoCmd.Close acForm, "MenuPrincipal", acSaveYes
)

Et tout est là quand je le réouvre

Encore merci Claude!
Dermochelys est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h00.


 
 
 
 
Partenaires

Hébergement Web