Problème fonction sous vba

Bonjour, j'ai essayé de faire une fonction sous vba dont le but est de faire:
sur la cellule dans laquelle estla formule :
si son numéro de ligne et son numéro de colonne correspondent à des valeurs dans des cellules d'une autre feuille, alors sa valeur est la valeur d'une cellule d'une autre feuille, sinon il doit y avoir 0.
Il faut que ce soit itératif car la fonction doit parcourir 500 lignes de cette "autre feuille"
J'ai réussit à le faire en formule mais je ne suis allé que de 2à 12 mais je ne pourrais pas aller jusqu'a 500 comme ça...
donc j'ai essayé de faire une fonction soit vba mais ça ne marche pas...

Voila comment ça fonctionne en formule :
=IF(AND(ROW()=traitement!$C$2;COLUMN()=traitement!$D$2);traitement!$B$2;IF(AND(ROW()=traitement!$C$3;COLUMN()=traitement!$D$3);traitement!$B$3;IF(AND(ROW()=traitement!$C$4;COLUMN()=traitement!$D$4);traitement!$B$4;IF(AND(ROW()=traitement!$C$5;COLUMN()=traitement!$D$5);traitement!$B$5;IF(AND(ROW()=traitement!$C$6;COLUMN()=traitement!$D$6);traitement!$B$6;IF(AND(ROW()=traitement!$C$7;COLUMN()=traitement!$D$7);traitement!$B$7;IF(AND(ROW()=traitement!$C$8;COLUMN()=traitement!$D$8);traitement!$B$8;IF(AND(ROW()=traitement!$C$9;COLUMN()=traitement!$D$9);traitement!$B$9;IF(AND(ROW()=traitement!$C$10;COLUMN()=traitement!$D$10);traitement!$B$10;IF(AND(ROW()=traitement!$C$10;COLUMN()=traitement!$D$10);traitement!$B$10;IF(AND(ROW()=traitement!$C$11;COLUMN()=traitement!$D$11);traitement!$B$11;IF(AND(ROW()=traitement!$C$12;COLUMN()=traitement!$D$12);traitement!$B$12;IF(AND(ROW()=traitement!$C$12;
COLUMN()=traitement!$D$12);traitement!$B$12;0)))))))))))))

et voila ce que j'ai essayé de faire:

Function Macro_test(cell As Range)
Dim i As Long

If cell.Row = Sheets("traitement").Range("Ci") And cell.Column = Sheets("traitement").Range("Di") Then

cell = Sheets("traitement").Range("Bi")

ElseIf i < 500 Then
i = i + 1
Else

cell = 0

End If

End Function

je ne sais pas du tout ce qui ne va pas...

Merci!!!!

