XL 2013 Importation et mise à jour (code de job)

an@s

XLDnaute Occasionnel
Bonsoir à tous,
dans l'exemple ci-joint j'essaie de faire l'importation des données de feuille Balance vers le classeur CB à partir de la cellule A8.
en plus de ça pour chaque ligne importée je saisie un code manuellement dans la colonne F et quand je fais l'importation une deuxième fois le code importe les nouvelles lignes et garde les anciennes avec le même code.
le problème sur mon exemple c'est que je n'ai pas une seule colonne de référence sans doublons, mais pour éviter cela il faut considérer trois colonnes A, C et D chose qui m'empêche d'appliquer le même code ci-dessous produit par JOB dans un exemple similaire.

Merci d'avance
An@s


VB:
Private Sub CommandButton1_Click()
Dim t, nlig&, d As Object, i&, rest(), j&
Application.ScreenUpdating = False
With Workbooks.Open(ThisWorkbook.Path & "\Paie-Mens.xlsx").Sheets("Feuil1")
  t = .Range("A5:AC" & .Range("F" & .Rows.Count).End(xlUp).Row + 2)
  nlig = UBound(t)
  .Parent.Close False
End With
'---restitution du 1er tableau---
[E:E].Copy [AE1] 'sauvegarde la colonne E (matricules) en colonne auxiliaire AE
Range("A3:AC" & Rows.Count).ClearContents 'RAZ
[A3].Resize(nlig, 29) = t
'---liste des noms du 1er tableau---
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(t)
  If t(i, 5) <> "" Then d(t(i, 5)) = i 'repère la ligne
Next i
'---création du 2ème tableau (rest)---
t = Range("AD3:AE" & Range("AE" & Rows.Count).End(xlUp).Row + 1)
ReDim rest(1 To nlig, 1 To 1)
For i = 1 To UBound(t)
  If t(i, 2) <> "" And d.Exists(t(i, 2)) Then rest(d(t(i, 2)), 1) = t(i, 1)
Next i
'---restitution du 1er tableau rest---
[AE:AE].Delete 'à l'origine on a mis des formules en colonne AE
Range("AD3:AD" & Rows.Count).ClearContents 'RAZ
[AD3].Resize(nlig) = rest
'---Bordures---
Rows("3:" & Rows.Count).Borders.LineStyle = xlNone 'RAZ
For i = nlig To 1 Step -1
  If Range("D" & i + 2) <> "" Then 'dernière ligne effective
    [A3].Resize(i, 30).Borders.Weight = xlThin
    [A3].Resize(i, 30).Borders(xlInsideHorizontal).LineStyle = xlDot
    '[A3].Resize(i, 30).Borders(xlInsideHorizontal).Weight = xlHairline 'si l'on préfère
    Exit For
  End If
Next i
With ActiveSheet.UsedRange: End With 'actualise les barres de défilement
End Sub
 

Pièces jointes

  • Balance.xlsx
    10.3 KB · Affichages: 26
  • CB.xlsm
    24.7 KB · Affichages: 30

an@s

XLDnaute Occasionnel
Bonjour Job, Dranreb, le forum
Draneb, votre code beug chez moi. quand je l’exécute un message d'erreur affiche : incompatibilité de type (pouvez vous voir d'ou vient le problème ?)

Job,merci pour votre réponse. j'ai ajouté une colonne A de référence dans la feuille Balance et j'ai adapté le même code produit par votre part dans cet exemple comme vous pouvez remarquer.

ce que je souhaite maintenant c'est d'avoir un autre code lié au bouton <Dispatching> pour ventiler les montants de la colonne F sur les feuilles qui sont déjà créées.

j'explique:

les codes que j'ai sur la colonne G sont aussi les noms des feuilles que j'ai dans le fichier CB.
ce qui faut faire c'est de prendre par exemple le montant de la cellule F8 (RECAP) qui est 658 et il vérifie le nom de la feuille dans la colonne G dans notre cas G8 =RH puis il vérifie le libellé de la colonne B qui est ACHATS DE PETIT OUTILLAGE ET EQUIPEMENT ensuite il vérifie le mois dans la colonne E qui est dans ce cas 052018 donc le mois de Mai et il va mettre le montant dans la cellule G8 de la feuille RH car elle correspondant à la colonne du même mois et la même ligne du libellé.

je donne un autre exemple de la ligne 11 de la feuille RECAP:
pour ventiler le montant de F11 qui est 1050, a feuille correspondante c'est à dire G11 est DCG, le mois correspondant est E11 201801, et le libellé relatif est B11 qui est ACHATS DES PREST. ARCHIVAGE donc le montant sera ventilé dans la cellule C9 de la feuille DCG.

NB: si le code retrouve des lignes dont les cellules B, E et G sont les mêmes il fut faire la somme des montants correspondant et ventiler le total dans la feuille concernée.
exemple des lignes 6 et 47 de la feuille RECAP B6=B47, E6=E47, G6=G47 donc la somme des F6 et F47 = 26 077 sera ventilé dans la cellule E13 de la feuille AAG

Merci d'avance

Cordialement
An@s
 

Pièces jointes

  • Balance.xlsx
    10.6 KB · Affichages: 19
  • CB.xlsm
    109.2 KB · Affichages: 22

Dranreb

XLDnaute Barbatruc
Bonjour.
Ce n'est pas ma macro dans le classeur joint.
Le GigogneAn@s.xlsm ne bloguait pas chez moi, du moins avec le Balance.xlsx ouvert la dernière fois.
Avec le nouveau, vu que vous avez ajouté une colonne devant, évidemment if faut remplacer [A2:F2] par [B2:G2]
Nouveau code :
VB:
Option Explicit
Private Sub CommandButton1_Click()
Dim WbkBal As Workbook, NatOpé As SsGr, Descr As SsGr, Mois As SsGr, _
   T(1 To 5000, 1 To 6), L As Long, Détail, C As Long
