Microsoft 365 Copier depuis plusieurs pages d'un fichier une plage de colonnes entre deux cellules comportant un texte particulier

soan

XLDnaute Accro
@softy69

C'est ok, j'ai corrigé ; j'avais fait une très grosse erreur en mettant la suppression
d'une feuille dans la même boucle que celle des autres opérations, car j'avais
oublié que ça « dérègle » le compteur i de la boucle For i = 1 To n ; donc
il faut 2 boucles en tout, pas qu'une seule.

Dans le post #19 précédent :

* je n'ai pas laissé le mauvais code VBA, car ce n'était absolument pas un bon exemple
à suivre, et ça aurait pu induire en erreur certains lecteurs du forum ; aussi, je l'ai
remplacé par le bon code VBA (correction de l'ancien).

* ma remarque pour le .CountA() est toujours valable : c'est à vérifier !


soan
 
Dernière édition:

soan

XLDnaute Accro
@softy69

* relis d'abord tout mon post #21

* relis le dernier paragraphe du post #19, car je l'ai modifié

* tu peux essayer le code VBA du post #19, mais reste
prudent par rapport au 2ème .CountA() !

soan
 

softy69

XLDnaute Nouveau
@softy69

* relis d'abord tout mon post #21

* relis le dernier paragraphe du post #19, car je l'ai modifié

* tu peux essayer le code VBA du post #19, mais reste
prudent par rapport au 2ème .CountA() !

soan
je suis en train ... je reviens à toi avec des nouvelles, je te remercie énormément !
 

softy69

XLDnaute Nouveau
Merci @soan , c'est net on y voit plus clair.

Le 2ᵉ .CountA() est bien à remplacer par :
VB:
 Application.WorksheetFunction.CountA(.Rows(lig))
Si tu peux m'aider à coder encore un souhait pour aujourd’hui ça serait TOP


Je veux ajouter juste avant le msg box une ligne qui dit:

"Dans feuille "PASTE"
garder que le texte contenu dans une cellule (supprimer images, figures, groupes...)
ET
si la valeur de la cellule A de chaque ligne n'est PAS "ID" or PAS un nombre or PAS de la forme "D123456" alors supprimer"

Ci-joint code actuel. Est-ce que ligne 1 et 2 peuvent être supprimées ?

Merci par avance de ton/votre aide.


Code:
Option Explicit
Dim nlm&, lg2&

Private Sub Job(i%)
  Dim coID%, dlg&
  With Worksheets(i)
    coID = .Cells(2, Columns.Count).End(1).Column - 6
    dlg = .Cells(2, coID).End(4).Row
    .Cells(2, coID).Resize(dlg - 1, 11).Copy Cells(lg2, 1)
    lg2 = lg2 + dlg - 1
    dlg = .Cells(nlm, coID).End(3).Row
    .Cells(dlg, coID).Resize(, 11).Copy Cells(lg2, 1)
    Cells(lg2, 1).Resize(, 11).Borders.LineStyle = 1
    lg2 = lg2 + 1
  End With
End Sub

Sub CpyTbl()

  On Error Resume Next
  Dim Ws As Worksheet, lig&, k&, n%, p%: n = Worksheets.Count
  Application.ScreenUpdating = 0: Application.DisplayAlerts = 0
  For Each Ws In Application.Worksheets
    If Application.WorksheetFunction.CountA(Ws.UsedRange) = 0 Then Ws.Delete
  Next Ws
  For p = 1 To n
    With Worksheets(p)
      .Cells.UnMerge: k = .[A65536].End(3).Row
      For lig = k To 1 Step -1
        If Application.CountA(.Rows(lig)) = 0 Then .Rows(lig).Delete 3
      Next lig
    End With
  Next p
  Application.DisplayAlerts = -1


Sheets.Add Before:=Worksheets(1)
Sheets(1).Name = "PASTE" '

  Dim i%: Application.ScreenUpdating = 0
  Worksheets("PASTE").Select: Cells.Clear
  nlm = Rows.Count: lg2 = Cells(nlm, 1).End(3).Row + 1
  If lg2 = 2 And [A1] = "" Then lg2 = lg2 - 1
  For i = 2 To Worksheets.Count: Job i: Next i
  Cells(lg2 + 1, 1).Select: Application.CutCopyMode = 0

MsgBox ("MTO ESTABLISHED !")
End Sub
 
Dernière édition:

soan

XLDnaute Accro
@softy69

1) merci pour ta confirmation concernant le .CountA()

