Importation de certaines colonnes

Bonjour Mr Dan,

voici le fichier

cordialement

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

Bonsoir Mr Dan,

je vous ai fait une capture d'écran pour le message d'erreur qui s'affiche après toutes les modifications que vous m'avez proposé

j'espère que vous puissiez trouver la solution

j'ai essayé sur 2 autres pc mais le même message

Bonne soirée

sans titre

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 ! on peut même mettre aussi le nom de la feuille : [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 ! donc chacun est libre de choisir la syntaxe qu'il préfère !

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 !!! j'ai quand même fait plusieurs choses :

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 767un 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

Rechercher des sujets similaires à "importation certaines colonnes"