Infos, d'aide, de renseignements

Bonjour,

Voila environ 3 semaine que je me suis "lancé" dans le VBA sur Excel. J'ai réaliser, à l'aide de tutos youtube et de ce forum, un gros fichier qui traitera une base de données de contacts. Mon souci est qu'il est fonctionnel, mais j'aimerai le perfectionner. Jusqu'à maintenant je trouvais les solutions mais là, malgré la super aide de Rag02700 je n'y arrive pas. Mon problème est que quand je lis un code, je le comprends. Mais arriver sur une page blanche, je ne sais rien faire. je ne sais pas quelles questions me poser, dans quel ordre pour que je puisse écrire mon code. Avez-vous des conseils.

D'autre part, dans un premier temps, j'aimerai ajouter et supprimer, par le biais de combobox dans un userform, les listes RowSource de combobox qui servent à entrer des données dans la base. Merci d'avance si vous avez de quoi m'aider.

Et dans un second temps, j'ai 2 combobox, une combo "agence" et l'autre combo "personnes". J'aimerai qu'en fonction du choix de l'agence la deuxième combo n'indique que les personnes présentent dans l'agence désignée par la première combo. Merci d'avance si vous avez de quoi m'aider.

PS: désolé si je ne suis pas dans la bonne section pour ce post.

salut

Je suis un peu dans le même cas que toi. Le plus simple est de commencer par enregistrer une macro, qui te donnera ensuite ton code ou une partie de ton code que tu viendra modifier par la suite. Après tu peut ajouter des variables et des boucles (avec dim ... as ... puis For ...).

Sinon faire des recherches sur internet et sur les forums pour avoir des parties de code à modifier.

Tout ça n'est que mon avis mais c'est comme ça que j'avance, pour le reste je ne me suis pas encore penché sur les combobox donc je laisse les pro en parler ^^

Merci Numero Bis

C'est ce que je fais aussi avec les Macros mais quand c'est pas possible, et bien je suis bloqué. Mais merci de t'y être intéressé.

Bonjour,

Il faut voir un langage de programmation comme l'anglais où le français, ou n'importe quel autre langage, on a un niveau de compétence pour la compréhension, écrite, orale, l'expression écrite, orale, en programmation il n'y a que l'écrit, mais savoir lire et savoir écrire sont 2 compétences différentes.

Un début pour écrire un code c'est d'identifier les différentes actions qui seront à faire, on peut mettre des commentaires pour séparer les étapes, si tu veux par exemple compter le nombre de cellule en colonne a qui contiennent au moins 3 a, il va falloir:

sub test()
'initialiser les variables

'parcourir la colonne soit via Range soit via une variable tableau
    '-> si la cellule contient 3 a, incrémenter le compteur

'afficher le résultat ou l'inscrire quelque part
end sub

Une fois que tu fais ta structure en langage humain, tu n'as plus qu'à essayer de traduire tes étapes, celle que tu viens de voir, c'est l'étape du besoin, qu'as-tu besoin de faire pour atteindre ton objectif?

Tes étapes vont ensuite se remplir et constituer ton code:

Sub test()
'initialiser les variables
Dim ligFin As Long
Dim tableau As Variant
Dim compt As Long

ligFin = Range("a" & Rows.Count).End(xlUp).Row
tableau = Range("a1", "a" & ligFin)

'parcourir la colonne soit via Range soit via une variable tableau
For i = LBound(tableau, 1) To UBound(tableau, 1)
    '-> si la cellule contient 3 a, incrémenter le compteur
    If compteCar("a", tableau(i, 1)) >= 3 Then
        compt = compt + 1
    End If
Next i

'afficher le résultat ou l'inscrire quelque part
MsgBox compt & " cellules contiennent au moins 3 a.", vbInformation, "Résultat"
End Sub

Private Function compteCar(car As String, ByVal recherche As String) As Long
'parcourir la chaine de caractère lettre par lettre
For i = 1 To Len(recherche)
    '-> à chaque fois que la lettre est identique, sans respecter la case, on incrémente le compteur
    If LCase(Mid(recherche, i, 1)) = LCase(car) Then
        compteCar = compteCar + 1
    End If
Next i
End Function

Ici c'est un exemple, mais c'est comme ça que je procède pour structurer mon code.

Pour revenir à ton sujet, je n'ai pas trop compris l'histoire des RowSource, mais pour le dernier paragraphe, il s'agit de combobox en cascade, boisgontierjacques a fait un site avec pas mal d'exemples de code, je te joins le lien, il existe aussi de nombreuses demandes sur le forum, et si besoin, on peut aussi répondre à des points de blocage : http://boisgontierjacques.free.fr/pages_site/formulairecascade.htm

Bonjour à tous,

