Copier un tableau dans une centaine de feuilles et créer des liens hypertextes automa

ckoebel5

XLDnaute Junior
Bonjour,
Je suis débutant en VBA mais je compte bien m’améliorer !
Par contre je suis impatient d’avoir quelques réponses, et pour l’instant je préfère demander de l’aide plutôt que d’apprendre pas à pas… mais cela va venir.

Voilà j’ai une feuille « liste des élèves » composée de plus d’une centaine de lignes (des élèves) dans la feuil3, la colonne C (prénoms).

1) J’aimerais affecter un lien à chaque prénom Cn pour qu’il renvoie à une feuille Feuiln du même classeur.
J’ai déjà crée ces feuilles qui portent le prénom de chaque élève (grâce à une macro
trouvée chez vous mais que j’ai sans doute maladroitement modifiée, mais ça marche ) qui pour l’instant sont vierges.

2) Dans chaque feuille Feuiln, j’aimerais coller un tableau « modèle » identique pour tous au départ, (et que ce tableau s’affiche en zoom plein écran (ça ça serait la cerise sur le gateau), sauf que sur chaque feuille j’aimerais aussi un lien qui renvoie à la « ligne » n du tableau liste des élèves et que les valeurs de ce tableau soient aussi recopiées à la ligne n.

Vous avez sans doute deviné que je suis enseignant (au collège), mais pas d’informatique !!!!

Je ne sais si une personne aura la grande âme de m’aider, en tout cas, je la remercie d’avance pour sa contribution:) et ça m’aidera franchement à être plus efficace surtout lorsque je travaillerai avec une tablette PC.

Christophe
 

ckoebel5

XLDnaute Junior
Re : Copier un tableau dans une centaine de feuilles et créer des liens hypertextes a

Bonjour, j'ai écrit un code un peu plus sérieux et qui semble bien marcher pour l'insertion.
Code:
Sub InsertSout() 'change la chaine de caract des soutiens dans la liste des élèves car la liste des soutiens évolue
Dim L As Long, Sinsert As String, Sout As String, PlgSout As Range, Z As String, P As Long, C As String, k As Integer, 
Sinsert = TbxInsert.Text
For L = 2 To FLstÉlv.Range("A65536").End(xlUp).Row       ' dernière ligne non vide
    Set PlgSout = FLstÉlv.[Soutiens].Rows(L)
    Z = PlgSout.Value
    If Not Z = "" Then
        For k = Len(Z) - 2 To 1 Step -3
            If Val(Mid$(Z, k, 2)) > Val(Sinsert) Then
                C = Mid$(Z, k, 2)
                C = C + 1
                If Len(C) = 1 Then C = "0" & C
                Z = Left$(Z, k - 1) & C & Mid$(Z, k + 2)
            End If
         Next k
    End If
    FLstÉlv.[Soutiens].Rows(L) = Z
Next L
End Sub

Oui, ma méthode n'est pas forcément le plus astucieuse mais je vous rappelle que un de mes buts est "d'apprendre" à programmer, en tout cas de progresser modestement. donc je m'étais posé comme défi de programmer sans faire ce que vous avez dit (mais que je vais faire à présent pour savoir).

Cordialement.
 

Dranreb

XLDnaute Barbatruc
Re : Copier un tableau dans une centaine de feuilles et créer des liens hypertextes a

Bonjour
Après tout c'est une autre approche qui n'est peut être pas si mauvaise. Au moins vous ne changez que les numéros qui existent.
Moi je voulais changer partout d'un seul coup tous les numéros possibles mêmes s'ils ne sont pas utilisés (en partant du dernier dans le cas d'un ajout pour ne pas retoucher ceux qui viennent d'être changés. Ça faisait une boucle avec moins de passage (seulement autant que de numéros possibles et non pas autant que d'élèves existant)
Juste: CLng serait mieux que Val, mais n'est pas nécessaire puisque vous comparez deux chaines. J'aurais écris un en une ligne:
VB:
C = Mid$(Z, k, 2): If C > SInsert Then Mid$(Z, K, 2) = Format(C + 1, "00")
Eh oui, Mid est aussi une instruction.

Cordialement.
 

ckoebel5

XLDnaute Junior
Re : Copier un tableau dans une centaine de feuilles et créer des liens hypertextes a

Merci, ça marche puissamment.

Autre question, avec les textbox note d oral, j'ai écrit la programmation pour le calcul de la moyenne qui est écrite soit dans la colonne du 1er, 2è ou 3è trimestre, parfois il peut m'arriver d'enlever une mauvaise note à l'oral et de la remplacer par une lettre donc il y a parfois des lettres dans les textbox d'oral.
Voici mon code:
Code:
Private Sub CalcOralMoy()
Dim j As Integer, Oralmoy, Tot
j = 0
Tot = 0
If IsNumeric(TbxO_1.Text) = True And TbxO_1.Text <> "" Then
j = j + 1
Tot = Tot + Val(TbxO_1.Text)
End If
If IsNumeric(TbxO_2.Text) = True And TbxO_2.Text <> "" Then
j = j + 1
Tot = Tot + Val(TbxO_2.Text)
End If
If IsNumeric(TbxO_3.Text) = True And TbxO_3.Text <> "" Then
j = j + 1
Tot = Tot + Val(TbxO_3.Text)
End If
If IsNumeric(TbxO_4.Text) = True And TbxO_4.Text <> "" Then
j = j + 1
Tot = Tot + Val(TbxO_4.Text)
End If
If IsNumeric(TbxO_5.Text) = True And TbxO_5.Text <> "" Then
j = j + 1
Tot = Tot + Val(TbxO_5.Text)
End If
If IsNumeric(TbxO_6.Text) = True And TbxO_6.Text <> "" Then
j = j + 1
Tot = Tot + Val(TbxO_6.Text)
End If
If j > 0 Then Oralmoy = Tot / j
If ActiveWorkbook.Name Like "*1*" Then TbxOralMoy1 = Oralmoy
If ActiveWorkbook.Name Like "*2*" Then TbxOralMoy2 = Oralmoy
If ActiveWorkbook.Name Like "*3*" Then TbxOralMoy3 = Oralmoy
End Sub

Il ne me satisfait pas trop, j'ai d'abord voulu l'écrire avec une boucle for i = 1 to 6....
Mais je n'y suis pas parvenu. Y a t'il une façon de faire pour indiquer la Tbx0_ i ?

Cordialement.
 

Dranreb

XLDnaute Barbatruc
Re : Copier un tableau dans une centaine de feuilles et créer des liens hypertextes a

Oui: Me.Controls("TbxO_" & i)
À part ça IsNumeric(...) est une expression booléenne, c'est à dire du type requis derrière un If.
Il est idiot de comparer une expression booléenne à True
puisque True = True c'est True, False = True c'est False, donc IsNumeric(...) = True c'est IsNumeric(...) tout seul !
"=" est un opérateur de comparaison: il sert à fabriquer une expression booléenne à partir de données d'un autre type.
On n'en a pas besoin pour combiner des expressions booléennes.
Les expressions booléennes ont leurs propres opérateur Eqv, Xor, And, Or, Imp, et l'inverseur Not.
Eqv doit être préféré à =
Xor doit être préféré à <>
 

ckoebel5

XLDnaute Junior
Re : Copier un tableau dans une centaine de feuilles et créer des liens hypertextes a

Bonjour!
Je me suis mis à la création d'un nouvel Userform afin de gérer les compétences et le socle commun je dois avouer que ce travail est assez lourd.

Voici deux questions mais d'abord le code déjà écrit:
Code:
Option ExplicitDim LÉlv As Long, PlgComp As Range, ColComp As Long, Comp As String, ChaineComp As String


Private Sub ChercheRangeCompElv() 'cherche la chaine de caractères dans FlstElv de la Compétence choisie pour l'élève choisi
LÉlv = FCtrl.[LgnÉlv].Value
Comp = FCtrl.[CompSél].Value
If Comp = "" Then
   MsgBox "Aucune compétence n'est sélectionnée", vbCritical, "Modification des compétences"
   Exit Sub
End If


ColComp = FLstÉlv.Cells.Find(What:=Comp).Column    ' d abord faire trouver la colonne de la compétence


Set PlgComp = FLstÉlv.Columns(ColComp).Rows(LÉlv)
ChaineComp = PlgComp.Value       'la chaine de caract de la compétence pour l eleve donné
End Sub


Private Sub ListerRésultatClasse()
Dim TLC As Range, Lign As Long, dL As Long, L As Long
UfComp.LbxRésultClasse.Clear
Set TLC = FLstÉlv.[TouteLaClasse]
dL = TLC.Row - 1
For L = 1 To TLC.Rows.Count
   Lign = L + dL
 If Comp = "" Then UfComp.LbxRésultClasse.AddItem FLstÉlv.[Prénom].Rows(Lign).Value
 If Comp <> "" Then UfComp.LbxRésultClasse.AddItem FLstÉlv.[Prénom].Rows(Lign).Value & "     " & FLstÉlv.Columns(ColComp).Rows(Lign).Value
Next L
End Sub


Private Sub BtSélA_Click()
ChercheRangeCompElv
On Error Resume Next
ChaineComp = ChaineComp + "A"
PlgComp.Value = ChaineComp
ListerRésultatClasse
End Sub


Private Sub BtSélB_Click()
ChercheRangeCompElv
On Error Resume Next
ChaineComp = ChaineComp + "B"
PlgComp.Value = ChaineComp
ListerRésultatClasse
End Sub


Private Sub BtSélC_Click()
ChercheRangeCompElv
On Error Resume Next
ChaineComp = ChaineComp + "C"
PlgComp.Value = ChaineComp
ListerRésultatClasse
End Sub


Private Sub BtSélD_Click()
ChercheRangeCompElv
On Error Resume Next
ChaineComp = ChaineComp + "D"
PlgComp.Value = ChaineComp
ListerRésultatClasse
End Sub


Private Sub ListBox172_Click()   'cette procédure ne fonctionne pas comme je le voudrais, mais avec un temps de retard, car s' affichent les résultats de l'item cliqué précédemment mais pas présentement, dans la fiche ctrl s'est bien le bon CompSél qui est affiché mais la procédure travaille avec l'ancien....why?
ChercheRangeCompElv
On Error Resume Next
PlgComp.Value = ChaineComp
ListerRésultatClasse
End Sub


'Private Sub ListBox172_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
 'le même code qu'au dessus ici fonctionne parfaitement pourquoi ça marche ici et pas au dessus avec click????


'End Sub

1) Vous avez pu découvrir m'a première question à l'intérieur du code ci-dessus.
2) Cet Userform contient plusieurs controls multipage...(3 niveaux différents) donc ça fait énormément de listbox ... plus d'une soixantaine! Y a t il un moyen pour que la dernière procédure puisse être réécrite pour être valable pour chaque listbox de l'Uf ou faut-il la reécrire autant de fois qu'il y a de list?

Cordialement.
 

Dranreb

XLDnaute Barbatruc
Re : Copier un tableau dans une centaine de feuilles et créer des liens hypertextes a

Bonjour.
Je n'ai pas de réponse à votre 1ère question. J'ai beaucoup de mal à voir ce que vous voulez faire, n'ayant pas le fichier sous la main.
J'ai la vague impression que vous vous lancez de nouveau sur quelque chose de peu rationnel. Un peu comme votre idée d'origine de créer une fiche pour chaque élève au lieu de faire ce qu'on a fait.
Cordialement.
 

ckoebel5

XLDnaute Junior
Re : Copier un tableau dans une centaine de feuilles et créer des liens hypertextes a

Bonjour.
Alors voici le fichier réduit, ne contenant que l'userform déjà suffisamment volumineux. Merci pour votre "vague impression", en faît j'ai choisi des controls "multipage" pour avoir une meilleure visibilité et accessibilité. Il eût été plus simple bien sûr de faire et de programmmer une listbox unique comme vous l'aviez fait avec l'uf soutien mais là il y a tout de même prêt de 270 items aussi j'ai préféré fractionner par catégories.

En haut à gauche les 4 boutons de "notation", en bas à gauche le multipage, à droite la listbox des résultats.

Cordialement.
 

Pièces jointes

  • Uf Comp.xls
    279 KB · Affichages: 115

Dranreb

XLDnaute Barbatruc
Re : Copier un tableau dans une centaine de feuilles et créer des liens hypertextes a

Bonjour.
Je n'ai toujours pas assez d'éléments. Il m'aurait aussi fallu la feuille Liste des élèves et peut être la feuille de contrôle.
je bloque dès cette instruction:
ColComp = FLstÉlv.Cells.Find(What:=Comp).Column
Alors vous cherchez dans toute la feuille un numéro correspondant à la dernière sélection d'une ligne dans une ListBox particulière parmi un bon nombre. Je me demande sur quoi vous pouvez bien tomber ?! À partir du moment ou vous avez du code dans l'UF vous auriez sans doute dans ce cas intérêt à ne plus utiliser ControlSource et à gérer vous même le renseignement de CompSél d'une information plus précise.
Il me semble aussi que quatre ComboBox enchaînés auraient été mieux que vos MultiPage.
 

ckoebel5

XLDnaute Junior
Re : Copier un tableau dans une centaine de feuilles et créer des liens hypertextes a

Je tombe sur la colonne recherchée tout simplement, mais sans doute devrais je préciser par sécurité et efficacité de ne chercher que dans la première ligne de la feuille. Comment coder cela?

et comment et pourquoi définir CompSél plus précisement? CompSél = contenu de 1ere colonne de selected item, n'est ce pas suffisant? c'est bien cela un controlSource si j'ai bien compris...

Quant au choix d'un multipage vs ComboBox? Je ne sais trop, ça se discute, sur le coup et sans recul je trouvais que le choix multipage me convenant d avantage et plus esthétique quoique je ne vois pas trop la différence à l'usage. A présent que je suis embarqué dans ce choix, je peux bien sûr toujours rebrousser chemin, mais a) je ne suis pas convaincu b) j'aimerais néanmoins aller au bout de ce que j'avais envisagé... au moins pour combler mon ignorance.

Cordialement.
 

Pièces jointes

  • Classeur2.xls
    234 KB · Affichages: 61
  • Classeur2.xls
    234 KB · Affichages: 66
  • Classeur2.xls
    234 KB · Affichages: 67

Dranreb

XLDnaute Barbatruc
Re : Copier un tableau dans une centaine de feuilles et créer des liens hypertextes a

de ne chercher que dans la première ligne de la feuille. Comment coder cela
Ah ben oui, comme ça c'est tout de suite beaucoup plus clair. Mettez Rows(1) au lieu de Cells
CompSél = contenu de 1ere colonne de selected item, n'est ce pas suffisant? c'est bien cela un controlSource si j'ai bien compris...
Oui. J'ai peut être dit une bêtise.
Cela dit ça ne marche pas et je n'ai aucune idée pourquoi.
Peut être un problème de conflit avec tout ces ListBox qui ont le même ControlSource. Vous aurez bien du mal à gérer le changement simultané des deux: celui qui contenait l'ancien code et celui sélectionné.
Il vaudrait mieux n'en avoir qu'un dont vous changez le contenu de List en fonction des autre choix.
Peut être aussi la valeur du Contrôle est elle inscrite dans la cellule ControlSource seulement après l'évènement Change. Dans ce cas travaillez avec la valeur de contrôle plutôt qu'avec la cellule dans cette procédure.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 719
Messages
2 112 183
Membres
111 455
dernier inscrit
Jacandre