Valeurs par défauts

  • Initiateur de la discussion Delirum
  • Date de début
D

Delirum

Guest
Bonjours à tous.

Je voudrais réaliser une nouvelle fonction en VBA.

Pour le moment j'ai réussi à réaliser cela :

J'ai 2 colonne dans une feuille excel qui n'est pas accessible à l'utilisateur.
Une (par exemple de A1 à A10) qui comporte des valeurs par défauts (1 ou 0) et une seconde (par exemple de B1 à B10) qui comporte les valeurs que l'utilisateur désire (dans un premier temps ces valeurs sont celles par défauts).

L'utilisateur ouvre un userform qui comporte 10 boutons bascules (1 par cellule de B1 à B10) la position est détecter en fonction des valeurs que comporte les cellules de B1 à B10. Lorsque l'utilisateur enfonce un bouton à bascule la cellule qui y correspond est affecté de la valeur 1 et lorsqu'il est en position relevé, de la valeur 0.

Lorsque l'utilsateur ferme puis ouvre à nouveau l'userform, la position des boutons bascules est détectés à nouveau en fonction des valeurs (1 ou 0) qui est en réalité la position qu'il avait choisit au part avant.

Je voudrais créer un bouton dans mon userform un bouton qui réinitialise les valeurs des cellules B1 à B10 par les valeurs par défaut inscrite dans les cellule de A1 à A10), et que la position des bouton bascule soit détecter directement (sans la fermeture de l'userform.


merci du coups de main et @+.
 
@

@+Thierry

Guest
Bonsoir Délirium

Difficile de faire ceci sans avoir plus de précisions...

Enfin une approche simple déjà :

Option Explicit
Private Sub Re_Ini()
Dim MyArray
Dim CTRL As Control
Dim i As Byte

i = 1
MyArray = Sheets("Settings").Range("A1:A10")
Sheets("Settings").Range("B1:B10") = MyArray

For Each CTRL In Me.Controls
If TypeOf CTRL Is MSForms.ToggleButton Then
CTRL = Sheets("Settings").Cells(i, 1)
i = i + 1
End If
Next CTRL
End Sub

Evidemment ce genre de boucle va scanner les ToggleButtons dans l'ordre de leur création et par conséquent les valeur en A1:A10 devront être synchronisées dans le même ordre...

Sinon j'ai re-donné récemment une de mes astuces interressantes qui semble valable pour toi aussi ... Tu nommes tes cellules avec les noms des ToggleButtons... et ensuite tu as la possibilité de faire ceci :

Private Sub Another_Ini()
Dim CTRL As Control
Dim Nom As Object
Dim r As Integer

Set Nom = ActiveWorkbook.Names
For r = 1 To Nom.Count
For Each CTRL In Controls
If CTRL.Name = Nom(r).Name Then
CTRL = Range(Nom(r)).Value
Range(Nom(r)).Offset(0, 1) = Range(Nom(r))
End If
Next CTRL
Next r

End Sub

C'est plus souple pour l'ordre des Controls... Puisque c'est toi qui définit les noms comme tu veux...

Bonne Soirée
@+Thierry
 
D

Delirum

Guest
Je te remerci Thierry .
Pour ma par j'ai continué à chercher une solution à mon problème et j'ai trouvé ceci :

Private Sub CommandButton1_Click()
Feuil1.Range("C2").Select
ActiveCell.FormulaR1C1 = "=RC[-1]"
Feuil1.Range("C3").Select
ActiveCell.FormulaR1C1 = "=RC[-1]"
Feuil1.Range("C4").Select
ActiveCell.FormulaR1C1 = "=RC[-1]"
Feuil1.Range("C5").Select
ActiveCell.FormulaR1C1 = "=RC[-1]"
Feuil1.Range("C6").Select
ActiveCell.FormulaR1C1 = "=RC[-1]"
Feuil1.Range("C7").Select
ActiveCell.FormulaR1C1 = "=RC[-1]"
Feuil1.Range("C8").Select
ActiveCell.FormulaR1C1 = "=RC[-1]"
End Sub

Et sa marche. les valeurs par défaut de la colonne B sont reporté dans la colonne C.
Seul Ique, c'est que je n'arrive pas à ce que les boutons bascule (Toggle button) adopte automatiquement la position qui correspond à la valeur qui est dans les cellules 1 = position basse, 0 = position haute. J'aimerai que cette position soit détecter à l'ouverture de l'userform et lorsque l'utilisateur click sur le boutton qui remet les valeurs par défaut dans la colonne C.

Je pense que tu devrais mieu comprendre avec mon fichier qui est en pièce jointe.

@+ et merci
 

Pièces jointes

  • Classeur2.zip
    13.1 KB · Affichages: 28
  • Classeur2.zip
    13.1 KB · Affichages: 27
  • Classeur2.zip
    13.1 KB · Affichages: 29
@

@+Thierry

Guest
Bonsoir Délirium, le Forum

Je ne peux pas voir ton Fichier Joint (Sécurité du Bureau), mais ce que je vois c'est un peu comme Pierre Dac disait à Francis Blanche ...

"Je vois que vous ne connaissez pas votre texte "...

Non là franchement et plus sérieusement je vois que tu n'as même pas tenté d'appliquer ce que je t'ai conseillé... Alors dans ces conditions on ne peut pas être sur la même longueur d'onde.

Ces deux Lignes de codes que je donnais hier remplacent tout ton charabia ci-dessus :

MyArray = Feuil1.Range("B2:B8")
Feuil1.Range("C2:B8") = MyArray

Maintenant si tu veux persister dans un tas de lignes écrit au moins sans Select ...
With Feuil1
.Range("C2") = .Range("B2")
.Range("C3") = .Range("B3")
.Range("C4") = .Range("B4")
.Range("C5") = .Range("B5")
.Range("C6") = .Range("B6")
.Range("C7") = .Range("B7")
.Range("C8") = .Range("B8")
End With

En ce qui concerne ton problème d'initialisation de tes TogleButtons, tu as deux méthodes dans ce que je t'ai écrit hier... Mais les as-tu au moins vues ?

Bon Courage et Soirée
@+Thierry
 
D

delirium

Guest
Bonsoir Thierry.

J'avais et j'ai toujours l'intention de tester ton code.

Je suis débutant en VBA (sa fait 15 jours que je m'y suis mis). Je me suis procurer un ouvrage sur le VBA pour pouvoir comprendre et réaliser par moi même des codes VBA (je veux apprendre quoi !).

J'ai demandé de l'aide sur le forum et en attendant une réponse j'ai tenté de résoudre par moi même mon problème, ce qui à donner le code que je t'ais fournis juste pour que tu vois la fonctin que je veux réliser et ce qui ne tien pas la route.

Je n'ai pas eu le temps de tester ton code étant à mon taf à l'heures ou j'ai poster mes 2 réponses.

Mais ne t'inquiete pas on est bien sur la même longueur d'onde, dés que j'ai 5minutes je teste ton code.

Merci de ton aide et A+tard.
 
@

@+Thierry

Guest
Bonsoir Yeahou, Deliirum, le Forum

Ah enfin ravi de faire ta connaissance sur un code, oui, of course, on peut passer sans tableau avec les crochets (qui sous entendent Evaluate) mais j'ai déjà dit ce que je pensais là dessus Lien supprimé (entre autres réflexions tout comme Lien supprimé) mais comme je dis souvent VBA a cette force qui permet à tout un chacun de développer selon ses moyens et compétences... Et c'est ceci qui est super !!! et qui est évolutif...pour tout le monde !

Bonne Soirée

Dûr Dûr pour les Portos !
@+Thierry
 
Y

yeahou

Guest
Bonjour @+Thierry, le forum

tout le plaisir est pour moi, thierry
Moi, je suis un autodidacte intégral et j'aime bien [], je trouve cela plus pratique que range(). Par contre, je ne sais pas si le fait d'utiliser cette méthode peut ralentir le code, il faudra que je teste cela.
ce qui me choque, moi (mais je commence à m'y habituer), ce sont les omissions du type
range("b2")=range("c2") au lieu de activesheet.range("B2").value=activesheet.range("C2").value
ou valeur=inputbox qui appelle la fonction et plante sur l'argument type au lieu de valeur=application.inputbox qui appelle la méthode.
d'ailleurs quelqu'un sait pourquoi il y a à la fois une fonction et une méthode inputbox ? je serai curieux de savoir.
Comme quoi, tout ce qui n'est pas dans nos habitudes peut être choquant au départ.
J'ai découvert XLD (et les forums d'ailleurs) en cherchant un renseignement avec google début juin et depuis je viens régulièrement, je vois d'autres façons de programmer, des astuces que je ne connaissais pas, des problèmes à résoudre, j'aime.
Il y a sur ce forum beaucoup de personnes aimant autant Excel et sa programmation que moi et la passion se vit mieux à plusieurs.

LONGUE VIE AU FORUM XLD
 
@

@+Thierry

Guest
Re Yeahou, ke Forum, et sorry Delirium pour extrapoler sur ton Fil !

Je suis tout à fait ravi de savoir que tu es autodidacte (idem pour moi à 200% et cette passion est devenue mon job) pour les points de tes réflexions, je vais essayer de répondre du mieux que je peux (comme toujours je m'efforce ici..... et ailleurs aussi !! lol)

AAA) pour le ralentissement c'est Chip ou Cheap qui le dit, et quand moi je ne me contentais que de macros avec l'enregistreur il était déjà MVP USA ... d'ailleurs même Laurent Longren quant à lui, traite cette méthode de "Cochonne"... Enfin ce sont mes repères... Ici nous avons deux vrais et véritables repères expères, capables de tout sous Excel qui sont Ti et Jon (STéphane pour les intimes) et je sais que le second utilise les crochets, mais rarement je vois Ti le faire... Sinon Zon, un excellent contributeur aussi est adepte des crochets.... En fait je laisse la porte ouverte à un débat qui pourrait faire l'occasion d'un Fil (Topic) à lui tout seul !!! "[Crochets] or not Crochets that is the question !!!" lol

BBB) Pour ta seconde remarque je ne sais pas si tu as bien lu ? je n'ai pas écrit "range("b2")=range("c2")" mais j'ai écrit ".Range("C2") = .Range("B2")" c'est le petit Point qui fait la différence !!!

Car j'ai aussi écrit plus haut "With Feuil1" et j'ai fini comme il se doit pour ne pas faire crier VBE avec "End With"

En fait si on suit une logique implacable de pure syntax VBA il faudrait faire ce genre de code à chaque référence à un Objet Range :
Sub TheOxfordSyntax()
Dim WB As Workbook
Dim WS As Worksheet
Set WB = Excel.Application.ActiveWorkbook
With WB
Set WS = .ActiveSheet
End With
MsgBox CStr(WS.Range("A1").Value)
End Sub

Mais (fort heureusement, sinon tout le monde serait trop dégoûté et personne n'aurait essayé de programmer en VBA !!) Microsoft dans son "Excellence" nous permet d'écrire ceci, sans aucune erreur de compilation :

Sub TheBronxSyntax()
MsgBox Range("A1")
End Sub

Et on a le même résultat et sans aucun souci (pour autant qu'on parle du classeur actif avec la feuille active ... sinon c'est une autre histoire (of course !!!)) car VBA "comprend" tout seul par défaut différentes choses, et d'autres sont automatiquement des valeur par défaut (comme Value pour un Objet Range) c'est un avantage pour débuter vite sans avoir des Syntax Error à chaque ligne, mais en contre partie c'est un bon moyen de ne pas faire l'effort de "parler" VBA correctement et de passer à coter de beaucoup de possibilités !!! (revers de la médaille)


CCC) Si tu vas fais une recherche sur ce Forum avec Application.InputBox tu devrais tomber sur ce Fil => Lien supprimé où "magic" Ti (encore lui !! qui nous a fait découvrir l'InputBox Méthode... en comparaison de l'InputBox Function...

DDD) Pour la passion ......... hi hi hi ou plutôt "Niark" en hommage au grand "Vériland" (qui nous manque pas sa gentillesse et son humour) .... et bien tu es bien tombé Yeahou !!!

Ah au fait : (vieux motard que jamais)
Bienvenue_XLD.gif


Enfin voilà Yeahou !!! comme tu dis Longue Vie à XLD

Bonne soirée (enfin nuit)
@+Thierry
 
Y

Yeahou

Guest
Bonjour Thierry, delirium, le forum

thierry, quand je parlais des .value, c'était de maniére générale pour souligner que certaines abréviations peuvent être sources d'erreur et de difficultés de débugage. Je connais parfaitement le with et l'emploie sans modération.
<http://www.excel-downloads.com/html/French/forum/read.php?f=1&i=97003&t=96988>
tu as vu, andré, j'ai appris la leçon :))
<http://www.excel-downloads.com/html/French/forum/read.php?f=1&i=96901&t=96747>
quand à Ti, j'ai déja pu apprécier son savoir faire
<http://www.excel-downloads.com/html/French/forum/read.php?f=1&i=93672&t=93340>
et, depuis, je me précipite sur ses posts quand ils paraissent.

A +, yeah!
 
Y

yeahou

Guest
Bonjour @+Thierry, le Forum

J'ai fait un petit test pour évaluer le ralentissement du aux crochets [].
je remplis un tableau de 256256 valeurs avec le même code mais en utilisant pour la première macro une cellule référencée [] et pour la deuxième macro une cellule référencée range("").

Je ne m'attendais qu'à une légère différence mais le résultat est sans appel sur mon athlon 2600, 4'' pour range("") et 10'' pour [] soit une augmentation de 150%.

J'abandonne les croches, l'écriture simplifiée ne compense pas l'augmentation du temps de traitement.

Merci donc pour cette précieuse info que je confirme

A+

j'ai appliqué ce test sur une feuille ou j'avais rempli les cellules des 1001 premières lignes sur 256 colonnes avec un texte "RRR"

'Timer
Public Heure_Résultat(1 To 3) As Integer, Heu_Deb As Long, Heu_Cal As Long, Mes_Res As String
'Compteurs
Public Compteur As Long, Compteur2 As Long
'tableau
Public Tab_Test(0 To 255, 0 To 1000)
Sub essai_croches()
Application.ScreenUpdating = False
Application.Calculation = xlManual
'début timer
Heu_Deb = Timer

'début test
For Compteur = 0 To 255
For Compteur2 = 0 To 1000
Tab_Test(Compteur, Compteur2) = [A1].Offset(Compteur2, Compteur).FormulaR1C1
Next Compteur2
Next Compteur

'calcul timer
Heu_Deb = Timer - Heu_Deb
If Heu_Deb < 0 Then Heu_Deb = Heu_Deb + 86400
Heure_Résultat(1) = Fix(Heu_Deb / 3600)
Heure_Résultat(2) = Fix((Heu_Deb - (Heure_Résultat(1) * 3600)) / 60)
Heure_Résultat(3) = CInt(Heu_Deb - ((Heure_Résultat(1) * 3600) + (Heure_Résultat(2) * 60)))
If Heure_Résultat(1) = 0 Then Mes_Res = "Tableau rempli en " & Right("0" & Heure_Résultat(2), 2) & " minutes, " & Right("0" & Heure_Résultat(3), 2) & " secondes !" Else Mes_Res = "Tableau rempli en " & Right("0" & Heure_Résultat(1), 2) & " heures, " & Right("0" & Heure_Résultat(2), 2) & " minutes, " & Right("0" & Heure_Résultat(3), 2) & " secondes !"
MsgBox Mes_Res

Application.Calculation = xlAutomatic
End Sub
Sub essai_range()
Application.ScreenUpdating = False
Application.Calculation = xlManual
'début timer
Heu_Deb = Timer

'début test
For Compteur = 0 To 255
For Compteur2 = 0 To 1000
Tab_Test(Compteur, Compteur2) = Range("A1").Offset(Compteur2, Compteur).FormulaR1C1
Next Compteur2
Next Compteur

'calcul timer
Heu_Deb = Timer - Heu_Deb
If Heu_Deb < 0 Then Heu_Deb = Heu_Deb + 86400
Heure_Résultat(1) = Fix(Heu_Deb / 3600)
Heure_Résultat(2) = Fix((Heu_Deb - (Heure_Résultat(1) * 3600)) / 60)
Heure_Résultat(3) = CInt(Heu_Deb - ((Heure_Résultat(1) * 3600) + (Heure_Résultat(2) * 60)))
If Heure_Résultat(1) = 0 Then Mes_Res = "Tableau rempli en " & Right("0" & Heure_Résultat(2), 2) & " minutes, " & Right("0" & Heure_Résultat(3), 2) & " secondes !" Else Mes_Res = "Tableau rempli en " & Right("0" & Heure_Résultat(1), 2) & " heures, " & Right("0" & Heure_Résultat(2), 2) & " minutes, " & Right("0" & Heure_Résultat(3), 2) & " secondes !"
MsgBox Mes_Res

Application.Calculation = xlAutomatic
End Sub
 
@

@+Thierry

Guest
"[Crochets] or not Crochets that is the question !!!" lol

Bonsoir Yeahou, Délirium

Tandis que l'on n'a plus de news de Délirium, je vois que tu es un garçon perséverrant (gros doute d'orthographe lol)...

Je viens de tester à plusieurs reprises tes deux codes sur mon vieux coucou de test (PIII 800 / 512 ram)

La Sub essai_croches => oscille entre 24/25 secondes

La Sub essai_range => reste stable à 15 secondes

Donc il n'y a pas photo, même si je ne suis pas à 150% de différence

Ce qui ne m'étonne pas vraiment car ce que dit Cheap Pearson m'a toujours été de très bon conseil.

En tout cas c'est bien d'avoir des gens comme Toi (qui vont au bout des choses) sur ce Forum, Yeahou, on en a besoin !

Bonne Soirée
@+Thierry
 
M

Michel_M

Guest
Re thierry, delirium Yeahou

yeahou, j'ai relu ton prog: c'est super


Thierry
Salut Thierry,

Ouias, ouais j'ai lu le coup de then: end.

je me disais qu'en début de petite macro, ma foi! d'ailleurs Ti avait fait la m^me remarque que toi il y a quelque temps.

Puisque je tiens, je t'envoie en pièce jointe une bidouille-maison utilisant les new collections:
le but est d'envoyer des éléments d'une listbox "depart"dans une autre "arrivee" mais au retour (arrivee -->depart) l'élément doit retrouver sa place dans la listbox de départ.

J'avais fait çà pour le fun ( ca m'evite de gamberger à mes soucis) et ca devrait pouvoir être amélioré

je m'étais cassé les dents en essayant de faire un drag and drop avec la souris

je répète : c'est pour le fun, donc...

au dodo et peut-être à demain pour de nouvelles aventures
Michel
 

Pièces jointes

  • aller_retour.zip
    16.9 KB · Affichages: 36

Discussions similaires

Statistiques des forums

Discussions
311 721
Messages
2 081 928
Membres
101 842
dernier inscrit
seb0390