VBA Problème simple de recherche dans une matrice

yannw

XLDnaute Nouveau
Bonjour le forum,

j'ai déjà fait appel à vous il y a quelques temps et vous m'avez grandement aidés, je vous en remercie. J'aurai à nouveaux besoin de vos lumières.

J'ai joint un fichier afin que mes explications soit plus parlantes

Voilà ce que j'aimerais faire:

Sur une feuille excel(Input_trade), j'entre une date, un nom et une quantité.

Sur une deuxième feuille (history_trade) j'ai une matrice avec des dates sur la colonne A (A24:A32) et
des noms sur la ligne 7 (B7:E7).

J'aimerais que chaque fois que j'entre une quantité sur ma première feuille, elle soit automatiquement recopié sur ma deuxième feuille à l'intersection de la date et du nom choisi .


Merci à tous de votre aide !


PS: j'ai déjà tenté avec une formule excel,graphique en rose sur mon exemple à disposition. Mais le résultat n'est pas optimal car à chaque fois que je change de nom,de date ou de quantité. Celle d'avant disparait... C'est la raison pour laquelle je pense qu'un code VBA est indispensable...
 

Pièces jointes

  • example_portfolio.xls
    28.5 KB · Affichages: 83

ROGER2327

XLDnaute Barbatruc
Re : VBA Problème simple de recherche dans une matrice

Bonjour yannw
Votre formule fonctionne. Mais pour m'en apercevoir, j'ai du effacer puis ressaisir les dates dans la colonne A de la première feuille. Bizarre...
J'en profite pour simplifiez la formule :
Code:
[COLOR="DarkSlateGray"]=SI(ET($A8=Input_Trade!$C$14;B$7=Input_Trade!$D$14);Input_Trade!$E$14;"")[/COLOR]
en B8, à recopier dans l'ensemble du tableau.​
ROGER2327
 

yannw

XLDnaute Nouveau
Re : VBA Problème simple de recherche dans une matrice

Bonjour ROGER2327,

Merci beaucoup pour votre post.

Mais ce qui me pose toujours problème avec cette fonction excel est que si je rentre une premiere fois un trade, la quantité sera sur la bonne cellule dans mon tableau mais si je rentre un deuxième trade, la quantité du premier trade sera effacé au profit du deuxième trade...

C'est la raison pour laquelle je pense qu un code VBA serait pas mal utile, mais je suis nul en VBA...

J'espère que mes indications sont assez clairs, n'hésitez pas à poser des questions si vous en avez !

Merci
 

ROGER2327

XLDnaute Barbatruc
Re : VBA Problème simple de recherche dans une matrice

Re...
Désolé de n'avoir pas compris : lorsque j'ai ouvert le classeur, je ne voyais rien apparaitre dans le tableau, jusqu'à ce que je fasse la modification sur les dates. J'ai donc cru que le problème était là...
J'ai compris maintenant. Je pense qu'il faut effectivement recourir à une procédure en VB. Ça risque d'être un peu plus long à fabriquer...​
ROGER2327
 

yannw

XLDnaute Nouveau
Re : VBA Problème simple de recherche dans une matrice

je sais... :) cela fait depuis ce matin que j'essaie milles trucs mais rien ne fonctionne! En plus, je ne suis pas très doué en VBA, je ne sais même pas par ou commencé et quoi écrire, j'ai besoins d'aide :D
 

ROGER2327

XLDnaute Barbatruc
Re : VBA Problème simple de recherche dans une matrice

