Importation de certaines colonnes
Re
Le fichier fonctionne bien. Afin de bien être sur j'ai demandé à ce qu'il soit vérifié sous excel 2013 et cela fonctionne également.
Je pense qu'il doit y avoir un souci sur votre version excel (2013 ?!)
Je ne pense pas que cela va solutionner le souci mais essayez en déplaçant la ligne juste après le END WITH ou en remplaçant la ligne par le code ci-dessous.
With ThisWorkbook.Sheets("ETAT DES STOCKS")
.Select
.Range("E7").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End With
Dans l'attente de vos news
Cordialement
Bonjour an@s, Dan,
Je te retourne ton dernier fichier Excel modifié (j'espère que Dan ne m'en voudra pas d'avoir modifié son code VBA) :
Essaye-le ; si ça marche, merci de passer le sujet en résolu (sinon, indique sur quelle ligne de code VBA ça plante).
dhany
Re
Mais votre fichier "Inventaire" est-il bien identique à celui posté sur le forum ??? car à la vue du message qu'Excel vous renvoie, ce n'est peut être plus le même souci.
An@s,
- lorsque vous cliquez sur "debogage" quelle est la ligne de code qui est surlignée en jaune ?
- essayez en remplaçant cette ligne dans le code Import -->
dlg = .Range("B" & .Rows.Count).End(xlUp).Row
Pour Dhany, le code reste identique à celui que j'ai fait sauf que vous avez ajouté des : , placé des crochets au lieu de Range (jamais compris pourquoi on fait cela d'ailleurs car il faut avouer que Range est plus lisible et facile à taper sur un clavier) et changé les integer par &, bref c'est un avis personnel mais cela complique la compréhension du code pour quelqu'un qui veut apprendre.
Pour ce qui est du code que ce soit celui là ou le mien, les deux passent.
Cordialement
@Dan,
Dan a écrit :placé des crochets au lieu de Range (jamais compris pourquoi on fait cela d'ailleurs)
C'est juste que [A1]
(par exemple) est à la fois plus court et plus lisible que Range("A1")
; c'est d'ailleurs tout exprès que la société Microsoft, concepteur du langage VBA d'Excel, a ajouté cette notation abrégée, alors autant s'en servir ! [Feuil1!A1]
; exemple si ce nom de feuille contient au moins un espace : ['Mars 2018'!A1]
Worksheets("Mars 2018").Range("A1")
Sheets("Mars 2018").Range("A1")
['Mars 2018'!A1]
Laquelle des trois notations est la plus courte ? bien sûr, après, c'est au goût de chacun !
⚠ Il y a toutefois une différence importante entre Worksheets() et Sheets() ; voir l'aide VBA pour plus d'infos là-dessus.
Dan a écrit :le code reste identique à celui que j'ai fait sauf que...
Oh !!!
1) Au départ, les 3 subs étaient collées verticalement l'une contre l'autre : aucune ligne vide entre un End Sub
et le Sub
suivant !!! c'est vraiment très mauvais pour la lisibilité du code !!! je les ai donc séparées verticalement.
2) Toujours pour améliorer la lisibilité du code, j'ai pris la peine de bien indenter tout le code VBA.
3) J'ai réécrit plusieurs instructions et simplifié quelques unes, notamment celles utilisant .PasteSpecial
; à chaque fois, suppression de tout ceci : , Operation:=xlNone, SkipBlanks:=False, Transpose:=False
(ça a été probablement mis par l'enregistreur de macros, et on peut très facilement l'enlever, car ce sont des valeurs par défaut)
4) Dans ta sub compteur(), tu as écrit :
Select Case i - 6
Case Is < 10: j = "000"
Case 10 To 99: j = "00"
Case 100 To 999: j = "0"
Case Is > 999: j = ""
End Select
Compte tenu du travail effectué par cette structure Select, c'est vraiment inutile : j'ai pu remplacer avantageusement toute cette structure Select par une simple instruction Format()
!!!
5) Je pense avoir corrigé l'erreur dont parlait le demandeur ; donc en attente de la réponse d'an@s.
Dan a écrit :changer les integer par &
Exact, et c'est bien plus qu'utiliser le caractère de déclaration de type !!! car tu as utilisé Integer pour un n° de (dernière) ligne, et ça ne suffit pas si cette (dernière) ligne est très loin en bas !!! Integer : -32 768 à +32 767 ➯ un beau plantage assuré à partir de la ligne 32 768 !!!
Dans le vrai fichier du demandeur, on ne peut pas prévoir d'avance s'il utilisera autant de lignes ! « probablement pas », mais par simple précaution, j'utilise systématiquement & (Long) pour un n° de ligne et % (Integer) pour un n° de colonne ; sauf dans des cas bien précis où il y a une certitude que par exemple le n° de ligne ne sera jamais supérieur à 32 767 ; j'utilise même Byte pour un n° de ligne dont je suis sûr qu'il est inférieur à 256, par exemple dans une boucle For lig = 5 to 20
... Next lig
&
est pour Long
: plage de nombres bien plus grande !!!
Cordialement,
dhany
Bonsoir Mr Dan, Dhany
j'ai découvert par hasard que le problème était les cellules fusionnées, une fois libérée le code à fonctionné mais pas comme il faut
dans la feuille ETAT DE STOCK, le code enlève la formule qui existait déjà dans la colonne C et la remplace par les valeurs de la colonne H de l'onget INV et qui doivent être copiées dans la colonne E de la feuille ETAT DES STOCKS
Bonne soirée
Re,
j'ai découvert par hasard que le problème était les cellules fusionnées, une
Raison pour laquelle au vu de votre message d'erreur, je me suis posé la question de savoir si vous utilisiez le même fichier inventaire.
Comme je vous avait dit précédemment, on avait testé le code sous excel 2010 et 2013. Sans soucis.
Votre fichier en retour avec la modification demandée. J'ai également modifié le code Compteur donné par Dhany car plus simple et on supprime la variable "j". Je n'avais pas pensé à cette solution.
Attention au fichier dernier fichier posté car il y avait de nouveau un espace après la lettre S dans l'onglet Stock. Corrigé dans le fichier posté.
J'ai supposé que c'est vous qui allez mettre les formules dans les colonnes C, ... si le nombre de lignes copiées depuis le fichier inventaire est plus grand. Le code ne fait que copier les lignes depuis Inventaire.
Dhany, waouh ! j'ai l'impression d'être sur les bancs de l'école...
Je vais répondre point par point sans mettre du rouge
point 1 : merci pour le "très mauvais" mais je ne vois pas ce que faire un retour à la ligne apporte. Mais bon admettons pour les puristes.
Point 2 : pour ma part, je ne trouve pas plus de lisibilité. Mais cela ne concerne que moi et au final c'est tout de même l'utilisateur qui pourra le faire remarquer.
Point 3 : Normal c'est le résultat de ce que j'avais demandé à An@s précédemment pour voir ce qu'Excel 2013 renvoyait en faisant un copier-coller
Point 4 : Effectivement plus simple et on évite une variable
Point 5 : Non. Son problème venait d'un copier coller sur des cellules fusionnées. Donc la plage différente entre les deux renvoyait un bug.
Variable Integer, oui 32687 lignes. Heu... après 15 ans de VBA ici et ailleurs, ce serait un comble que je ne sache pas cela.
Pour ce qui est des annotations crochets et autres, chacun est libre. Mais entre savoir ce que veut dire Range et [ ], il faut avouer que celui qui ne connaît pas VBA, va y perdre son latin.
Cordialement