Transformer un code long

Bonjour à tous,

Je ne suis pas à l'aise avec les variables.

Je pense qu'il y a une solution pour réduire le code ci joint en quelques lignes.

si quelqu'un aurait la solution se serait un plaisir de pouvoir soulager la programmation.

Merci d'avance

Amicalement

Noel

Private Sub ChiffreMois_Change() If ChiffreMois = 7 Then Label1 = Range("M3") TextBox1 = Range("N3") TextBox1.BackColor = ActiveSheet.Range("N3").Interior.Color Label2 = Range("M4") TextBox2 = Range("N4") TextBox2.BackColor = ActiveSheet.Range("N4").Interior.Color Label3 = Range("M5") TextBox3 = Range("N5") TextBox3.BackColor = ActiveSheet.Range("N5").Interior.Color Label4 = Range("M6") TextBox4 = Range("N6") TextBox4.BackColor = ActiveSheet.Range("N6").Interior.Color Label5 = Range("M7") TextBox5 = Range("N7") TextBox5.BackColor = ActiveSheet.Range("N7").Interior.Color Label6 = Range("M8") TextBox6 = Range("N8") TextBox6.BackColor = ActiveSheet.Range("N8").Interior.Color Label7 = Range("M9") TextBox7 = Range("N9") TextBox7.BackColor = ActiveSheet.Range("N9").Interior.Color End If End Sub

Bonjour cfn3cfn, le forum,

Un essai....(pas testé car pas de fichier....)

Private Sub ChiffreMois_Change()
 Dim i As Integer

   For i = 1 To 7
    If ChiffreMois = 7 Then
     Label(i) = Range("M" & i + 2)
      TextBox(i) = Range("N" & i + 2)
       TextBox(i).BackColor = ActiveSheet.Range("N" & i + 2).Interior.Color
    End If
   Next i
End Sub

Cordialement,

Bonjour xorsankukai,

Je te comprends. Pour le moment j'ai pas de fichier mais j'essaye de comprendre .

Dim i As Integer For i = 1 To 7 [color=#FF0000]représente quoi?[/color] If ChiffreMois = 7 Then Label(i) = Range("M" & i + 2) [color=#FF0000]et le 2 représente quoi également?[/color] TextBox(i) = Range("N" & i + 2) TextBox(i).BackColor = ActiveSheet.Range("N" & i + 2).Interior.Color End If Next i

Je suis pour apprendre mais non pas pour faire un copier/coller sans comprendre.

Merci d'avance de tes explications.

Amicalement

Noel

Re,

Je te comprends. Pour le moment j'ai pas de fichier mais j'essaye de comprendre .

Pas de souci, seulement j'aime bien tester mon code avant de le poster, histoire d'être sûr qu'il soit fonctionnel,

Tout comme toi, je suis en phase d'apprentissage,

 For i = 1 To 7
 next i

Comme tu as 7 textbox et qu'à chaque fois tu dis que label textbox = valeur de cellule M + N° label +2 (si textbox1: M3, si textbox2, M5, etc...), j'ai donc choisi de faire une boucle for sur tes Textbox.

Donc au premier tour de boucle, i=1, au deuxième i=2, etc...jusqu'à 7.

https://www.excel-pratique.com/fr/vba/boucles.php

Il y a peut-être moyen de faire mieux, si tel est le cas, d'autres propositions devraient arriver,

Amitiés,

Bonjour,

"TextBox(i)" ne représente pas un contrôle de formulaire, il faut utiliser ce code :

Private Sub ChiffreMois_Change()
    Dim i As Integer

    If ChiffreMois = 7 Then
        For i = 1 To 7
            Me.Controls("Label" & i) = ActiveSheet.Range("M3").Offset(i - 1)
            Me.Controls("TextBox" & i) = ActiveSheet.Range("N3").Offset(i - 1)
            Me.Controls("TextBox" & i) = ActiveSheet.Range("N3").Offset(i - 1).Interior.Color
        Next i
    End If
End Sub

où "Me" représente l'objet formulaire

et ci-dessous très certainement un code plus générique :

Private Sub ChiffreMois_Change()
    Dim i As Integer, j As Integer

    j = ChiffreMois - 1
    For i = 1 To 7
        Me.Controls("Label" & i) = ActiveSheet.Range("A3").Offset(i - 1, j * 2)
        Me.Controls("TextBox" & i) = ActiveSheet.Range("B3").Offset(i - 1, j * 2)
        Me.Controls("TextBox" & i) = ActiveSheet.Range("B3").Offset(i - 1, j * 2).Interior.Color
    Next i

End Sub

Merci thev pour ton intervention et ta correction,

@ cfn3cfn tu vois l'intérêt de poster un fichier test pour pouvoir éprouver le code,

Amitiés

Re,

Je comprends mieux. Mais je devrai avoir 31 Textbox et 31 Label.

Mais j'ai une erreur dont je te joints la copie d'écran.

pourrais-tu me dire pourquoi.

merci d'avance

ice screenshot 20190717 111928

Bonjour,

Parce qu'il faut utiliser le code d'archer...

A+

Bonjour Galopin,

C'est quoi le code d'archer?

Merci pour ton aide

Amicalement

Noel

Re,

Re,

Je comprends mieux. Mais je devrai avoir 31 Textbox et 31 Label.

Mais j'ai une erreur dont je te joints la copie d'écran.

pourrais-tu me dire pourquoi.

merci d'avance

thev a corrigé mon erreur ici:

https://forum.excel-pratique.com/viewtopic.php?p=781034#p781034

Cordialement,

Bonjour Galopin,

C'est quoi le code d'archer?

En fait il s'agit de thev...

A+

Re,

Je ne suis plus

thev?

Cela m'apporte aucune réponse à mon problème.

Je vais essayer de détacher un bout du fichier que je mettrai sur le site.

Merci

Amicalement

noel

Re ,

Comme promis voici le bout de fichier.

4calendrier.zip (14.56 Ko)

Bonjour,

Je n'ai travaillé que sur le _Change car j'ai compris que tu voulais pouvoir afficher n'importe quel mois...

La macro ci jointe affiche donc Juillet (vide) et ne remplit les TextBox que quand tu rentres un nombre dans le ChiffreMois...

En fait il faudrait modifier le Userform_Initialize pour qu'il affiche directement le mois que tu veux...

Je suppose que tu sauras faire...J'ai quand même esquissé un embryon de mois en janvier en colonne A et B pour tester... Tu me diras si j'ai bien compris...

A+

6calendriervg.zip (20.07 Ko)

Bonsoir

tien une petite modif sur ton code galopin

mettre une combox a la place de la textbox

A voir

6calendriervg-1.zip (20.98 Ko)

A+

Maurice

bonjour,

Oui je suis resté sur le textBox parce que c'est ce qui était monté d'origine, mais en fait je trouve que c'est dès le lancement que la situation est mal pensée : Il faudrait ouvrir directement sur "le bon mois" mais comme on n'a qu'une vue partielle de la feuille j'ai pas voulu me lancer dans "les grandes manoeuvres."

En fait j'avais une version de ce type sans TB mais le combo ne me semble pas convaincant, à mon avis il serait préférable de lancer le UserForm avec Worksheet_SelectionChange...

Je verrai ça demain !

A+

Bonjour à tous,

Bonjour Galopin,

Bonjour Archer,

Bonjour xorsankukai ,

Bonjour Thev,

Merci pour votre aide. Vos exemples sont efficaces sauf celui sans TextBox qui me donne une erreur à la ligne "J" qui n'est pas compatible.

Si je faisais un copier/coller se serait idéal. Mais bien entendu je voudrai plus d’explication sur le déroulement

exp :j = chiffremois - 1 pourquoi le -1 alors que quand je lui demande un N° que je vérifie avec MsgBox "J" me donne mon choix -1

Et quand je dois utilise "Integer", String etc dans les variables.

Si on pouvait me fournir un lien qui m'explique clairement tel variables pour les nuls se serait gentil de votre part.

En tout état de cause un grand remerciement à vous 4 et à tous les forumeurs qui ont particpés de près comme de loin a ce cours.

Cordialemùent

Noel

Bonjour,

Rendons à César... Euh à thev ce qui lui appartient car c'est lui qui au terme d'un raisonnement compliqué, a introduit le :

j = ChiffreMois - 1

Je n'ai fait que reprendre son exemple bien que je ne soit pas très favorable à ce type de codage.

Il faudrait une longue explication pour en démontrer les avantages et les inconvénients.

Disons simplement que ce -1 est lié à l'utilisation d'offset que personnellement je n'utilise quasiment jamais.

En effet pourquoi quand on veut parler d'une cellule faire référence à une autre cellule puis calculer un décalage ?

Cela donne un codage flou ou on ne sait jamais de quoi veut parler l'auteur.

Je suppose que cette habitude est née de l'usage très répandu de son équivalent DECALER par les vieux formuleux ou formulistes. Si cette habitude est saine et indispensable dans les formules, elle est en revanche plus discutable en VBA...

Dans la version de CalendrierVG on pourrait très bien se passer de cette complication en écrivant :

Private Sub ChiffreMois_Change()
Dim i As Integer, j As Integer
MyDate = DateValue("1" & " " & ChiffreMois & " " & Year(Date))
LabelMois = "Mois de : " & Format(MyDate, "mmmm yyyy")
    j = ChiffreMois
    For i = 1 To 31
        Me.Controls("Label" & i) = Cells(i + 2, j * 2 - 1)
        Me.Controls("TextBox" & i) = Cells(i + 2, j * 2)
        Me.Controls("TextBox" & i).BackColor = Cells(i + 2, j * 2).Interior.Color
    Next i
End Sub

de même dans le dernier classeur (CalendrierVG sans TB )

On pourrait écrire :

Private Sub ShowMois()
Dim i As Integer, j As Integer
MyDate = DateValue("1" & " " & Me.Tag & " " & Year(Date))
LabelMois = "Mois de : " & Format(MyDate, "mmmm yyyy")
LabelMois = Application.Proper(LabelMois)
    j = Me.Tag
    For i = 1 To 31
        Me.Controls("Label" & i) = Cells(i + 2, j * 2 - 1)
        Me.Controls("TextBox" & i) = Cells(i + 2, j * 2)
        Me.Controls("TextBox" & i).BackColor = Cells(i + 2, j * 2).Interior.Color
    Next i :?? 
End Sub

Ce qui donne un code très clair bien plus court et parfaitement compréhensible...

Pour ce qui est de l'utilisation des variables "Integer" ou "String" je te renvoie au cours Excel ou cela est parfaitement détaillé...

Je dirais simplement que l'utilisation d'Integer est là encore une habitude d'ancien programmeur économe des ressources de sa machine. Aujourd'hui dans ce monde de gaspillage effréné on lui préfère bien souvent "Long" ce qui évite d'avoir à se demander si la feuille de calcul utilisera plus de 32000 lignes ou pas...

A+

Re Galopin,

Je te remercie de ces explications.

j'ai besoin encore un petit renseignement

Me.Controls("TextBox" & i).ForeColor = ActiveSheet.Range("B3").Offset(i - 1, j * 2).fore.Color

Que faut-il mettre à la place de "ForeColor" pour avoir les polices de la même couleur que dans la cellule?

Merci

Amicalement

Noel

Re,

Je crois avoir trouvé la solution.

Il faut remplacer Fore par Font

@+

Chers amis

Rechercher des sujets similaires à "transformer code long"