Macro contrôle nombre caractere RAPIDEMENT

  • Initiateur de la discussion Initiateur de la discussion roidurif
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

roidurif

XLDnaute Occasionnel
Bonjour,

J'aimerai contrôler chacune de ces colonnes si le nombre de caractere n'est pas dépasser.
Si c'est le cas, alors la macro indique le N° de la celulle en feuil2.

J'ai fait cela, mais je sais pas si je m'y prends bien. car ca ne foctionne pas.

Il faut savoir que ma BDD est composée de 10000 ligne, il faudrait que ce soit rapide.


Code:
Sub test()
Dim Colonne(), i As Long
Colonne = Array("A", "C", "D", "E", "AB", "AC", "BA", "AH", "AI", "AW", "AX", "BB", "BC") 
With Sheets("BDD")
For i = 0 To 12
If Len(i) = 0 > 10 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 1 > 40 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 2 > 800 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 3 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 4 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 5 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 6 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 7 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 8 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 9 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 10 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 11 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 12 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
End If
End Sub

Merci de votre aide
 
Re : Macro contrôle nombre caractere RAPIDEMENT

Bonsoir


Une proposition qui semble loin d'être rapide

Code:
Sub atester()
Application.ScreenUpdating = False
colonne = Array("A", "C", "D", "E", "AB", "AC", "BA", "AH", "AI", "AW", "AX", "BB", "BC")
NBRCAR = Array(10, 40, 800, 50, 50, 50, 50, 50, 50, 50, 50, 50)
For i = 1 To 30
For j = 0 To 11
If Not IsEmpty(Cells(i, colonne(j))) Then
If Len(Cells(i, colonne(j))) > NBRCAR(j) Then
Sheets(2).Range("A65536").End(xlUp).Offset(1) = Cells(i, colonne(j)).Address(0, 0)
End If
End If
Next
Next
Application.ScreenUpdating = True
End Sub
 
Re : Macro contrôle nombre caractere RAPIDEMENT

Hello,

Sans fichier joint, difficile de t'aider, en revanche je peux déjà te signaler que dans ton code il y a deux petites erreurs.

Elles sont ci-dessous corrigées et en rouges.
Code:
Sub test()
Dim Colonne(), i As Long
Colonne = Array("A", "C", "D", "E", "AB", "AC", "BA", "AH", "AI", "AW", "AX", "BB", "BC") 
With Sheets("BDD")
For i = 0 To 12 [COLOR="Red"][B]' Ici aussi, moi j'aurais plutôt mis 1 to 13, mais je ne suis pas sûr ![/B][/COLOR]
If Len(i) = 0 > 10 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 1 > 40 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 2 > 800 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 3 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 4 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 5 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 6 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 7 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 8 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 9 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 10 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 11 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
If Len(i) = 12 > 50 Then Sheets(CONTROLE).Range("IV17").End(xlToLeft).Offset(0, 1).Value = Cel.Address(REF_ABS, REF_ABS)
[COLOR="Red"][B]Next i[/B][/COLOR]
End [COLOR="Red"][B]With[/B][/COLOR]
End Sub
Cdt, Hulk.


Edit : slt vba.
 
Re : Macro contrôle nombre caractere RAPIDEMENT

Re, bsr Hulk


Hulk:
For i = 0 To 12
car Array( )