Re...
Je décris la procédure toto qui s'applique à la plage A23:E32 de la feuille Trade_History en prenant ses valeurs dans la plage C23:E23 de la feuille Input_Trade.
Il s'agit d'écrire une procédure équivalente à la formule (en B24 de la feuille Trade_History, à étendre jusqu'en E32)
Code:
[COLOR="DarkSlateGray"]=SI(ET($A24=Input_Trade!$C$14;B$7=Input_Trade!$D$14);Input_Trade!$E$14;"")[/COLOR]
à ceci près que la procédure se souvient des valeurs successives saisies en E23 de la feuille Input_Trade, tant que la plage B24:E32 de la feuille Trade_History n'est pas effacée.
La plage A23:E32 de la feuille Trade_History est nommée "Table".
Code:
[COLOR="DarkSlateGray"]Sub toto()                                                  [COLOR="SeaGreen"]' 1[/COLOR]
Dim oTab(), oDat()                                          [COLOR="SeaGreen"]' 2[/COLOR]
Dim i As Long, j As Long                                    [COLOR="SeaGreen"]' 3[/COLOR]
   oTab = Sheets("Trade_History").Range("Table").Value      [COLOR="SeaGreen"]' 4[/COLOR]
   oDat = Sheets("Input_Trade").Range("C23:E23").Value      [COLOR="SeaGreen"]' 5[/COLOR]
   For i = 2 To UBound(oTab, 1)                             [COLOR="SeaGreen"]' 6[/COLOR]
      If oTab(i, 1) = oDat(1, 1) Then Exit For              [COLOR="SeaGreen"]' 7[/COLOR]
   Next i                                                   [COLOR="SeaGreen"]' 8[/COLOR]
   For j = 2 To UBound(oTab, 2)                             [COLOR="SeaGreen"]' 9[/COLOR]
      If oTab(1, j) = oDat(1, 2) Then Exit For              [COLOR="SeaGreen"]'10[/COLOR]
   Next j                                                   [COLOR="SeaGreen"]'11[/COLOR]
   If i > UBound(oTab, 1) Or j > UBound(oTab, 2) Then       [COLOR="SeaGreen"]'12[/COLOR]
      MsgBox "Données incorrectes"                          [COLOR="SeaGreen"]'13[/COLOR]
   Else                                                     [COLOR="SeaGreen"]'14[/COLOR]
      oTab(i, j) = oDat(1, 3)                               [COLOR="SeaGreen"]'15[/COLOR]
      Sheets("Trade_History").Range("Table").Value = oTab   [COLOR="SeaGreen"]'16[/COLOR]
   End If                                                   [COLOR="SeaGreen"]'17[/COLOR]
End Sub                                                     [COLOR="SeaGreen"]'18[/COLOR][/COLOR]
Après les déclarations de variables (lignes 2,3) les valeurs des plages utiles sont placées dans les tableaux oTab et oDat (lignes 4,5).
La boucle des lignes 6 à 8 parcourt la première colonne de oTab, à partir de la deuxième ligne, pour chercher s'il s'y trouve la valeur oDat(1, 1). Le cas échéant, le test de la ligne 7 est positif : Exit For est exécuté. Par conséquent, on sort de la boucle et i a la valeur du numéro de la ligne de oDat qui contient la valeur oDat(1, 1).
Au contraire, si la valeur oDat(1, 1) n'est jamais trouvée, Exit For n'est jamais exécuté et on sort de la boucle lorsque i atteint la valeur UBound(oTab, 1) + 1.
La boucle des lignes 9 à 11 parcourt la première ligne de oTab, à partir de la deuxième colonne, pour chercher s'il s'y trouve la valeur oDat(1, 2). Son fonctionnement est similaire à celui de la première boucle.
A la sortie de cette deuxième boucle, la situation est la suivante :
  • ou bien au moins l'une des deux valeurs oDat(1, 1) ou oDat(1, 2) n'a pas été trouvée. Dans ce cas, l'un au moins des deux indices i ou j a une valeur supérieure au nombre de lignes ou de colonnes du tableau oTab. Par conséquent, la valeur oDat(1, 3) n'a pas sa place dans le tableau oTab ;
  • ou bien les deux valeurs oDat(1, 1) et oDat(1, 2) ont été trouvées respectivement dans la première colonne et la première ligne de oTab. Dans ce cas, i et j sont les numéros de ligne et de colonne correspondants. Il suffira alors de placer oDat(1, 3) à l'intersection de la ligne i et de la colonne j.
Le traitement de ces deux situations est l'objet de la procédure conditionnelle des lignes 12 à 17.
Dans le premier cas, la procédure envoie un message signalant que les données sont incompatibles avec les paramètres de la plage "Table" (ligne 13).
Dans le second cas, la valeur oDat(1, 3) est affectée à l'élément oTab(i, j) du tableau oTab (ligne 15). Enfin, le tableau oTab est placé dans la plage "Table" (ligne 16).
Voilà pour la procédure.
On objectera peut être qu'on aurait pu travailler directement dans les plages sans passer par la copie des plages dans des tableaux. C'est exact, mais :
  1. La programmation n'est pas plus simple.
  2. Sur une plage "Table" de grandes dimensions, la vitesse d'exécution est généralement plus faible.
En fait, avec un peu d'habitude, l'utilisation des tableaux est aussi claire que l'utilisation de plages, et la transposition des procédures à des situations diverses est, à mon avis qu'on peut bien entendu ne pas partager, plus facile.​
ROGER2327
 
Dernière édition:

yannw

XLDnaute Nouveau
Re : VBA Problème simple de recherche dans une matrice

Bonjour à tous,

Merci Roger2327 pour tes explications !

J'avance petit à petit sur mon programme et je me retrouve de nouveaux face à un mur... :confused: Je m'explique:

L'idée de base est d'entrer des donnée sur une feuille excel avec une date et un numéro d'identification.

Puis sur une deuxième feuille, la macro recopie les données entrée au préalable à l'intersection de la bonne date et du bon numéro d'identification. C'est ce que fait parfaitement la macro actuellement.

Maintenant j'aurai besoin de rentrer plus d'une donnée à la fois dans mon tableau(l'exemple est plus parlant dasn mon fichier joint).

Deuxièmement, les formules que je rentre dans mon tableau sont transformées en valeur après l utilisation de la macro, c'est problématique pour ce que je veux faire et je ne sais pas comment changer cela. Dans la macro j'ai essayé de changer les .value par des .select mais ca ne fonctionne pas.

Quelqu un aurait-il une idée pour des améliorations afin que je puisse entrée plusieurs données dans mon tableau et que les formules ne soit pas non plus transformée en valeur?

Tout aide est la bienvennue! Merci d'avance
 

Pièces jointes

  • yannw_exemple_portfolio-2.xlsm
    18 KB · Affichages: 55

yannw

XLDnaute Nouveau
Re : VBA Problème simple de recherche dans une matrice

Bonjour Roger2327,

Voici le même fichier mais en version .xls

J espère que vous pourrez l'ouvrir sans problème et que vous pourrez m'aider à résoudre mes petits problèmes :)
 

Pièces jointes

  • yannw_exemple_portfolio-2.xls
    41 KB · Affichages: 69

ROGER2327

XLDnaute Barbatruc
Re : VBA Problème simple de recherche dans une matrice

Bonjour à tous

Merci pour le tuyau, Brigitte. En fait, je ne veux pas m'encombrer d'une usine à gaz supplémentaire inutile : Si un classeur doit être au format .xlms, c'est qu'il comporte des choses qu'Excel 2003 ne comprendra pas (et moi non plus...). En tous cas des choses que les utilisateurs d'Excel 2003 ne pourront pas traiter. Si un classeur peut être au format .xls, pourquoi s'en priver ? Il sera d'autant plus utilisable.
Pour ce qui est du code, le voici modifié :
Code:
[COLOR="DarkSlateGray"]Sub toto()
Dim oTab(), oDat()
Dim i As Long, j As Long
Dim k As Long [COLOR="SeaGreen"]'*[/COLOR]
   oTab = Sheets("Trade_History").Range("Table").Value
[COLOR="SeaGreen"]'   oDat = Sheets("Input_Trade").Range("C23:E23").Value[/COLOR]
   oDat = Sheets("Input_Trade").Range("C23:G23").Value [COLOR="SeaGreen"]'*[/COLOR]
   For i = 2 To UBound(oTab, 1)
      If oTab(i, 1) = oDat(1, 1) Then Exit For
   Next i
[COLOR="SeaGreen"]'   For j = 2 To UBound(oTab, 2)[/COLOR]
   For j = 2 To UBound(oTab, 2) Step 3 [COLOR="SeaGreen"]'*[/COLOR]
      If oTab(1, j) = oDat(1, 2) Then Exit For
   Next j
   If i > UBound(oTab, 1) Or j > UBound(oTab, 2) Then
      MsgBox "Données incorrectes"
   Else
[COLOR="SeaGreen"]'      oTab(i, j) = oDat(1, 3)[/COLOR]
      For k = 0 To 2 [COLOR="SeaGreen"]'*[/COLOR]
         oTab(i, j + k) = oDat(1, 3 + k) [COLOR="SeaGreen"]'*[/COLOR]
      Next k [COLOR="SeaGreen"]'*[/COLOR]
      Sheets("Trade_History").Range("Table").Value = oTab
   End If
End Sub[/COLOR]
J'ai laissé en commentaires les lignes de l'ancien code et marqué '* les lignes modifiées ou ajoutées afin que les lecteurs puisse comprendre les évolutions : on peut évidemment supprimer les lignes inutiles.
Quant au problème des formules, c'est autre chose. A suivre (peut-être)...​
ROGER2327
 

Discussions similaires