Incombatibilité de type

Signaler
Messages postés
130
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
8 décembre 2015
-
Messages postés
130
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
8 décembre 2015
-
Salut les gars j'ai une erreur je trouve pas :(

oqp = Sheets(1).UsedRange.Address
v = Split(oqp, "$")
dernier = CInt(v(UBound(v)))

tab_1 = Range(Cells(3, col), Cells(dernier, col)).Value

For i = 1 To dernier - 2
    blow = verif(CStr(tab_1(i, 1)), tab_2)
    If blow < 0 Then
        tab_2(tab_2_index, 1) = Trim(tab_1(i, 1)) '<-- incompatibilité...
        tab_2(tab_2_index, 2) = 1
    Else
        tab_2(blow, 2) = CStr(CInt(tab_2(blow, 2)) + 1)
        tab_2_index = tab_2_index + 1
    End If
Next

Sheets.Add
Sheets(Sheets.Count).Range(Cells(3, 1), Cells(dernier, 2)) = tab_2

End Sub


Function verif(str As String, tab_2 As Variant)

Dim jeton As Integer

jeton = -1

If IsEmpty(tab_2) Then GoTo bye
    

For i = 1 To CInt(UBound(tab_2, 1))
    If Trim(str) = Trim(tab_2(i, 1)) Then
        jeton = i
        GoTo bye
    End If
Next
    
bye:
   
verif = jeton
   
End Function



Le script est sensé lire une colonne et retourner chacun des contenus avec son nombre d’occurrences sur une autre feuille.


Merci d'avance


nitho l'amateur

9 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour,

1)
.value n'a rien à faire dans
tab_1 = Range(Cells(3, col), Cells(dernier, col)) .Value
2) tu devrais passer ta variabele col en paramètre de ta fonction
3) ta fonction ne retourne aucune valeur !
syntaxe habituelle pour une fonction :
Private(ou Public) Function toto (param1 as ...,param2 as ...) as ...
...
...
toto  = ...
End Function

etc ... etc ...
Je n'ai pas voulu ici aller au-delà, me contentant de mettre le doigt sur les erreurs les plus évidentes.

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Ah oui ...
et si ta variable dernier est la dernière ligne d'une colonne (par exemple la colonne B) :
n'utilise pas le usedrange, mais ceci :
dernier = Range("B" & Rows.Count).End(xlUp).row


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
130
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
8 décembre 2015

Erreurs prises en compte, même si

le ".value" est facultatif je te le concède, ça ne change rien au code...

et je ne passe pas col en paramètre de ma fonction parce que la fonction est sensée chercher si le tableau tab_1 contient déjà le string passé en premier paramètre et retourné la position de ce string dans tab_1... ça n'a rien à voir avec col.

col est juste le numéro de la colonne chargée dans tab_1 en début de programme.




nitho l'amateur
Messages postés
130
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
8 décembre 2015

tu veux dire End(xlDown).row !!!!

mais le problème avec xlDown c'est que s'il y a un trou dans ta colonne... Et bèèèè il te renvoie la ligne juste avant le trou.



nitho l'amateur
Messages postés
130
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
8 décembre 2015

Dzl j'avais pas vu ton Rows.count... Malin


nitho l'amateur
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Impossible de te guider plus en avant sans connaître ce que sont (comment ils sont déclarés) et ce que contiennent :

tab_2
tab_2_index

Je ne peux à ce stade que te conseiller :
- de typer toutes tes variables (l'utilisation de Option Explicit t'aiderait sans aucun doute à voir celles qui ne le sont pas)
- de passer en mode debug et de voir :
la valeur de blow, par exemple (mais aussi les autres).


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
130
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
8 décembre 2015

En fait le programme parcoure une colonne d'un fichier et stocke tous les mots qu'elle rencontre dans tab_1

Dans tab_2 il doit y avoir deux colonnes:
la première pour mettre les mots
la deuxième pour mettre le nombre d’occurrence

le résultat doit être affiché dans une nouvelle feuille (on s'interdit de modifier la feuille originale)

tab_2_index permet de savoir où est ce qu'on en est dans le tableau tab_2, il a normalement la valeur de ubound(tab_2)+1, c'est une sorte de curseur si tu veux, au fur et à mesure qu'on écrit dans tab_2, il se déplace...

la fonction vérif sert comme tu as du le voir à vérifier si le mot à déjà été enregistré dans tab_2 si c'est le cas, on incrémente le compteur à la ligne retournée par la fonction, sinon on insert le nouveau mot à la position donnée par tab_2_index




nitho l'amateur
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Je ne crois pas que tu aies répondu à mes observations, à commencer par la toute première


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
Messages postés
130
Date d'inscription
jeudi 16 avril 2009
Statut
Membre
Dernière intervention
8 décembre 2015

Ah je n'avais pas vu que j'avais coupé le code après les déclarations.

Bon je te montre où j'en suis.

Option Explicit

Sub antho()

Dim col As Integer
Dim tab_1 As Variant
Dim tab_2 As Variant
Dim tab_2_index As Integer
Dim blow, dernier, i As Integer

col = 3
tab_2_index = 0

dernier = Sheets(1).Range("C" & Rows.Count).End(xlUp).Row

tab_1 = Range(Cells(3, col), Cells(dernier, col)).Value
ReDim tab_2(UBound(tab_1), 1)

For i = 1 To dernier - 2
    blow = verif(CStr(tab_1(i)), tab_2)
    If blow < 0 Then
        tab_2(tab_2_index, 0) = Trim(tab_1(i))
        tab_2(tab_2_index, 1) = 1
        tab_2_index = tab_2_index + 1
    Else
        tab_2(blow, 1) = CStr(CInt(tab_2(blow, 1)) + 1)
    End If
Next

Sheets.Add
Sheets(Sheets.Count).Range(Cells(1, 1), Cells(dernier - 2, 2)).Value = tab_2

End Sub


Function verif(str As String, tab_2 As Variant) As Integer

Dim jeton, i  As Integer

jeton = -1

If IsEmpty(tab_2) Then GoTo bye
    

For i = 1 To CInt(UBound(tab_2, 0))
    If Trim(str) = Trim(tab_2(i, 0)) Then
        jeton = i
        GoTo bye
    End If
Next
    
bye:
   
verif = jeton
   
End Function




Comme tu peux le voir j'ai ajouté la ligne de Redim, pour éviter le problème d'incompatibilité de type.

tab_1 est sensé être un tableau à une dimension contenant une liste de mots avec des doublons
et tab_2 est sensé être un tableau à 2 dimensions, la première colonne contiendra une liste de mot sans doublons et la deuxième le nombre d'occurrences de chaque mot dans le premier tableau.



Merci d'avance

l'amateur