2) dans la sub CpyTbl(), tu n'as pas mis la bonne indentation
pour ces 3 lignes qui sont contre le bord gauche :

Sheets.Add Before:=Worksheets(1)
Sheets(1).Name = "PASTE" '

MsgBox ("MTO ESTABLISHED !")

elles doivent commencer sous le A de : Application.DisplayAlerts = -1

ça a peut-être l'air de pas grand chose, mais c'est très important,
car une mauvaise indentation nuit à la bonne lisibilité du code.

rappel : une bonne indentation est un des principes de base de
la programmation structurée.

3) pour le MsgBox, inutile de mettre des parenthèses,
tu peux mettre : MsgBox "MTO ESTABLISHED !"

(il va y avoir 2 Suites A et B à ce post)

soan
 

soan

XLDnaute Accro
Suite A du post précédent :

Tu demandes si on peut supprimer les lignes 1 et 2 ; lesquelles ? celles du début du module ?
celles du début de la sub Job() ? ou celles du début de la sub CpyTbl() ? bon, c'est pas grave :
surtout, ne t'embête pas à m'répondre, car dans les 3 cas, la réponse est non !
:p

bon, j'pense quand même que tu voulais parler des lignes 1 et 2 du début du module. ;)

-----------------------------------------------------------------------------------------------------

* la ligne Dim nlm&, lg2& ne doit pas être supprimée, car c'est pour déclarer 2 variables
qui sont utilisées par le code VBA ; des variables qui sont déclarées à ce niveau (au début
du module, et avant toute sub)
, sont des variables globales (c'est à dire de portée globale) ;
elles sont donc visibles (accessibles) par toutes les subs du module ; alors qu'à l'inverse,
les variables locales d'une sub ne sont visibles que par elle (portée locale) ; dans tout ce
paragraphe, là où j'ai écrit sub, c'est pareil pour une function ; alors petit jeu : relis bien
ce paragraphe en pensant « function » quand tu vois « sub ».

d'autre part, si j'ai déclaré nlm et lg2 en tant que variables globales, c'est pour simplifier
l'appel de la sub Job() ; ainsi, la sub CpyTbl() transmet à Job() uniquement l'indice i de
la feuille (qui servira d'index de feuille) ; et j'évite de devoir transmettre aussi nlm et lg2.


-----------------------------------------------------------------------------------------------------

* la ligne Option Explicit pourrait être supprimée, mais je le déconseille très fortement !
bien sûr, ça oblige à devoir déclarer explicitement toutes les variables, mais trop souvent,
c'est vu comme une contrainte et un inconvénient, alors que bien au contraire, c'est un
très gros avantage ! voici un exemple bien concret :


Montant = 10 ... puis : MsgBox Montant ; aucun problème, ça va afficher la valeur correcte
de Montant ; mais si tu fais une faute de frappe et que tu écris MsgBox Montent :

a) sans Option Explicit, ça va créer une nouvelle variable en mémoire (RAM) nommée
Montent, qui sera initialisée à 0, donc le MsgBox va afficher 0 au lieu de 10 ; là, c'est pas
encore trop grave vu que c'est juste un affichage erroné ; mais imagine que la faute
d'orthographe soit par exemple pour un nom de variable de ligne ; tu connais, toi,
la ligne 0 ? :p pas moi : je sais seulement qu'elle doit être située, en principe, juste au-
dessus de la ligne 1, donc en dehors des limites réelles de la feuille de calcul ! c'est pas
d'bol, hein ? :D surtout qu'une tentative d'utiliser la ligne fantôme 0 va créer un beau
plantage en bonne et due forme ! :( VBA ne sera pas content ! ni ton patron ! ;)
(qui sera lui très mécontent !) ; bon, j'sais très bien c'que vont dire @patricktoulon et
@mapomme : « on peut toujours récupérer l'erreur en mettant en place une gestion
d'erreurs » ; mébon, ça sort du cadre de cet article, et on ne va pas s'aventurer aussi
loin ! :p :) (pour toute réclamation, prière de s'adresser au rédacteur en chef !) ;
mapomme, si tu veux occuper tes loisirs de dimanche prochain à écrire un article
détaillé sur la mise en place d'une gestion d'erreurs, c'est pas de refus ! :p :D
(les poissons chanteront : « quand le chat n'est pas là, les souris dansent ! » ;) il se pourrait même que
tu sois à l'origine d'une exceptionnelle mutation génétique darwinienne des poissons : il y aura plus tard
des poissons-souris en plus des poissons-chats ! :p :D)


b) avec Option Explicit : Dim Montant ➯ la compilation crée une variable Montant,

