VB définir un range

Résolu
Bonjour,

Je suis vraiment débutante en VB et je fais beaucoup de récupération de code pour apprendre... votre aide serait appréciée.

J'ai une macro pour effacer mes données
Call ClearContent("CommandeJour", True, "A7:j2000")

Le problème c'est que je voudrais nommer un range pour A7:J2000, qui va varier en fonction du nombre de ligne dans mon onglet CommandeJour. Donc le range va toujours commencer à A7, mais va finir à JX ou X varie en fonction d'un nombre de ligne qui, je pense, peut être trouvé de la façon suivante (bout de code d'une autre macro qui fonctionne)

Dim NoLigne As Integer
NoLigne = 0
For Each Qte In Range("CommandeJour[Quantité]")
If Qte <> "" And Qte <> "0" Then
NoLigne = NoLigne + 1

C'est compréhensible?

7 réponses

  1. 1. Est-ce que ça peut être parce que j'ai Excel 2016
    je ne pense pas mais avec mon vieil excel 2003 ....

    Quelques idées
    1. ça ne fait rien dans mon fichier
    1.1. as tu un message d'erreur ?
    1.2. as tu affecté la macro au bouton ?
    1.3. dans le fichier que tu m'avais envoyé et dans la feuille Commandefacturation il y avait des lignes après les premières lignes vides (vers les n° 200), que j'ai supprimées, vérifies ce qu'il y a au fond de cette feuille
    2. les noms des feuilles concernées sont ils corrects (dans la macro) ?
    3. exécutes là en pas à pas et passes sur les variables pour contrôler leur valeur
    4. insères la ligne soulignée pour voir (et contrôler) l'adresse de la plage à copier
    Set plage = .Range(.Cells(lidebCJ, 1), .Cells(lifinCJ, cofinCJ))
    MsgBox plage.Address
    0
    1. ccm81, tu est génial ou géniale!!!
      Effectivement, il y avait des lignes copiées vers les 200 et ça copiait très bien mais à la suite!
      Oh que ça fait ma journée ça, un immmmmmense merci, t'a pas idée.

      Et je retiens aussi les trucs en point 3 et 4

      Génial!
      Bonne journée :) et encore merci!!!!
      0
  2. De rien

    Si c'est fini, du moins pour aujourd'hui ;-) peux tu mettre le sujet à résolu (en dessous du titre de ton premier message)

    Bonne fin de journée
    0
    1. Allo
      On y presque, il n'y a que le bout de la macro qui va copier dans CommandeFacturation

      plage.Copy Sheets(CFact).Cells(lifinCF + 1, 1)

      ça ne fait rien dans mon fichier (j'ai dû reprendre mon fichier avant de te l'envoyer car j'ai la dernière version d'excel et j'avais des messages d'erreur de version)

      Pourtant en pas à pas, ça fonctionne très bien dans le fichier que tu m'as envoyé.

      Est-ce que ça peut être parce que j'ai Excel 2016?
      0
  3. Le code est dans Module 1 (j'ai fait simple)
    J'ai affecté la macro Transfert_CJ_CF au bouton "Sauvegarder la commande"
    J'ai supposé qu'après le transfert, les données sont effacées dans la feuille "CommandeJour"
    http://www.cjoint.com/c/FFrp6zwmV2e

    Cdlmnt
    0
    1. Un grand merci ccm81
      J'apprend par moi même, c'est pas évident, une chance qu'il y a des gens généreux comme ceux qui partage sur ce forum.
      J'essaie de contribuer mais en VB je ne suis pas de calibre (encore...)
      C'est très apprécié!
      0
  4. As tu jeté un œil sur l'exemple que je t'ai proposé ?
    0
    1. Un gros merci pour ta patience, je crois plus ça va plus je m'enfonce...
      Voici le fichier, c'est dans l'onglet CommandeJour
      C'est le bouton Finaliser la commande du jour

      Le but c'est de sélectionner la plage de lignes non vide dans CommandeJour et d'aller copier à la suite dans CommandeFacturation

      http://www.cjoint.com/c/FFrpCJ1PtKa
      0
  5. Je t'ai fait un petit exemple
    http://www.cjoint.com/c/FFro5NyM27e

    Cdlmnt
    0
    1. Merci ccm81
      Je pense que c'est effectivement le code de ClearContent qui doit bloquer le tout.
      Voici le code, donc faudrait que je remplace ce qui concerne le range ci-dessous par P ou Plage que j'ai défini comme tu m'as montré?

      Sub ClearContent(SheetSource As String, WithRange As Boolean, Optional Range As String)
      UnProtectSheet ("CommandeJour")
      Worksheets(SheetSource).Range(Range).ClearContents

      ProtectSheet ("CommandeJour")
      End Sub
      0
  6. Peux tu envoyer le code de
    1. La procédure ClearContent
    2. La procédure qui contient l'appel à ClearContent

    Ou mieux
    Peux tu envoyer la partie concernée de ton fichier, sur cjoint.com et joindre le lien obtenu à ton prochain message. N'oublies pas d'y ajouter des explications et des exemples de résultat attendu

    1) Tu vas dans https://www.cjoint.com/
    2) Tu cliques sur [Parcourir] pour sélectionner ton fichier
    3) Tu descends en bas de la page pour cliquer sur [Créer le lien Cjoint]
    4) Au bout de quelques secondes la deuxième page s'affiche, avec le lien
    en bleu souligné ; tu le sélectionnes et tu fais "Copier"
    5) Tu reviens dans ta discussion sur CCM, et dans ton message de réponse
    tu fais "Coller".

    Cdlmnt
    0
    1. Bonjour

      Pour récupérer la dernière ligne non vide de ton onglet
      DerLig = Cells.Find("*", , , , xlByRows, xlPrevious).Row

      Puis
      plage = "A7:J" & DerLig

      Et l'appel à ta procédure
      Call ClearContent("CommandeJour", True, plage)

      Cdlmnt
      0
      1. J'essai ça à l'instant, merci beaucoup!
        0
      2. Est-ce qu'il faut que je définisse Plage
        Ca me marque l'erreur suivante

        Erreur de compilation: Type d'argument ByRef incompatible
        0