Liaison entre textbox sur userform et une plage de données sur tableur

  • Auteur de la discussion thierry234
  • Date de début

thierry234

Nouveau membre
Bonjour,

Ça fait maintenant deux jours que je parcours internet en espérant obtenir des réponses et m'aider à monter un programme en VBA que je dois réaliser dans le cadre d'un stage (malheureusement sans aucun encadrement pour me venir en aide >_>)

Bref, le topo : je dois monter une partie de logiciel qui gère un planning des visites à venir à partir d'une base Access.
J'ai choisi de le faire par Excel (je pense que c'est plus simple), et j'ai donc monté une source de données OCBD pour récupérer la base de données sous Excel.

Je vous présente maintenant la manière dont j'ai pensé mon code :

Un bouton sur le programme Access permet de fermer la bdd et d'ouvrir Excel ;
A l'ouverture du tableur, une boite de dialogue s'ouvre :



Elle permet d'actualiser la base par rapport à l'OCBD ;

Ensuite, une fois fermée, le menu principal apparaît :



Je pense qu'il est facile de comprendre le principe avec ce screen.
Ce qui m'intéresse c'est le textbox en bas, et on arrive au problème !

En fait je veux appeler depuis le tableur des contenus de cellules, que je concatènerai ensuite pour correspondre au schéma des label au-dessus du textbox.
Comme j'ai une même plage de données qui va servir aux 4 boutons, j'ai des filtres qui se déclenchent à chaque fois qu'un bouton (ce sont des TB) est activé ; ça, ça marche a priori.

Là où je bloque, c'est pour appeler des données cellule après cellule en éliminant les cellules vides. Voilà le code que j'ai actuellement pour le premier bouton :

Code:
Private Sub ToggleButton1_Click()
'
' Permet le filtre des visites à 7 jours
    Range("G112:G266").Select
    ActiveWindow.SmallScroll Down:=-72
    Selection.AutoFilter
    Selection.AutoFilter Field:=1, Criteria1:="<=7", Operator:=xlAnd

' Affichage dans le textbox
  
Dim cell As Range
   For Each cell In Range("G113:G200")
           If cell = "" Then
           TextBox1.Text = ""
           Else: TextBox1.Text = Range("J180").Value & "   " & Range("K180").Value & "  " & "heures" & "  " & Range("L180").Value
           End If
    Next cell
End Sub

Ce code fonctionne, mais il n'est attribué qu'à une ligne fixe ! (la 180)
Je n'arrive pas à faire la même chose pour la plage entière, quoique j'essaye ça bug.
Et je n'arrive pas non plus à faire apparaître et disparaitre ces donnée en fontion de l'état du ToggleButton =(

J'ai essayé un bon paquet de solutions, mais comme j'apprends le vba sur le tas sans vraiment de connaissance c'est la grosse galère !
Voilà, si quelqu'un peut me filer un coup de main, ça pourrait bien sauver mon stage !

Si besoin de renseignements complémentaires, n'hésitez pas à demander j'essaierai de vous répondre au mieux ! Merci !


Edit : J'ai dit une bêtise, la première partie du code marche, la partie Else fonctionne, mais pas le reste ! :\
 

zeb

Modérateur
J'ai choisi de le faire par Excel (je pense que c'est plus simple),
Ohlala. Mais quelle erreur ! Pourquoi ne pas le faire directement dans ACCESS ?
Tu veux 2/20 à ton stage ?

Je peux bien te corriger ce code en particulier, mais vraiment, je pense que tu te fourvoies complètement. Arrête le VBA/Excel et passe en VBA/Access. Tu auras en plus le SQL, ce qui te permettra de faire les choses bien mieux.

En SQL, on s'affranchit des champs vides très facilement :
Code:
.... WHERE champ <> '' OR champ IS NOT NULL ;
Tu bases ensuite tes traitements sur cette requête.

--------------------

Pourquoi cette boucle, puisqu'il n'y a qu'un textbox que tu réinitialises à chaque fois ?
Je te fais ce que j'ai compris :
Code:
'Dim cell As Range ' // Eh, pourquoi cette ligne est en commentaire !
Dim cell As Range

TextBox1.Text = "" ' // On vide le texte
For Each cell In Range("G113:G200" )
   If cell.Value = "" Then ' // Ben quoi, c'est pas la cellule mais son contenu qui nous importe !
       ' // Rien à faire
   Else
       ' // Ajoute le texte présente puis ce qu'on vient de trouver :
       TextBox1.Text = TextBox1.Text & vbCrLf & cell.Offset(0, 3).Value & "  " & cell.Offset(0, 4).Value & "  heures "  & cell.Offset(0, 5).Value
   End If
'Next cell ' // Nan mais depuis qu'on a inventé l'indentation, on ne remet plus les variables
Next

En + propre :
Code:
Dim cell As Range

TextBox1.Text = ""
For Each cell In Range("G113:G200" )
   If cell.Value <> "" Then
       TextBox1.Text = TextBox1.Text & vbCrLf & _
                       cell.Offset(0, 3).Value & "  " & _
                       cell.Offset(0, 4).Value & "  heures "  & _
                       cell.Offset(0, 5).Value
   End If
Next

C'est ça qu'il te fallait ?
Bon, j'insiste, fais-le avec Access. :pfff:
 

thierry234

Nouveau membre
Rassure-toi mon stage n'est pas noté (enfin c'est plutôt moi que ça rassure...)
Disons pour faire court que VBA/VB et la programmation en général ne sont pas mon point fort, mais dans mon coin on prend le stage qu'on trouve, en avoir un c'est déjà pas mal :\
Sinon j'ai choisi Excel parce que la syntaxe du VBA Excel a l'air d'avoir plus de points communs avec le VB que le VBA Access, dans lequel je me suis noyé sans trop y comprendre quelque chose (j'ai quelques faibles notions de VB, et quelques autres de SQL).
C'est sûr, j'aurais préféré le faire sous Access, mais bon je fais avec les moyens du bord à défaut d'être compétent pour répondre à la demande :bounce:

Ton code fonctionne je te remercie (je découvre au passage "vbCrLf" >.>), mais il me faut encore un petit coup de pouce ! Impossible de faire apparaître et disparaître ces données en activant/désactivant le ToggleButton ;

J'ai tenté un
Code:
If ToggleButton.Value Then
en amont de mon filtre, mais ça n'a pas l'air très concluant !

Une solution ?
J'espère que je vais me débrouiller après ça, en tout cas merci bien tu me sauves ma journée !
 

zeb

Modérateur
Sinon j'ai choisi Excel parce que la syntaxe du VBA Excel a l'air d'avoir plus de points communs avec le VB que le VBA Access
Ben non, c'est exactement la même.

je fais avec les moyens du bord à défaut d'être compétent
Ben nous servons à quoi, nous ?

M'enfin, t'as pas envie, c'est surtout ça.

-----------------------

C'est pas mal ton truc de If. C'est bien ça la solution.

Code:
' // Dans tous les cas on vide le texte.
TextBox1.Text = ""

If ToggleButton.Value Then
    '// Le reste du code
    ....
End If
 

thierry234

Nouveau membre
Salut et merci pour la confirmation !

Je t'assure que mon but n'est pas de faire un caprice pour utiliser Excel, c'est juste que lorsque j'ai regardé le code du programme principal sous Access j'ai halluciné parce que je reconnaissais presque rien, j'en ai donc conclu qu'il y avait des différences avec le VBA Excel... >_>

Sinon je parle de ma compétence, pas de ceux comme toi qui m'aident à me sortir du pétrin, et qui en savent sans doute infiniment plus que moi dans ce domaine. C'est juste que jusqu'ici je n'avais jamais eu besoin de demander de l'aide sur un forum, et je vois ça comme un aveu d'incompétence sur le sujet (ce qui est totalement le cas !). Enfin bref, je sais pas si je me fais comprendre, mais en résumé le prends pas pour toi, je suis un peu tordu de nature !

Pour le faire sous Access, il faudrait que je sache créer et appeler un état en dynamique, créé à partir d'une base de données, le tout filtré par rapport à une date. Ça me paraît tout simplement insurmontable vu mon niveau :\

Merci encore pour l'aide, si je bute encore sur mon module je reviendrai demander humblement un nouveau coup de main ! :lol:
 

thierry234

Nouveau membre
Bon, j'ai changé ma manière de voir la chose pour un truc plus simple, parce que finalement il n'y a pas besoin de voir si grand. J'ai donc supprimé mes filtres par date, et l'affichage est maintenant direct dans la textbox grâce au code fourni par zeb.
Et à propos de ce code, je rencontre un nouveau contre-temps (décidément !), voyez vous-même :



Je remets le code en place :

Code:
Private Sub ToggleButton1_Click()
   Dim cell As Range
    TextBox1.Text = ""
   For Each cell In Range("G113:G200")
     If cell.Value <> "" Then
       TextBox1.Text = TextBox1.Text & vbCrLf & _
                        cell.Offset(0, 3).Value & _
                        cell.Offset(0, 4).Value & _
                        cell.Offset(0, 5).Value _

     End If
   Next
End Sub

Vous l'aurez compris, j'ai essayé (notamment avec des vbCrLf, vbCr, Chr (10), Chr (13)) d'organiser mes données ligne par ligne, sans succès =(

Un coup de main s'il vous plaît ? (sur le code j'ai viré tout le superflu, notamment les espaces entre les données, et ce pour voir si ça avait un quelconque rapport)
 

zeb

Modérateur
Je t'assure que mon but n'est pas de faire un caprice pour utiliser Excel
:lol:

Tu n'es pas le premier à rester crisper sur Excel... tel le naufragé accroché à sa bouée de sauvetage et qui refuse de la lâcher, même si on lui tend une gaffe pour le hisser à bord du vaisseau venu le sauver :o [:patch]

Beaucoup de plus, pensent utiliser Excel comme base de données :pfff:
Et, je me suis même fendu d'un message pour vous (faire) prévenir : T'as vu, c'est pas nouveau, j'ai écrit ça il y a 3 ans déjà.

Sinon je parle de ma compétence
J'avais compris :)
le prends pas pour toi
Non, non :)

Comme déjà dit, le VBA de toutes les applications Office est le même. On n'y manipule de base pas toujours les mêmes objets, mais on peut charger les objets spécifiques de l'un dans l'autre.

Ce qui te manque, c'est le SQL. Je t'invite si la programmation est susceptible de faire partie de ton métier, de te jeter dessus le plus vite possible. C'est très facile.

En outre, Access peut te cacher ce SQL, c'est-à-dire de te faire faire de la prose comme M. Jourdain.

N'hésite pas à revenir, pas forcément humblement. Nous acceptons les novices, mais n'aimons pas ceux qui le restent trop longtemps ... [:flambyx:2]
 

thierry234

Nouveau membre
Tu n'es pas le premier à rester crisper sur Excel... tel le naufragé accroché à sa bouée de sauvetage et qui refuse de la lâcher, même si on lui tend une gaffe pour le hisser à bord du vaisseau venu le sauver :o [:patch]

Ô capitaine mon capitaine, vous n'avez point vu mon nouvel appel à l'aide, et pour cause : je l'ai formulé pendant que vous me gratifiiez d'un message fort instructif ! [:_tom_:7] :p

Mon message de 15h33 a dû paraître pendant que celui de 15h36 était rédigé, je pense que tu ne l'as pas lu/vu :sweat:

Je prends bonne note pour le SQL, qui faisait de toute façon partie des trucs que je voulais approfondir cet été ! (mais après mon stage u_____u)

 

zeb

Modérateur
Je crois que tu as oublié de déclarer ton textbox comme étant multiligne.

Cette question était ridicule. Trouve autre chose de plus intéressant la prochaine fois :o

...

[:diabolo]
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 845
Membres
1 586 373
Dernier membre
https://forum.tomshardwar
Partager cette page
Haut