qui est initialisée à 0 ; puis il y a : Montant = 10 ; ok : ça met 10 dans la place
mémoire qui a été réservée pour Montant ; donc MsgBox Montant affiche bien 10 :
résultat correct ! :)
mais si tu as écrit Montent = 10 : la compilation « se dit » :
« ah non ! moi j'suis pas d'accord !!! j'ai aucune place réservée en mémoire qui a
le nom Montent ! donc STOP !!! j'arrête de suite mon job de compilation !!! » ;
c'est ici qu'intervient le fameux blocage avec la ligne jaune (quoique cette ligne
jaune n'apparaît pas toujours forcément) ; la compil a eu tout à fait raison de
s'arrêter, car on a vu dans le point a) qu'une variable qui n'a pas le contenu
adéquat peut entraîner une catastrophe ; donc c'est inutile qu'elle poursuive
plus loin son travail !


-----------------------------------------------------------------------------------------------------

Option Explicit permet donc de détecter des variables non déclarées (celles que le
programmeur a oublié de déclarer, ou celles qui sont mal orthographiées) ; mais
pas seulement : ça permet aussi de détecter des incohérences concernant le type
des variables ; ah oui ? par exemple ? ben ça, c'est un autre job pour l'dimanche
d'après l'prochain dimanche de mapomme ! :p (pas vrai, mapomme ? ah zut, ça va
être loupé pour faire la grasse matinée et aller à la pêche !!! j'en connais un qui va m'appeler
« le saboteur des week-ends » ! bon, p't'être que patricktoulon voudra bien l'faire à ta place ?)


alors, tu es pour ou contre l'utilisation d'Option Explicit ? tu as toujours envie de
l'enlever ? fais comme tu veux, mais moi, je le mets systématiquement ! sauf
dans les très rares cas où un module contient une petit sub qui n'utilise aucune
variable ; par exemple une sub Workbook_Open() qui contient juste :
MsgBox "Hello ! c'est l'heure d'éteindre le PC !!!" (comment ? mais j'viens juste d'ouvrir
mon classeur Excel ! à c'rythme-là, j'aurai jamais l'temps d'terminer mon boulot !!!)


soan
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonsoir Soan
j'sais très bien c'que vont dire @patricktoulon et
@mapomme : « on peut toujours récupérer l'erreur en mettant en place une gestion
d'erreurs
tu a tout faux je suis le premier a la proscrire
je ne m'en sert uniquement si je n'ai pas le choix
 

softy69

XLDnaute Nouveau
[QUOTE

alors, tu es pour ou contre l'utilisation d'Option Explicit ? tu as toujours envie de
l'enlever ? fais comme tu veux, mais moi, je le mets systématiquement ! sauf
dans les très rares cas où un module contient une petit sub qui n'utilise aucune
variable ; par exemple une sub Workbook_Open() qui contient juste :
MsgBox "Hello ! c'est l'heure d'éteindre le PC !!!" (comment ? mais j'viens juste d'ouvrir
mon classeur Excel ! à c'rythme-là, j'aurai jamais l'temps d'terminer mon boulot !!!)


soan
[/QUOTE]


C'est assez pour moi maitre @soan, fonction explicit adoptée!

J'attends avec impatience la suite B :oops:
 

soan

XLDnaute Accro
@patricktoulon : ah, j'savais pas ! désolé pour l'erreur ! mais d'un autre côté, j'l'ai écrit
un peu en plaisantant, et aussi en pensant que si j'le mettais pas, quelqu'un aurait écrit
sous ce post : « mais non, même si une erreur se produit, on peut la récupérer par une
gestion d'erreurs ! » ;)


soan
 

soan

XLDnaute Accro
@softy69 : quoi ? t'as d'jà tout lu ? (et en plus t'es encore debout à c't'heure-ci ? :p)
bon, c'est vrai qu'c'est bien plus long à écrire qu'à lire !!! (surtout qu'j'tape pas vite, moi,
avec seulement deux doigts sur le clavier !!!) ;
bon, j'suis quand même bien content qu't'as
adopté comme moi le « Option Explicit ! »
:)


soan
 

soan

XLDnaute Accro
@softy69

R.U, c'est le Royaume Uni ; alors t'es en Angleterre ? ou au Pays de Galles ? ou en Écosse ?
si t'es en Écosse, t'as p't'être vu le monstre du Loch Ness ? :p t'es p't'être un immortel,
du clan MacLeod ? :D ou peut-être juste un simple pêcheur d'Irlande du Nord ? ;)

désolé de te décevoir, mais la Suite B que j'avais prévu d'écrire, c'était que j'connais pas
assez bien la gestion des formes pour pouvoir faire ta dernière demande ; j'allais juste
te mettre ce petit exemple :
VB:
Option Explicit

Sub Essai()
  Dim Forme As Shape: Application.ScreenUpdating = 0
  For Each Forme In ActiveSheet.Shapes
    Forme.Delete
  Next Forme
End Sub
c'est un truc dans c'goût-là (non testé !) ; le gel de l'écran est là pour éviter la gêne visuelle
de multiples formes visibles qui disparaissent de l'écran, en un temps plus ou moins long
selon le nombre de formes ; les formes non visibles sont elles aussi supprimées.

c'est pour une seule feuille ; à adapter pour le faire sur toutes les feuilles du classeur !

AVANT d'utiliser cette sub, tu peux faire une vérification préalable en mettant à la place
de Forme.Delete :
MsgBox Forme.Name (ATTENTION : tu pourrais avoir des surprises, et
découvrir qu'avec .Delete, tu aurais failli supprimer une forme à laquelle tu tiens !).

Tant pis ! c'est pas grâce à moi qu'tu pourras voir la tête de ton patron demain matin ! :confused:
si jamais il râle, dis-lui : « c'est pas grave, désormais, c'est moi qui vais diriger la boîte,
alors allez vous reposer ! » :p petite précision : le « moi » de c'qui est entre guillemets, c'est toi,
hein ? pas moi ! ;)


soan
 
Dernière édition:

softy69

XLDnaute Nouveau
R.U, c'est le Royaume Uni ; alors t'es en Angleterre ? ou au Pays de Galles ? ou en Écosse ?
si t'es en Écosse, t'as p't'être vu le monstre du Loch Ness ? :p t'es p't'être un immortel,
du clan MacLeod ? :D ou peut-être juste un simple pêcheur d'Irlande du Nord ? ;)
Je suis simplement au pays de galles rien de particulier à signaler ici.:rolleyes:

VB:
Option Explicit

Sub Essai()
  Dim Forme As Shape: Application.ScreenUpdating = 0
  For Each Forme In ActiveSheet.Shapes
    Forme.Delete
  Next Forme
End Sub
c'est un truc dans c'goût-là (non testé !) ; le gel de l'écran est là pour éviter la gêne visuelle
de multiples formes visibles qui disparaissent de l'écran, en un temps plus ou moins long
selon le nombre de formes ; les formes non visibles sont elles aussi supprimées.

AVANT d'utiliser cette sub, tu peux faire une vérification préalable en mettant à la place
de Forme.Delete :
MsgBox Forme.Name (ATTENTION : tu pourrais avoir des surprises, et
découvrir qu'avec .Delete, tu aurais failli supprimer une forme à laquelle tu tiens !).


Ça marche j'imbriquerai ça demain dans la matinée


Tant pis ! c'est pas grâce à moi que tu pourras voir
la tête de ton patron demain matin ! :confused:

Tu peux peut-être m'aider sur la reconnaissance de caractères ?
Je voudrais dire
1) si cell (a,i) contient "ID" seulement
2) si cell (a,i) contient ("D" puis six chiffres)
3) si cell (a,i) de type nombre


Merci par avance et pout tout
 

soan

XLDnaute Accro
on s'est croisés, alors t'as pas dû voir les dernières modifs de mon post #32 ;
relis-le pendant que j'vais taper laborieusement ma réponse à ton post #33.

PS : ça ira sûrement plus vite si tu m'envoies ta secrétaire !!! :p

soan
 

soan

XLDnaute Accro
@softy69

alors 1ère recommandation importante : crée un monstre du Pays de Galles :
ça fera venir les touristes !!! :) et si ton patron est suffisamment affreux et
moche à faire peur, offre-lui le job !!!
:p (en lui disant qu'il a la tête de l'emploi !)

-----------------------------------------------------------------------------------------------

imbrique, imbrique, mais soit bien prudent : j'voudrais pas qu'tu effaces par
mégarde des formes indispensables au fonctionnement de ton vrai fichier !

-----------------------------------------------------------------------------------------------

pour la reconnaissance de caractères :

* code VBA pour ton 1) : If Cells(a, i) = "ID" Then MsgBox "ID"

* code VBA pour ton 3) : If IsNumeric(Cells(a, i)) Then MsgBox "Donnée numérique"

* code VBA pour ton 2) :
VB:
If Left$(Cells(a, i), 1) = "D" Then
  If IsNumeric(Val(Mid$(Cells(a, i), 2, 6))) Then
    MsgBox "Donnée commençant par D et 6 chiffres"
  End If
End If
les 2 premiers sont très faciles ; celui-là est plus dur ; on doit pouvoir faire mieux,
et peut-être en utilisant le mot-clé VBA Like ? (je n'parle pas d'un "J'aime" ! ;))


soan
 

softy69

XLDnaute Nouveau
Bonjour @soan ,

La première recommandation a beaucoup fait rire mon patron, je lui ai envoyé le lien et le #du post. ;)

--------------------------------------------------

imbrique, imbrique, mais soit bien prudent : j'ne voudrais pas qu'tu effaces par mégarde des formes indispensables au fonctionnement de ton vrai fichier !
Sur ce point la j'ai fait un peu mieux que ça.... une pause ! Et ça m'a permis de me rendre compte d’une chose que je ne vous ai pas dites .... je suis cachottier a ma propre insu :rolleyes:

