Mon premier projet VBA

Bonjour,

Je me lance dans mon premier projet VBA. Jusqu'alors, j'avais simplement adapté du code qui m'avait été très largement communiqué.

L'objectif que je me suis fixé est de pouvoir obtenir l'autocomplétion de cellules en fonction d'un numéro (appelé "numéro clef") dans le fichier ci-joint. Pour être plus précis, je souhaite qu'à chaque fois qu'une donnée soit entrée dans une cellule, elle soit recopiée dans toutes les autres cellules de la même colonne mais uniquement pour les lignes qui ont le même numéro clef.

L'idée est de dynamiser le tout par la suite, afin que je puisse à chaque entrée de valeur dans des colonnes spécifiées que ces valeurs se reportent automatiquement sur toutes les lignes adéquates.

J'ai découpé mon travail en étapes. Actuellement, j'ai réussi à faire fonctionner ce bout de code afin d'obtenir l'autocomplétion de toutes les cellules de la colonne B dont le numéro clef (colonne A) est identique ; à partir de la cellule que je sélectionne.

J'aimerais, si vous le voulez bien, que vous me donniez votre avis sur mon code, notamment quant à la variable "fvalue" que j'ai déclaré As String mais qui pourra contenir des nombres, des dates et du texte dans le fichier destiné à accueillir le résultat final. Est-ce que ce sera un facteur bloquant ?

De même, si j'ai travaillé sur un fichier contenant 50 valeurs (colonne A) à vérifier ; mon fichier destinataire environ comportera 200.000 valeurs. Est-ce que mon code doit être revisité ; c'est à dire, est-ce qu'il y a quelque chose de plus à optimiser afin que le code ne fasse pas planter le fichier lorsque je l'exécuterai sur un tout autre ordre de grandeur ?

Enfin, peut-être voyez-vous quelque chose qui m'a échappé. N'hésitez pas à m'en faire part, s'il vous plaît

Sub Macro1()

' Macro1 Macro

Dim rownum, i As Long
Dim fvalue, bvalue As String

 Application.ScreenUpdating = False

With ActiveSheet

rownum = ActiveCell.Row
avalue = .Range("A" & rownum).Value
fvalue = ActiveCell.Value
i = 2

For i = 2 To .Range("A" & Rows.count).End(xlUp).Row
    If .Range("A" & i).Value = avalue Then
    .Range("B" & i).Value = fvalue
    End If
  Next

 End With

 Application.ScreenUpdating = True

End Sub

Et ci-joint, le fichier Excel.

Je vous remercie pour l'attention que vous porterez à mon post,

Olivier

Hello,

Hum, une table de correspondance et une recherchev serait peut être plus optimisée ?

@+

Bonjour

Pour une premiere macro c'est pas mal

J'ai corrigé ta macro avec des anotations

J'ai supprimé le "A partir de la cellule que je selectionne" car c'est une source d'erreur...

pour ta variable fvalue ce sera toujours du texte...

il vaut mieux la declarée en variant (si tu mets dim fvalue elle est automatiquement en variant)

A+ François

Je ne sais pas si excel peux gerer 200000 lignes... mais ce ne sera pas à cause de ta macro...

Bonjour HeylmOlive et Bienvenue
Un peu en retard pour ma proposition.
Papy Henri

Sub Macro1()

' Macro1 Macro

Dim i As Long
Dim Bvalue, Avalue As String
 Application.ScreenUpdating = False
With ActiveSheet
    i = 2
    DerLigne = .Range("A" & .Rows.count).End(xlUp).Row
    Avalue = .Range("A" & i).Value
    Bvalue = .Range("B" & i).Value
        For i = 2 To DerLigne
            If .Range("A" & i).Value = Avalue Then
                .Range("B" & i).Value = Bvalue
            Else
                Avalue = Avalue + 1
                Bvalue = .Range("B" & i).Value
            End If
        Next
 End With
 Application.ScreenUpdating = True
End Sub

Merci beaucoup pour vos réponses. J'ai pu reprendre le projet que ce matin.

J'ai appris des choses qui m'ont fait progresser (l'instruction IF/THEN/ELSE ; la possibilité de déclarer une variable en VARIANT notamment). J'ai retenu la proposition de fanfan car il fallait bien faire un choix même si toutes répondaient à mon besoin. Je vous en remercie.

J'ai souhaité affecter ma macro à un événement de la feuille : Cours VBA : les événements Worksheet (excel-pratique.com) ; cependant si je choisis l'événement suivant : > Private Sub Worksheet_Change(ByVal Target As Range) End Sub < ; mon classeur crash alors que les autres s'exécutent sans difficulté.

Savez-vous s'il vous plaît s'il y a une erreur connue avec l'événement "Change" ?

Bonjour

Cette macro evenementielle marche très bien mais

elle ne doit pas être dans un module

clic sur l'onglet de la feuille et selectionne visualiser le code

C'est à cet endroit que doit ce trouver ta macro.

Mais si c'est la macro de ton post elle ne peut marcher avec une macro evenementielle...

Private Sub Worksheet_Change(ByVal Target As Range) End Sub => target étant la cellule modifiée...

A+ François

Bonjour,

cependant si je choisis l'événement suivant : > Private Sub Worksheet_Change(ByVal Target As Range) End Sub < ; mon classeur crash alors que les autres s'exécutent sans difficulté.

Oui comme fanfan38 vous l'explique, un code private worksheet est à placer dans la feuille en non dans un module
Pour ce que vous voulez faire, essayez ceci :

Click droite sur l'onglet puis choisir "Visualiser le code" et coller le code ci-dessous

Private Sub Worksheet_Change(ByVal Target As Range) 
Call Macro1
End sub

Le code sera exécuté sur n'importe quel changement d'une cellule sur la feuille

Avantage : vous pouvez utiliser le bouton sur la feuille ou exécuter de manière automatique sur changement dans la feuille

NB : avec 200 000 valeurs... cela va râmer ferme. A vérifier...

Cordialement

Non DAN, ça va planter car il fait une boucle dans la macro dans laquelle se trouve target... (memoire insuffisante)...

A+ François

Non DAN, ça va planter car il fait une boucle dans la macro dans laquelle se trouve target... (memoire insuffisante)...

Ok mais c'est juste l'idée.
Je n'ai pas fait d'essai en fait mais ce que je propose est possible à réaliser. On peut contourner ce souci pour éviter de relancer le code à chaque passage
A voir s'il veut cela

A+

Rechercher des sujets similaires à "mon premier projet vba"