VBA Faire correspondre un onglet avec un autre (x200)
Bonsoir à tous,
Dans l'élaboration de mon programme de gestion, j'ai un nouveau problème.
Tout d'abord, voici un bref résumé de mon programme:
J'aimerais obtenir un suivi des paiements de chaque médecin. Tout d'abord, j'encode des données dans un tableau correspondant à un médecin (l'onglet comporte le nom du médecin, ex: "Bartin Claire"). Ensuite, en appuyant sur un bouton comportant une macro, les données se sauvegardent dans la feuille à côté (qui comporte comme nom d'onglet "Bartin Claire synthèse). Après s'être sauvegardées dans le tableau, les données s'effacent du tableau de l'onglet principal du médecin "Bartin Claire" afin de pouvoir réutiliser ce tableau ... Il n'y a pas qu'un seul médecin, et donc il va y avoir un autre onglet avec un autre nom "Defoy Thomas" et "Defoy Thomas synthèse". Ainsi de suite ...
J'ai déjà effectué, grâce à des membres du forum, le tableau comportant les sauvegardes. Cependant, celui-ci se trouve dans le même onglet du médecin. Donc tout se trouve dans l'onglet "Bartin Claire" (voir photos). En d'autres termes, j'ai rajouté des onglets pour y mettre le tableau de sauvegarde afin de se faciliter la tâche pour l'impression.
- Tableau principal de l'onglet "Bartin Claire" où l'on va encodé des données et ensuite vont se supprimer:
- Tableau où se sauvegarde les données (toujours dans l'onglet "Bartin Claire"):
- Tableau où j'aimerais sauvegarder les données au lieu du 2ème tableau de sauvegarde le l'onglet "principal" du médecin (qui sera donc supprimé quand tout ira bien):
Voici le fichier en question:
J'ai encodé quelques données pour que vous sachiez à quoi correspondent les colonnes.
Voici le code VBA pour la sauvegarde du tableau dans le même onglet:
Sub sauvegarde()
Dim n%, nn%
With ActiveSheet
n = .Range("D52").End(xlUp).Row
If n = 1 Then Exit Sub: n = n - 1
nn = .Range("D" & .Rows.Count).End(xlUp).Row + 1
If Range("L" & nn).Value <> "" Then
nn = nn + 1
End If
Application.ScreenUpdating = False
.Range("D" & nn).Resize(n).Value = .Range("C2").Resize(n).Value
.Range("E" & nn).Resize(n).Value = .Range("G2").Resize(n).Value
.Range("F" & nn).Resize(n).Value = .Range("D2").Resize(n).Value
.Range("G" & nn).Resize(n).Value = .Range("E2").Resize(n).Value
.Range("H" & nn).Resize(n).Value = .Range("K2").Resize(n).Value
.Range("I" & nn).Resize(n).Value = .Range("L2").Resize(n).Value
.Range("J" & nn).Resize(n).Value = .Range("F2").Resize(n).Value
.Range("K" & nn).Resize(n).Value = .Range("N2").Resize(n).Value
.Range("L" & nn).Resize(n).Value = .Range("J2").Resize(n).Value
.Range("A" & nn) = .Range("T5")
.Range("C" & nn) = .Range("T3")
.Range("B" & nn) = .Range("T6")
nnn = .Range("D" & .Rows.Count).End(xlUp).Row
.Range("A" & nnn & ":T" & nnn).Borders(xlEdgeBottom).Weight = xlMedium
.Range("B2:F51").ClearContents
.Range("H2:L51").ClearContents
.Range("O2:O51").ClearContents
.Range("Q2:Q51").ClearContents
.Range("T5:T6").ClearContents
End With
End Sub
Que faut-il faire pour faire correspondre ce code dans l'onglet de synthèse. Et que ce soit pareil à chaque fois que j'ajoute une feuille (étant donné qu'il y a que 2 médecins mais il y en aura bien 200 au bout) donc ici ça devra être pareil pour Defoy Thomas et sa synthèse, qu'à chaque fois se soit lier?
Merci de votre aide !
Bonsoir,
peu-tu reportes ton code sans tes mise en formes ... le code se retrouve en blanc sur blanc sur mon écran soit illisible ...
re,
Tiens inspire toi de cela ...
Sub sauvegarde()
Dim n%, nn%
Dim sh as worSheet
Dim shDest as workSheet
set sh = ActiveSheet 'Feuille source
set shDest = ThisWorkBook.worksheets("Ma feuille synthése")
With ActiveSheet
n = .Range("D52").End(xlUp).Row
If n = 1 Then Exit Sub: n = n - 1
'---- Code de calcul nn devient inutile
'nn = .Range("D" & .Rows.Count).End(xlUp).Row + 1
' If Range("L" & nn).Value <> "" Then
' nn = nn + 1
' End If
Application.ScreenUpdating = False
' Toutes les lignes sous la forme :
'.Range("D" & nn).Resize(n).Value = .Range("C2").Resize(n).Value
'deviennent
shDest.Range("D2").Resize(n).Value = .Range("C2").Resize(n).Value
???? Il n'y a que moi qui ne vois pas les sources dans cette discussion ???
Merci pour ta réponse!
Et pour moi, toute la discussion est lisible
Et donc à chaque fois que je vais créer un autre onglet + sa feuille de synthèse, je devrai modifier le nom de la feuille de synthèse ? Ou je dois à chaque fois créer une nouvelle macro et l'affectée au bouton de l'onglet ?
J'en viens donc à modifier le code (ici dans l'onglet Defoy Thomas) :
Sub sauvegarde()
Dim n%, nn%
Dim sh As worSheet
Dim shDest As Worksheet
Set sh = ActiveSheet 'Feuille source
Set shDest = ThisWorkbook.Worksheets("Defoy_Thomas_synthèse")
With ActiveSheet
n = .Range("D52").End(xlUp).Row
If n = 1 Then Exit Sub: n = n - 1
End If
Application.ScreenUpdating = False
shDest.Range("D").Resize(n).Value = .Range("C2").Resize(n).Value
shDest.Range("E").Resize(n).Value = .Range("G2").Resize(n).Value
shDest.Range("F").Resize(n).Value = .Range("D2").Resize(n).Value
shDest.Range("G").Resize(n).Value = .Range("E2").Resize(n).Value
shDest.Range("H").Resize(n).Value = .Range("K2").Resize(n).Value
shDest.Range("I").Resize(n).Value = .Range("L2").Resize(n).Value
shDest.Range("J").Resize(n).Value = .Range("F2").Resize(n).Value
shDest.Range("K").Resize(n).Value = .Range("N2").Resize(n).Value
shDest.Range("L").Resize(n).Value = .Range("J2").Resize(n).Value
shDest.Range("A") = .Range("T5")
shDest.Range("C") = .Range("T3")
shDest.Range("B") = .Range("T6")
nnn = .Range("D" & .Rows.Count).End(xlUp).Row
shDest.Range("A" & nnn & ":T" & nnn).Borders(xlEdgeBottom).Weight = xlMedium
shDest.Range("B2:F51").ClearContents
shDest.Range("H2:L51").ClearContents
shDest.Range("O2:O51").ClearContents
shDest.Range("Q2:Q51").ClearContents
shDest.Range("T5:T6").ClearContents
End With
End Sub
J'ai ce message qui s'affiche en l'exécutant :
Erreur de compilation
Type défini par l'utilisateur non défini
re,
il manque un k :
Dim sh As worKSheet
après je comprends pas la question .., tu ne peu pas avoir plusieurs feuilles avec le même nom dans un même classeur..
après tu peu rajouter des paramètres et passer par exemple le nom des feuilles ou l'objet feuille en paramètre à ta procédure que tu met une feuille de code "module standard" de façon à pouvoir l’appeler de chacun de tes boutons..
Sub sauvegarde( stFeuilleSource as string, stFeuilleDest as string )
Dim n%, nn%
Dim sh As worSheet
Dim shDest As Worksheet
Set sh = ThisWorkbook.Worksheets(stFeuilleSource) 'Feuille source
Set shDest = ThisWorkbook.Worksheets(stFeuilleDest)
...
et pour les boutons cela donne un truc du genre
sub CommandButton_Click()
Sauvegarder "Defroy_Thomas","Defroy_Thomas_synthese",
end sub