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 :

Détection d'une valeur dans un tableau de données variables - VBA [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut Détection d'une valeur dans un tableau de données variables - VBA
    Bonjour à tous,

    Débutant en VBA, je rencontre un souci qui est le suivant:

    J'ai un tableau de données comportant 6 colonnes (N°, Ref, Nb, Base, Hauteur, Long) avec un nombre de ligne indéterminé puisqu'il provient de la récupération de calcul excel via la vba.
    Ce tableau est trié par ordre croissant de la colonne "Base", puis "Hauteur", puis "long".

    A la suite de ma VBA créé, j'aimerais copier les plages de cellule de manière à avoir une plage de cellule par Hauteur différente.
    C'est cette partie qui me bloque puisque je n'est pas la possibilité de connaître le nombre de hauteur différente ni le nombre de ligne présentant la même hauteur.
    Je n'est réussi qu'a bricoler des codes, récupéré sur internet, permettant de réaliser l'action que je veux faire mais avec une plage que j'ai lu (il fonctionne):

    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
     
    Sub Bouton3_Clic()
     
    Dim XLApp As New Excel.Application
    Dim XlBook As Workbook
    Dim monfichier, chemin As String
     
    monfichier = Range("calcul!c4") & "_ebras_" & Range("calcul!e5") & "_x_" & Range("calcul!f5") & ".csv"
    chemin = "Mon Chemin d'accès"
    Set XlBook = XLApp.Workbooks.Add
     
    'copie de la plage que j'ai lu
    Worksheets("calcul").Range("b4:g5").Copy
        With XlBook.Worksheets("feuil1")
            .Range("a1").PasteSpecial Paste:=xlPasteValues
        End With
    Application.CutCopyMode = False
     
    XlBook.Sheets("Feuil2").Delete
    XlBook.Sheets("Feuil3").Delete
    XlBook.SaveAs Filename:=(chemin & monfichier)
    XlBook.Close savechanges:=False
     
    End Sub
    Merci d'avance
    Loïc

  2. #2
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    Bonsoir
    si j'ai bien compris ta demande tu peux choisir entre l'une des deux solutions
    1/ Un userform comprenant un combobox (ou tu va choisir la hauteur) et un listbox qui va enregistré toutes les lignes qui ont la hauteur choisie
    2/ Ou bien envoyer dans une deuxième feuille les lignes qui correspond à une hauteur choisie (via un inputbox par exemple)
    Toutefois un tableau dynamique croisé avec des segments fait bien l'affaire sans recourir à VBA

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut
    Bonjour bennasr,

    L'idée est que pour chaque plage comprenant la même hauteur, dans ce tableau qui es un tableau intermédiaire, je veux pouvoir en faire un fichier ".csv".
    Mais aussi les hauteurs sont des valeurs calculés donc je peut pas les connaître d'avance et surtout j'aimerais que le même bouton qui me rempli et trie ce tableau puisse copié les plages de hauteurs / hauteur différentes et les colles dans un nouveau fichier excel que j'enregistre en fichier ".csv" via vba.
    Il faudrait que l'utilisateur n'est besoin que de cliquer sur le bouton et tous les fichiers ".csv" s'enregistre dans son dossier.

    J'espère avoir été plus clair

    Loïc

  4. #4
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    Bonsoir Loic
    Je suis débutant en VBA et autodidacte en VBA mais j'ai un fichier qui peut t'aider
    en effet c'est un fichier récapitulatif des devises (de ce super site) et qui ouvre une nouvelle feuille pour chaque devise
    elle correspond presque à ce que tu cherche, Toutefois je peux pas l'adapter à tes besoins vu que mes connaissance sont limités
    Ci joint la feuille et à toi d'essayer d'adapter

    Bonne Continuation
    Fichiers attachés Fichiers attachés

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut
    Salut Bennasr,

    C'est exactement ce que je veux faire sauf qu'il faut copier chaque plages dans un nouveau classeur à chaque fois.
    Mon niveau de VBA ne me permettra pas de pouvoir adapter le code je n'arrive pas à comprendre ce code il y a trop de "fonction" que je ne connais pas.

    Si une personne pourrais prendre du temps pour adapter le code de cette feuil excel à ce que j'essaie de formuler ce serais super.


    Merci pour ton aide tout de même

  6. #6
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    Pour espérer un aide de l'un de ce super site je te conseille de copier le code et le mettre entre balse #
    car aucun n'ouvre les pièces jointes
    En fait c'est ce que disent les règles du forum

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut
    Encore merci bennasr, je vais mettre les codes.

    Donc si quelqu'un était capable de transformer ce code qui récupère les données d'un tableau en les triant et les copiant par "devise" dans une nouvelle feuille.

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
     
    Option Explicit
    Option Compare Text
     
    Dim liste As Range
     
    Sub Crée_Feuilles()
        Dim dercel As Range
     
        With Sheets("Recap")
                Set dercel = .Cells(.Rows.Count, 5).End(xlUp)
                Set liste = .Range(.Cells(4, 5), dercel)
        End With
     
        Call Creer_Liste_Feuilles(liste)
        Set dercel = Nothing
        Set liste = Nothing
     
    End Sub
     
    Sub Creer_Liste_Feuilles(Plage As Range)
        Dim Cell As Range
        Dim Un As Collection
        Dim i As Long, j As Long
        Dim Inverse1, Inverse2, Item
     
        Set Un = New Collection
     
        On Error Resume Next
     
        'Boucle sur la plage de cellule
        For Each Cell In Plage
            'If Cell <> "" Permet de ne pas prendre en compte les cellules vides
            'Un.Add Cell, CStr(Cell) Ajoute le contenu de la cellule dans la collection
            If Cell <> "" Then Un.Add Cell, CStr(Cell)
        Next Cell
     
        On Error GoTo 0
     
        'Trie la collection
     
        For i = 1 To Un.Count - 1
            For j = i + 1 To Un.Count
                If Un(i) > Un(j) Then
                    Inverse1 = Un(i)
                    Inverse2 = Un(j)
                    Un.Add Inverse1, before:=j
                    Un.Add Inverse2, before:=i
                    Un.Remove i + 1
                    Un.Remove j + 1
                End If
            Next j
        Next i
     
        'Boucle sur les éléments de la collection.
        For i = 1 To Un.Count
            Debug.Print Un(i)
            Call Gestion_Feuilles(Un(i))
        Next i
     
        Set Un = Nothing
     
    End Sub
     
    Public Sub Gestion_Feuilles(occurs As String)
     
    Dim i As Integer, n As Integer, nbcol As Integer
     
    Dim f As Range, celcop As Range
     
    Dim firstAddress As String
     
    Dim Tablo() As Variant
     
    Dim sh As Worksheet
     
    Dim existe_feuil As Boolean
     
    With Sheets("Recap")
        Set celcop = .Range("E3", .Cells(3, .Columns.Count).End(xlToLeft))
    End With
    'nombre de données à alimenter = dimension 1 de la variable Tablo
    nbcol = celcop.Columns.Count
     
    'Teste si la feuille existe
    existe_feuil = False
    For Each sh In Worksheets
        If sh.Name = occurs Then
            existe_feuil = True
            Exit For
        End If
    Next sh
     
    'Si la feuille n'existe pas, alors création de celle-ci avec nom et titres de colonnes adaptés
    If existe_feuil = False Then
        Sheets.Add Type:=xlWorksheet, After:=Sheets(Sheets.Count)
        celcop.Copy
        With ActiveSheet
            .Paste Destination:=.Range("C3")
            .Name = occurs
        End With
        Application.CutCopyMode = False
    End If
     
    'D'après l'aide en ligne de la méthode Find
    With liste
        Set f = .Find(occurs, LookIn:=xlValues)
        If Not f Is Nothing Then
            firstAddress = f.Address
            Do
                    n = n + 1
                    ReDim Preserve Tablo(1 To nbcol, 1 To n)
                    'Toutes les cellules de la ligne alimentent Tablo
                    For i = 1 To nbcol
                            Tablo(i, n) = f.Offset(0, i - 1)
                    Next i
                    Set f = .FindNext(f)
            Loop While Not f Is Nothing And f.Address <> firstAddress
        End If
    End With
     
     
    'Alimentation de la feuille
    With Sheets(occurs)
             .Range("C3", .Range("C3").Offset(UBound(Tablo, 2) - 1, UBound(Tablo, 1) - 1)).Value = WorksheetFunction.Transpose(Tablo)
    End With
     
    'Réinitialisation de la variable Tablo
    Erase Tablo
     
    End Sub
    Et le remplacer par un code qui récupère mes données dans un tableau comportant 6 colonnes (N° "B", Ref "C", Nb "D", Base "E", Hauteur "F", Long "G") avec un nombre de ligne indéterminé. En les triant par "Hauteur" différente colonne "H", et les colles dans un nouveau classeur Excel nommée comme dans le début de code que j'ai réussi à bricoler qui créé une nouvelle feuille et l'enregistre au format ".csv" en collant la plage de cellule que j'aurais déterminer de la même manière du code ci-dessus.

    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
     
    Sub Bouton3_Clic()
     
    Dim XLApp As New Excel.Application
    Dim XlBook As Workbook
    Dim monfichier, chemin As String
     
    'Nom de mon fichier comportant "\" & "Base de la plage de cellule" & "_ebras_" & "_x_" & "Hauteur de la plage de cellule" & ".csv"
    monfichier = "\" & Range("calcul!c4") & "_ebras_" & Range("calcul!e5") & "_x_" & Range("calcul!f5") & ".csv"
     
    chemin = ThisWorkbook.Path
     
    Set XlBook = XLApp.Workbooks.Add
     
    Worksheets("calcul").Range("b4:g5").Copy
        With XlBook.Worksheets("feuil1")
            .Range("a1").PasteSpecial Paste:=xlPasteValues
        End With
    Application.CutCopyMode = False
     
    XlBook.Sheets("Feuil2").Delete
    XlBook.Sheets("Feuil3").Delete
    XlBook.SaveAs Filename:=(chemin & monfichier)
    XlBook.Close savechanges:=False
     
    End Sub
    J'espère être rester clair et merci si quelqu'un pouvais se pencher la dessus.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 05/01/2007, 20h04
  2. Réponses: 4
    Dernier message: 27/11/2006, 23h20
  3. Chercher une valeur dans un tableau
    Par christel1982 dans le forum ASP
    Réponses: 5
    Dernier message: 14/09/2006, 09h01
  4. Rechercher une valeur dans un tableau
    Par pafi76 dans le forum Access
    Réponses: 2
    Dernier message: 29/06/2006, 14h23
  5. Réponses: 21
    Dernier message: 28/02/2006, 15h23

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