Le fichier sur lequel on bosse provient d'une conversion PDF ==> Excel faite en ligne.

1- Vous vous rappelez les colonnes "ID" qui ne commençaient pas toutes en Q ?

Et bah en effectuant la même conversion de fichier avec Adobe Pro les colonnes "ID" commencent toutes en CS

2-Vous vous rappelez les feuilles blanches qui étaient insérées entre mes feuilles complétées ?

Et bah en effectuant la même conversion de fichier avec Adobe Pro tout est sur une seule page o_O

-----------------------------------------------------

Du coup avec toutes ces péripéties je vois le bout du tunnel. J'ai un code qui fonctionne !



Code:
Option Explicit


Sub DeleteLeftColumns()
 Application.ScreenUpdating = False
 Dim shp As Shape
 
    Range("A1:M65536").Select
    With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
        
 For Each shp In ActiveSheet.Shapes
   shp.Delete
 Next shp
 End With
   Columns("A:CR").Select     ' S�lectionne la plage de colonnes
   Selection.Delete           ' suprimmer la section
  
End Sub

Sub cleanning()
 Dim lig&, k&
 Application.ScreenUpdating = False
  With Worksheets(1)
: k = .[A65536].End(3).Row
 For lig = k To 1 Step -1
 
    If Cells(lig, 1) = "ID" Or IsNumeric(Cells(lig, 1)) Or Left$(Cells(lig, 1), 1) = "D5" Then
            Else: Rows(lig).Delete
    End If
    
    If Application.CountA(.Rows(lig)) = 0 Or Cells(lig, 1) = "TITLE" Or Cells(lig, 1) = "" Then
          Rows(lig).Delete
        
    End If
 Next
 
