IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Pb de "Type"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Par défaut Pb de "Type"
    Bonjour,

    j'ai un probleme, mon code est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
    Private Type produit    'Definition du type produit
        designation As String
        part_reference As String
        material_type(1 To 2) As String
        '...
        '...(beaucoup de variable)
    End Type
     
    Sub Master()
     
    'Creation d'un tableau de produit
    Dim tableau(1 To 20) As produit
     
    'Remplissage du tableau
    Dim plage As Range, cellule As Range
    Dim nCols As Integer, nRows As Integer
        nCols = 28
        nRows = 40
        For n = 1 To 10
            Set plage = Range(Range("A1").Offset(0, (n - 1) * 28), Range("A1").Offset(nRows, (n - 1) * 28 + nCols))  'selection successive de 28 colonne et 40 lignes par un offset de 28 case a droite
     
            For Each cellule In plage
     
                If cellule.Value = "Designation" Then
                    cellule.Select                       'On selectionne cet case
                    Selection.Offset(0, 1).Select
                    tableau(n).designation = ActiveCell.Value    'Stockage de la valeure
                End If
     
     
                If cellule.Value = "City" Then
                    cellule.Select
                    Selection.Offset(1, 0).Select
                    tableau(n).part_reference = ActiveCell.Value
                End If
     
            '...
            '...(beaucoup de conditions)
     
     
     
            Next cellule
        Next n
     
    End Sub
    Ce programme fonctionne corectement.
    Mais lorsque je veux passer mon "nRows" de 40 a 400, ca ne marche plus, le debbuger surlingne en jaune "If cellule.Value = "Designation" Then"

    J'ai l'impression qu l'ordi n'appreci pas de manipuler de si grand tableau et/ou de si grand type perso.

    Peut-etre qu'une meilleur synthaxe serait la solution, ?
    Si vous avez des idées, n'hesitez pas.

    Merci d'avance, Jean-Claude.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu peux déjà avantageusement simplifier ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                If cellule = "Designation" Then
                    tableau(n).designation = cellule.Offset(0, 1)
                End If
    et ceci dans les deux cas cités
    Tu peux tester ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Test()
    Dim plage As Range, cell As Range
        Set plage = ActiveSheet.UsedRange
        For Each cell In plage
            MsgBox cell.Offset(0, 4)
        Next
    End Sub
    A part ça, je ne vois pas le pb (pas encore)

  3. #3
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Par défaut Retour test
    Merci pour la synthaxe, c'est boucoup mieu, mais sa n'arrange pas mon probleme.

    La macro test (utilisée tel quel), a eu pour résultat un messagebox vide avec bouton ok qui se repetait indefiniment apres appuy sur ok (je suis rester appuyer sur entrer pour voir si il y avait une fin mais je me suis decouragé avant). A quoi devait-elle etre utile ?

    Merci.

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Le message vide ? Teste en mettant MsgBox cell.Offset(0, 4).value
    C'était censé te montrer que la syntaxe fonctionnait mais dans ma feuille je n'ai que des chaîne, c'est peut-être pour ça... Ou alors, tu as un certain nombre de premières lignes totalement vides dans ta feuille de calculs.
    Bref, ça ne règle rien, je m'y attendais un peu...
    En relisant, la "ligne" suivante me paraît... même si elle fonctionne...
    Set plage = Range(Range("A1").Offset(0, (n - 1) * 28), Range("A1").Offset(nRows, (n - 1) * 28 + nCols)) 'selection successive de 28 colonne et 40 lignes par un offset de 28 case a droite
    Peux-tu tester ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = Range(Cells(1, n * 28), Cells(nRows, (n * 28 + nCols))
    Comme il ne s'agit plus d'un offset, le "-1" n'est plus utile.
    par contre, il faudra que tu adaptes nRows pour la même raison.
    Tu dis

  5. #5
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox cell.Offset(0, 4).value
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox cell.Offset(0, 4)
    font la meme chose, je n'avait pas vue, mais en effet, arrivé a la 2e ligne (qui n'est pas vide comme la 1ere), la message box affiche le contenu des cases.

    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set plage = Range(Cells(1, n * 28), Cells(nRows, (n * 28 + nCols)))
    fonctionne bien mais , ne prend pas en compte la 1er plage (colonne 1 a 28) et ne resout pas le probleme, helas.

    >> Il n'y a pas une limite de memoire utilisable ?

    A bientot. JC

  6. #6
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Par défaut
    J'ai essayer de tronconner le plage pour balayer plusieur fois 40 lignes avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    For j = 1 To 12
    '[...]
    Set plage = Range(Range("A1").Offset((j - 1) * 40, (n - 1) * 28), Range("A1").Offset((j - 1) * 40 + nRows, (n - 1) * 28 + nCols))
    '[...]
    Next j
    Mais ca ne marche plus du tout l'erreur est toujours la meme "erreur 13"; probleme de type su la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If cellule = "Designation" Then

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo