Débutant - Somme de RechercheV
Bonjour à tous,
Tout d'abord Meilleurs vœux 2023. Pour info, j'utilise Excel pour mon boulot. Je ne suis pas grand débutant mais débutant tout de même. Je n'utilise que quelques recherchV et fonctions basiques. Je me lance en auto didacte et ce n'est pas facile ^^ avec l'intention de progresser en VBA. Je n'ai pas de background de développement.
J'ai le problème suivant : je dois calculer une somme de rechercheV par ligne.
- Dans la feuil 1 j'ai mes deux lignes qui m'intéressent,
- Dans la feuil 2 les nombres correspondant a chacune des cellules de la feuil 1
- Dans la feuil 3 j'ai fait ce que je dois faire en mode bourrin à la Mano. Compliqué avec plusieurs centaines de lignes et de colonnes :)
Armé de VBA pour les nuls j'essaie de voir la structure "fonctionnelle" de mon programme et ça donne ça :
1) Sélectionner la première cellule qui m'intéresse
Range ("A2").Select
2) Pour toutes les cellules non vides de A2 à AX effectue une rechercheV et fait la somme de ces recherches V
Là c'est un peu compliqué...Premièrement j'ai pensé à une boucle DO While pour parcourir les cellules de ma ligne
Do While ActiveCell.Value <> Empty
ActiveCell.Select
ActiveCell.Offset (0, 1).Select
Premier problème , je n'arrive pas comprendre comment insérer ma RechercheV pour chacune des cellules. Deuxième problème , je ne vois pas si il est mieux d'incrémenter un compteur ou de faire la somme de la plage définie par la boucle DO mais le cas échéant comment faire mon Range.select alors que je ne connais pas X (sauf a créer un compteur pour l'occasion ?)
Ensuite il faut que je saute de ligne - Là j'ai compris que je pouvais imbriquée ma boucle Do dans une boucle FOR de i à y pour y = mon nombre de lignes - que je connais.
Si quelqu'un a des pistes pour m'aider ça serait top, merci. Après , peut être qu'il est plus facile de le faire avec une fonction. Merci de m'indiquer cette fonction mais j'aimerai le faire en VBA, le but étant de se lancer dans le domaine.
Merci à tous,
Jacques.
Bonjour,
En considérant vos feuil1 et feuil 2 comme celles que vous avez postées dans votre fichier, votre code à essayer.
Sub test()
Dim dercol As Integer, coltot As Integer, i As Integer
Dim j As Byte
With Sheets("Feuil1")
dercol = .Cells(1, Columns.Count).End(xlToLeft).Column
coltot = dercol
For i = dercol To 2 Step -1
.Cells(1, i).EntireColumn.Insert
coltot = coltot + 1
For j = 2 To 100
If .Cells(j, i - 1) <> "" Then
.Cells(j, i).FormulaR1C1 = "=VLOOKUP(RC[-1],Feuil2!R1C1:R3C2,2,FALSE)"
.Cells(j, coltot) = .Cells(j, i) + .Cells(j, coltot)
End If
Next j
Next i
End With
End SubPour tester :
- Placez vous sur la feuil1
- exécutez le code ci-dessus
si ok -->
Crdlt
Bonjour,
Merci pour cette réponse rapide, je suis en train d'essayer de comprendre comment ça fonctionne. Mais ça marche ! Question subsidiaire, la même chose sans afficher les colonnes avec les nombres dans la feuil1, il faut que je crée un compteur qui s'incrémente après chaque Recherchev().
Encore merci
Question subsidiaire, la même chose sans afficher les colonnes avec les nombres dans la feuil1, il faut que je crée un compteur qui s'incrémente après chaque Recherchev().
J'ai vu votre deuxième problème mais je n'ai pas compris la question. Que voulez vous comme résultat final ?
Bonjour à Raoulshiro et Dan ,
Bonne année à vous ,
Ma version pour la première question. Cliquez sur le bouton Hop de la feuille "Bourrin".
Pour la 2ème question, je n'ai rien compris
J'ai remis le tableau en forme sur ce qu'il serait souhaitable - en bleu dans la feuille ci-jointe.
Je n'arrive pas a comprendre comment la formule arrive a choisir la première case par défaut. Si comme dans le tableau vert j'ai les deux premières colonnes qui ne me servent pas dans le calcul est ce que si je dis avant toute chose Range ("C16"). Select cela fonctionnera sans prendre les deux premières colonnes - Je vais esayer ? J'ai également ajouté une difficulté supplémentaire avec l'ajout de conditions - dans l'exemple j'ai toutes les cellules qui commencent par AF à sommer entre elles et les CV à sommer entre elles uniquement ? Avec une formule j'aurais fait un sommeSI est ce que cela fonctionne de même dans le code à l'intérieur de la boucle With ?
Encore merci pour les réponses.
Je n'arrive pas a comprendre comment la formule arrive a choisir la première case par défaut.
Quelle formule et quelle première cellule ?
Si comme dans le tableau vert j'ai les deux premières colonnes qui ne me servent pas dans le calcul.... J'ai également ajouté une difficulté supplémentaire avec l'ajout de conditions - dans l'exemple j'ai toutes les cellules qui commencent par AF à sommer entre elles et les CV à sommer entre elles uniquement
Si vous ne figez pas votre tableau ou que vous y allez pas à pas, on ne va jamais y arriver.
C'est votre tableau en vert le bon ?
Si oui nom et adresse sont positionnés en ligne 1 ? donc A1 pour "Nom" ?
Edit : si votre tableau vert est positionné en ligne 1, comme ceci
Votre code comme ceci :
Sub test()
Dim dercol As Integer, i As Integer, col As Integer
Dim TotalAF As Range, TotalCV As Range
Dim j As Byte
With Sheets("Feuil1")
dercol = .Cells(1, Columns.Count).End(xlToLeft).Column - 1 'on cherche la derniere colonne en ligne 1
For i = dercol To 4 Step -1 'on boucle i en valeur dernière colonne jusque jusque 4 par pas de -1
.Cells(1, i).EntireColumn.Insert 'on insère une colonne à chaque valeur de i
Set TotalAF = .Rows(1).Find("TOTAL AF") 'on cherche le mot Total AF en ligne 1
Set TotalCV = .Rows(1).Find("TOTAL CV") 'on cherche le mot Total CV en ligne 1
For j = 2 To 100 'à chaque valeur de i on boucle depuis la ligne 2 à la ligne 100
If .Cells(j, i - 1) <> "" Then 'verifier à chaque ligne si la cellule de la colonne précédente n'est pas vide (i-1)
.Cells(j, i).FormulaR1C1 = "=VLOOKUP(RC[-1],Feuil3!R1C1:R3C2,2,FALSE)" 'ajout de la formule RechercheV
End If
Select Case UCase(Left(.Cells(j, i - 1), 2)) 'extraire AV ou AF à chaque ligne de la cellule en colonne précédente (i-1)
Case Is = "AF": col = TotalAF.Column 'si AF, on recupère le num de colonne dans la variable Col
Case Is = "CV": col = TotalCV.Column 'si CV, on recupère le num de colonne dans la variable Col
End Select
If col > 0 Then .Cells(j, col) = .Cells(j, i) + .Cells(j, col): col = 0 'si la variable col a une valeur, on fait la somme de la cellule ligne (j), colonne (col) que l'on ajoute à la valeur existante en cellule ligne j et colonne i
Next j 'on passe à la ligne suivante
Next i 'on passe à la colonne suivante
End With
End SubCela suppose que F1 et G1 sont bien nommés Total AF et Total CV. le mieux serait d'éviter l'espace entre total et AF et CV et de mettre un tiret ou un souligné. A corriger dans le code dans ce cas.
Rebonjour à tous les deux
Désolé pour le pas à pas mais j'espérais pouvoir quand même faire quelque chose de mon côté mais force est de constater que je ne m'y connais pas assez même avec le code fait j'ai du mal a comprendre. La logique passe encore mais le code je suis trop débutant pour pouvoir insérer quoique ce soit.... Je vais relire attentivement pour bien comprendre !
Encore merci. Bonne fin de journée. :)
La logique passe encore mais le code je suis trop débutant pour pouvoir insérer quoique ce soit.... Je vais relire attentivement pour bien comprendre !
Je vous ai inscrit un commentaire en regard de chaque ligne
Si souci dites moi
Si ok et terminé -->
Cordialement
Bonjour ,
Top merci, c'est plus clair pour moi, je vais le travailler comme exercice en essayant d'ajouter d'autres actions comme par exemple mettre en gras, couleur....
Encore merci, bonne journée.