macro fonctionnelle depuis un onglet mais se plante sur d'autre onglet du classeur

crisud

XLDnaute Nouveau
Bonjour,


J'ai construis une macro lisant dans une table comportant notamment 2 colonnes qui sont renvoyées sous forme de tableau ordonnée et abscisse.

Les données sont dans un onglet dénommé [Data]
Le tableau est envoyé sur l'onglet dénommé [Balance-Géné]

Ma macro fonctionne parfaitement si je la lance depuis l'onglet [Data]

J'ai besoin d'un petit coup de main, car elle plante avec une erreur 1004
à la ligne --> For Each c In Sheets("Data").Range([B2], [B65536].End(xlUp))




Code:
Sub toto()
  Dim Tableau()
  Dim Tablo()
  Dim i As Long
 Dim mondico As Object
 Dim c As Object
 Dim d As Object

'ordonnées
  
 With Sheets("Balance_Géné")
  
        Set mondico = CreateObject("Scripting.Dictionary")
        
        For Each c In Sheets("Data").Range([B2], [B65536].End(xlUp))
                  'si la donnée n'existe pas encore dans le dictionnaire
            If Not mondico.Exists(c.value) Then
                  'on l'ajoute dans le dictionnaire...
                mondico.Add c.value, c.value
                  '...et dans le tableau VBA ;-)
                    ReDim Tableau(1 To mondico.Count)
                    Tableau(mondico.Count) = c.value
                           
                            
                        Sheets("Balance_Géné").Cells(2 + mondico.Count, 1) = Application.Transpose(Tableau(mondico.Count))
      
        
            End If
      
        Next c



'abscisse
 



        
       Set mondico = CreateObject("Scripting.Dictionary")
      
      
        For Each d In Sheets("Data").Range([A2], [A65536].End(xlUp))
                'si la donnée n'existe pas encore dans le dictionnaire
             If Not mondico.Exists(d.value) Then
                'on l'ajoute dans le dictionnaire...
                mondico.Add d.value, d.value
                '...et dans le tableau VBA ;-)
                    ReDim Tablo(1 To mondico.Count)
                    Tablo(mondico.Count) = d.value
            
                        Sheets("Balance_Géné").Cells(2, 1 + mondico.Count) = Tablo(mondico.Count)

             End If
          
       Next d
      
End With
  
  
 
  
End Sub


Merci d'avance
 

pierrejean

XLDnaute Barbatruc
Re : macro fonctionnelle depuis un onglet mais se plante sur d'autre onglet du class

Bonjour crisud

Pas tout exploré mais teste néanmoins

Code:
For Each c In Sheets("Data").Range("B2:B" & Sheets("Data").Range("B65536").End(xlUp))
 

crisud

XLDnaute Nouveau
Re : macro fonctionnelle depuis un onglet mais se plante sur d'autre onglet du class

J'ai trouvé, un solution en sélectionnant la feuille où se trouve mes données
Sheets("data").Select

J'ai glissé l'instruction Application.ScreenUpdating = False
ce qui évite l'échos de la feuille data

Mais cette solution me satisfait pas, car sa oblige de changer de focus.


Alors comment résoudre plus proprement

Christian
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : macro fonctionnelle depuis un onglet mais se plante sur d'autre onglet du class

Salut crisud et le forum
Alors comment résoudre plus proprement
En faisant comme Pierrejean t'a dit ?
Code:
Sub toto()
Dim Tableau()
Dim Tablo()
Dim i As Long
Dim mondico As Object
Dim c As Object
Dim d As Object

'ordonnées

With Sheets("Balance_Géné")
    Set mondico = CreateObject("Scripting.Dictionary")
    For Each c In Sheets("Data").Range(Sheets("Data").[B2], Sheets("Data").Cells(Rows.Count, "B").End(xlUp))
    'si la donnée n'existe pas encore dans le dictionnaire
        If Not mondico.Exists(c.Value) Then
        'on l'ajoute dans le dictionnaire...
            mondico.Add c.Value, c.Value
            '...et dans le tableau VBA ;-)
            ReDim Tableau(1 To mondico.Count)
            Tableau(mondico.Count) = c.Value
            .Cells(2 + mondico.Count, 1) = Application.Transpose(Tableau(mondico.Count))
        End If
    Next c
    'abscisse
    Set mondico = CreateObject("Scripting.Dictionary")
    For Each d In Sheets("Data").Range(Sheets("Data").[A2], Sheets("Data").Cells(Rows.Count, "A").End(xlUp))
    'si la donnée n'existe pas encore dans le dictionnaire
        If Not mondico.Exists(d.Value) Then
        'on l'ajoute dans le dictionnaire...
            mondico.Add d.Value, d.Value
            '...et dans le tableau VBA ;-)
            ReDim Tablo(1 To mondico.Count)
            Tablo(mondico.Count) = d.Value
            .Cells(2, 1 + mondico.Count) = Tablo(mondico.Count)
        End If
    Next d
End With
End Sub
À chaque fois que tu écris
Code:
For Each d In Sheets("Data").Range([A2], [A65536].End(xlUp))
Tu écris en réalité
Code:
For Each d In Sheets("Data").Range(activesheet.[A2], activesheet.[A65536].End(xlUp))
Ne t'étonne pas qu'Excel se fâche !

Je n'ai pas testé le code (pas envie de savoir ce qu'il doit faire exactement), mais :
- On est à l'ère 2007 et supérieures, donc la limite n'est plus de 255 colonnes et de 65536 lignes => Cells(rows.count,Columns.count).end est plus approprié
A+
 

Discussions similaires

Réponses
3
Affichages
578

Statistiques des forums

Discussions
312 584
Messages
2 089 991
Membres
104 330
dernier inscrit
joedal