On Error Resume Next
Set WbkBal = Workbooks("Balance.xlsx")
If Err Then Err.Clear: Set WbkBal = Workbooks.Open(ThisWorkbook.Path & "\Balance.xlsx")
If Err Then MsgBox Err.Description, vbCritical: Exit Sub
On Error GoTo 0
'For Each NatOpé In Gigogne(TableUnique(Feuil1.[A8:F8], WbkBal.Sheets("Feuil1").[A2:F2]), 1, 3, 4)
For Each NatOpé In Gigogne(TableUnique(Feuil1.[A8:F8], WbkBal.Sheets("Feuil1").[B2:G2]), 1, 3, 4)
   For Each Descr In NatOpé.Co
      For Each Mois In Descr.Co
         L = L + 1
         For Each Détail In Mois.Co
            If Détail(0) = 0 Then
               For C = 1 To 6: T(L, C) = Détail(C): Next C
            Else
               For C = 1 To 5: T(L, C) = Détail(C): Next C
               End If: Next Détail, Mois, Descr, NatOpé
'Feuil1.[A8].Resize(UBound(T, 1), UBound(T, 2)).Value = T ' instruction définitive
Feuil1.[H8].Resize(UBound(T, 1), UBound(T, 2)).Value = T ' intruction de test
End Sub
 

zebanx

XLDnaute Accro
Bonjour à An@s, Dranreb, Job75, le forum

Un essai avec de multiples traitements

Préalable : Je ne me suis pas du tout occupé de la partie de collecte des données donc commence à travailler à partir d'une feuille RECAP sur CB à jour...

Idée pour la ventilation évoquée en #4
1. Les feuilles sont uniques mais les tableaux normés. Donc on va affecter à chaque cellule (code analytique, mois) une adresse.
2. On a un tableau après transposition grace à un code de Klin89
3. On fait glisser 2 formules dans le tableau (sheet "recap") permettant d'avoir le mois et cette cellule de référence
4. On passe avec un dictionnaire (code Laetitia90 / Job75) pour agréger les données.
5. On ventile (macro "remplir")
Le résultat est rapide.

@+

@Dranreb
Pour information. Blocage moi aussi en exécution (F8 depuis VBE) au niveau de:
- NatOpé As SsGr, Descr As SsGr, Mois As SsGr (ok je supprime "option explicite" et mets cette partie en ')
- TableUnique (msgbox : erreur de sub ou fonction non définie)
La macro complémentaire (giglx.xla) est bien installée (version 2003), cochée et fonctionne, du moins sur un code précédemment transmis.
Le code transmis en #5 est mis dans la feuille ("RECAP").
 

Pièces jointes

  • CB.xls
    497.5 KB · Affichages: 21
Dernière édition:

an@s

XLDnaute Occasionnel
Bonjour à tous,
merci Job, Dranreb, zebanx pour vos réponses.

pour la première partie du code concernant l'importation je l'ai réglé comme vous pouvez remarquer en appliquant le code du job ci-dessus.
maintenant est ce qu'il y'a possibilité d'avoir un code pour résoudre la deuxième partie de mon exemple si c'est possible ?

Merci d'avance

Cordialement
An@s
 

ChTi160

XLDnaute Barbatruc
Bonsoir
Bonsoir le Fil,le Forum
une approche de la deuxième demande "DISPATCHING"
j'ai du modifier les Intitulés Fevrier de chaque feuille en Février .
Demande d'Info :

je n'ai pas compris , comment sont déterminés les Noms de Feuilles lors du transfert des données depuis le Fichier "Balence" ?

Bonne fin de Soirée
jean marie
 

Pièces jointes

  • CB-Chti160.xlsm
    135.8 KB · Affichages: 13
Dernière édition:

ChTi160

XLDnaute Barbatruc
Re
Une autre version avec quelques Ajouts (mise en forme etc )
Question : pourquoi ne pas creer un tableau de correspondance des services et de leurs abreviations ?
jean marie
 

Pièces jointes

  • CB-Chti160-2.xlsm
    140.6 KB · Affichages: 13
Dernière édition:

an@s

XLDnaute Occasionnel
Bonsoir Chti160, le forum

merci beaucoup pour votre réponse qui répond parfaitement à ma demande.
pour votre question concernant les feuilles: elles sont créées à l'avance et chaque feuille correspond à un département
je n'ai mis toutes les feuilles de tout les département mais j'ai fait le test en ajoutant une nouvelle feuille et appliquer votre code et ça marché.

en revanche j'ai des petites remarques a rectifier si c'est possible :
- Est ce que je peux supprimer l'onglet <Feuile test> et cette ligne du code sans que cela n'impact le fonctionnement du code? 'Worksheets("Feuille Test").Range("A1").Resize(UBound(TabRecap, 2), UBound(TabRecap, 1)) = Application.Transpose(TabRecap
parce que je ne dois avoir d'autres feuilles sauf celles qui sont déjà sur le fichier

- En cliquant sur le bouton Dispatching le classement des lignes du tableau de l'onglet RECAP change, est ce que c'est possible de garder le même classement des lignes par numéro de colonne A ???

- En cliquant sur le bouton Dispatching le code supprime les valeurs de la colonne B des feuilles qui concerne le budget, alors que le code ne doit pas toucher cette colonne vu que je la remplie manuellement

merci infiniment une autre fois

Cordialement
An@s
 

Discussions similaires

Statistiques des forums

Discussions
314 719
Messages
2 112 179
Membres
111 452
dernier inscrit
christine64