Oui, l'enregistreur est une bonne base mais il faut savoir modifier le code ensuite pour le purger de ses impuretés^^.

En fait, il faut déjà définir le problème avant d'écrire un code, quitte à écrire sur un papier :

avec la feuille "bidule"

pour chaque ligne allant de 1 à la fin

si la cellule en A est vide
    je colorie en rouge
sinon
    je colorie en vert
(fin de si

pour essayer essayer de traduire ça par du code. Et c'est là qu'on voit ce qu'il faut examiner. Par exemple, ici, j'ai mis de 1 à la fin mais il faut bien la trouver la ligne de fin !

Donc c'est en définissant du mieux possible ce qu'on cherche à faire, puis en corrigeant les problèmes qui surviennent (parce qu'il est difficile de tout prévoir) qu'on peut y parvenir petit à petit.

Cdlt,

Bonjour à tous,

Oui, l'enregistreur est une bonne base mais il faut savoir modifier le code ensuite pour le purger de ses impuretés^^.

En fait, il faut déjà définir le problème avant d'écrire un code, quitte à écrire sur un papier :

avec la feuille "bidule"

pour chaque ligne allant de 1 à la fin

si la cellule en A est vide
    je colorie en rouge
sinon
    je colorie en vert
(fin de si

pour essayer essayer de traduire ça par du code. Et c'est là qu'on voit ce qu'il faut examiner. Par exemple, ici, j'ai mis de 1 à la fin mais il faut bien la trouver la ligne de fin !

Donc c'est en définissant du mieux possible ce qu'on cherche à faire, puis en corrigeant les problèmes qui surviennent (parce qu'il est difficile de tout prévoir) qu'on peut y parvenir petit à petit.

Cdlt,

C'est ça! Tester au fur et à mesure le code quand on le développe, bien définir le besoin en langage humain, sur papier, en commentaire, de la façon dont on le préfère, s'aider de l'enregistreur de macro pour avoir des bouts de code, chercher de l'aide sur internet pour petit à petit étendre ses connaissances, apprendre les fonctions de base de VBA, les boucles, les tests, etc...

Salut Ausecour,

Oui, avancer petit à petit finalement...

Merci au fait pour la petite fonction CompteCar !

A bientôt,

Merci Ausecour et 3GB !

Pouvez vous me dire ce qui ne va pas dans la phrase suivante

ActiveCell.Offset(, 2 & Rows.Count).End(xlUp).Value = TextBox2

Je veux partir de la cellule active, faire un offset de 2 vers la droite, de trouver la dernière cellule vide de la colonne en partant du bas et de copier la valeur de textbox2.

Merci

Ce qui ne va pas, c'est le 2 & Rows.Count qui est inapproprié puisque la méthode offset attend des arguments de type long (valeur entière).

Et tu ne peux pas faire un offset jusqu'à rows.count car il y a plus de lignes que de colonnes offset(nblignes, nbcolonnes).

D'ailleurs, tu ne pourrais pas non plus décaler jusqu'à columns.count car tu dépasserais les capacités de la feuille.

Donc je dirais qu'il faut quelque chose comme ça :

Cells(rows.count, ActiveCell.column + 2).End(xlUp).Value = TextBox2

Mais le Activecell est aussi un problème en soi. Il faut arriver à éviter d'y recourir en général.

Cdlt,

Bonjour à tous,

Comme à leur habitude, excellentes explications de Ausecours et 3GB.

Pour ton soucis vas y étape par étape et seulement après tu cherches à optimiser. Pour rappel F8 te sers à exécuter ton code ligne à ligne.

Fait une ligne par action comme tu l'as expliqué à l'écrit, traduit le en code puis ensuite cherche à l'optimiser/fusionner/ etc ...

Ici tu demande à faire un offset : ça me semble OK mais j'ai un doute sur ce que tu demandes et ce que tu veux faire. Par contre ensuite ton rows.count, place le sur une autre ligne afin de voir comment sélectionner la dernière cellule de ta plage.

Ensuite, tu demandes à copier un valeur, je ne vois aucune instruction de type copy ... Pour ajouter une valeur dans un test box il faut un .value.

Bonne journée.

Salut Ergotamine ! Merci de nous rejoindre

Oui, j'ai hésité à le rajouter mais, au début, il vaut mieux scinder les opérations pour les rendre plus claires et plus facilement identifier la source d'un bug lorsqu'il survient.

Et pour compléter mon précédent commentaire : en général, activecell résulte d'un cells.select (ou .activate). D'une part ça ralentit considérablement le code mais d'autre part ça a tendance à le rendre compliqué et moins bien défini qu'en ciblant directement des plages précises. Pour cibler ces plages, on peut le faire à l'aide de références (range("A1") par exemple) ou parfois à partir de leur nom, et pour cela, il faut nommer les plages (ayant un rôle significatif dans le code) via le gestionnaire de noms d'Excel. Ca rend le code plus dynamique.

@Ergotamine : En fait, c'est l'inverse. Thierry cherche à mettre la valeur de la Textbox2 dans une cellule (qu'il essaie de cibler).

Cdlt,

Bonjour à tous,

je remets ici ma réponse au message privé:

Voici en vert ce qui est juste, en rouge ce qui est faux:
ActiveCell.Offset(, 2 & Rows.Count).End(xlUp).Value = TextBox2
Ce qu'il faut plutôt écrire c'est:
Cells(Rows.Count, ActiveCell.Column + 2).End (xlUp)
Tu pars de la cellule qui se trouve à la dernière ligne de la feuille
Cells(Rows.Count

pour le décalage on prend le numéro de la colonne de la cellule active puis on ajoute 2

, ActiveCell.Column + 2)

et à partir de cette cellule, tu pars de bas en haut pour modifier la valeur de la première cellule trouvée

.End (xlUp).Value

J'ajoute ceci:

ce que tu avais écrit correspond à:

à partir de la cellule actuelle je veux la cellule qui se trouve à 0 lignes,

ActiveCell.Offset(,

en décalage de colonne tu demandes la concaténation entre 2 et le nombre de ligne que compte la feuille

2 & Rows.Count

à partir de ce décalage, tu veux faire l'équivalent d'un Ctrl + flèche vers le haut et atteindre la valeur de la cellule atteinte

.End(xlUp).Value

Bonjour,

Salut Ergotamine ! Merci de nous rejoindre

Oui, j'ai hésité à le rajouter mais, au début, il vaut mieux scinder les opérations pour les rendre plus claires et plus facilement identifier la source d'un bug lorsqu'il survient.

Et pour compléter mon précédent commentaire : en général, activecell résulte d'un cells.select (ou .activate). D'une part ça ralentit considérablement le code mais d'autre part ça a tendance à le rendre compliqué et moins bien défini qu'en ciblant directement des plages précises. Pour cibler ces plages, on peut le faire à l'aide de références (range("A1") par exemple) ou parfois à partir de leur nom, et pour cela, il faut nommer les plages (ayant un rôle significatif dans le code) via le gestionnaire de noms d'Excel. Ca rend le code plus dynamique.

@Ergotamine : En fait, c'est l'inverse. Thierry cherche à mettre la valeur de la Textbox2 dans une cellule (qu'il essaie de cibler).

Cdlt,

Alors ne manque-t-il pas un TextBox2.Value ? Ou la propriété est implicite au même titre qu'un range ?

Bonne journée.

De mémoire il n'y a pas besoin de préciser .value

EDIT: je confirme après test, pas besoin de préciser

Oui, c'est la propriété par défaut de l'objet Textbox mais je dirais qu'il vaut mieux le préciser (quand la ligne de code n'est pas trop longue ).

Bonjour,

Il y a une méthode pour savoir quelle est la propriété par défaut d'un objet ?

Par avance merci !

Très bonne question ! Pas à ma connaissance malheureusement...

Je sais que pour les range, c'est value, pour les contrôles de formulaires, c'est en général value et caption. Je crois (sans en être certain) que la propriété de l'application est worksheetfunction (renvoyant un objet cette fois). Je ne sais même pas si tous les objets ont une propriété par défaut car je pense que ça dépend de la façon dont l'objet a été conçu...

Ca dépasse mes connaissances malheureusement... Un habitué des modules de classe saura sûrement mieux répondre.

Bon ben j'ai l'impression d'être dans la coure en bermuda et Kickers en train d'écouter parler les grands.

En tous cas merci beaucoup à TOUS pour votre aide ca m'a permis de comprendre où aller et comment.

Ahah sympa comme métaphore, j'espère qu'on pourra à nouveau t'aider par le suite

Pour la propriété renvoyée par défaut je dois avouer ne pas trop savoir, en général c'est value pour la plupart des objets que je manipule, j'essaye sans préciser puis je regarde si ça passe ou ça casse en général, parce que mettre value partout alourdis le code.

Je ne vais malheureusement pas beaucoup pouvoir vous avancer par rapport aux modules de classe, je les ai rarement utilisé et n'ai pas beaucoup d'expérience, je me demande si LouReed en utilise, il pourrait peut-être nous avancer sur la question, lui ou un autre... Je suis encore nouveau en nombre d'années sur Excel par rapport à certains d'entre nous

Loool, si seulement...

Notre envie d'apprendre est grande mais on est juste des amateurs (enfin pour l'instant ).

Merci pour ce retour et bon courage pour ton apprentissage (c'est dur au début mais ça vient vite) !

Rechercher des sujets similaires à "infos aide renseignements"