Range variable

Bonjour le forum

Alors voilà j'ai un petit bout de code qui marche très bien mais je voudrais le faire selon des variables qui sont dans ma macro.

Dim Joint As Range
    For Each Cellule In Workbooks("Liste_joint.xlsx").Worksheets("Liste_joint").Range("E1:Z100")
        If Cellule Is Nothing Or Cellule.Value = "" Then
            Cellule.Delete xlUp
        End If
    Next Cellule

En gros je vais voir chaque cellule de mon range et je la supprime si elle est vide ou égale à nothing.

Ce que je voudrais c'est quelque chose du genre:

Dim Joint As Range
    For Each Cellule In Workbooks("Liste_joint.xlsx").Worksheets("Liste_joint").Range(Cells(2, 1), Cells(i, 10))
        If Cellule Is Nothing Or Cellule.Value = "" Then
            Cellule.Delete xlUp
        End If

    Next Cellule

Sachant que i est une variable integer.

Mais apparemment c'est pas comme ça que l'on fait xD

Une âme charitable pour m'expliquer ?

Merci d'avance

Bonjour,

Votre syntaxe me semble correcte, mais la valeur de i ne doit pas changer dans la boucle. Par contre, tester If Cellule Is Nothing est inutile.

Autre syntaxe possible :

Range("B1:J" & i)

Si le nombre de lignes est amené à changer (not. en cas de suppression de ligne) :

LigMax = Range("A" & Rows.Count).End(xlUp).Row 'Détermine la dernière ligne à partir de la colonne A
For i = LigMax To 2 Step -1 'Boucle partant de la dernière ligne jusqu'à la ligne 2
    'Instruction(s)
Next i

Bonjour Pedro, merci beaucoup pour votre réponse

Ok pour moi je vais tester pour voir si ça fonctionne dans mon code (normalement oui je vois pas pourquoi)

Je me posais la question parce que je vais faire ce code une seconde fois plus tard dans la même macro, mais cette fois ci avec des numéros de colonne qui seront sous forme de variable, qui sont définies pendant l'exécution du code, elles ne vont donc pas changer en cours de route mais au point de départ de ma macro je ne les connais pas.

Je me demandais si quelque chose de cette forme serait juste du coup:

Range(a & b : c & i)

Merci d'avance pour votre réponse

Re,

J'ai testé, ça marche nickel,

Juste pour l'écriture du Range avec uniquement des variables, je dois mal faire un truc car ça n'a pas l'air de fonctionner...

Un piti coup de main ?

Merci d'avance

En gros si je met:

Dim Joint As Range
    For Each Cellule In Workbooks("Liste_joint.xlsx").Worksheets("Liste_joint").Range("A1:J" & i)
        If Cellule Is Nothing Or Cellule.Value = "" Then
            Cellule.Delete xlUp
        End If
    Next Cellule

ça marche nickel, par contre si je met tout en variable ça ne fait rien, en exécutant pas à pas je vois qu'il va bien de cellule cellule mais il ne supprime pas les cases vides....

For Each Cellule In Workbooks("Liste_joint.xlsx").Worksheets("Liste_joint").Range(x & w & ":" & y & i)
        If Cellule Is Nothing Or Cellule.Value = "" Then
            Cellule.Delete xlUp
        End If
    Next Cellule

Je comprend pas trop pourquoi d'ailleurs, est-ce impossible d'écrire des numéros de colonnes avec des variables ?

Merci d'avance

Salut,

As-tu bien vérifié que tes :

  • x : Renvoie bien un string !
    w : Renvoie bien un long !
    y : Renvoie bien un string !
    i : Renvoie bien un long !

Par contre je ne saurais trop te conseiller la méthode de Pedro22.

Votre syntaxe me semble correcte, mais la valeur de i ne doit pas changer dans la boucle. Par contre, tester If Cellule Is Nothing est inutile. Autre syntaxe possible : Range("B1:J" & i) Si le nombre de lignes est amené à changer (not. en cas de suppression de ligne) : LigMax = Range("A" & Rows.Count).End(xlUp).Row 'Détermine la dernière ligne à partir de la colonne A For i = LigMax To 2 Step -1 'Boucle partant de la dernière ligne jusqu'à la ligne 2 'Instruction(s) Next i

Bonjour Jean-Paul,

Je vais exposer mon problème dans son entièreté pour plus de clarté. J'ai deux assez gros fichier avec pas mal de données et une dizaine de page. Ces données, je vais plus tard les exporter en CSV pour quelles soient traduite par un programme de 3D pour des structures métalliques complexes.

Ce que j'ai mis dans mes messages précédents n'est qu'une toute petite portion d'une des nombreuses macro sur lesquelles je travaille. J'utilise une première macro pour écrire les données dans une sheet en fonction de certains critères, puis j'extrait une partie de ces données pour faire une liste des types jonctions entres mes structures métalliques.

Pour la première partie de mon extraction pas de soucis je sais où je commence donc je peux aisément connaitre mes colonnes donc la formule de Pedro pour ça est nickel:

Dim Joint As Range
    For Each Cellule In Workbooks("Liste_joint.xlsx").Worksheets("Liste_joint").Range("A1:J" & i)
        If Cellule Is Nothing Or Cellule.Value = "" Then
            Cellule.Delete xlUp
        End If
    Next Cellule

Aucuns soucis de ce côté là. Mon problème c'est que par la suite je vais chercher les données d'un autre workbook, dans le même format que le premier. Je veux avoir le même résultat, sur la même feuille, donc une liste de plusieurs colonnes avec mes données mais décalée de la première.

Et là je ne connais plus mes colonnes, c'est la première partie de la macro qui détermine où s'arrête ma liste en terme de colonnes et donc le point de départ de la deuxième liste.

Je connais ces colonnes en fait mais uniquement sous forme de chiffre, par exemple mon départ de deuxième liste est la colonne x (mon w est en réalité un 1 je voulais juste savoir le faire uniquement avec des variables) et mon y ma colonne finale de cette liste.

For Each Cellule In Workbooks("Liste_joint.xlsx").Worksheets("Liste_joint").Range(x & w & ":" & y & i)
        If Cellule Is Nothing Or Cellule.Value = "" Then
            Cellule.Delete xlUp
        End If
    Next Cellule

Comme je ne les connais pas en avance je ne sais pas comment faire ou alors transcrire ces chiffres en lettre qui correspondent aux colonnes. Comme x = 10 = J, mais je ne sais pas si c'est possible.

Je peux bien sûr vous montrer les fichier mais c'est un bordel sans nom avec beaucoup d'erreurs de débutant en VBA donc faut pas avoir peur de saigner des yeux...

Encore merci pour votre temps et votre patience

Bonjour Tyrannosaure,

Oui dans un premier temps je veux bien ton fichier pour voir de quoi on parle, et voir la configuration de ton éditeur, et d'Excel.

Comme dis la charte évites de mettre trop de données personnelles.

J'attends ton retour

Bonjour le forum, Jean-Paul, Pedro,

Je vous préviens d'avance je suis débutant en VBA j'utilise surtout des boucles donc mon code est sans doute très brouillon à vos yeux.

J'ai un premier fichier Excel avec plusieurs macros dedans, la seule feuille qui nous intéresse c'est la sectionsa_l.

Dedans il y a tout pleins de trucs mais le bouton (1. Remplissage auto) permet de compléter la sheet en fonction des première infos du tableau.

Lorsque l'on clique dessus il y a notamment les colonnes AT, BC et BM qui se remplissent, ce sont des types de joints (de la forme SS_JA, SS_JC, SI_JA, SI_JC, A_JA, A_JC plus des chiffres).

Ce que je veux (attention faut accrocher son slip) c'est:

1. Copier ces données vers un autre document Excel, qui se nomme Liste_joint. (ça fonctionne)

