Mise à jour tableau

  • Initiateur de la discussion Initiateur de la discussion Lulu01
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Lulu01

XLDnaute Nouveau
Bonjour tout le monde,

Tout d'abord merci, car cela fait quelques temps que je vous suis et aujourd'hui je franchis le pas. Je trouve ce forum bien utile et j'espère que ma question en aidera certains.


Voila mon problème. Toutes les semaines je recois un tableau data de taille variable et dont les entetes changent et je dois mettre à jour un tableau dont le format est fixe.

J'ai essayé d'automatiser la mise à jour du tableau mais sans succes.
J'ai du mal à trouver la bonne boucle et à rechercher le bon entete afin de selectionner la bonne colonne qui contient les données que je veux recuperer.
Pourriez-vous m'aider, s'il vous plait?


Ci-joint le fichier avec mon ebauche...
 

Pièces jointes

Re : Mise à jour tableau

Bonjour
Devant une telle instabilité du fichier source, je mettrais un système de confirmation des plages à prendre. J'ai un userform à usage général qui conviendrait très bien pour cela.
Son utilisation vous obligerait avant de faire quoique ce soit de préparer un maximum de choses déduisibles des entêtes trouvées, puis de lancer mon UfSelect.Ouvrir.
Il est possible de prédéfinir certaines plages lorsqu'on les connait (UfSelect.ÉtapePlage)
Une autre procédure recevant une liste de plages confirmées effectuerait le travail.
Elle se lancerait par un bouton "Go!" sur la forme.
Je retourne le classeur muni simplement du dispositif, sans y avoir inclu son utilisation, car je n'ai pas trop compris le détail de tout ça, que l'examen par vous des commentaires explicatifs dans UfSelect clarifierait.
À+

P.S. Conseil: Dissociez la confirmation des lignes à prendre de celle des colonnes entières intersectionnées avec elles.

P.S.2: La procédure pourrait se lancer avant même que le classeur source soit ouvert !
En effect l'userform, en mode non modal, supporte toutes ouvertures ou activations.
À l'exécution vous n'auriez plus à vous préoccuper du claseur source ni de sa feuille, vous recevez une liste de plages de la bonne source, dont il ne resterait plus qu'à récupérer les valeurs.
 

Pièces jointes

Dernière édition:
Re : Mise à jour tableau

Dranreb,

Merci pour cette réponse. J'ai jeté un coup d'oeil et cela semble être un code extremement poussé!

Je me demande tout de même si ce n'est pas un peu trop compliqué dans mon cas.
Le changement de format du fichier source (un fichier excel) correspond à 2 versions: un relevé mensuel et un relevé hebdomadaire.

Je pensais simplement faire comme cela:
1/ un user form dans lequel je cocherais "relevé mensuel" ou "relevé hebdomadaire" (je connais pour chaque version, le nom des 3 entetes dont j ai besoin)
2/ recherche du 1 entete correspondant dans la range Sheets ("data"). range ("a1:a256")
3/ definir cet entete en temps que range
4/ definir la colonne de l'en-tete du 2 row au dernier en tant que range
5/ faire un copie/paste
6/ et ainsi de suite
 
Re : Mise à jour tableau

Bonjour
Avec la fonction rechercheh exemple en
A2 =RECHERCHEH("Produit"; data; 2; FAUX) en A3 =RECHERCHEH("Produit"; data; 3; FAUX)
B2 =RECHERCHEH("reference produit"; data; 2; FAUX) en B3 =RECHERCHEH("reference produit"; data; 3; FAUX)
pour ce faire sélectionner les cellules de la feuille data et les nommer data...
A+ François
 
Re : Mise à jour tableau

À vous de voir. L'userform vous dispenserait de toute la gestion de définition des plages.
Et la simplicité de son utilisation est à la mesure de sa complexité interne.
Un exemple d'utilisation qui n'a rien à voir avec votre cas pour voir des exemple d'appels:
VB:
'

Sub SolutEqu()
UfSelect.Ouvrir "SolutEquGo", "Résolution d'un système d'équations linéaires par formule Excel", _
   "Rect:La matrice carrée m*m des M telle qu'à chacune des" & vbLf & "m lignes L : " _
      & ChrW$(8721) & " { pour C=1 à m: M(L,C) × X(C) } = Y(L)", _
   "Rect:La table des valeurs Y(L)" & vbLf _
      & "(plusieurs colonnes possibles)", _
   "Rect:La plage résultante à garnir des X(C), la solution du" & vbLf _
      & "système, orientée en lignes ou en colonnes à votre goût !"
End Sub
Sub SolutEquGo(TRg() As Range)
Dim NbL As Long, NbC As Long, Nbid As Long, OrIntui As Boolean, Déterm As Double, ZM As String, ZY As String, Z As String
With TRg(0): NbL = .Rows.Count: NbC = .Columns.Count: End With
If NbL <> NbC Then
   Nbid = Int(Sqr(NbL * NbC) + 0.5)
   UfSelect.ÉtapePlage 0, TRg(0)(1, 1).Resize(Nbid, Nbid), _
      "Votre matrice n'était pas carrée" & vbLf & "(" & NbL & " lignes de " & NbC & " colonnes)"
   Exit Sub: End If
NbC = TRg(1).Columns.Count
If TRg(1).Rows.Count <> NbL Then
   UfSelect.ÉtapePlage 1, TRg(1)(1, 1).Resize(NbL, NbC), "Votre table des valeurs Y comportait" _
      & vbLf & TRg(1).Rows.Count & " lignes au lieu de " & NbL
   Exit Sub: End If
With TRg(2)
   If NbL <> NbC Then
      OrIntui = NbL > NbC Xor .Rows.Count > .Columns.Count
   ElseIf TRg(2).Column = TRg(0).Column Then
      OrIntui = MsgBox("Ayant demandé les solutions aux mêmes colonnes que la matrice," _
         & vbLf & "désirez vous bien une ligne de coefficients X pour chaque somme Y ?" _
         & vbLf & "(sinon: le résultat sera orienté comme d'usage en algèbre matriciel)", _
         vbYesNo + vbQuestion, "Résolution système d'équations par formule Excel") = vbYes
   Else
      OrIntui = MsgBox("Hmm! c'est vraiment partout carré cette affaire là !" _
         & vbLf & "Désirez vous l'orientation appliquée en mathématique matricielle ?" _
         & vbLf & "(sinon orientation intuitive: une ligne de X pour chaque colonne Y)", _
         vbYesNo + vbQuestion, "Résolution système d'équations par formule Excel") = vbNo
      End If
   If OrIntui Then Nbid = NbL: NbL = NbC: NbC = Nbid
   If .Rows.Count <> NbL Or .Columns.Count <> NbC Then
      UfSelect.ÉtapePlage 2, .Resize(NbL, NbC), "Votre plage résultante n'était pas" _
      & vbLf & " dimensionnée convenablement"
      Exit Sub
      End If
   End With
On Error Resume Next
Déterm = WorksheetFunction.MDeterm(TRg(0))
If Déterm = 0 Then Z = "pas de solution" Else Z = "solution en bonne voie"
MsgBarreÉtat "Matrice " & DescrZones(TRg(0)) & ": Déterminant = " & Déterm & " (" & Z & ")."
ZM = TRg(0).Name.Name
If Err <> 0 Then ZM = TRg(0).Address(True, True, xlR1C1, TRg(0).Worksheet.Name <> TRg(2).Worksheet.Name)
Err.Clear
ZY = TRg(1).Name.Name
If Err <> 0 Then ZY = TRg(1).Address(True, True, xlR1C1, TRg(1).Worksheet.Name <> TRg(2).Worksheet.Name)
Err.Clear
Z = "MMULT(MINVERSE(" & ZM & ")," & ZY & ")"
If OrIntui Then Z = "=TRANSPOSE(" & Z & ")" Else Z = "=" & Z
TRg(2).FormulaArray = Z
If Err <> 0 Then
   MsgBox "Installation de :" & vbLf & """" & Z & """" & vbLf & "==> Err." & Err.Number & ": " & Err.Description, _
      vbCritical, "Résolution système d'équation"
   UfSelect.Réactiver
Else
   UfSelect.Fermer
   End If
End Sub
 
Dernière édition:
Re : Mise à jour tableau

Je vous indique quand même le code de la partie centrale d'un système d'importation
VB:
Rem. ———— Ajustement du nombre de lignes d'accueil
ThisWorkbook.Activate
Set RgCbl = Application.Range(RgRéfCbl.Value).EntireRow: LCblMax = RgCbl.Rows.Count
RgCbl.Worksheet.Activate
If LCblMax < LSrcMax Then
   RgCbl.Rows(LCblMax).Copy
   RgCbl.Rows(LCblMax).Resize(LSrcMax - LCblMax).Insert
ElseIf LCblMax > LSrcMax Then
   RgCbl.Rows(LSrcMax + 1).Resize(LCblMax - LSrcMax).Delete
   End If
Set RgCbl = RgCbl.Resize(LSrcMax)

Rem. ———— Rectification référence plage cible
On Error Resume Next
Set ObjNom = RgCbl.Name: If Err Then Set ObjNom = Nothing
On Error GoTo 0
If ObjNom Is Nothing Then
   s = Split(RgCbl.Address(True, True, xlA1, True), "[")
   RgRéfCbl.Value = s(0) & Split(s(1), "]")(1)
Else
   RgRéfCbl.Value = ObjNom.Name
   End If
   
Rem. ———— Importation
Application.Calculation = xlCalculationManual
For C = 1 To UBound(tCol, 1)
   If tCol(C, 2) <> "" Then
      On Error Resume Next
      Set Rg = Application.Range(tCol(C, 2))
      If Err Then MsgBox "Impossible d'isoler """ & tCol(C, 2) & """ dans cette feuille :" _
         & vbLf & Err.Description, "Importation": GoTo Épilogue
      Set Rg = Intersect(Rg, RgCbl)
      If Err Then Set Rg = Nothing: Z = Err.Description Else Z = "(Ce n'est pas lié à une erreur d'exécution.)"
      On Error GoTo 0
      If Rg Is Nothing Then MsgBox "Il n'y a pas d'intersection de """ & tCol(C, 2) & """ avec """ _
         & RgCbl.Address & """ dans cette feuille." & vbLf & Z, "Importation": GoTo Épilogue
      Rg.Value = RgSrc.Columns(C).Value
      End If
   Next C
Application.Calculation = xlCalculationAutomatic
Il se paramètrait de puis une feuille de contôle Excel. Je ne pouvais vous le proposer car il impliquait des classeurs sources issus d'autres applications ayant toujours la même structure. Mais vous pouvez vous inspirer de larges passages. RgRéfCible est une des cellules de la feuille de contrôle, vous pouvez supprimer tout se qui s'y rapporte.
L'important à y voir est en tête: ce serait dommage de ne pas profiter de la nécessité de la macro pour ajuster convenablement la plage d'acceuil de façon que toutes références vers cette plage soient automatiquement corrigées (zone d'impression, plage nommée, formules et autres peut être).
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour