IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Type mismatch macro excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Mars 2013
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 10
    Par défaut Type mismatch macro excel
    bonjours,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Range("B$2:B$1048576") < 0.791666666666667 And Range("B$2:B$1048576").Value > 0.29 Or Range("C$2:C$1048576").Value < 6 Then
    WorksheetFunction.EntireRow.Delete
    End If
    je recois un type mismatch error et je ne sais pas pourquois.

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonsoir
    Et qu'est ce que ce "code" est censé faire?

  3. #3
    Membre habitué
    Inscrit en
    Mars 2013
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 10
    Par défaut
    suprimer les ligne qui on une valeur entre 0.791666666666667 et 0.29 dans la colonne B ou supprimer la ligne si la valeur dans la colonne c est inférieur a 6

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    D'abord il faut faire une boucle sur toutes les cellules remplies de la colonne B et pour chaque cellule faire le test adéquat.

    Car par exemplesignifie que tu compare un tableau de 3 cellules à une valeur numérique

    En plus, où tu as déniché cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WorksheetFunction.EntireRow.Delete
    Voilà, je vais te donner un petit coup de pouce

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim i as Long
     
    For i=300 To 2 Step -1
         If Range("B" & i).value > 0 Then Rows(i).Delete
    Next i
    Explication, Pour supprimer des lignes (ou ajouter) en utilisant la boucle For/Next il faut toujours commencer par le bas et remonter
    i est le compteur de ligne et le code teste si B300>0, ensuite B299...B2
    et il supprime la ligne i quand la condition est vérifiée

    Attention, Toutes les données de la colonne B doivent être des nombres (pour que l'inégalité du test soit correcte)

    Ensuite, pour trouver la dernière ligne remplie de la colonne B:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim N as long
     
    N=Cells(Activesheet.rows.count,"B").End(xlup).Row
    Elle est nécessaire pour se limiter à la partie utile de la feuille

    Bon courage

  5. #5
    Membre habitué
    Inscrit en
    Mars 2013
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 10
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim i As Long
    Dim N As Long
    N = Cells(Activesheet.Rows.Count, "B").End(xlUp).Row
    For i = N to 2 Step -1
    If Range ("B" & i).Value >  0.7916666666667 And Range ("B" & i).Value < 0.29 _
    Or Range ("C" & i).Value < 6 Then Rows(i).Delete
    Next i
    Voila ce que j'ai réussi a faire, ca à lére de fonctionné mais j'ai 200000 lignes et le temps de calcule est énorme, y aurait il un autre moyen de speeder un peut le proccesus.

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Revérifie ta condition en mettant éventuellement des parenthèse

    L'utilisation des variables tableaux dans ton cas sont souhaitables

    Teste ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Sub Traiter()
    Dim N As Long, i As Long, j As Long
    Dim N1 As Double, N2 As Double
    Dim Tb, Res()
     
    Application.ScreenUpdating = False
    With Worksheets("Feuil1")
        N = .Cells(.Rows.Count, 2).End(xlUp).Row
        If N > 1 Then
            Tb = .Range("B2:C" & N)
            ReDim Res(1 To N - 1, 1 To 2)
            For i = 1 To N - 1
                N1 = Tb(i, 1)
                N2 = Tb(i, 2)
                If N1 > 0.7916666666667 And N1 < 0.29 Or N2 < 6 Then
                    j = j + 1
                    Res(j, 1) = N1
                    Res(j, 2) = N2
                End If
            Next i
     
            .Range("B2:C" & N) = Res
        End If
    End With
    End Sub

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Déjà tu ne peux pas tester une plage("B$2:B$1048576") entière, mais cellule par cellule comme dit plus haut.
    D’autre part Excel utilise les paramètres régionaux pour définir le séparateur décimal (, ou .).
    Ce qui dans certains cas provoque des erreurs, tu dois qualifier le contenu de ta cellule :
    0.791666666666667 et 0,791666666666667 ce n’est pas la même chose !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Sub test()
    Dim i As Long
    For i = Range("B$2:B$1048576").Rows.Count To 1 Step -1
        If ConvertNumerique(Cells(i, 2)) < 0.791666666666667 And ConvertNumerique(Cells(i, 2)) > 0.29 Or ConvertNumerique(Cells(i, 2)) < 6 Then
            Cells(i, 2).EntireRow.Delete
        End If
    Next
    End Sub
    Function ConvertNumerique(V) As Double
    Dim Myval As String
    Myval = Replace(V, ",", ".")
    If IsNumeric(Myval) = True Then
        ConvertNumerique = Val(Myval)
        Exit Function
    End If
    Myval = Replace(Myval, ".", ",")
    If IsNumeric(Myval) = True Then
        ConvertNumerique = Val(Myval)
        Exit Function
    End If
    End Function

  8. #8
    Membre éprouvé
    Formateur en informatique
    Inscrit en
    Janvier 2011
    Messages
    134
    Détails du profil
    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 134
    Par défaut
    Bjr,

    Pour palier la lenteur d'une boucle sur 200000 lignes il vaut mieux utiliser les fonctions natives à Excel ... ici un filtre élaboré. L'exécution prend moins de 1 sec sur mon vieux portable de 6 ans ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Sub Extraction()
    '
    ' en imaginant que les colonnes à partir de E sont libres ...
    ' que le titre de la colonne A soit col 1, celui de la B soit col 2 et C Col 3
    '
     
     
        Range("E1") = "col 2"
        [F1] = "col 2"
        [G1] = "col 3"
        [E2] = "<0,791666666666667"
        [F2] = ">0,29"
        [G3] = "<6"
     
     
        Range("A1:C200000").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
            Range("E1:G3"), CopyToRange:=Range("H1"), Unique:=False
     
    'Reste à faire ce qu'on veut de la zone extraite ...
     
    End Sub

Discussions similaires

  1. Type Mismatch sur une cellule Excel contenant une formule
    Par _developpeur_ dans le forum VBA Access
    Réponses: 7
    Dernier message: 15/07/2011, 14h10
  2. Type mismatch sur une procédure de fermeture d'un fichier excel
    Par _developpeur_ dans le forum VBA Access
    Réponses: 1
    Dernier message: 21/06/2011, 11h15
  3. débutant en VBA je n'arrive pas à finir ma macro excel
    Par jeanpierreco dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/01/2005, 12h20
  4. Porter une macro Excel vers OpenOffice
    Par totofweb dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 13/07/2004, 13h20
  5. [LG]Type mismatch
    Par néo333 dans le forum Langage
    Réponses: 6
    Dernier message: 04/11/2003, 22h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo