Problème fonction sous vba

julesdelf Messages postés 13 Statut Membre -  
julesdelf Messages postés 13 Statut Membre -
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. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  2. julesdelf Messages postés 13 Statut Membre
     
    Merci beaucoup Via, c'est pile ce qu'il me fallait et ça fonctionne nickel!!!!!!
    Merci Merci

    Cordialement
    0
  3. julesdelf Messages postés 13 Statut Membre
     
    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
  4. julesdelf Messages postés 13 Statut Membre
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Maurice
     
    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
  7. julesdelf Messages postés 13 Statut Membre
     
    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
  8. Maurice
     
    Bonjour
    donne si tu peux ton fichier tXt pour voir ton probleme

    A+
    Maurice
    0
  9. julesdelf Messages postés 13 Statut Membre
     
    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. julesdelf Messages postés 13 Statut Membre
       
      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
  10. Maurice
     
    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
  11. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  12. julesdelf Messages postés 13 Statut Membre
     
    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. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
  13. julesdelf Messages postés 13 Statut Membre
     
    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
  14. julesdelf Messages postés 13 Statut Membre
     
    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