Listbox sur classeur fermé/mise à jour

  • Initiateur de la discussion Stéph tjs en vie
  • Date de début
S

Stéph tjs en vie

Guest
Bonjour à tous,

J'essaye de monter une macro pour optimiser une base de données qui jusque là était trop trop bruillon !

Je vous explique vite fait , j'ai un classeur repértoriant une liste de clients (classeur 1)avec 3 colonnes :
colonne A liste Clients
colonne B pays du client
colonne C domaine d'activités du client

J'ai un second classeur qui repertorie les nouvelles transactions que les clients ont faits.

1er Pb :
J'ai developpé une macro avec un userform qui me permet d'ajouter ces nouvelles transactions en choisissant
successivement le nom du client, le pays et le domaine d'activités.Le pb est le suivant :

- soit le client existe déjà car présent dans mon classeur 1 précédent Listeclients.xls - là c'est génial, pas de pb
- soit il n'existe pas, et là je remplis mon userform moi meme en tapant en brute son nom et en choisissant dans une liste son pays et son type d'activités puis en meme temps je demande à ma macro de l'ajouter à ma Listeclients (classeur 1) aussi bien son nom, k son pays et son type d'activités soit les 3 colonnes. c'est une sorte de mIse à jour de ma base.
Là est le pb, pour le moment, je n'arrive pas à lui faire ajouter et dans le meme ordre nom/pays/domaine, j'ai un code pour ajouter le nom mais le classeur n'est pas reconnu ..!

If Me.Listeclients.ListIndex = -1 Then _
Workbooks('ListeInvestisseurs.xls').Sheets('Feuil1').Cells(1, 1).End(xlDown).Offset(1, 0).Value = Me.ListeInvestisseurs.Value

Comment arriver à lui faire comprendre cette mise à jour ?

2eme pb :

Ma list box est alimentée par une liste déroulante dont la source est le classeur 1 Listclients.xls, le pb c'est que jusqu'ici ce classeur doit absoluement etre ouvert,sinon ma macro ne fonctionne pas!

Voici mon code actuel pour importer le fichier liste clients

Dim i As Integer
For i = 1 To Workbooks('Listeclients.xls').Sheets('Feuil1').Range('A1').End(xlDown).Row
ListeClients.AddItem Workbooks('ListeClients.xls').Sheets('Feuil1').Cells(i, 1)
Next i

Auriez vous une solution pour qu'elle fonctionne également lorsque le classeur est fermé ?
J'ai fait une ptite recherche dans les archives, mais je n'ai rien trouvé qui concernait une listbox liste déroulante alimentée par un classeur fermé ..

Quelqu'un a t il une idée ?


Merci pour votre aide le forum ..

Steph, tjs en vie meme apres tous ces codes codés!
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Stéph, le Forum

Je ne veux pas t'inquiéter mais si tu te dis 'Steph, tjs en vie meme apres tous ces codes codés!' j'ai vraiment peur de te mettre en lien une Démo sur 'ADO' (ActiveX Data Object) qui est The Solution pour toucher à des classeurs Fermés. (Fais une recherche à ADO sur ce Forum sous les Noms de MichelXLD, Michel_M ou le mien)

Ce que je peux te conseiller dans un premier temps c'est de travailler encore un peu sur Fichier Ouvert (qui ceci dit en passant peut être invisible à l'utilisateur)

Ce que je peux te conseiller dans un second temps immédiat c'est de nommer tes contrôles d'une manière conventionnelle... Car

If Me.Listeclients.ListIndex = -1 Then

Me laisse comprendre que nous parlons d'un ActiveX 'ListBox' ... Or manifestement le fait que tu puisses 'en tapant en brute son nom' renseigner un enregistrement nouveau laisse présager que finalement l'on parle de d'un ActiveX 'ComboBox'... (?)

Ce que je peux te conseiller dans un troisième temps c'est d'essayer d'utiliser des Syntax standard de programmation car ce genre de Condition en 1 ligne est très fatiguante à suivre et sera (si ce n'est déjà) cause d'erreur...

If Me.Listeclients.ListIndex = -1 Then _
Workbooks('ListeInvestisseurs.xls').Sheets('Feuil1').Cells(1, 1).End(xlDown).Offset(1, 0).Value _
= Me.ListeInvestisseurs.Value

Devrait être clairement défini et écrit de la Sorte :

Dim WBCible As Workbook
Dim WSCible As Worksheet
Dim RCible As Range

Set WBCible = Workbooks('ListeInvestisseurs.xls')
Set WSCible = WBCible.Sheets('Feuil1')
Set RCible = WSCible.Cells(1, 1).End(xlDown).Offset(1, 0)


   
If Me.Listeclients.ListIndex = -1 Then
        RCible.Value = Me.ListeInvestisseurs.Value
   
End If

