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

Bjr vbacrumble
J ai modifié le code existant en reprenant ta logique, j'ai essayé de l'adapter, mais lorqu'il y ' a plusieurs colonnes à contrôler pour un même limite, ca bloque (exemple limite 3).

Je sais pas si je m y prends bien??
Code:
Sub test2j()
Dim colo(1 To 90) As Variant, i As Long
Dim d As Worksheet, s As Worksheet
Dim lim1 As Range
Dim lim3 As Range
Dim lim4 As Range
Dim lim5 As Range
Dim lim7 As Range
Dim lim8 As Range
Dim lim10 As Range
Dim lim11 As Range
Dim lim20 As Range
Dim lim22 As Range
Dim lim30 As Range
Dim lim40 As Range
Dim lim100 As Range
Dim lim255 As Range
Dim lim333 As Range
Dim lim800 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(2)).SpecialCells(2).Count > 0 Then
Set lim1 = d.Columns(colo(2)).SpecialCells(2).Offset(1)
End If
For Each c In lim1
If Len(c) > 1 Then
s.Range("T65536").End(xlUp).Offset(1).Value = c.Address(0, 0)
End If
Next

'limite 3
If d.Columns(colo(14, 29, 35, 38, 42, 53)).SpecialCells(2).Count > 0 Then
Set lim3 = d.Columns(colo(14, 29, 35, 38, 42, 53)).SpecialCells(2).Offset(1)
End If
For Each c In lim1
If Len(c) > 3 Then
s.Range("T65536").End(xlUp).Offset(1).Value = c.Address(0, 0)
End If
Next


'limite 4
If d.Columns(colo(6, 10, 18, 22, 26)).SpecialCells(2).Count > 0 Then
Set lim4 = d.Columns(colo(6, 10, 18, 22, 26)).SpecialCells(2).Offset(1)
End If
For Each c In lim1
If Len(c) > 4 Then
s.Range("T65536").End(xlUp).Offset(1).Value = c.Address(0, 0)
End If
Next

'limite 10
If d.Columns(colo(1, 36, 37, 41, 54, 55)).SpecialCells(2).Count > 0 Then
Set lim10 = d.Columns(colo(1, 36, 37, 41, 54, 55)).SpecialCells(2).Offset(1)
End If
For Each c In lim1
If Len(c) > 10 Then
s.Range("T65536").End(xlUp).Offset(1).Value = c.Address(0, 0)
End If
Next


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

vbacrumble, merci de ton aide


Je pense que limites = Split("10 1 22 40 800 4 255 40 800 4 255 40 800 3 255 40 800 4 255 40 800 4 255 40 800 4 255 8 3 11 40 11 11 11 3 10 10 3 8 8 10 3 100 100 100 100 100 100 8 7 40 40 3 10 10 255 255 255 5 1 255 333 20 20 30 20 20 20 20 20 20 20 30 30 20 20 20 20 20 20 30 30 1 1 100 100 100 100 100 100")... correspond au limite de chaque colonne??

Mais je n'arrive pas à le faire à partir de la colonne T11.

Je te joins mon fichier car je m 'arrache les cheveux STP
 

Pièces jointes

Re : Macro contrôle nombre caractere RAPIDEMENT

Re


Remplace l'ancien code par celui-ci

Code:
Sub test4j()
Dim limites, i As Long, j As Long, k As Long, l As Long
Dim d As Worksheet, s As Worksheet, c As Range
limites = Split("10 1 22 40 800 4 255 40 800 4 255 40 800 3 255 40 800 4 255 40 800 4 255 40 800 4 255 8 3 11 40 11 11 11 3 10 10 3 8 8 10 3 100 100 100 100 100 100 8 7 40 40 3 10 10 255 255 255 5 1 255 333 20 20 30 20 20 20 20 20 20 20 30 30 20 20 20 20 20 20 30 30 1 1 100 100 100 100 100 100")
Set s = Sheets("Feuil2"): Set d = Sheets("BDD")
Application.ScreenUpdating = False: s.Range("T2:T65536").ClearContents: k = 12
For j = 1 To 90
 If d.Columns(j).SpecialCells(2).Count > 0 Then
 For Each c In d.Columns(j).SpecialCells(2).Offset(1, 0)
 If Len(c) > CLng(limites(j - 1)) Then
 l = CLng(limites(j - 1))
    s.Range("IV" & k).End(xlToLeft).Value = c.Address(0, 0)
 k = k + 1
 End If
 Next
 End If
Next
s.Activate: Application.ScreenUpdating = True
End Sub
 
Re : Macro contrôle nombre caractere RAPIDEMENT

Merci vbacrumble

Je comprend ta macro

k = 12 correspond à la ligne 12

Sinon, j' ai l'impression lorsqu'il y a une seule valeur supérieur à la limite et le reste vide, ca de detecte pas les erreurs.

Exemple en colonne CL, je renseigne la cellule CL5 à plus de 100 caraceter et le reste de la colonne reste vide. Alors il ne detecte pas, je c pas pkoi??

Vois exemple dans le fichier

merci infieniment
 

Pièces jointes

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

Bonsoir

Patience.

J'ai d'autres choses à faire pour le moment.

Et d'autres gens du forum viendront t'aider en temps et en heures.

PS : voici pour patienter un code qui pourrait t'inspirer
(Ce code permet de tronquer la saisie dans la cellule active
au nombre de caractères définies dans le tableau limites()

(A mettre dans le code de la feuille , pas dans un module standard )
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range, limites, i As Long
limites = _
    Split("2 3 2 3 3 3 5 5 10 3 4") [COLOR="Green"] '/->  Limites caractères[/COLOR]
   [COLOR="Green"] '//////A B C D E F G H  I J K     /->  COLONNES ////////[/COLOR]
    For i = 1 To 10
    If Not Intersect(Target, Columns(i)) Is Nothing Then
        For Each cell In Intersect(Target, Columns(i))
            If Len(cell.Value) > CLng(limites(i - 1)) Then
            cell = Left(cell, CLng(limites(i - 1)))
            cell.Select
             MsgBox "Les données en colonne : " _
                    & Target.Column _
                    & " sont limités à " & CLng(limites(i - 1)) _
                    & " caractères.", vbCritical, "ERREUR DE SAISIE"
            End If
        Next cell
    End If
    Next
End Sub
 
Dernière édition:
Re : Macro contrôle nombre caractere RAPIDEMENT

Bonjour vbacrumble,

Je t'explique le but de cette macro, ce sera mieux

je recois enormement de tableau de la part de mes clients et le but de cette macro c'est d'ouvrir chaque fichier et de les contrôler avec la macro.
Si le nombre de caracteres n'est pas respectés alors je leur envois le diagnostique, pour faire les corrections necessaire.

Hors ta derniere propostion n'est pas adaptable. C'est pour ca que je tiens à l'autre proposition, mais le souci c'est comme je te l'ai expliqué au dessus du post, c'est qu il faut que toutes les celulles d'une colonne soit remplis pour que la macro contrôle correctement, alors que dans le tableau de mes clients toutes les celulles d'une colonne ne sont pas renseignées
Code:
Sub test4j()
Dim limites, i As Long, j As Long, k As Long, l As Long
Dim d As Worksheet, s As Worksheet, c As Range
limites = Split("10 1 22 40 800 4 255 40 800 4 255 40 800 3 255 40 800 4 255 40 800 4 255 40 800 4 255 8 3 11 40 11 11 11 3 10 10 3 8 8 10 3 100 100 100 100 100 100 8 7 40 40 3 10 10 255 255 255 5 1 255 333 20 20 30 20 20 20 20 20 20 20 30 30 20 20 20 20 20 20 30 30 1 1 100 100 100 100 100 100")
Set s = Sheets("Feuil2"): Set d = Sheets("BDD")
Application.ScreenUpdating = False: s.Range("T2:T65536").ClearContents: k = 12
For j = 1 To 90
 If d.Columns(j).SpecialCells(2).Count > 0 Then
 For Each c In d.Columns(j).SpecialCells(2).Offset(1, 0)
 If Len(c) > CLng(limites(j - 1)) Then
 l = CLng(limites(j - 1))
    s.Range("IV" & k).End(xlToLeft).Value = c.Address(0, 0)
 k = k + 1
 End If
 Next
 End If
Next
s.Activate: Application.ScreenUpdating = True
End Sub

Ton autre proposition celle ci, prenais en compte toutes les celulles de la colonnes, quelques soit le remplssage des colonnes, simplement elle commencait à contrôler à partir de la 1eme ligne (en tête du tableau) et non pas la 2èeme ligne comme je le souhaitais.
Et autre chose elle contrôlait la feuille active. (alor qui lui Faudrait lui dire contrôler onglet feuille "BDD")

Code:
Sub atester()
Application.ScreenUpdating = False
Colonne = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP", "AQ", "AR", "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ", "BA", "BB", "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL", "BM", "BN", "BO", "BP", "BQ", "BR", "BS", "BT", "BU", "BV", "BW", "BX", "BY", "BZ", "CA", "CB", "CC", "CD", "CE", "CF", "CG", "CH", "CI", "CJ", "CK", "CL")
NBRCAR = Array(10, 1, 22, 40, 800, 4, 255, 40, 800, 4, 255, 40, 800, 3, 255, 40, 800, 4, 255, 40, 800, 4, 255, 40, 800, 4, 255, 8, 3, 11, 40, 11, 11, 11, 3, 10, 10, 3, 8, 8, 10, 3, 100, 100, 100, 100, 100, 100, 8, 7, 40, 40, 3, 10, 10, 255, 255, 255, 5, 1, 255, 333, 20, 20, 30, 20, 20, 20, 20, 20, 20, 20, 30, 30, 20, 20, 20, 20, 20, 20, 30, 30, 1, 1, 100, 100, 100, 100, 100, 100)
With Sheets("catalogue")
For i = 1 To 90
For j = 0 To 89
If Not IsEmpty(Cells(i, Colonne(j))) Then
If Len(Cells(i, Colonne(j))) > NBRCAR(j) Then
Sheets("Feuil2").Range("T65536").End(xlUp).Offset(1) = Cells(i, Colonne(j)).Address(0, 0)
End If
End If
Next
Next
Application.ScreenUpdating = True
End With

End Sub

merci de ton aide
 
Re : Macro contrôle nombre caractere RAPIDEMENT

Bonjour


Pas le temps d'aller plus loin ce jour.

Tu as assez d'éléments (à mon avis) pour t'en sortir (en mixant, adaptant les différents codes que j'ai posté dans ton fil de discussion)

Sans compter les ressources qui se trouvent dans les archives du forum.

Et sans oublier les membres actifs du forum qui liront ton fil.
 
- 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