Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
bonsoir,
j'ai codé une macro " archiver " mais quand je l'exécute, j'ai ce message " incompatibilité de type ", je ne sais pas comment résoudre ce problème
voici le le code :
En rouge, l'incompatibilité de type
Sub Archiver()
Dim num_position(17) As Byte
Dim i As Integer
Sheets("Jeu_Résultats").Select
Range("K2").Select
date_position = Range("K2").Value
If date_position = "" Then Exit Sub
For i = 1 To 17 num_position(i) = Range("L6").Offset(i - 1, 0).Value
If IsEmpty(num_position(i)) Then
End If
Next i
Sheets("Archives").Select
Range("A1").Select
If Range("A3").Value <> "" Then ActiveCell.End(xlDown).Select
ActiveCell.Offset(2, 0).Select
ActiveCell.Value = date_position
For i = 1 To 17
ActiveCell.Offset(0, i).Value = num_position(i)
Next i
Sans le fichier qui contient les données, difficile de viser juste. D'après ton code, tu as déclaré la variable num_position() comme un byte, c'est à dire un entier compris entre 0 et 255. si jamais ta cellule Range("L6").Offset(i - 1, 0) contient tout autre type de donnée (réel, entier <0 ou >255, texte, date, ...) ceci peut être à l'origine du plantage.
Donc, vérifie bien le contenu des cellules que tu essaie de stocker dans num_position() et adapte ta variable ou la référence à la cellule en conséquence.
je vous joins mon fichier excel pour visualiser le problème 🙂
désolé le fichier est trop important et même en le zippant ça ne passe pas !!
dans la colonne " L6:L22, j'ai cette formule suivante :
" =SI(ESTNA(EQUIV(N6;$D$4:$F$4;0));" ";LIGNE(1:1)) " que j'ai tiré jusqu'à L22
elle me renvoie une valeur comprise entre 1 et 20 en fonction d'un autre tableau
l'intitulé de la colonne " L6:L22 " est : P.G. = Position Gagnante
je n'arrive toujours pas a comprendre mon erreur d'incompatibilité de type
For i = 1 To 17
[COLOR=black]num_position(i) = Range("L6").Offset([COLOR=red][B]i - 1[/B][/COLOR], 0).Value[/COLOR]
If IsEmpty(num_position(i)) Then
End If
Next i
Lors du premier passage, num_position(1) prend la valeur de L5, donc tu essaie d'affecter une chaîne "P.G." à une variable numérique.
Si tu modifie ton code par :
la solution proposée par Roger marche très bien 🙂
Merci aux autres d'avoir proposé une solution 🙂
cependant, j'ai un autre problème, dans ma feuille " archives ", les résultats ne s'affichent pas dans les colonnes que je veux
après plusieurs tentatives, j'obtiens toujours le même résultats,
je joins mon fichier excel pour que visualiser le problème
Sub Archiver()
Dim num_position(17) As Variant
Dim i As Integer
Sheets("Jeu_Résultats").Select
Range("K2").Select
date_position = Range("K2").Value
If date_position = "" Then Exit Sub
For i = 1 To 17
num_position(i) = Range("L6").Offset(i - 1, 0).Value
If IsEmpty(num_position(i)) Then
End If
Next i
Sheets("Archives").Select
Range("A2").Select
If Range("A3").Value <> "" Then ActiveCell.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
ActiveCell.Value = date_position
j = 1
For i = 1 To 17
If num_position(i) <> " " Then
ActiveCell.Offset(0, j).Value = num_position(i)
j = j + 1
End If
Next i
End Sub
Bonsoir,
je reviens vers vous car j'ai toujours des problèmes avec ma macro " archiver ".
je souhaite archiver les résultats de plusieurs colonnes qui se trouvent dans la feuille " Jeu_Résultats ", dans ma feuille " Archives ". Avec la solution de FredOo, le code fonctionne bien pour une colonne🙂
j'ai essayé a partir de ce code, de chercher un autre code pour pourvoir prendre en compte toute mes colonnes mais je n'y suis pas arrivé 😱😱
je ne vois pas comment solutionner mon problème 😱
Je t'ai fais un code dans le fichier joint. Celui-ci fonctionne bien pour les données que tu as rempli.
Regarde comment il est construit et essaie de l'adapter à ton fichier réel.
J'ai tout de même une remarque à faire : Tu n as une drôle de manière de classer tes données dans l'onlet Jeu-Résultats. Ceci rend le traitement des données donc le code plus complexe. Essaie de simplifier tout cela.
merci FreedOo pour ton code 🙂
comme tu as dit dans ton message, je vais l'étudier et l'adapter a mon fichier réel 🙂
je vais essayer de simplifier mes données de la feuille " Jeu-Résultats "
FredOo, j'ai analysé ton code mais je ne comprend pas tout.
il y a une boucle dans ton code que je ne parviens pas a comprendre
voici cette boucle:
For k = 1 To 18
For i = 1 To 17
num_position(i, k) = Range("L5").Offset(i + IIf(k < 10, 0, 23), (IIf(k < 10, k, k - 9) - 1) * 6).Value
Next i
Next
Si tu peux me donner des explications sur cette boucle 🙂🙂
Tu as sur la feuille, 18 tableaux de chacun 17 lignes. Ces tableaux sont rangés sur 2 rangées de 9 tableaux chacune. Les 2 rangées on 23 lignes d'écart et chaque tableau est séparé du suivant par 6 colonnes. Cette disposition m'a fait écrire la remarque sur la bizarrerie de ta feuille.
La première boucle
Code:
For k = 1 to [COLOR=blue][B]18[/B][/COLOR]
sert à parcourir les 18 tableaux de résultats.
La deuxième boucle
Code:
For i = 1 to [COLOR=red][B]17[/B][/COLOR]
sert à parcourir les 17 lignes de chaque tableau de résultats.
J'utilise ensuite la variable num_position(i, k) qui est un tableau à 2 dimensions. La première dimension contient 17 éléments correspondant au nombre de lignes et la deuxième dimension contient 18 éléments correspondant au nombre de tableaux de résultats.
J'initialise donc ce tableau en le remplissant du contenu de chacune des 17 lignes de chacun des 18 tableaux, avec la formule
La fonction IIF() agit comme un If .. Then .. Else. On peurrait donc traduire le
Code:
IIf(k < 10, 0, [COLOR=seagreen][B]23[/B][/COLOR])
par un
Code:
If k < 10 Then
0
Else
[B][COLOR=seagreen]23[/COLOR][/B]
End If
Donc, à partir de "L5", j'ai un offset de i lignes si k > 10 et i+23 lignes si k >= 10.
Je teste si k>10 car la première rangée de tableaux comporte 9 éléments et à partir du dixième, il me faut repartir en colonne "L" et en ligne i+23.
Ensuite, c'est le même principe pour l'offset en colonne :
Code:
IIf(k < 10, k, k - 9) - 1) * 6
Ici, je me décale de 6 colonnes à chaque incrémentation de k jusqu'à 9 puis à partir de 10, je retranche 9 et je multiplie par 6 pour me décaler de 6 colonnes mais dans la rangée inférieure des tableaux.
Voilà.
Pas sûr d'avoir été très clair mais je fais d mon mieux. N'hésites pas à redemander des explications si tu en as besoin.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.