VBA : Nom de zone

M

Marc

Guest
Bonjour le forum,

Toujours pour le même projet (celui de grille de réservation de la salle).

J'ai créé une variable (dim datum as string)

Cette variable prend le nom de deux champs access, exemple :

octobre03

Je sélectionne la feuille excel 'Grille' et j'aimerais juste que VBA insère le contenu de la variable dans la zone nom mais là il me donne ce message d'erreur :

Erreur de compilation : membre de méthode ou de données introuvable

et voici le code :

Application.Goto Reference:=datum

J'espère que j'ai été assez claire, n'hésiter pas à me contacter si vous ne comprenez pas.

Merci d'avance pour l'aide.

Marc
 
M

Marc

Guest
Hellboy écrit:
Bonjour Marc

Tes explications son claire, mais très peu de vision sur l'erreur qui se produit. Te serait-il possible de joindre ton fichier ou en montrer un peu plus sur ton code s.v.p.

Hellboy écrit:
Bonjour Marc

Tes explications son claire, mais très peu de vision sur l'erreur qui se produit. Te serait-il possible de joindre ton fichier ou en montrer un peu plus sur ton code s.v.p.

Bonjour Philippe,

Merci pour ta réponse.

C'est un peu compliqué car c'est un dialogue entre Access et Excel.

Pour ce qui est de ma grille de réservation, j'ai avancé un tout petit peu.

Ce que j'ai fais, c'est créer une variable (datum) qui reprend le nom du mois et du jour (sans espace).

je sélectionne ensuite la feuille grille, là, j'aimerais seulement qu'il prenne la valeur de la variable 'datum' et qu'il la mette dans zone de liste + enter, cela le positionnerais alors en B8 (octobre03).

Cela serait une petite avancée pour le premier message que j'ai posté aujourd'hui avant midi.

Voici le classeur excel maj.

A bientôt et merci !

Marc

PS:

Voici mon code qui permet de transférer des données de Access vers Excel + commentaires (cela pourra peut être servir pour quelqu'un d'autre)

Private Sub btnValiderDonneesReservationSalleInfo_Click()
' declaration des variables DAO
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim AppExcel As Excel.Application
Dim wbexcel As Excel.Workbook
Dim ValSQL As String
Dim Errormsgbox As String
Dim datum As String 'cette variable va mémoriser la valeur mois + jour (exemple octobre03) pour rechercher la zone portant ce nom dans l'autre feuille


'en cas d'erreur, on va à TraitementErreur (TraitementErreur est une étiquette)
'On Error GoTo TraitementErreur


'ici, je fais perdre le focus au bouton (le focus va sur la liste de choix 'Mois') pour que le bouton puisse être
'caché (visible=false)
Me!Mois.SetFocus
Me!btnValiderDonneesReservationSalleInfo.Visible = False

' ouverture de la table Table DonneesReservationSalleInfo
Set db = CurrentDb
Set rst = db.OpenRecordset('DonneesReservationSalleInfo')

'on ouvre le fichier excel (occupation)
Set AppExcel = CreateObject('Excel.Application')
'je cache la feuille
AppExcel.Visible = True
'je sélectionne la bonne feuille du classeur
Set wbexcel = AppExcel.Workbooks.Open('Z:\\occupation', ReadOnly:=False)
wbexcel.Sheets('DonneesReservationSalleInfo').Select




' ajouter un nouvel enregistrement dans la table 'DonneesReservationSalleInfo'
rst.AddNew

' remplissage des champs dans la table 'DonneesReservationSalleInfo'
rst('Mois') = Mois.Value
rst('Jours') = Jours.Value
rst('HeureDebut') = HeureDebut.Value
rst('HeureFin') = HeureFin.Value
rst('Utilisateur') = Utilisateur.Value

' maj de la table avec le nouvel enregistrement
rst.Update

'Programmation de la requête
ValSQL = 'SELECT * FROM [rqtDonneesReservationSalleInfo]'

'dans le fichier excel, je sélectionne la ligne 1A
AppExcel.Cells(1, 1).Select

'Je sélectionne la ligne libre (juste après celle qui est occupée par des données)
Do Until AppExcel.ActiveCell.Value = ''
AppExcel.ActiveCell.Offset(1, 0).Select
Loop

'Je vais au premier enregistrement de la table 'DonneesReservationSalleInfo'
rst.MoveFirst

'jusqu'à la fin de tous les enregistrements dans la requête
While Not rst.EOF

'je remplis la sheet excel
AppExcel.ActiveCell.Value = rst![N°].Value
AppExcel.ActiveCell.Offset(0, 1).Value = rst![Mois].Value
AppExcel.ActiveCell.Offset(0, 2).Value = rst![Jours].Value
AppExcel.ActiveCell.Offset(0, 3).Value = rst![HeureDebut].Value
AppExcel.ActiveCell.Offset(0, 4).Value = rst![HeureFin].Value
AppExcel.ActiveCell.Offset(0, 5).Value = rst![Utilisateur].Value
AppExcel.ActiveCell.Offset(0, 6).Value = Now
AppExcel.ActiveCell.Offset(0, 7).Value = rst![Mois] & rst![Jours]
datum = AppExcel.ActiveCell.Offset(0, 7).Value

AppExcel.ActiveCell.Offset(1, 0).Select
AppExcel.Worksheets('grille').Select
AppExcel.Application.Goto Reference:=datum

'je supprime les enregistrements de la table, un enregistrement à la fois vue qu'on doit cliquer sur le bouton pour
'enregistrer le changement dans la table
rst.Delete
rst.MoveNext

'voir aussi l'évènement sur le close du formulaire et sur l'activation du formulaire (petit carré en haut à gauche)

Wend

'je ferme le tout (excel) et je sauve
'wbexcel.Save
'wbexcel.Close
'AppExcel.Quit

'je supprime toutes les valeurs des listes de choix
Me!Mois.Value = ''
Me!Jours.Value = ''
Me!HeureDebut.Value = ''
Me!HeureFin.Value = ''
Me!Utilisateur.Value = ''




'TraitementErreur:
' If Err.Number = 3021 Then
' Errormsgbox = 'Matricule non trouvé dans cette année !'
' AppExcel.Quit
'
' Else
' Errormsgbox = 'L'erreur suivante s'est produite : ' & vbCrLf & Err.Number & Err.Description
'
' End If
' MsgBox Errormsgbox, vbCritical
'



End Sub
 

Hellboy

XLDnaute Accro
re

Ton fichier n'a pas passé. Suit le fil de ma signature.

En même temps, je vois souvent le terme zone de liste, mais je ne suis pas certain de savoir c'est quoi au juste.

Merci pour ton code aussi, je vais le garder comme ref.

En passant, je ne sais pas si tu connaissais la commande With. Je te montre un exemple d'actualité.:

'je remplis la sheet excel
With AppExcel
       
With .ActiveCell
                    .Value = rst![N°].Value
                    .Offset(0, 1).Value = rst![Mois].Value
                    .Offset(0, 2).Value = rst![Jours].Value
                    .Offset(0, 3).Value = rst![HeureDebut].Value
                    .Offset(0, 4).Value = rst![HeureFin].Value
                    .Offset(0, 5).Value = rst![Utilisateur].Value
                    .Offset(0, 6).Value = Now
                    .Offset(0, 7).Value = rst![Mois] & rst![Jours]
                    datum = .Offset(0, 7).Value
                       
                    .Offset(1, 0).Select
       
End With
    .Worksheets('grille').Select
    .Application.Goto Reference:=datum
End With

a+
 
M

Marc

Guest
re,

Je renvois le fichier.

Excuse moi pour zone de liste, je me suis trompé, c'est nommé une cellule via une zone (je vais faire un printscreen et l'envoyer).

De rien pour le code, c'est la méthode DAO, ancienne méthode mais facile et efficace !

Je connais With mais je l'applique pas assez souvent.

Je renvois maintenant mon fichier.

Merci !

Marc [file name=occupation.zip size=10910]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/occupation.zip[/file]
 

Pièces jointes

  • occupation.zip
    10.7 KB · Affichages: 33
  • occupation.zip
    10.7 KB · Affichages: 35
  • occupation.zip
    10.7 KB · Affichages: 35
M

Marc

Guest
Re-salut tout le monde,

J'ai trouvé une solution pour mon choix d'une zone nommée par VBA mais ma solution est très longue et je pense qu'on peut l'améliorer, voici le code :

If datum = 'octobre03' Then
AppExcel.Application.Goto Reference:='octobre03'
elseif datum = 'octobre04' then
AppExcel.Application.Goto Reference:='octobre04'
...
End If

Je pourrais créer 3 modules pour les 3 trimestres mais les jours changent d'une année à l'autre, l'année prochaine, le 03 octobre tombe un vendredi et le 04 octobre qui était un mardi cette année tombera un Samedi (jour où il n'y a pas de séminaire).

Donc, je pense réellement que ma solution n'est pas bonne.

Qu'en pensez-vous ?

Merci d'avance.

Marc
 

Hellboy

XLDnaute Accro
re Marc (la saisie tu ?)

:)

La commande pour assigner un nom a une cellule c'est ceci:


ActiveWorkbook.Names.Add Name:='Octobre03', RefersToR1C1:='=Grille!R4C4'

R4( Ligne 4 en englais)
C4(Colonne 4 en anglais)

J'essaie de voir a quel endroit tu peux mettre l'assignation, j'ai l'impression qu'il me manque un bout de code pour le faire.

Je ne sais pas si je t'aide dans la bonne direction. :eek:

si oui, AppExcel.Application.Goto Reference:=datanum va faire l'affaire

a+
 
M

Marc

Guest
Re,

Je reviens à nouveau mais cette fois-ci avec une bonne nouvelle, j'ai trouvé et tout seule ;)

