Problème fonction sous vba

Fermé
julesdelf Messages postés 13 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 15 juin 2015 - 9 mai 2015 à 18:46
julesdelf Messages postés 13 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 15 juin 2015 - 11 mai 2015 à 15:05
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

via55 Messages postés 14495 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 7 novembre 2024 2 735
9 mai 2015 à 19:45
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
julesdelf Messages postés 13 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 15 juin 2015
9 mai 2015 à 21:57
Merci beaucoup Via, c'est pile ce qu'il me fallait et ça fonctionne nickel!!!!!!
Merci Merci

Cordialement
0
julesdelf Messages postés 13 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 15 juin 2015
10 mai 2015 à 10:16
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
julesdelf Messages postés 13 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 15 juin 2015
10 mai 2015 à 10:44
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
julesdelf Messages postés 13 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 15 juin 2015
10 mai 2015 à 11:55
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
Bonjour
donne si tu peux ton fichier tXt pour voir ton probleme

A+
Maurice
0
julesdelf Messages postés 13 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 15 juin 2015
10 mai 2015 à 12:12
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
julesdelf Messages postés 13 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 15 juin 2015
10 mai 2015 à 12:16
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
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
julesdelf Messages postés 13 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 15 juin 2015
10 mai 2015 à 12:48
voila le fichier txt:
https://www.cjoint.com/?0EknaTpMoIi

désolé...
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
10 mai 2015 à 12:49
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
julesdelf Messages postés 13 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 15 juin 2015
10 mai 2015 à 12:58
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
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
10 mai 2015 à 13:16
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
julesdelf Messages postés 13 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 15 juin 2015
11 mai 2015 à 13:23
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
julesdelf Messages postés 13 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 15 juin 2015
11 mai 2015 à 15:05
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