14 réponses

  1. Bonjour,

    1) Tes adresses Range ("Ci") ne sont pas correctes, la syntaxe adéquate est Range("C" & i)

    2) Procèdes plutôt par une boucle de 1 à 500 :
    Function test(cell As Range)
    Dim i As Long
    Dim lg As Integer
    For i = 1 To 500
    If Sheets("traitement").Range("C" & i) = cell.Row And Sheets("traitement").Range("D" & i) = cell.Column Then lg = i
    Next
    If lg > 0 Then test = Sheets("traitement").Range("B" & lg) Else test = 0
    End Function


    Cdlmnt
    Via
    0
    1. Merci beaucoup Via, c'est pile ce qu'il me fallait et ça fonctionne nickel!!!!!!
      Merci Merci

      Cordialement
      0
      1. Bonjour, nouvelle journée nouveau problème...
        J'essai d'in tégrer dans une macro la fonction match.
        J'ai une valeur définie comme une date dans une feuille, je veux trouver le numéro de colonne correspondant dans une autre feuille, voila ma syntaxe: (je vous epargne tout le rest du code qui fonctionne bien)

        NLIG AS VARIANT
        Range("a" & DLig2).Select
        NLIG = Application.Match(Range("a" & DLig2).Value, Sheets("reception commande").Rows(3), 0)
        Range("d" & DLIG3) = NLIG

        J'ai une erreur sur le NLIG ALORS QUE LA FONCTION :

        =MATCH(A$6;'reception commande'!$3:$3;0)

        fonctionne mais j'ai besoin de remplacer le 6 par la valeur DLIg2 car elle peut changer...
        est ce que le code est bon?
        est ce que c'est qu'il ne trouve pas la valeur?

        merci
        0
        1. en fait mon problème vient de la cellule que je cherche,
          j'importe un fichier txt dans lequel j'ai une date écrite comme ça 12/05/2015, mon séparateur de colonne est "tab"
          mais lorsque je l'importe par la macro, la date se transforme en 05/12/2015 05 decembre au lieu de 12 mai et du coup ma fonction match ne la trouve pas...
          voila ce que j'ai mis pour l'importation:

          Workbooks.OpenText Filename:= _
          "C:\Users\jules\Desktop\test code barre\RECEPTION.txt", Origin:=932, _
          StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
          ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, Comma:=False, _
          Space:=False, Other:=False, OtherChar:="/", FieldInfo:=Array(Array(1, 1) _
          , Array(2, 1)), TrailingMinusNumbers:=True

          merci
          0
          1. Bonjour

            Voila deja une macro pour importer un fichier Txt separateure Tab

            Sub ListeFichier()
            Dim Dossier As FileDialog
                  Chemin = ActiveWorkbook.Path & Application.PathSeparator
            Set Dossier = Application.FileDialog(msoFileDialogOpen)
               With Dossier
                  .AllowMultiSelect = False
                  .InitialFileName = Chemin
                  .Title = "Choix d'une fichier Elise"
                        With .Filters
                           .Clear
                           .Add "Fichiers Textes", "*.txt", 1
                        End With
                  .InitialFileName = ""
                  'Interdit la multi sélection
                  .AllowMultiSelect = False
                     If .Show = -1 Then
                           Fichier = .SelectedItems(1)
                           Call LireFichier(Fichier)
                        Else
                           Exit Sub
                     End If
               End With
            Set Dossier = Nothing
            End Sub
            
            Sub LireFichier(NomFichier)
            Dim Ar() As String
               With Application
                  .ScreenUpdating = False
                  .EnableEvents = False
                  .Calculation = xlManual
               End With
            Cells.Select
            Selection.ClearContents
            ' -------------------------------------
            Sep = vbTab
            Lig = 1
                Open NomFichier For Input As #1
                    Do While Not EOF(1)
                        Line Input #1, Chaine
                           Ar = Split(Chaine, Sep)
                           Col = 1
                              For X = LBound(Ar) To UBound(Ar)
                                 Cells(Lig, Col) = Ar(X)
                                 Col = Col + 1
                              Next
                        Lig = Lig + 1
                    Loop
                Close #1
            ' -------------------------------------
               With Application
                  .ScreenUpdating = True
                  .Calculation = xlCalculationAutomatic
                  .EnableEvents = True
                  .CutCopyMode = False
                  .Goto [A2], True
               End With
               MsgBox "Terminer"
            End Sub
            


            A tester sur ton fichier

            A+
            Maurice
            0
            1. C'est vrai que c'est mieux comme ça...
              mais ça ne change pas mon problème qui est sur le format de la date lors de l'importation,
              le fichier txt comporte 12/05/2015 et lors de mon importation ou de la tienne il se transforme en 05/12/2015.
              et si j'essai de l'inverser dans le txt (05/12/2015), il me donne le bon format après l'importation soit 15/05/2015. Mais la fonction Match ne fonctionne toujours pas...

              voila l'intégralité de mon code après les importations:

              Windows("fichier d'importation.xlsx").Activate
              DLig1 = Range("A1").End(xlDown).Row + 1
              Range("A1:B" & DLig1).Select
              Application.CutCopyMode = False
              Selection.Cut
              Windows("fichier globalV7.xlsm").Activate
              Sheets("traitement_reception").Select
              DLig2 = Range("A1").End(xlDown).Row + 1
              Range("a" & DLig2).Select
              ActiveSheet.Paste
              Range("c2:d2").Select
              Selection.Copy
              Range("c" & DLig2).Select
              ActiveSheet.Paste
              Range("C3").Select
              Selection.Copy
              DLIG3 = DLig2 + 1
              DLIG4 = DLIG3 + DLig1 - 3
              Range("C" & DLIG3).Select
              ActiveSheet.Paste
              Application.CutCopyMode = False
              Selection.AutoFill Destination:=Range("C" & DLIG3 & ":C" & DLIG4), Type:=xlFillDefault
              Sheets("traitement_reception").Select
              NLIG = Application.Match(Range("a" & DLig2).Value, Sheets("reception commande").Rows(3), 0)
              Range("d" & DLIG3) = NLIG
              0
              1. Bonjour
                donne si tu peux ton fichier tXt pour voir ton probleme

                A+
                Maurice
                0
                1. voila ce qu'il y a dans mon fichier txt:
                  05/12/2015
                  MOUSSE APPUIE-GENOU 350
                  VERIN V60 - 6000N course 29cm FLY'EVER REF 44A 150
                  RONDELLE PLASTIQUE M8 (8.1x14x1) 2000

                  en fait quand je teste ma fonction match sur une colonne avec la cellule "mousse appui-genou" comme valeur de recherche, ça fonctionne
                  mais si je cherche la date sur les lignes ça ne fonctionne pas.
                  J'ai essayé avec autre chose que la date et ça ne fonctionne pas sur les lignes...
                  0
                  1. RECTIFICATION, j'ai essayé avec autre chose qu'une date et ça fonctionne, le problème doit donc venir de mes formats de date...
                    0
                2. Bonjour
                  Pour transmettre un fichier, il faut passer par un site de pièce jointe tel que cjoint.com

                  Va sur ce site : http://cjoint.com
                  Clic sur parcourir,
                  Cherche ton fichier,
                  clic sur ouvrir,
                  Clic sur "Créer le lien cjoint",
                  Copier le lien,
                  Revenir ici le coller dans une réponse

                  A+
                  Maurice
                  0
                  1. Contributeur
                    Bonjour,

                    Importe ton fichier en enregistrement de macro, et à l'étape des colonnes choisi JMA pour le format des colonnes date.
                    Tu auras les bons paramètres pour une importation correcte.

                    eric
                    0
                    1. Bonjour éric,
                      j'ai déjà essayé mais le problème c'est que ça importe bien quand je le fait mais quand je relance la macro, ça ne l'a pas pris en charge.
                      Après le problème ne vient pas forcement de la date, il vient surtout du fait que la fonction match ne fonctionne pas avec la date, quand je met une valeur, ou un texte, la fonction arrive à retrouver ce que je cherche mais quand je met une date, tel que je l'ai écrite, il ne trouve rien...
                      le problème ne viendrai t-il pas du ".value" que j'ai mis, n'y a t-il pas un autre terme à mettre?
                      0
                      1. Contributeur
                        Ca n'importe pas bien puisque ça inverse mois et jour sur certaines dates....
                        C'est donc 2 problèmes, fait ce que je t'ai indiqué.

                        Et pour chercher une date :
                            Dim c As Range
                            Set c = [A:A].Find(CDate([A2]), LookIn:=xlValues)
                            If Not c Is Nothing Then
                                MsgBox "date en ligne " & c.Row
                            Else
                                ' date non trouvée
                            End If
                        0
                    2. Bonjour tout le monde!
                      alors avec toutes les infos que vous m'avez donné, j'y suis arrivé donc c'est super!!!!!
                      Sans trop abusé (dites moi si c'est le cas), pour continuer ce programme,
                      je cherche à trier une liste importée en fonction du format de la cellule si c'est une date, et de la première lettre de la cellule.
                      C'est à dire:
                      si A1 est une date, alors la valeur va dans d1
                      si A2 commence par B alors la valeur va en e1
                      Si A3 commence par T alors la valeur va en f1
                      si A4 commence par B alors la valeur va en e2

                      J'ai essayé de faire une fonction avec une boucle for avec une condition basée sur le format "date" mais elle s'arrête à la première valeur et je n'ai pas réussit à lui faire analyser toutes les données et à les triées.
                      Voila une idée du type de fichier que je cherche à trier:
                      https://www.cjoint.com/?0ElnLsrbONF

                      Merci!!!
                      0
                      1. C'est bon, je deviendrai presque bon lol, voila le programme qui fonctionne mais il est un peu long du coup:
                        Sub CONTROLBOX()
                        Dim iIM As Long
                        Dim iLN As Long
                        Dim IM As Worksheet
                        Dim LN As Worksheet
                        Dim X As Range

                        Set IM = Worksheets("import")
                        Set LN = Worksheets("liste_numéros")

                        LN.Select
                        iLN = Range("C1").End(xlDown).Row + 1

                        For iIM = 1 To 500
                        IM.Select
                        IM.Range("A" & iIM).Select
                        If Left$(IM.Range("A" & iIM), 1) = "C" Then
                        IM.Range("A" & iIM).Copy LN.Range("C" & iLN)
                        IM.Range("A" & iIM).Delete Shift:=xlUp
                        iLN = iLN + 1
                        iIM = iIM - 1
                        End If
                        Next
                        IM.Select
                        Range("A1").Select
                        LN.Select
                        Range("A1").Select

                        End Sub

                        En tout cas, il fonctionne!!! ;)
                        0