Formules dans VBA

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

9exemplevba.xlsm (22.01 Ko)

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

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,

re,

remplace la ligne

.Cells(NumLigneVide, 3).Value = UCase(article) & n

par

.Cells(NumLigneVide, 3).Value = UCase(Left(article, 3)) & n

Cela fonctionne parfaitement !

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

Cdlt

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

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

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.

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

Merci infiniment pour vos réponses ! Tout fonctionne !

Rechercher des sujets similaires à "formules vba"