XL 2016 Récupérer les données de nom et de date VBA

Dadi147

XLDnaute Occasionnel
Bonjour à tous. J'ai déjà été aidé @job75 Mais je dois modifier en raison de la nouvelle conception du fichier
La conception du fichier a été modifiée, je dois donc modifier le code pour extraire la date et le nom de la colonne i
Avec la même condition et la même méthode, existe-t-il un moyen de faire en sorte que le code s'exécute à partir de la première table vide et d'ignorer les tables qui ont été remplies auparavant car il s'exécute lentement lorsqu'il récupère les données
VB:
Sub Remplir_tout()
Dim nmax&, a$(), derlig&, tablo, i&, n&, c As Range, dat$, h&
With Sheets("Sheet1")
    '---liste des adresses---
    nmax = Application.CountIf(.[E:E], "Restaurant*") 'changé en colonne ("i")
    ReDim a(nmax) 'base 0
    derlig = .Range("C" & .Rows.Count).End(xlUp).Row + 1 'changé en colonne ("K")
    a(nmax) = "E" & derlig 'dernier élément   changé en colonne (i")
    tablo = .Range("E1:F" & derlig) 'matrice, plus rapide, au moins 2 éléments  changé en colonne ("i")
    For i = 1 To derlig
        If Trim(tablo(i, 1)) Like "Restaurant*" Then a(n) = "E" & i: n = n + 1
    Next i
    '---remplissage des colonnes A et B
    Application.ScreenUpdating = False
    .[A:B].ClearContents 'RAZ
    .[A:B].HorizontalAlignment = xlCenter 'centrage
    For n = 0 To UBound(a) - 1
        Set c = .Range(a(n))
        dat = Mid(Trim(c(7, 0)), 11, 10)
        h = .Range(a(n + 1)).Row - 1 - c(5).Row
        If h > 0 Then
            If IsDate(dat) Then c(6, -3).Resize(h) = CDate(dat)
            c(6, -2).Resize(h) = c(2)
        End If
    Next n
End With
End Sub
 

Pièces jointes

  • TEST1(4).xlsm
    50.1 KB · Affichages: 9

Oneida

XLDnaute Impliqué
Bonjour à tous. J'ai déjà été aidé @job75 Mais je dois modifier en raison de la nouvelle conception du fichier
La conception du fichier a été modifiée, je dois donc modifier le code pour extraire la date et le nom de la colonne i
Avec la même condition et la même méthode, existe-t-il un moyen de faire en sorte que le code s'exécute à partir de la première table vide et d'ignorer les tables qui ont été remplies auparavant car il s'exécute lentement lorsqu'il récupère les données
VB:
Sub Remplir_tout()
Dim nmax&, a$(), derlig&, tablo, i&, n&, c As Range, dat$, h&
With Sheets("Sheet1")
    '---liste des adresses---
    nmax = Application.CountIf(.[E:E], "Restaurant*") 'changé en colonne ("i")
    ReDim a(nmax) 'base 0
    derlig = .Range("C" & .Rows.Count).End(xlUp).Row + 1 'changé en colonne ("K")
    a(nmax) = "E" & derlig 'dernier élément   changé en colonne (i")
    tablo = .Range("E1:F" & derlig) 'matrice, plus rapide, au moins 2 éléments  changé en colonne ("i")
    For i = 1 To derlig
        If Trim(tablo(i, 1)) Like "Restaurant*" Then a(n) = "E" & i: n = n + 1
    Next i
    '---remplissage des colonnes A et B
    Application.ScreenUpdating = False
    .[A:B].ClearContents 'RAZ
    .[A:B].HorizontalAlignment = xlCenter 'centrage
    For n = 0 To UBound(a) - 1
        Set c = .Range(a(n))
        dat = Mid(Trim(c(7, 0)), 11, 10)
        h = .Range(a(n + 1)).Row - 1 - c(5).Row
        If h > 0 Then
            If IsDate(dat) Then c(6, -3).Resize(h) = CDate(dat)
            c(6, -2).Resize(h) = c(2)
        End If
    Next n
End With
End Sub
Bonjour,

Votre code doit etre dans un ou plusieurs modules pas dans le VBA d'une feuille
Votre code peut etre plus court et plus simple.
Vous n'avez besoin que d'une seule boucle sur les lignes
Like "Restaurant*"
en modifiant la recherche et pas besoin de mise en memoire des lignes
Si vous etes daccord, je vous fais ca demain matin
Colonne i et k, pas compris, se sont les nouvelles colonnes, donc celles de votre fichier?
 

Dadi147

XLDnaute Occasionnel
Bonjour,

Votre code doit etre dans un ou plusieurs modules pas dans le VBA d'une feuille
Votre code peut etre plus court et plus simple.
Vous n'avez besoin que d'une seule boucle sur les lignes

en modifiant la recherche et pas besoin de mise en memoire des lignes
Si vous etes daccord, je vous fais ca demain matin
Colonne i et k, pas compris, se sont les nouvelles colonnes, donc celles de votre fichier?
Merci pour ton intérêt. L'emplacement de la condition a été modifié de la colonne E à i et l'emplacement de la date extraite. Mais où placer le résultat reste inchangé dans la colonne A la date et la colonne b le nom. Colonne k, c'est la dernière ligne de la facture qui en dépend, pour mettre les données devant, comme dans le fichier joint. Merci encore
 

Oneida

XLDnaute Impliqué
Re,
Fichier modifier, execution en 0.02s a 0.09s sur mon PC pour les donnees que vous avez dans ce fichier
A voir.

Suite:
Avec votre code de remplissage colonne A:B (mes modifs sont sur la recherche cellules Restau)
Il ya un decalage de trois vers le haut colonne A:B que je ne comprends pas.
Ce phenomene se produit chez moi sur votre fichier d'origine mais pas a chaque fois!!!
 

Pièces jointes

  • Dadi147_TEST1(4).xlsm
    61.1 KB · Affichages: 3
Dernière édition:

Oneida

XLDnaute Impliqué
Re,
Fichier modifier, execution en 0.02s a 0.09s sur mon PC pour les donnees que vous avez dans ce fichier
A voir.

Suite:
Avec votre code de remplissage colonne A:B (mes modifs sont sur la recherche cellules Restau)
Il ya un decalage de trois vers le haut colonne A:B que je ne comprends pas.
Ce phenomene se produit chez moi sur votre fichier d'origine mais pas a chaque fois!!!
Suite:
Avec ce code, c'est ok
VB:
For n = 1 To nmax
                Set c = .Range(a(n))
                dat = Mid(Trim(c(7, 0)), 11, 10)
                h = .Range(a(n + 1)).Row - 1 - c(9).Row     'ald c(6)
                If h > 0 Then
                    If IsDate(dat) Then c(9, -3).Resize(h) = CDate(dat)     'idem
                    c(9, -2).Resize(h) = c(2)       'idem
                End If
            Next n
 

Dadi147

XLDnaute Occasionnel
Suite:
Avec ce code, c'est ok
VB:
For n = 1 To nmax
                Set c = .Range(a(n))
                dat = Mid(Trim(c(7, 0)), 11, 10)
                h = .Range(a(n + 1)).Row - 1 - c(9).Row     'ald c(6)
                If h > 0 Then
                    If IsDate(dat) Then c(9, -3).Resize(h) = CDate(dat)     'idem
                    c(9, -2).Resize(h) = c(2)       'idem
                End If
            Next n
Bonjour. Merci pour votre aide, mais il semble que je n'ai pas bien saisi l'idée. Je veux récupérer les données de la colonne i .Les cellules sont de couleur rouge.Comme indiqué dans le fichier joint, le code exécute la même tâche précédente et apporte les données en couleur jaune. j'espère que l'idée est claire
 

Pièces jointes

  • Screenshot_1.png
    Screenshot_1.png
    28.8 KB · Affichages: 18

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Dadi, Oneida,
Un essai en PJ avec ce que j'ai compris:
1- On repère Restaurant xxx en colonne I, on extrait le nom du resto, la date et la Ref en dessous.
2- Tant qu'un nouveau resto n'est pas apparu alors on met en colonne A la date et en B la Ref.
3- Je ne remplis A et B que lorsque C est non vide.

VB:
Sub CompleteFeuille()
    Dim DL%, L%, L2%
    DL = [C65500].End(xlUp).Row
    Range("A1:B" & DL).ClearContents
    tablo = Range("A1:I" & DL + 2)
    For L = 1 To UBound(tablo)
        If tablo(L, 9) Like "Restaurant*" Then
            Resto = Mid(tablo(L, 9), 12)
            LaDate = Right(tablo(L + 2, 9), 10)
            For L2 = L + 4 To UBound(tablo) - 2
                If tablo(L2 - 1, 3) Like "(4) Service fees =*" = True Then Exit For
                If tablo(L2, 3) <> "" Or tablo(L2 + 1, 3) Like "(4) Service fees =*" = True Then
                    tablo(L2, 1) = LaDate
                    tablo(L2, 2) = Resto
                End If
            Next L2
        End If
    Next L
    [A1].Resize(UBound(tablo, 1), UBound(tablo, 2)) = tablo
End Sub
 

Pièces jointes

  • TEST1(4) (V2).xlsm
    81 KB · Affichages: 3

Discussions similaires

Réponses
7
Affichages
423
Réponses
9
Affichages
146
Réponses
1
Affichages
113

Membres actuellement en ligne

Statistiques des forums

Discussions
313 310
Messages
2 097 037
Membres
106 816
dernier inscrit
Garry972