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 :

Récupérer les dimensions d'un Array [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2011
    Messages : 40
    Points : 35
    Points
    35
    Par défaut Récupérer les dimensions d'un Array
    Bonjour à tous,

    cela faisait un moment que je n'avais eu la chance de venir ici mais nécessité faisant loi, me revoici.

    Mon nouveau boss me demande de me remettre aux macros Excel mais je n'ai plus vraiment pratiqué depuis quelques années et je suis coincé sur un bug.
    J'ai trois fichiers :
    • Un fichier original (test 1.xlsx)
    • un fichier modifié (test 2.xlsx)
    • Un fichier qui doit me permettre de comparer les deux à l'aide d'une macro (compare Test.xlsm)


    J'ai récupérer le code ici.
    Le code récupère les données sur la première feuille dans un Array et compare cellule par cellule au données de la seconde feuille elles aussi récupérées dans un Array.

    Cependant, au moment de récupérer les dimensions de l'Array, j'ai une "erreur d'exécution 13 : incompatibilité de type" sur la ligne qui initie le "For".
    Quand j'ajoute un espion sur "varSheetA" j'ai bien les bonnes données et dimensions dedans et je ne comprends pas pourquoi le LBound me génère cette erreur.
    J'ai essayé de désactivé "Explicit" pour laisser "iRow" et "iCol" se définir tout seul et j'ai le même soucis.
    Est-ce que quelqu'un aurait une idée ?

    En ce qui concerne la partie Else du If, je n'ai pas encore pu la tester donc il est possible que ce soit du gros charabia qui plante. ^^


    Ci-dessous, le code et ici les fichiers exemple.

    En vous remerciant par avance pour votre aide.

    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
     
    Option Explicit
     
    Sub VerifVersion()
     
        Dim varSheetA As Variant
        Dim varSheetB As Variant
        Dim varSheetRes As Variant
        Dim strRangeToCheck As String
        Dim iRow As Long
        Dim iCol As Long
        Dim iRowList As Long
        Dim iColList As Long
        Dim wbkA As Workbook
        Dim wbkB As Workbook
     
     
        iRowList = 1
        iColList = 1
     
        strRangeToCheck = "A1:B30"
        ' If you know the data will only be in a smaller range, reduce the size of the ranges above.
        Debug.Print Now
        Set wbkA = Workbooks.Open(Filename:="C:\DosTest\test 1.xlsx")
        Set varSheetA = wbkA.Worksheets("Feuil1").Range(strRangeToCheck) ' or whatever sheet you need
        Set wbkB = Workbooks.Open(Filename:="C:\DosTest\test 2.xlsx")
        Set varSheetB = wbkB.Worksheets("Feuil1").Range(strRangeToCheck) ' or whatever sheet you need
        Debug.Print Now
     
        For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)
            For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2)
                If varSheetA(iRow, iCol) = varSheetB(iRow, iCol) Then
                    ' Cells are identical.
                    ' Do nothing.
                Else
                    ' Cells are different.
                    ' Code goes here for whatever it is you want to do.
                    'ThisWorkbook.ThisWorksheet.Range(iColList,iRowList)=(iRow,Icol)
                    varSheetRes(iRowList, iColList) = iRow & ";" & iCol
                    ThisWorkbook.Worksheets("Feuil1").Range("A1").Select
                    varSheetRes.Paste
                End If
            Next iCol
        Next iRow
     
    End Sub

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,

    Si il s'agit de comparer les valeurs des cellules (pas les formules mais leur résultat) :
    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
    Option Explicit
    Sub VerifVersion()
    Dim wbkA As Workbook
    Dim wbkB As Workbook
    Dim varSheetA As Variant
    Dim varSheetB As Variant
    Dim varRes As Variant
    Dim strRangeToCheck As String
    Dim iRow As Long
    Dim iCol As Long
     
      strRangeToCheck = "A1:B30"
      Set wbkA = Workbooks.Open(Filename:="C:\DosTest\test 1.xlsx")
      varSheetA = wbkA.Worksheets("Feuil1").Range(strRangeToCheck).Value
      Set wbkB = Workbooks.Open(Filename:="C:\DosTest\test 2.xlsx")
      varSheetB = wbkB.Worksheets("Feuil1").Range(strRangeToCheck).Value
      For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)
        For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2)
          If Not varSheetA(iRow, iCol) = varSheetB(iRow, iCol) Then
            ' Cellules differentes
            varRes = varRes & vbLf & Cells(iRow, iCol).Address(False, False) & " : " & varSheetA(iRow, iCol) & " <> " & varSheetB(iRow, iCol)
          End If
        Next iCol
      Next iRow
      With ThisWorkbook.Worksheets(1)
        .Cells.Clear
        If Not IsEmpty(varRes) Then
          varRes = "Plages " & strRangeToCheck & " différentes en :" & varRes
          varRes = Split(varRes, vbLf)
          .Cells(1, 1).Resize(UBound(varRes) + 1).Value = Application.Transpose(varRes)
        Else
          .Cells(1, 1).Value = "Plages " & strRangeToCheck & " identiques"
        End If
      End With
     
    End Sub
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2011
    Messages : 40
    Points : 35
    Points
    35
    Par défaut
    Patrice740 Merci beaucoup !!!
    Ca fait exactement ce qu'il me fallait !

    Par contre du coup je ne comprends pas la différence si il y a ou non le "Set" en début de ligne de la déclaration de l'array (lignes 14 et 16 de ton code). A quoi sert-il ? Pourquoi est-il sur les ligne précédentes et pas celles-ci ?

    Je passe le sujet en résolu.

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Citation Envoyé par Tomtomtvn Voir le message
    Par contre du coup je ne comprends pas la différence si il y a ou non le "Set" en début de ligne de la déclaration
    Il faut utiliser Set pour affecter un objet à une variable.
    Lignes 14 et 16 ce sont des matrices de valeurs (tableau VBA ou array) de type variant (les contenus des cellules)
    Lignes 13 et 18 des objets Workbook

    Dans ton code, lignes 24 et 25 tu affectes à tes variables des objets Range, d'où l'erreur ultérieure
    Pour obtenir un tableau de valeurs il aurait fallu faire ensuite MonTableau = MonObjetRange.Value.

    Pour mémoire un variable typée Variant peut être affectée avec tout autre type de variable, y compris objet.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2011
    Messages : 40
    Points : 35
    Points
    35
    Par défaut
    Merci pour ta réponse Patrice740.

    Je ne suis pas certain d'avoir tout compris.
    Quel est l'intérêt de déclarer une variable si ce n'est pas pour lui affecter un type ? Si le type Variant permet de mettre n'importe quoi dans ma variable, autant ne pas déclarer de type non ?

  6. #6
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,
    Citation Envoyé par Tomtomtvn Voir le message
    Si le type Variant permet de mettre n'importe quoi dans ma variable, autant ne pas déclarer de type non ?
    Eh bien non !
    Un code avec des variables typées de façon adéquate (pas toutes en variant) est bien plus sûr :
    - tout d'abord ça oblige à réfléchir au type de donnée traitée pour choisir la variable adéquate.
    - il y a moins de risque d'erreur d'affection et les erreurs sont détectée automatiquement : l'erreur 13 incompatibilité de type.
    - ça permet d'optimiser l'occupation mémoire, le type variant nécessite 16 ou 22 octets alors que le type objet n'en nécessite que 4.
    - en général la vitesse d'exécution est améliorée de façon sensible.
    - le code est plus limpide, donc plus simple à comprendre
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer les dimensions de l'élément parent ?
    Par ghohm dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 02/09/2006, 10h22
  2. comment récupérer les dimensions d'une image
    Par sirius25 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 07/08/2006, 15h47
  3. Récupérer les dimensions de mon image.
    Par Trilby dans le forum ASP
    Réponses: 3
    Dernier message: 10/02/2005, 09h52

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