2. Supprimer les doublons et les cases vides (parce que les types de joints vont par deux mais ce que je veux c'est une liste exhaustive des types de joints).

3. Les trier par ordre croissant.

Je m'explique:

De mon premier fichier j'extrait les données, je fais ma macro et ça marche plutôt bien. Mon problème c'est que j'ai une deuxième sheet, identique à la première, qui peut avoir des données différentes, je dois effectuer les mêmes opérations et les rajouter dans le même tableau.

Ce sont les fonctions de suppression des doublons, de suppression des cases vides et de tri par ordre croissant sur une zone variable qui me bloquent...

Donc 3 fichiers:

  • Premier fichier parent avec la macro qui nous intéresse: Poutre_left, la sheet qui nous intéresse est sectionsa_l, dedans il y a les données que je veux extraire qui sont elles mêmes issues d'une macro. C'est la macro Liste_joint qui doit faire le travail.
  • Deuxième fichier parent: Poutre_right, sheet sectionsa_r, il y a là la deuxième plage de données qui nous intéresse.
  • Troisième fichier: Liste_joint, c'est dans ce dernier que je dois faire apparaître ma liste de joint.

J'ai réussi à faire la plupart de ces choses, sans doute avec beaucoup de bidouillage mais ça fonctionne et c'est le principal. La seule barrière qui me bloque pour clore le sujet c'est cette histoire de range variable. Comme ce sont les premières étapes de ma macro qui définissent les suivantes je ne sais pas déterminer mes colonnes autre que par des chiffres.

En gros ça fonctionne uniquement parce qu'aujourd’hui avec ce tableau je connais les colonnes. Mais plus tard je serais amené à avoir plus de données et souvent avec plus de variables...

Pour voir ce que je veux faire vous pouvez cliquer sur le bouton "6.Liste joint" qui exécute la macro (presque) correctement (une fenêtre s'ouvre pour sélectionner le fichier Liste_joint au début de la macro) vous aurez ainsi une idée de ce que je veux faire.

Si vous voulez plus d'explication pour comprendre mon code (qui n'est clairement pas propre je code depuis peu :/) n'hésitez pas !

Aussi si vous avez des commentaire sur mon code, comment le faire plus proprement et simplement je suis preneur

En tout cas merci d'avance

7liste-joint.xlsx (10.40 Ko)
5poutre-left.xlsm (276.70 Ko)
7poutre-right.xlsm (250.28 Ko)

Bonjour le forum, Jean-Paul, Pedro,

Je n'ai pas eu de retour de votre part, est-ce parce que c'est trop complexe ou peut être que je m'y prend mal ?

Merci d'avance pour vos conseils

Salut Tyrannosaure,

Salut l'équipe,

Reprenons :

  • tu veux copier les colonnes [AT:BC:BM] des deux fichiers-sources Right-Left vers 'Liste-Joint' ;
  • je remarque "Plate01-02-03" : y en aura-t-il d'autres (04-05...) qui s'y ajouteront et l'emplacement de ces colonnes est-il potentiellement appelé à être modifié par l'ajout de colonnes de nouvelles données ? ;
  • à la limite, aucune importance tant que je puisse être SÛR et CERTAIN que les données qui t'intéressent seront TOUJOURS sous l'étiquette "Prepa". Dans ce cas, une macro trouverait toujours tout le bazar.
  • le mot "Fin" en bas de ces colonnes "Prepa" est-il un mot pour t'aider dans ta programmation ou est-ce important ?
  • tu ne veux pas de doublons ni de lignes vides : normal.
  • comment doit se présenter 'Liste-joint' ? Une simple colonne où s'ajoutent tes colonnes-sources l'une sous l'autre ? A côté l'une de l'autre? Ce dernier cas me semble (mais, ce que j'en dis, hein?...) plus facile pour consulter et/ou comparer...
Je ne sais pas ce que tu veux en faire, après tout.

Je t'avouerai que je n'ai pas le temps ni le courage d'étudier ton code pour savoir.

Fais-nous un mini fichier-exemple de 'Fichier-joint' (bon, je ne résiste plus, je te le dis : 'Fichier-Joints' me gratterait moins les yeux!!).

A+

Salut Tyrannosaure, le fil

Non, non, juste qu'en ce moment j'ai la famille à la maison donc pas trop de temps pour m'y pencher, encore une semaine à patienter,

Bonjour Curulis, Jean-Paul, Pedro et bien sûr le Forum,

Alors j'ai "triché" pour réussir à faire ce que je veux mais cela dévie de ce que je voulais à l'origine. Pour mieux te répondre Curulis je joins un fichier type de ce que je voudrais en résultat.

Pour répondre à tes questions:

- tu veux copier les colonnes [AT:BC:BM] des deux fichiers-sources Right-Left vers 'Liste-Joint' ;

1/ Je veux recopier les colonnes [A:AT:BC:BM] des deux fichiers Right-Left vers "Liste-Joints"

- je remarque "Plate01-02-03" : y en aura-t-il d'autres (04-05...) qui s'y ajouteront et l'emplacement de ces colonnes est-il potentiellement appelé à être modifié par l'ajout de colonnes de nouvelles données ? ;

2/ Non pour l'instant ce n'est pas au programme

- à la limite, aucune importance tant que je puisse être SÛR et CERTAIN que les données qui t'intéressent seront TOUJOURS sous l'étiquette "Prepa". Dans ce cas, une macro trouverait toujours tout le bazar.

3/ Oui il y aura TOUJOURS l'étiquette "Prepa" en tête de colonne

- le mot "Fin" en bas de ces colonnes "Prepa" est-il un mot pour t'aider dans ta programmation ou est-ce important ?

4/ Oui c'est important pour d'autres macros, je les utilises comme condition de fin

- tu ne veux pas de doublons ni de lignes vides : normal.

5/ Oui normal xD

- comment doit se présenter 'Liste-joint' ? Une simple colonne où s'ajoutent tes colonnes-sources l'une sous l'autre ? A côté l'une de l'autre? Ce dernier cas me semble (mais, ce que j'en dis, hein?...) plus facile pour consulter et/ou comparer...

6/ Voir le fichier en PJ

Je concède largement que je suis un débutant et que ce que je fais c'est souvent de la débrouille. Ce que j'ai fais pour le moment c'est prendre une colonne trèèèèèès loin pour copier les données du deuxième fichier puis les compiler avec celles du premier.

Donc dans Liste-joints

Ma première colonne : Type de joints qui sont dans la colonne A des deux fichiers sources

Les colonnes suivantes : Les types de joints qui correspondent aux colonnes [AT:BC:BM] répartis en deux grandes colonnes qui représentent chacune des sources, le fichier Left et le fichier Right.

Dans l'exemple que je donne les types de joints sont parfaitement identiques entre les deux fichiers mais il est possible que ce ne soit pas le cas.

Merci d'avance, merci de votre temps et votre patience

5liste-joint.xlsx (10.97 Ko)

Bonjour Tyrannosaure, le fil

Bon je reprends un peu le fil même si je n'ai que 10% de mon temps.

Dans ton ficher j'ai commencé à revoir un peu ton code "CE N'EST PEUT ÊTRE PAS OPÉRATIONNEL" mais c'est pour te donner des idées de simplifications.

J'ai aussi rajouté deux modules

- modFunctions avec quelques fonctions bien utiles

- modCurrent avec des fonctions pour faire ce que tu demandes

Il faudra bien sur adapter ce code à ton classeur excel, pour les test je travaille sur une feuille du classeur poutre_left "Juste pour les tests" pour plus de simplicité.

Donc tu va dans le module modCurrent, tu recherches la fonction Test, tu y colles ton curseur et tu fais F5, ensuite tu vas voir le résultat sur la feuille "Juste pour les tests". Tu peux aussi utilisé F8 pour faire du pas à pas et voir de plus près.

Certains codes ne sont pas de moi, mais de Jaques Boisgontier.

Je reste en attente de ton retour,

5poutre-left.xlsm (300.66 Ko)

Bonjour Jean-Paul, le Forum

Tout d'abord, Waouh, merci Jean-Paul, je comprend pas tout mais merci je suis en train de travailler dessus, même si c'est d'un tout autre niveau par rapport à ce que je fais

Je te remercie aussi de prendre de ton temps pour me répondre mais ne t'embête pas ce n'est pas un sujet urgent j'avance au fur et à mesure de mon temps libre pour développer ce fichier.

Juste une chose que je ne comprend pas dans ton message:

-Donc tu va dans le module modCurrent, tu recherches la fonction Test, tu y colles ton curseur et tu fais F5, ensuite tu vas voir le résultat sur la feuille "Juste pour les tests".

Qu'entends tu par "tu y colles ton curseur" ? Désolé je suis tout débutant en VBA :/

Encore merci à tous pour tout ce que vous faites

Et merci d'avance pour vos réponse

Salut tyrannosaure, le fil.

Tu cliques tout simplement n'importe où dans la sub. Et ensuite F5 depuis l'éditeur VBA.

Par contre je viens de regarder ton dernier fichier "liste joint", et je commence à comprendre ce que tu recherches, je vais m'y poser dessus dès que j'ai deux minutes.

Salut Tyrannosaure,

Salut Jean-Paul,

je dis ça, je ne dis rien mais, sauf erreur...

Donc dans Liste-joints

Ma première colonne : Type de joints qui sont dans la colonne A des deux fichiers sources

Les colonnes suivantes : Les types de joints qui correspondent aux colonnes [AT:BC:BM] répartis en deux grandes colonnes qui représentent chacune des sources, le fichier Left et le fichier Right.

... je vois exactement l'inverse!!

Quid?

A+

Salut Curulis, Jean-Paul

Oups erreur de ma part :p J'ai trop bossé dessus j'ai plus les yeux en face des trous...

Effectivement dans Liste-joints :

Ma première colonne : Les types de joints qui correspondent aux colonnes [AT:BC:BM]

Les colonnes suivantes : La localisation des joints qui sont dans la colonne [A] des deux fichiers sources, avec sur la même ligne les différentes localisations s'il apparaissent sur le même type de joint. Il doivent être répartis en deux grandes colonnes qui représentent chacune une des sources, le fichier Left et le fichier Right.

Autant pour moi désolé de cette erreur (et merci de me l'avoir dit xD)

Merci pour votre aide à tous

Rechercher des sujets similaires à "range variable"