Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/08/2011, 16h37   #1
Membre régulier
 
Inscription : mai 2006
Messages : 272
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 272
Points : 72
Points : 72
Par défaut Erreur dépassement de capacité

Bonjour à tous

Je travaille sur un fichier excel qui par le biais du macro vba me permet de copier des donnée dans un autre fichier en supprimant les lignes comportant un zéro et en y ajoutant en premiere colonne une liste alphabetique.

Le soucis est que mon fichier vient de dépasser les 256 lignes et ma liste alphabetique s'arrete iv et ne veux pas continuer sur iw... ix..iy...iz..ja...jb et ainsi de suite.

L'erreur se produit sur la ligne en rouge.

Pouvez vous me dire ce qui bloque dans mon code et comment je peux palier au probleme.

Voici mon code:


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
Workbooks.Add
 
    Range("B1").PasteSpecial Paste:=xlPasteValues
 
'----Permet d'effacer les ligne comportant un zero en quantité
'----et de creer une liste alphabetique dans la premiere colonne
     Dim rADet As Range
Dim rTab As Range
Dim bColA As Integer 'Caractére 1° ligne
Dim r As Range
Set firstCell = Range("A1")
Set lastCell = Range("H65536").End(xlUp)
Set rTab = Range(firstCell, lastCell)
Stop
 bColA = 1
For Each r In rTab.Rows
  'ici à chaque tour de boucle ..
  ' r.. représente une ligne du tableau..
 
  If r.Cells(3) = 0 Then
    If rADet Is Nothing Then
      Set rADet = r
     Else
     Set rADet = Application.Union(rADet, r)
    End If
   Else
      st = Cells(1, bColA).AddressLocal(False, False)
   r.Cells(1) = LCase(Left(st, Len(st) - 1))
     bColA = bColA + 1
 
End If
Next
If Not rADet Is Nothing Then rADet.Delete
Merci d'avance
zoumzoum59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 17h00   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 890
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 890
Points : 7 163
Points : 7 163
Bonjour,

La variable BcolA est integer.
Il est fort probable qu'a un moment elle prenne une valeur supérieure à 32767
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 17h20   #3
Membre régulier
 
Inscription : mai 2006
Messages : 272
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 272
Points : 72
Points : 72
Merci jfontaine, mais j'ai verifier quand ça bloque la variable à pour valeur 257 donc ce n'est pas sur cette variable qu'est le probleme, du moins j'en suis presque sur.
zoumzoum59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 17h29   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 890
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 890
Points : 7 163
Points : 7 163
Dans excel 2003 et antérieur il n'y a pas plus de 256 colonnes
Ne serait ce pas cela le problème ?
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 18h05   #5
Membre régulier
 
Inscription : mai 2006
Messages : 272
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 272
Points : 72
Points : 72
Oui je suis d'accord il y a bien que 256 colonnes, mais comme je ne comprend pas bien ce code, je n'arrive pas à déchifrer comment la liste alphabetique est créer.
Si elle est créé en reprenant l'intitulé alphabetique de chaque colonne pour créer la liste, c'est certainement cela qui pose probleme.
Donc si c'est bien le probleme comment je peux faire pour créer ma liste alphabetique de plus de 256 caracteres?
zoumzoum59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 20h05   #6
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 890
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 890
Points : 7 163
Points : 7 163
Ci dessous une procédure qui affiche la liste dans la colonne A

il te restera a adapter a ton besoin

Ici on va jusqu’à 300
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
Sub ListeLettre()
 
Dim strPos1 As String 'Contient la lettre niveau 1
Dim strPos2 As String 'Contient la liette niveau 2
 
Dim i As Integer
Dim j As Integer
 
 
For i = 1 To 300
 
    If j <= 26 Then
        strPos2 = Chr(65 + j)
    Else
 
        If strPos1 = "" Then
            strPos1 = "A"
        Else
            strPos1 = Chr(Asc(strPos1) + 1)
        End If
 
        j = 1
        strPos2 = ""
 
    End If
 
    j = j + 1
    Range("B" & i).Value = strPos1 & strPos2
 
Next i
 
End Sub
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 15h33   #7
Responsable Access
 
Avatar de Arkham46
 
Inscription : septembre 2003
Messages : 4 300
Détails du profil
Informations personnelles :
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : septembre 2003
Messages : 4 300
Points : 7 939
Points : 7 939
Par défaut suite suppression message précédent

bjr,

si j'ai tout bien suivi :
Code :
st = Cells(1, bColA).AddressLocal(False, False)
sert uniquement à formater un texte comme on le voit dans les en-têtes de colonnes (AA, AB, AC, ...)

comme bColA ne peut dépasser 256 dans cette instruction, tu peux utiliser la méthode de jfontaine

mais si j'ai bien compris son code ça ne marche que pour 2 lettres donc jusqu'à 702 = ZZ (me dire si je me trompe )

je me suis donc amusé à écrire une fonction pour générer les caractères en fonction d'un nombre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
Public Function NombreLettre(ByVal pNombre As Long) As String
Dim lDiv As Long, lReste As Long
Do
    lDiv = pNombre \ 26
    lReste = pNombre Mod 26
    ' on commence la numérotation à 1 pour A
    ' donc si 0 => Z
    If lReste = 0 Then
        lReste = 26
        lDiv = lDiv - 1
    End If
    ' ajout de la lettre qui correspond au reste de la division par 26
    NombreLettre = Chr(64 + lReste) & NombreLettre
    ' on continue avec le résultat de la division
    pNombre = lDiv
    ' dernière lettre
    If pNombre <= 26 Then
        If pNombre > 0 Then NombreLettre = Chr(64 + pNombre) & NombreLettre
        Exit Do
    End If
Loop
End Function
en reprenant le code du début, les lignes :
Code :
1
2
      st = Cells(1, bColA).AddressLocal(False, False)
   r.Cells(1) = LCase(Left(st, Len(st) - 1))
deviennent alors :
Code :
1
2
3
 
st = NombreLettre(bColA)
r.Cells(1) = LCase(st)
bon courage...
__________________
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL

Blog Office Mon Site DVP
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/09/2011, 10h33   #8
Membre régulier
 
Inscription : mai 2006
Messages : 272
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 272
Points : 72
Points : 72
Bonjour à tous

Merci Jfontaine et merci Arkham46, c'est tout nickel.

Et en plus ta fonction est bien expliquer, je n'aurais pas su la créer mais au moins je comprend comment elle fonctionne et je pense que c'est déjà ça.

Encore merci à vous deux
zoumzoum59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h05.


 
 
 
 
Partenaires

Hébergement Web