L'avantage Sera que dans la Foulée tu pourras facilement alimenter ta Base de Données avec par exemple (je ne connais pas le nom de tes Contrôles)

Dim WBCible As Workbook
Dim WSCible As Worksheet
Dim RCible As Range

Set WBCible = Workbooks('ListeInvestisseurs.xls')
Set WSCible = WBCible.Sheets('Feuil1')
Set RCible = WSCible.Cells(1, 1).End(xlDown).Offset(1, 0)


   
If Me.Listeclients.ListIndex = -1 Then
       
With RCible
            .Value = Me.ListeInvestisseurs.Value
            .Offset(0, 1).Value = Me.ListPays.Value
            .Offset(0, 2).Value = Me.ListDomaine.Value
       
End With
   
End If


Voilà pour une première approche de conseils.

Bonne Soirée
[ol]@+Thierry[/ol]
 
S

Steph secourue ..

Guest
Bonjour Thierry, et le forum,

Je te remercie tout d'abord pour ton aide et je te dis bravo !
Parce que ca marche et du premier coup en adaptant le nom de mes controles ..Et Bonne idée que de raccoucir mes lignes de programme, c'est bcp plus facile à suivre meme pour moi !

Je débute en VB mais je tiens à vraiment comprendre ce que je tape et là c'est le cas !

Sinon tu me disais Thierry dans ton msg que pour second pb, je pouvais cacher mon classeur meme si je devais travailler en l'ouvrant, que veux tu dire par là ?

Et je voulais te demander aussi , existe il une fonction qui me permette d'ouvrir ce classeur automatiquement au moment où j'ouvre mon second classeur sans que je le fasse moi meme ?

Merci pour ton temps et tes bons conseils ,

Steph
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour STeph, le Forum

Merci de ton gentil message.

Pour la suite c'est pas trop compliqué (pas encore ;)) !

Pour Cacher ton Fichier 'Base De Données' si par exemple il se nomme 'MyBDD.xls' ... Voici un Code à mettre dans un Module Standard Vierge (Module2 par Exemple)

Option Explicit

Public Const BDDFullPath As String = 'C:\Documents and Settings\TE\My Documents\MyBDD.xls'
Public Const BDDFileName As String = 'MyBDD.xls'

Public WBCible As Workbook

Sub OpenBDDModeHidden()
Set WBCible = Workbooks.Open(BDDFullPath)
    Windows(WBCible.Name).Visible =
False

End Sub

Sub CloseBDDModeHidden()
   
If Not WBCible Is Nothing Then
        WBCible.Close 0
   
End If
End Sub


Sub UnHideBDD()
On Error GoTo Out
    Windows(BDDFileName).Visible =
True
Exit Sub
Out:
MsgBox 'La
Base de Données ' & BDDFileName & ' n'est pas ouverte'
End Sub


Il est simple ensuite de lancer ces procédures automatiquement à l'ouverture et à la fermeture de ton Classeur de Travail avec des macros évènementielles dans le Private Module 'ThisWorkBook' comme suit :

Option Explicit


Private Sub Workbook_Open()
With Application
    .ScreenUpdating =
False 'Pour éviter d'entrevoir la base de données..
   
        OpenBDDModeHidden
'Lancement de la Macro du Module Public
   
    .ScreenUpdating =
True
End With
End Sub


Private Sub Workbook_BeforeClose(Cancel As Boolean)
        CloseBDDModeHidden
End Sub

Pour trouver ce Private Module je t'invite à regarder ce Gil, bien plus simple que de longues explications :



Un autre astuce plutot que Windows Hide est de rendre la Base de Donnée comme 'Add-Ins' mais c'est plus une ruse de sioux qu'autre chose....

Au cas où :
Sub OpenBDDModeVeryVeryVeryHidden()
Set WBCible = Workbooks.Open(BDDFullPath)
    WBCible.IsAddin =
True

End Sub

(Mettre à False pour 'récupérer ' le classeur)


Recommandation Générale

A partir du moment où tu masquera ta BDD il est hors de question de travailler dessus sans implicitement indiquer à VBA que tu travaille sur le 'WBCible' et la 'WSCible'...

Un Code Style :

TextBox1 = Range('A1') ne passera plus (Ce sera la cellule du classeur de Travail)

Et un Code Style :

Sheets('MySheetDeMyBDD').Select Plantera carrément !

'Nicht' Select de la BDD ensuite !!!

Pendant tes tests, tu auras probablement la Perte (bug etc) de la Variable Public 'WBCible' ce qui est normal... Mais un fois ton Classeur bien bouclé, en fait WBCible sera initialisée une fois pour toute à l'ouverture et sera accessible par toutes tes autres macros...

Bonne Journée et Découverte du VBA

[ol]@+Thierry[/ol]
 

Discussions similaires

Statistiques des forums

Discussions
312 520
Messages
2 089 297
Membres
104 092
dernier inscrit
karbone57