avec ça

AppExcel.Application.Goto datum

ça fonctionne.

Il sélectionne la bonne cellule.

Mais ceci n'est que le début de mon aventure, je vais maintenant continuer et si j'ai à nouveau un souci, je reviendrai.

Je visiterai très souvent votre site pour (essayer) d'aider les autres car je sais c'est quoi être dans le besoin :lol:

Merci !

Marc
 

Jam

XLDnaute Accro
Salut Hellboy, Marc,

2 petites remarques:

Pour nommer une plage rien de plus simple et surtout plus facile à retenir que:
Range('D4').Name='Octobre03'
ou
Sheets('Grille').Range('D4').Name='Octobre03'
ou encore
[D4].Name='Octobre03'

B)

Marc, pourquoi te casser la nénette à partir d'Access pour gérer Excel ?
L'inverse aurait-été, IMHO, plus judicieuse car la gestion de l'objet XL aurait été nettement simplifié. Au passage DAO ou ADO, je préfère ce dernier, mais c'est un autre débat.

Bon courage
 
M

Marc

Guest
Marc écrit:
Re,

Je reviens à nouveau mais cette fois-ci avec une bonne nouvelle, j'ai trouvé et tout seule ;)

avec ça

AppExcel.Application.Goto datum

ça fonctionne.

Il sélectionne la bonne cellule.

Mais ceci n'est que le début de mon aventure, je vais maintenant continuer et si j'ai à nouveau un souci, je reviendrai.

Je visiterai très souvent votre site pour (essayer) d'aider les autres car je sais c'est quoi être dans le besoin :lol:

Merci !

Marc

Oups :woohoo:

J'avais pas lu ton message Philippe, je vois que tu étais dans le bon ;)

Un super grand merci pour ton aide et bonne soirée.

Marc
 
M

Marc

Guest
Jam écrit:
Salut Hellboy, Marc,

2 petites remarques:

Pour nommer une plage rien de plus simple et surtout plus facile à retenir que:
Range('D4').Name='Octobre03'
ou
Sheets('Grille').Range('D4').Name='Octobre03'
ou encore
[D4].Name='Octobre03'

B)

Marc, pourquoi te casser la nénette à partir d'Access pour gérer Excel ?
L'inverse aurait-été, IMHO, plus judicieuse car la gestion de l'objet XL aurait été nettement simplifié. Au passage DAO ou ADO, je préfère ce dernier, mais c'est un autre débat.

Bon courage

Salut,

Je me casse la nénette car les utilisateurs doivent d'abord remplir un formulaire et eux ils préfèrent une interface graphique simple et chaleureuse.

Tu connais ADO ? moi pas beaucoup, si tu veux on peut en parler en privé (pour pas ennuyé les autres).

Quels sont pour toi les avantages du ADO comparer au DAO ?

MERCI !

Marc
 

Jam

XLDnaute Accro
Re Marc,

Quand je dis ne pas se casser la nénette, je l'entendais pour la manipulation d'Excel sous Access. De même tu pourrais gérer la mise à jour de ta base directement à partir d'Excel (en utilisant ADO ou DAO) via des requêtes SQL type SELECT ou INSERT. Excel est quand même plus facile d'accès pour les utilisateurs qu'une base Access.

Pour en revenir à ADO vs DAO je t'invite (j'espère que tu lis l'anglais) à te rendre sur ce lien pour voir la différence de programmation entre les 2. Tu verras qu'il y en a peu en fait.
Ce lien n'existe plus

Pour les avantages de l'un sur l'autre disons simplement que le modèle ADO permet d'accéder à une variété plus grande de type de bases de données que DAO qui lui ne donne accès qu'au moteur de donnée d'Access type Jet. ADO est plus performant, moins consommateur de ressource, qu'il est plus récent et donc qu'il offre plus de possibilité et de souplesse de programmation. ADO est aussi beaucoup plus stable que DAO. Bref, il vaut mieux utiliser ADO même si dans le strict couple Access/Excel DAO peut tout à fait convenir.

J'espère avoir répondu à ta question. Si tu recherches plus de renseignement autant lancer une petite recherche de ADO vs DAO sur ton moteur de recherche favori car tu le verras le débat est assez riche.

Bon courage
 
M

Marc

Guest
Salut Jam,

J'apprécie beaucoup ta réponse et surtout le lien que tu m'as envoyé, merci !

J'apprécie aussi ton explication sur la différence entre DAO et ADO, à nouveau merci.

Et pour conclure, je suis tout à fait d'accord avec toi, 'Excel est quand même plus facile d'accès pour les utilisateurs qu'une base Access' mais j'ai créé un formulaire comme on pourraît sans doute le faire avec Excel mais Access est de ce point de vu, mieux que Excel (niveau formulaire).

Merci encore et bon Week-End.

Marc
 

Discussions similaires

Statistiques des forums

Discussions
312 467
Messages
2 088 670
Membres
103 914
dernier inscrit
VAL965698