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 :

Cibler une ligne dans un tableau VBA à deux dimensions [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Comptable
    Inscrit en
    Novembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Novembre 2018
    Messages : 100
    Par défaut Cibler une ligne dans un tableau VBA à deux dimensions
    Bonjour à tous le forum,

    Cela fait quelques mois que je n'ai pas été actif sur le forum mais je reviens vers vous car je travaille sur un projet pour le travail qui consiste à alimenter un fichier texte à partir d'un tableau VBA.

    La structure du tableau est composé de 18 colonnes et autant de ligne que besoin. Mon problème est le suivant :

    Je dois contrôler que certaines colonnes sont complétées, pour cela je me suis dit que j'allais utiliser un tableau temporaire (comme un Set de range sur une ligne) puis l'envoyer sur une fonction qui contrôle la ligne.

    J'ai eu l'idée boucler avec redim preserve sur toutes les colonnes pour alimenter ce tableau mais il doit bien exister un moyen de le faire en une commande VBA. J'ai essayé la commande dans le code mais il me récupère que la première et la dernière.

    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
    '**************************************************************************************************
    ' NAME : WriteLines (FUNCTION)
    ' INPUT : sPathFile (String), sData (String)
    ' OUTPUT : NoComplianceLines (Array)
    '**************************************************************************************************
    Public Function WriteLines(sPathFile As String, sData() As String) As String()
     
        For lRow = LBound(sData, 1) To UBound(sData, 1) Step 1
     
            Erase sNewLine
            sNewLine = Array(sData(lRow, 0), sData(lRow, UBound(sData, 2))) ' Ici je souhaite comme faire un Set de Range
     
            'Contrôle que les champs obligatoire sont renseignés
            If Compliance(sNewLine) Then
     
                sLine = VBA.Join(sNewLine, VBA.vbTab)
                NumberMemory = VBA.FreeFile
     
                Open sPathFile For Append As #NumberMemory
     
                Print #NumberMemory, sLine
     
                Close #NumberMemory
     
            Else
                ' Gestion des lignes non conforme
            End If
     
        Next lRow
     
     
     
    End Function
    Avez-vous une idée sur cette question ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    pour extraire une ligne d'un tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Index(tabl, n, 0)
    ici on récupère la n ième ligne

    pour extraire une colonne d'un tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Index(tabl, 0, n)
    ici on récupère la n ième colonne

  3. #3
    Membre éprouvé
    Homme Profil pro
    Comptable
    Inscrit en
    Novembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Novembre 2018
    Messages : 100
    Par défaut
    Merci Joe levrai, cela marche niquel

    Je me disais bien qu'il existait une méthode plus simple que la boucle for.
    Mon erreur était de chercher uniquement dans la bibliothèque VBA, la prochaine fois je penserais à utiliser les fonctions natives d'Excel.

    Voici le code avec la modification

    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
    '**************************************************************************************************
    ' NAME : WriteLines (FUNCTION)
    ' INPUT : sPathFile (String), sData (Array)
    ' OUTPUT : NoComplianceLines (Array)
    '**************************************************************************************************
    Public Function WriteLines(sPathFile As String, sData() As String) As String()
     
        For lRow = LBound(sData, 1) To UBound(sData, 1) Step 1
     
            Erase sNewLine
            sNewLine = WorksheetFunction.Index(sData, lRow) ' Cibler une ligne dans un tableau
     
            'Contrôle que les champs obligatoire sont renseignés
            If Compliance(sNewLine) Then
     
                NumberMemory = VBA.FreeFile
     
                Open sPathFile For Append As #NumberMemory
     
                Print #NumberMemory, VBA.Join(sNewLine, VBA.vbTab)
     
                Close #NumberMemory
     
            Else
                'Gestion des lignes non conforme
            End If
     
        Next lRow
     
     
    End Function

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    Attention! Application.Index sur un Array() est lent si on traite des Arrays() de taille importante.

    En PJ, une fonction qui prend une partie d'un Array()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TblS = PrendPartieArray(TblE, 10, 1, Array(3, 1, 2))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function PrendPartieArray(TblE, Début, Taille, ColRécup)
      n = 0
      fin = Début + Taille - 1: If fin > UBound(TblE) Then fin = UBound(TblE)
      Dim TblS(): ReDim TblS(1 To Taille, LBound(ColRécup) To UBound(ColRécup))
      For i = Début To fin
        n = n + 1
        For k = LBound(ColRécup) To UBound(ColRécup): TblS(n, k) = TblE(i, ColRécup(k)): Next k
      Next i
      If n > 0 Then PrendPartieArray = TblS
    End Function
    Boisgontier
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. [XL-2016] VBA - Ajouter une ligne dans un tableau
    Par Valoou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/05/2017, 14h48
  2. Réponses: 1
    Dernier message: 24/04/2007, 17h20
  3. [VBA-E]insertion automatique d'une ligne dans un tableau
    Par janus82 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 06/04/2006, 15h42
  4. selection d'une ligne dans un tableau en html
    Par jehlg dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/02/2006, 23h08
  5. probleme bizarre de hauteur auto d'une ligne dans un tableau
    Par zax-tfh dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 17/01/2005, 23h34

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