MsgBox "FINISH"
End With
End Sub

--------------------

Les problèmes que je rencontre, je l'espère et corrigez-moi si je me trompe, sont de niveau optimisation, a la fois niveau écriture et temps d'exécution.

- Le temps d'ouverture du fichier est extra long, car trop de formes et d'images a charger d'un coup sur une feuille (sur le fichier joint elles sont supprimées). Avez-vous une idée pour y remédier ?

- Le temps d'exécution des deux macros est aussi très long. J'ai lu quelque par qu'on peut scander la phase sélection de la phase modification dans le code. Vous êtes adeptes de cela ?
 

Fichiers joints

soan

XLDnaute Accro
@softy69

il est sympa, ton patron : il a le sens de l'humour ! :)

mais pourquoi tu m'vouvoies, tout à coup ? tu peux m'tutoyer, comme au début ! ;)

j'suis content qu'ce soit mieux avec Adobe Pro, et comme toutes les colonnes "ID"
commencent en CS, y'a plus besoin de devoir détecter où est située la dernière
colonne du tableau ; mais pour les lignes vides en trop, il en reste encore !

tableau 1 : lignes 3 et 13
tableau 4 : lignes 140, 142 et 144
tableau 5 : lignes 194 ; 196 ; 197 ; 199 et 201

et y'a encore plein d'cellules fusionnées !

tableaux 6 et en dessous : idem

À propos de la fin de ton post :

pour les formes et images, pas d'idée ; et oui, c'est mieux d'éviter les .Select chaque fois
que possible ! je mets des .Select uniquement quand y'a pas moyen d'faire autrement.

Pour le code VBA, 1ère sub :

VB:
Option Explicit

'à propos de tout ce qui était dans le With .. End With :

'a) on peut garder uniquement la suppression des formes

'b) tout le reste est des modifs de la plage A1:M65536,
'   or les colonnes A à M sont incluses dans le "A:CR"
'   des colonnes que tu supprimes juste avant End Sub,
'   donc c'est inutile !

'=> maintenant, ça fait ceci : pour la feuille active,
'suppression de toutes toutes les formes et de "A:CR"

Sub DeleteLeftColumns()
  Dim shp As Shape
  Application.ScreenUpdating = False
  For Each shp In ActiveSheet.Shapes
    shp.Delete
  Next shp
  Columns("A:CR").Delete
End Sub
Pour le code VBA, 2ème sub :

Il y a : With Worksheets(1) ; avec la 1ère feuille du classeur ; donc juste dessous :
k = .[A65536].End(3).Row est sur la 1ère feuille : OK ; mais ensuite, quand il y a :
Cells(lig, 1) : c'est sur la feuille active ; est-ce bien ça ? ou si tu as oublié de
mettre le point, ça aurait dû être sur la 1ère feuille ? si tu as oublié le point,
et que la feuille active n'est pas la 1ère feuille du classeur : big problem ! ;)
alors revérifie toutes les références à telle ou telle feuille, implicite ou explicite.

Vérifie bien les conditions des 2
If car j'suis vraiment pas sûr que c'est c'que
tu veux vraiment ! alors fais tes essais sur une copie du fichier Excel !!!


Code:
Sub cleanning()
  Dim lig&, k&
  Application.ScreenUpdating = False
  With Worksheets(1)
    k = .[A65536].End(3).Row
    With Cells(lig, 1)
      For lig = k To 1 Step -1
        If .Value <> "ID" And Not IsNumeric(.Value) And Left$(.Value, 1) <> "D" Then
          Rows(lig).Delete
        End If
        If Application.CountA(.Rows(lig)) = 0 Or .Value = "TITLE" Or .Value = "" Then
          Rows(lig).Delete
        End If
      Next lig
    End With
  End With
  MsgBox "FINISH"
End Sub
soan
 

softy69

XLDnaute Nouveau
Bonjour soan,
j'espère que TU vas bien et que tout se passe bien autour de TOI. Quand je vouvoie c'est pck je me dis il y a potentiellement quelques lecteurs ... haha


j'suis content que ce soit mieux avec Adobe Pro, et comme toutes les colonnes "ID"
commencent en CS, il y a plus besoin de devoir détecter où est située la dernière
Colonne du tableau ; mais pour les lignes vides en trop, il en reste encore !
Oui c'est tellement plus simple comme ça, je vais quand même regarder si je peux faire la conversion de fichier vers différentes pages pour une question pratique et d'exploitation poussée derrière.

Et il y a encore plein de cellules fusionnées !
Justement les fameuses lignes ci-dessous servent à défusionner toutes les cellules et recentrer les textes et désactiver le renvoie à la ligne du texte
Code:
    With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False

Il y a : With Worksheets(1) ; avec la 1ère feuille du classeur ; donc juste dessous :
k = .[A65536].End(3).Row est sur la 1ère feuille : OK ; mais ensuite, quand il y a :
Cells(lig, 1) : c'est sur la feuille active ; est-ce bien ça ? ou si tu as oublié de
mettre le point, ça aurait dû être sur la 1ère feuille ? si tu as oublié le point,
et que la feuille active n'est pas la 1ère feuille du classeur : big problem ! ;)
alors revérifie toutes les références à telle ou telle feuille, implicite ou explicite.

Vérifie bien les conditions des 2
If car j'suis vraiment pas sûr que c'est c'que
tu veux vraiment ! alors fais tes essais sur une copie du fichier Excel !!!
Mon classeur n'a qu'une feuille et n'en aura qu'une quoi qu'il arrive *sauf si je trouve le moyen de convertir vers différentes pages* + voir ci-dessous :

Pour le code VBA, 1ère sub : nickel, j'y ai ajouté mes ligne de mise en forme et fonctionne avec un léger gain de temps.

Pour le code VBA, 2ème sub : il ne fonctionne pas. Bloque sur les lignes if, du coup je tourne toujours sur mon ancien, c'est juste très long...

À propos de la fin de ton post :

pour les formes et images, pas d'idée ; et oui, c'est mieux d'éviter les .Select chaque fois
que possible ! je mets des .Select uniquement quand y'a pas moyen d'faire autrement.
Du coup il faudrait que je fasse idem je suppose, mais comment haha ...
 
Dernière édition:

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas