XL 2010 Remplacer formule petite valeur en VBA

Marypen

XLDnaute Nouveau
Bonsoir, je n'y connais absolument rien en VBA..... Ça plante le décors.
J'aurais besoin de remplacer les formule matricielles de mon fichier par un Code VBA afin de le rendre plus rapide.
Ci joint un petit fichier représentatif de mon problème avec les explications et demandes.
J'importe un fichier de 4 colonnes et environ 25000 lignes et je dois extraire 2 types de données, les n° d'articles à 6 caractères et les n° d'articles à 6 caractères suivi d'un "." dans 2 colonnes séparées. Ensuite, je voudrais extraire les noms correspondant aux n° trouvés précédemment dans 2 colonnes séparées à la suite

Pouvez-vous m'aider à réaliser ceci. Je serais ravi de pouvoir également comprendre les procédés VBA, je n'ai jamais approfondi mais je suis conscient que cela solutionne beaucoup de problèmes.

Grand merci
 

Pièces jointes

  • test articles.xlsx
    14.3 KB · Affichages: 19

laurent3372

XLDnaute Impliqué
Supporter XLD
Ma solution (qui donne EXACTEMENT mêmes résultats que la feuille exemple)
Code:
Option Explicit             'Oblige à déclarer toutes les variables

Sub GenerationResultats()   ' Génère le tableau Resultats
    Const O_NUMERO As Long = 1              'N° colonne NUMERO dans la table O
    Const O_NOM As Long = 2                 '"     "    NOM      "   "   "   "
    Const R_NUMERO As Long = 1
    Const R_NUMERO_POINT As Long = 2
    Const R_NOM As Long = 3
    Const R_NOM_POINT As Long = 4
   
    Dim rOrig As Range                      'Range d'origine
    Dim rResult As Range
    Dim ligO As Long                        'Indice dans lla table O
    Dim ligR As Long                        'Indice dans la table R
    Dim sO_Numero As Variant                'Numéro d'origine
    Dim so_Nom  As String                   'Nom d'origine
    Dim iR_Numero_point As Variant
    Dim sR_Numero_point As String
    Dim sR_Nom_point As String
    Set rOrig = Feuil1.Range(Range("A2"), Range("B2").End(xlDown)) 'Détermination range d'origine
    Set rResult = rOrig.Offset(, 14).Resize(, 4) ' range de résultats
    ligR = 0
    For ligO = 1 To rOrig.Rows.Count       'On balaie le tableau d'origine
        sO_Numero = rOrig(ligO, O_NUMERO).Text           'NUMERO
        so_Nom = rOrig(ligO, O_NOM)                      'Nom
        If (Len(sO_Numero) = 6) Then
            ligR = ligR + 1
            On Error Resume Next
            iR_Numero_point = WorksheetFunction.Match(sO_Numero & ".", rOrig.Columns(O_NUMERO), 0)
            If Err = 1004 Then
                sR_Numero_point = "-"
                sR_Nom_point = "-"
            Else
                sR_Numero_point = rOrig.Cells(iR_Numero_point, O_NUMERO).Text
                sR_Nom_point = rOrig.Cells(iR_Numero_point, O_NOM)
            End If
            On Error GoTo 0
            rResult.Cells(ligR, R_NUMERO) = sO_Numero               ' On positionne les résultats
            rResult.Cells(ligR, R_NOM) = so_Nom
            rResult.Cells(ligR, R_NUMERO_POINT) = sR_Numero_point
            rResult.Cells(ligR, R_NOM_POINT) = sR_Nom_point
        End If
           
    Next ligO
    MsgBox "Fin de traitement"
   
End Sub
Cordialement,
--
LR
 

Pièces jointes

  • test articles (1).xlsm
    28.6 KB · Affichages: 5

job75

XLDnaute Barbatruc
Bonjour à tous,
vba sera plus rapide sur un nombre de ligne faible mais sur un nombre de ligne important il sera a la ramasse c'est bien connu ;)
C'est vrai si l'on entre les résultats cellule par cellule comme le fait laurent3372 au post #3 !!!

Mais si l'on travaille sur un tableau VBA (matrice) avec le résultat entré d'un seul coup dans la plage à la fin c'est beaucoup plus rapide, c'est en général ce qu'on fait sur de grands tableaux.

A+
 

eriiic

XLDnaute Barbatruc
Bonjour à tous,

il n'y a pas de réponse absolue, ça dépend des cas.
Les formules étant multi-thread excel peut en calculer 8 ou plus simultanément.
Vba, mono-thread, n'est pas toujours plus rapide, c'est selon le contexte.
Si on peut avoir souvent des gains importants sur des matricielles, sur des formules plus classiques c'est moins évident.
eric
 

Marypen

XLDnaute Nouveau
Bonjour à tous,
Merci pour les réponses et le débat qui en découle....
En ce qui concerne les 2 solutions, elle sont chacune "à moitié" correctes....
Ce serait vraiment super d'avoir le résultat final du tableau de Laurent3372 ( càd, les n° 6ch sur le même ligne que le 6ch et ".") mais sur une feuille séparée comme le fait fanfan38.
Je n'ai pas encore essayé le code sur mon fichier, donc pour la réponse "plus rapide ou non", je vous direz quoi plus tard...
Au fait, mon pseudo est un mix du diminutif de ma chère et tendre et du diminutif de mon nom de famille. Mary et Pen. Mais qui suis-je Mary ou Pen???

Déjà merci d'avance à tous et toutes
 

Discussions similaires

Statistiques des forums

Discussions
311 733
Messages
2 082 019
Membres
101 872
dernier inscrit
Colin T