Formules dans VBA Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
A
Antonio
Jeune membre
Jeune membre
Messages : 32
Inscrit le : 23 mai 2019
Version d'Excel : 2010 FR

Message par Antonio » 23 mai 2019, 14:01

Bonjour à tous,

Voilà ce que j'essaie de faire : J'ai une liste d'article dans un tableau (ex : Ballon), avec un N° de Cycle (ex : 18) qui leur correspond (chaque fois que cet article est à nouveau rentrer dans le tableau, le N° de Cyle augmente d'1) et un nom type (qui reprend les 3 premières lettres d'article et le N° de Cycle). -> Voir fichier d'exemple en pièce jointe.

Exemple : BALLON 18 BAL18

J'aimerais que lorsque l'utilisateur rentre le numéro d'article via un UserForm, le N° de Cycle et et le Nom type se remplisse automatiquement, malheureusement mon code ne marche pas :
Private Sub CommandButton_Valider_Click()

    Dim NumLigneVide As Integer

        NumLigneVide = 2
    
    Do Until Cells(NumLigneVide, 1).Value = ""
    
        NumLigneVide = NumLigneVide + 1
        
    Loop
    
        Cells(NumLigneVide, 1).Value = TextBox_Article.Value
        
        Cells(NumLigneVide, 2).FormulaLocal = "=MAX(SI(A1:A11=A12;B1:B11;0)) +1"
        
        Cells(NumLigneVide, 3).FormulaLocal = "=MAJUSCULE(GAUCHE(A12;3)&B12))"
        
        UserForm1.Hide
        Unload UserForm1

End Sub
Sachant qu'en plus la première formule est une formule matricielle (Ctrl+Maj+Entrer)

Je vous remercie grandement d'avance pour votre aide

Cdlt
ExempleVBA.xlsm
(22.01 Kio) Téléchargé 4 fois
Avatar du membre
i20100
Passionné d'Excel
Passionné d'Excel
Messages : 4'734
Appréciations reçues : 226
Inscrit le : 16 mars 2017
Version d'Excel : 2010 sur PC

Message par i20100 » 23 mai 2019, 14:46

Bonjour,

à tester,
Dim NumLigneVide As Long

With Sheets("Feuil1")
    NumLigneVide = .Cells(Rows.Count, 1).End(xlUp).Row + 1
    article = TextBox_Article.Value
    t = "MAX(IF(A2:A1000000=""" & article & """,B2:B1000000,0))"
    n = Evaluate(t) + 1
    
    .Cells(NumLigneVide, 1).Value = article
    .Cells(NumLigneVide, 2).Value = n
    .Cells(NumLigneVide, 3).Value = UCase(article) & n
End With
Si le problème est résolu, pensez au clic sur le bouton
isabelle
A
Antonio
Jeune membre
Jeune membre
Messages : 32
Inscrit le : 23 mai 2019
Version d'Excel : 2010 FR

Message par Antonio » 23 mai 2019, 14:56

Bonjour,

Merci beaucoup pour votre réponse, il semblerait qu'on tienne le bon bout grâce à vous mais ce n'est pas tout à fait ça !
En effet votre code met dans la colonne 3 le nom de l'article en entier et le N° de Cycle, or il me faut vraiment uniquement les 3 premières lettres de l'article ! (et en majuscule !)

Cordialement,
Avatar du membre
i20100
Passionné d'Excel
Passionné d'Excel
Messages : 4'734
Appréciations reçues : 226
Inscrit le : 16 mars 2017
Version d'Excel : 2010 sur PC

Message par i20100 » 23 mai 2019, 15:09

re,

remplace la ligne
.Cells(NumLigneVide, 3).Value = UCase(article) & n
par
.Cells(NumLigneVide, 3).Value = UCase(Left(article, 3)) & n
Si le problème est résolu, pensez au clic sur le bouton
isabelle
A
Antonio
Jeune membre
Jeune membre
Messages : 32
Inscrit le : 23 mai 2019
Version d'Excel : 2010 FR

Message par Antonio » 23 mai 2019, 15:14

Cela fonctionne parfaitement !

Je vous remercie infiniment pour votre temps et votre aide ! Bonne journée

Cdlt
A
Antonio
Jeune membre
Jeune membre
Messages : 32
Inscrit le : 23 mai 2019
Version d'Excel : 2010 FR

Message par Antonio » 23 mai 2019, 15:36

Rebonjour,

Finalement en transposant le code dans mon vrai fichier excel, il semblerait que la ligne
n = Evaluate(t) + 1
pose problème (erreur d'exécution '13' Incompatibilité de type) , je soupçonne une erreur de déclaration de variable (j'avais mis String), pourriez vous m'aider à nouveau svp ?

Merci d'avance
Avatar du membre
i20100
Passionné d'Excel
Passionné d'Excel
Messages : 4'734
Appréciations reçues : 226
Inscrit le : 16 mars 2017
Version d'Excel : 2010 sur PC

Message par i20100 » 23 mai 2019, 15:59

re,

voici la macro avec déclaration.
ps/ j'ai ajouté les variables pour définir les adresses des colonnes du tableau.
Private Sub CommandButton_Valider_Click()
Dim NumLigneVide As Long, n As Integer
Dim article As String, t As String, colArt As String, colCycle As String

colArt = ActiveSheet.ListObjects("Tableau1").ListColumns(1).DataBodyRange.Address(0, 0)
colCycle = ActiveSheet.ListObjects("Tableau1").ListColumns(2).DataBodyRange.Address(0, 0)

With Sheets("Feuil1")
    NumLigneVide = .Cells(Rows.Count, 1).End(xlUp).Row + 1
    article = TextBox_Article.Value
    t = "MAX(IF(Feuil1!" & colArt & "=""" & article & """,Feuil1!" & colCycle & ",0))"
    n = Evaluate(t) + 1
    
    .Cells(NumLigneVide, 1).Value = article
    .Cells(NumLigneVide, 2).Value = n
    .Cells(NumLigneVide, 3).Value = UCase(Left(article, 3)) & n
End With

Unload UserForm1
End Sub
Si le problème est résolu, pensez au clic sur le bouton
isabelle
Avatar du membre
Pedro22
Membre impliqué
Membre impliqué
Messages : 2'315
Appréciations reçues : 238
Inscrit le : 26 janvier 2017
Version d'Excel : 2010

Message par Pedro22 » 23 mai 2019, 16:03

Bonjour, salut i20100,

Petit complément, pour écrire une formule matricielle en VBA, il faut utiliser ".FormulaArray" à la place de ".FormulaLocal". La formule est en revanche à écrire en version anglaise.
Le problème n'est pas de ne pas savoir, le problème est de ne pas chercher...
Ton problème est résolu ? N'oublie pas de l'indiquer :
Avatar du membre
i20100
Passionné d'Excel
Passionné d'Excel
Messages : 4'734
Appréciations reçues : 226
Inscrit le : 16 mars 2017
Version d'Excel : 2010 sur PC

Message par i20100 » 23 mai 2019, 16:24

re,
slt Pedro22,

tu peux également utiliser l'objet "Tableau" pour trouver la dernière ligne,
Private Sub CommandButton_Valider_Click()
Dim NumLigneVide As Long, n As Integer
Dim article As String, t As String, colArt As String, colCycle As String

With ActiveSheet.ListObjects("Tableau1")
    NumLigneVide = .DataBodyRange.Item(.DataBodyRange.Count).Row + 1
    colArt = .ListColumns(1).DataBodyRange.Address
    colCycle = .ListColumns(2).DataBodyRange.Address
End With

With Sheets("Feuil1")
    article = TextBox_Article.Value
    t = "MAX(IF(Feuil1!" & colArt & "=""" & article & """,Feuil1!" & colCycle & ",0))"
    n = Evaluate(t) + 1

    .Cells(NumLigneVide, 1).Value = article
    .Cells(NumLigneVide, 2).Value = n
    .Cells(NumLigneVide, 3).Value = UCase(Left(article, 3)) & n
End With

Unload UserForm1
End Sub
Si le problème est résolu, pensez au clic sur le bouton
isabelle
A
Antonio
Jeune membre
Jeune membre
Messages : 32
Inscrit le : 23 mai 2019
Version d'Excel : 2010 FR

Message par Antonio » 24 mai 2019, 11:40

Merci infiniment pour vos réponses ! Tout fonctionne !
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message
  • VBA ou Formules ?
    par Le Drosophile » 22 octobre 2018, 15:13 » dans Excel - VBA
    12 Réponses
    166 Vues
    Dernier message par dhany
    26 octobre 2018, 09:36
  • vba en formules
    par bernard53 » 28 janvier 2019, 12:55 » dans Excel - VBA
    6 Réponses
    142 Vues
    Dernier message par bernard53
    1 février 2019, 13:48
  • VBA ou formules
    par daewoo41 » 12 juin 2019, 07:05 » dans Excel - VBA
    6 Réponses
    113 Vues
    Dernier message par daewoo41
    12 juin 2019, 21:20
  • Formules VBA
    par Mskander » 23 décembre 2015, 08:42 » dans Excel - VBA
    4 Réponses
    124 Vues
    Dernier message par Mskander
    28 décembre 2015, 11:25
  • Retranscrire formules en VBA
    par 20syl » 4 août 2017, 10:22 » dans Excel - VBA
    10 Réponses
    219 Vues
    Dernier message par 20syl
    7 août 2017, 10:51
  • Formules à transformer en VBA
    par Xavax » 9 novembre 2015, 14:08 » dans Excel - VBA
    9 Réponses
    224 Vues
    Dernier message par Xavax
    12 novembre 2015, 15:23