Methode pour intégrer des lignes dans un fichier
Bonjour,
Je vous préviens, ma question est compliquée. Chaque mois les entreprises envoient un fichier appelé DSN qui est composé de segments qui récapitulent...tout. C'est un .txt à la base. Ce fichier est totalement normé et en principe réalisé par un logiciel. Mais des fois ça capote. Nous devons alors faire des blocs de régularisation c'est à dire que l'on intègre à ce fichiers plusieurs segments, à des endroits bien précis et pour chaque salariés.
Une petite DSN de 5-6 salariés est composée de 1600 lignes. Alors imaginez maintenant la taille d'une DSN de 500 salariés. Et imaginez que nous soyons obligé d'intégrer lignes de regularisations pour les 500 salariés.....
Aussi, je suis à la recherche d'une methode pour intégrer ces lignes autrement qu'à la main. J'insiste sur le fait que c'est un fichier test que je devrais adapter sur un fichier réel.
Déjà j'ai ouvert le .txt avec Excel (ouf ça marche). Mon premier onglet est composé de 3 personnes sur 3 mois (commençons par petit pour voir). Dans la colonne A, les segments qui sont en fait redondant. Ensuite je saisie les valeurs dont j'ai besoin. Jusqu'ici tout va bien.
L'onglet "bloc à intégrer" me permet de crée la syntaxe dont j'ai besoin. C'est cool. (j'améliorerai avec des fonctions décaler) En A et en jaune ce sont les blocs à intégrer.
Et enfin, le meilleur pour la fin, la DSN. >>>>Comment faire pour intégrer les blocs de lignes automatiquement au bon endroit?
Le bloc A3;A20 doit être ajouté aprés le segment S21.G00.30.002,'CDDDEUX' et S21.G00.30.004,'Tempspartieldeux' et après le S21.G00.78.006 (avec possibilité de modifier cela si besoin)
Le bloc A23;A40 doit être ajouté aprés le segment S21.G00.30.002,'MANDATAIRE' et S21.G00.30.004,'Social' et après le S21.G00.78.006
Etc...vous voyez le principe.
Comment procéderez vous? Par avance merci pour vos lumières.
Bonjour Wikimel,
D'après ce que je lis
Et enfin, le meilleur pour la fin, la DSN. >>>>Comment faire pour intégrer les blocs de lignes automatiquement au bon endroit?
Le bloc A3;A20 doit être ajouté aprés le segment S21.G00.30.002,'CDDDEUX' et S21.G00.30.004,'Tempspartieldeux' et après le S21.G00.78.006 (avec possibilité de modifier cela si besoin)
Le bloc A23;A40 doit être ajouté aprés le segment S21.G00.30.002,'MANDATAIRE' et S21.G00.30.004,'Social' et après le S21.G00.78.006
1) Vous nous dites après xxxx et après xxx mais avant quoi !?
2) Excel n'est pas une IA, quelle est la logique pour intégrer ces blocs à l'endroit souhaité ?
A+
Bonjour et merci pour votre retour. J'avoue qu'a moi aussi ça me semble être difficilement réalisable.
Les règles pour moi sont les suivantes:
Qu'est ce qui doit être intégré: Dans l'onglet "bloc à intégrer" colonne A, repère la première S21.G00.002, prends 2 lignes plus loin pour arriver à la S21.G00.62.005 et descend jusqu'à la prochaine S21.G00.002 -1. S'il y a des vides ne les prends pas. (vi parceque tous les salariés n'ont pas toujours été présent sur toutes les périodes ça serait trop facile)
Ou les intégrer: Dans "DSN", repère la S21.G00.30.002 avec la même valeur, dessous repère le segment indiqué en G1 de bloc à intégrer et insère le bloc
> Salairé 1
Recommence à repérer S21.G00.002 dans "bloc à intégrer", prends 2 lignes plus loin pour arriver à la S21.G00.62.005 et descend jusqu'à la prochaine S21.G00.002 -1. S'il y a des vides ne les prends pas.
Puis dans DSN, repère la S21.G00.30.002 avec la même valeur, dessous repère le segment indiqué en G1 de "bloc à intégrer" et insère le bloc.
> Salarié 2 Et j'en ai 500 comme ça...
Maintenant, l'organisation de l'onglet "bloc à intégrer" peut être revue, j'ai juste mis ça ainsi pour obtenir ma syntaxe en A. J'aurais plus de salarié et plus de période sur mon tableau originale.
Bon, le plan B qui est plus modeste serait juste d'insérer X lignes (G2 de l'onglet Bloc "à intégrer" par salariés aprés le ségment indiqué en G1 et je fais des copier-coller des blocs. Je serait aussi gagnante en temps.
Toutes autres suggestion m'intéresse grandement.
Précision supplémentaire, l'intégration doit se faire à la suite du dernier segment G1, car ce segment apparait plusieurs fois pour un salarié.
Dernière version
Re,
Wikimel, le problème est simple, vos explications ne correspondent pas au fichier donné (en tout cas à mes yeux)
Exemple 1 : repère la première S21.G00.002
Je ne trouve déjà pas cette valeur
Exemple 2 : prends 2 lignes plus loin pour arriver à la S21.G00.62.005
Je ne trouve pas non plus cette valeur
Donc vous voyez, personne ne vous répond mais c'est normal
Le mieux je pense, serait de mettre une 4ème feuille "Resultat" et nous montrer le résultat escompté, avec la vrai bonne explication
A+
Bonjour,
@BrunoM45, tu avais raison concernant le manque de compréhension du fichier alors je l'ai revu.
>Fichier sur 365 car utilisation de la fonction FILTRER
C91 à C165 de "saisie" doit être copier- insérer coller valeurs dans DSN au dessus de la ligne 950 (info ligne 7 de Saisie)
D91 à D165 de "saisie" doit être copier- insérer coller valeurs dans DSN au dessus de la ligne 1134 (info ligne 7 de Saisie)
etc....
Je vais enregistrer une macro en espérant réussir ensuite à lui donner comme instruction de...continuer jusqu'au bout du tableau
Merci de m'avoir mis sur la bonne voie
Bonjour,
Pourrais-je avoir de l'aide sur cette macro. Je suis partie d'un enregistrement et aprés j'ai bricolé, essayé des trucs
Comment indiquer que l'on veut aller au N° de ligne indiquée dans une cellule?
Comment "tirer sur la formule sur la droite"? Et lui indiquer de s'arrêter quand ce qu'il séléctionne est vide?
Merci
Sub Integration()
'
' Integration Macro
'
Range("C95:C169").Select
If Range("C95:C169") <> "" Then
Selection.Copy
'Ici je voudrais lui indiquer d'aller sélectionner la ligne dont le numero est indiqué en C93 soit la valeur 950 sur la feuille "DSN"
Sheets("DSN").Select
Rows("950:950").Select
Selection.PasteSpecial Paste:=xlPasteValues, Insert Shift:=xlDown 'Ici je voudrait Insérer ce qui a été collé mais que les valeurs Error ici
Range("D95:D169").Select
If Range("D95:D169") <> "" Then
Selection.Copy
Sheets("DSN").Select
Rows("1156:1156").Select 'Va chercher le N° de ligne indiqué en D93
Selection.PasteSpecial Paste:=xlPasteValues, Insert Shift:=xlDown 'insère et colle les valeurs
'Même cycle jusqu'a OJ95:OJ169 sauf si vide arrêter et le N° de ligne se décaller à droite d'une cellule.
Endif
End Sub
J'avance d'un pas pour reculer de 3
> La fonction Filtre n'est pas du tout dynamique!!
> Grosse question : qui va plus vite, la fonction ou la macro?
Je m'explique: La ligne 8 me permet de calculer à quelle ligne copier mes éléments. Mais quand j'aurais copié ma premiere colonne, le Numero de ligne de la deuxième colonne va changer. (enfin si je trouve une solution pour le filtre non dynamique!)
> J'enchaine les tutos sur les loop. Au passage les cours VBA sur ce site sont très bien fait pour débuter.
>Terrible vérité de ma semaine: j'aurais gagné mon temps à faire les copier-coller à la main
Bonsoir Wikimel,
Navré de vous avoir abandonné, mais malgré vos explications c'est vraiment opaque pour moi
Surtout que maintenant vous avez apparemment 4 colonnes
On perd souvent du temps au début, mais cela vous en fera gagner énormément après
A+
Je dois:
copier / insérer C172: C246 dans DSN.sheet en A950 (le N° de la ligne est indiqué en C8)
copier / insérer D172: D246 dans DSN.sheet en A"i" (le N° de la ligne est indiqué en D8)
copier / insérer E172: E246 dans DSN.sheet en A"i" (le N° de la ligne est indiqué en E8)
copier / insérer F172: F246 dans DSN.sheet en A"i" (le N° de la ligne est indiqué en F8)
.....jusqu'a ce que la ligne 8 soit vide. C'est un Do ...loop until je crois
Re,
Essayez ceci, si j'ai bien compris
Sub IntégrationDansDSN()
Dim Col As Long, dLigS As Long, LigDSN As Long
' Avec la feuille de saisie
With Sheets("SAISIE")
' Pour les colonnes de C=3 à F=6
For Col = 3 To 6
' Récupérer le numéro de ligne ou insérer
LigDSN = .Cells(8, Col)
' Dernière ligne du bloc à insérer
dLigS = .Cells(Rows.Count, Col).End(xlUp).Row
' Copier les lignes et les insérer
.Range(.Cells(172, Col), .Cells(dLigS, Col)).Copy
' Les insérer au bon endroit dans la feuille DSN
Sheets("DSN").Range("A" & LigDSN).Insert Shift:=xlDown
Next Col
End With
End SubA+
Est il possible de mettre en couleur (n'importe laquelle) les cellules copiées dans DSN, pour s'y retrouver un peu quand j'aurais pleins de lignes? Si c'est compliqué ou long à faire c'est pas grave, ça me va trés bien comme ça déjà.
Donc il est possible de faire toutes ces actions, en même temps et sans boucle!! Vous avez posé 3 variables: les colonnes, le numéro de ligne à récuperer et ça:
.Cells(Rows.Count, Col).End(xlUp).Row permet de lui dire d'aller jusqu'a ce qu'il trouve une ligne vide.
Sheets("DSN").Range("A" & LigDSN).Insert Shift:=xlDown >> Dans la feuille DSN, en A et pour le numéro récupère la variable déterminée plus haut + l'instruction d'insérer copier.
Est ce que j'ai bien compris?
C'est vraiment cool.
Bonjour Bruno,
J'ai un problème de "tempo" avec la macro Intégration sur mon vrai fichier qui intègre presque 4000 lignes sur 15000.
Demande en version courte:
Serait il possible d'ajouter à la macro "puis tire B1 de "DSN" vers le bas jusqu'à la ligne 16000
copier / insérer C172: C246 dans DSN.sheet en A950 (le N° de la ligne est indiqué en C8) puis tire B1 de "DSN" vers le bas jusqu'à la ligne 16000
copier / insérer D172: D246 dans DSN.sheet en A"i" (le N° de la ligne est indiqué en D8) puis tire B1 de "DSN" vers le bas jusqu'à la ligne 16000
.....jusqu'a ce que la ligne 8 soit vide.
Explications:
La macro de base fonctionne mais a chaque fois qu'un petit bout est intégré, ma colonne B de DSN n'a pas toujours le temps de se mettre à jours pendant l'exécution de la macro et le N° de ligne en ligne 8 devient faux. (> "trop rapide")
J'ai essayé de rendre fixe le N° de ligne mais là encore ça ne fonctionne pas car l'intégration est réalisée colonne aprés colonne, le N° de ligne se décale au bout d'un moment. La macro met 5-6 secondes à effectuer la tache donc je pense que c'est normale.(>"Trop lente")
Si vous avez une autre idée je prends ;-)
Merci et bon week-end
Sub IntégrationDansDSN()
Dim Col As Long, dLigS As Long, LigDSN As Long
' Avec la feuille de saisie
With Sheets("SAISIE")
' Pour les colonnes de C=3 à F=6
For Col = 3 To 6
' Récupérer le numéro de ligne ou insérer
LigDSN = .Cells(8, Col)
' Dernière ligne du bloc à insérer
dLigS = .Cells(Rows.Count, Col).End(xlUp).Row
' Copier les lignes et les insérer
.Range(.Cells(172, Col), .Cells(dLigS, Col)).Copy
' Les insérer au bon endroit dans la feuille DSN
Sheets("DSN").Range("A" & LigDSN).Insert Shift:=xlDown
Next Col
End With
End Sub