A tester (si j'ai bien compris le problème)
Code:
Sub essaiII()
Dim plagetest As Range
Dim cell As Range
Dim a As Range, b As Range, c As Range, d As Range
Application.ScreenUpdating = False
Set a = Columns("A").SpecialCells(xlCellTypeConstants, 23)
Set b = Columns("C").SpecialCells(xlCellTypeConstants, 23)
Set c = Columns("D").SpecialCells(xlCellTypeConstants, 23)
Set d = Columns("E").SpecialCells(xlCellTypeConstants, 23)
Set e = Columns("AB").SpecialCells(xlCellTypeConstants, 23)
Set f = Columns("AC").SpecialCells(xlCellTypeConstants, 23)
Set g = Columns("AC").SpecialCells(xlCellTypeConstants, 23)
Set h = Columns("AC").SpecialCells(xlCellTypeConstants, 23)
Set i = Columns("BA").SpecialCells(xlCellTypeConstants, 23)
Set j = Columns("AH").SpecialCells(xlCellTypeConstants, 23)
Set k = Columns("AI").SpecialCells(xlCellTypeConstants, 23)
Set l = Columns("AW").SpecialCells(xlCellTypeConstants, 23)
Set m = Columns("AX").SpecialCells(xlCellTypeConstants, 23)
Set n = Columns("BB").SpecialCells(xlCellTypeConstants, 23)
Set o = Columns("BC").SpecialCells(xlCellTypeConstants, 23)
Set plagetest = Union(d, e, f, g, h, i, j, k, l, m, n, o)

For Each cell In a
If Len(cell) > 10 Then
Sheets(2).Range("A65536").End(xlUp).Offset(1) = cell.Address(0, 0)
End If
Next
For Each cell In b
If Len(cell) > 40 Then
Sheets(2).Range("B65536").End(xlUp).Offset(1) = cell.Address(0, 0)
End If
Next
For Each cell In c
If Len(cell) > 800 Then
Sheets(2).Range("C65536").End(xlUp).Offset(1) = cell.Address(0, 0)
End If
Next
For Each cell In plagetest
If Len(cell) > 50 Then
Sheets(2).Range("D65536").End(xlUp).Offset(1) = cell.Address(0, 0)
End If
Next
Application.ScreenUpdating = True
End Sub
 
Re : Macro contrôle nombre caractere RAPIDEMENT

Bonjour vbacrumble,

Merci pour tes propositions, une question qu'elle est la difference entre ta 1ere proposition et la 2 eme.
Sinon comment dois je proceder pour ne pas prendre la premiere ligne de mon tableau qui correspond à l'entete.

Je te joins mon fichier d'exemple

Merci
 
Dernière édition:
Re : Macro contrôle nombre caractere RAPIDEMENT

Re


Peux-tu me rappeler exactement les limites pour les colonnes ?

Colonne A : 10 caractères maxi (c'est ça ?)
Colonne C : 40 caractères maxi (c'est ça ?)
Colonne D : 800 caractères maxi (c'est ça ?)
Colonnes E à BC : 50 caractères maxi (c'est ça ?)

PS: la différence c'est de voir si l'une s'exécute plus rapidement que l'autre ou pas
 
Re : Macro contrôle nombre caractere RAPIDEMENT

Re



Voici une proposition que je te laisse compléter

Code:
Sub test()
Dim lim10 As Range
Dim lim20 as Range
Dim c As Range
Set lim10 = _
Range("N:N,AC:AC,AI:AI,AL:AL,AP:AP,BA:BA").SpecialCells(xlCellTypeConstants, 23)
For Each c In lim10
If Len(c) > 10 Then
Sheets("TEST").Range("A65536").End(xlUp).Offset(1, 0) = c.Address(0, 0)
End If
Next
set lim20 = etc etc
End Sub

Pour continuer tu suis la même logique pour les autres plages
 
Re : Macro contrôle nombre caractere RAPIDEMENT

vbacrumble

Merci vbacrumble, je vais tester cela et si je doit procéder un résultat horizontal pour afficher les erreurs, j'ai fait cela, es ce que c'est Bon?

Code:
If Len(c) > 10 Then
Sheets("TEST").Range("IV20").End(xlToLeft).Offset(1, 0) = c.Address(0, 0)
End If

merci
 
Dernière édition:
Re : Macro contrôle nombre caractere RAPIDEMENT

Re vbacrumble

Je viens de terminer la macro, je bloque sur la ligne,

Code:
Sheets("BDD").Range("IV20").End(xlToLeft).Offset(1, 0) = c.Address(0, 0)
End If

J'ai besoin d'afficher les numéros cellules (Caractères non respecté) en horizontal , mais je n'y arrive pas. Soit ce se bloque ou sa tourne une meme cellule

merci de ton aide
 

Pièces jointes

Dernière édition:
Re : Macro contrôle nombre caractere RAPIDEMENT

Re

Regardes bien ton code


Tu as laissé cel.Address au lieu de c.Address

et dans ton classeur , il n'y a de Feuil2
Code:
Set lim1 = _
Sheets("BDD").Range("B:B").SpecialCells(xlCellTypeConstants, 23)
For Each c In lim1
If Len(c) > 1 Then
[B][COLOR="Red"]Sheets("Feuil2").Range("IV20").End(xlToLeft).Offset(0, 1)[/COLOR][/B] = [B][COLOR="Red"]c.Address(0, 0)[/COLOR][/B]
End If
Next

Set lim3 = _
Sheets("BDD").Range("N:N,AC:AC,AI:AI,AL:AL,AP:AP,BA:BA").SpecialCells(xlCellTypeConstants)
For Each c In lim3
If Len(c) > 3 Then
[COLOR="Red"][B]Sheets("Feuil2").Range("IV21").End(xlToLeft).Offset(0, 1).Value[/B][/COLOR] = [COLOR="Red"][B]c.Address(0, 0)[/B][/COLOR]
End If
Next

Je te laisse modifier le reste
 
Dernière édition:
Re : Macro contrôle nombre caractere RAPIDEMENT

Merci vbacrumble,

J'avais pas fait attention.


J'ai fait en sorte de ne pas prendre en compte la premiere ligne de mon tableau qui correspond à l'entete et de commencer à la 2eme ligne. es ce que je m' y pend bien?

Sinon, je remarque un bug de la macro lorsque les colonnes sont vides. Comment dois je m'y prendre pour la macro ne s'arrete pas même quand il y' a des colonned vides ?

Code:
Set lim1 = _
Sheets("BDD").Range("B2:B65536").SpecialCells(xlCellTypeConstants, 23)
For Each c In lim1
If Len(c) > 1 Then
Sheets("Feuil2").Range("IV20").End(xlToLeft).Offset(0, 1) = c.Address(0, 0)
End If
Next

Set lim3 = _
Sheets("BDD").Range("N2:N65536,AC2:AC65536,AI2:AI65536,AL2:AL65536,AP2:AP65536,BA2:BA65536").SpecialCells(xlCellTypeConstants)
For Each c In lim3
If Len(c) > 3 Then
Sheets("Feuil2").Range("IV21").End(xlToLeft).Offset(0, 1).Value = c.Address(0, 0)
End If
Next

Merci de ton aide

Cordialement
 

Pièces jointes

Dernière édition:
Re : Macro contrôle nombre caractere RAPIDEMENT

vbacrumble,

Je n'arrive toujours pas à corriger le blocage de la macro lorsque les colonnes de la feuil "BDD" sont vides. Comment dois je m'y prendre pour la macro ne s'arrete pas même quand il y' a des colonne vides ?

Code:
Set lim1 = _
Sheets("BDD").Range("B2:B65536").SpecialCells(xlCellTypeConstants, 23)
For Each c In lim1
If Len(c) > 1 Then
Sheets("Feuil2").Range("IV20").End(xlToLeft).Offset(0, 1) = c.Address(0, 0)
End If
Next

Set lim3 = _
Sheets("BDD").Range("N2:N65536,AC2:AC65536,AI2:AI65536,AL2:AL65536,AP2:AP65536,BA2:BA65536").SpecialCells(xlCellTypeConstants)
For Each c In lim3
If Len(c) > 3 Then
Sheets("Feuil2").Range("IV21").End(xlToLeft).Offset(0, 1).Value = c.Address(0, 0)
End If
Next

Merci de ton aide

Cordialement[/QUOTE]
 
Re : Macro contrôle nombre caractere RAPIDEMENT

Bonsoir



Code:
Set lim1 = _
[COLOR="Blue"]Sheets("BDD").Range("B2:B65536").SpecialCells(xlCellTypeConstants, 23) [/COLOR]
[COLOR="Green"]' la ligne en bleue sert à ne prendre en compte que les cellules contenant
'des constantes et non vides[/COLOR]
For Each c In lim1
If Len(c) > 1 Then 
Sheets("Feuil2").Range("IV20").End(xlToLeft).Offset(0, 1) = c.Address(0, 0)
End If
Next

Donc le code ne s'occupe pas des cellules vides.

PS: Excel (avant Excel 2007) n'a que 256 colonnes
or le code VBA tel que j'ai écrit inscrit les données sur une ligne de colonne en colonne
(donc il ne peut y avoir que 256 adresses copiées en Feuil2)

C'est bien ce que tu souhaites faire ?
 
Dernière édition:
Re : Macro contrôle nombre caractere RAPIDEMENT

Re


Essaie de modifier le code existant en reprenant la logique ci-dessous
Code:
Sub test2j()
Dim colo(1 To 90) As Variant, i As Long
Dim d As Worksheet, s As Worksheet
Dim lim1 As Range
Set s = Sheets("Feuil2")
Set d = Sheets("BDD")
'remplissage du tableau
For i = LBound(colo) To UBound(colo)
colo(i) = i
Next
'limite 1
If d.Columns(colo(1)).SpecialCells(2).Count > 0 Then
Set lim1 = d.Columns(colo(1)).SpecialCells(2).Offset(1, 0)
End If
For Each c In lim1
If Len(c) > 1 Then
s.Range("IV20").End(xlToLeft).Offset(, 1) = c.Address(0, 0)
End If
Next
'///
End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
927
Réponses
15
Affichages
818
Réponses
4
Affichages
742
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
1 K
Réponses
2
Affichages
413
Retour