RowSourse

JC de Lorient

XLDnaute Impliqué
Bonsoir le forum
:( toujours pas d'accès au ancien post sniff !!

Bon voilà
j'ai un 1er combobox jusque là tout va bien
on va dire liste1,liste2 liste3, liste4

j'aimerais pouvoir avoir comme rowsource dans mon 2ème CBox la valeur de mon 1er CBox
si je choisis Liste3 dans mon 1er avoir la "Liste3" dans mon 2ème

Est ce possible?
Si oui j'aimerais un coup de main
merci a vous
 

porcinet82

XLDnaute Barbatruc
Re : RowSourse

Salut JC,

Comme un exemple vaut mieux qu'un long discours je t'ai préparé un petit exemple de ce que tu peux faire.

Si tu as des questions, n'hesite pas,

@+
 

Pièces jointes

  • JC.xls
    28 KB · Affichages: 106
  • JC.xls
    28 KB · Affichages: 107
  • JC.xls
    28 KB · Affichages: 109

JC de Lorient

XLDnaute Impliqué
Re : RowSourse

Re porcinet, et le forum
dans ton exemple içi pourrait on remplacer le 8 par la dernière cellule non vide de la colonne? genre .End(xlup).Row
si oui quelle est la syntaxe?

Merci encore

ComboBox1.Clear
For j = 5 To 8
ComboBox1.AddItem (Cells(1, j).Value)
Next j
 

Hervé

XLDnaute Barbatruc
Re : RowSourse

bonjour tout le monde

si je peut me permettre une remarque (enfin meme deux)

- je me méfie des evenements change qui ont parfois tendance à se déclencher lorsque l'on ne le veut pas, je préfère l'evenement click des controles.

- pour avoir une mise à jour d'un controle sur une feuille sans devoir changer d'onglet (Worksheet_Activate), on peut se servir de l'evenement GotFocus, plus pratique me semble t'il.

enfin, bon, moi ce que j'en dit, c'est juste pour donner un coup de main.

salut
 

JC de Lorient

XLDnaute Impliqué
Re : RowSourse

bonsoir a tous
merci a vous 3
Myta, ton code m'a bien aidé mais je me suis un peu planté :(
en fait c'est içi :

Private Sub ComboBox3_Change()
Dim i As Byte, cel As Range
For Each cel In Sheets("Données").Range("AI1", Sheets("Données").Range("AI1").End(xlToRight))
If cel = ComboBox3.Value Then
ComboBox4.Clear
For i = 2 To 15
ComboBox4.AddItem (Sheets("Données").Cells(i, cel.Column).Value)
Next i
Exit Sub
End If
Next cel
End Sub

c'est mon 15 que j'aimerais transformer en dernière valeur de ma colonne cel.Column
merci mille fois
 

ChTi160

XLDnaute Barbatruc
Re : RowSourse

Salut JC
Bonjour le Fil
Bonjour le Forum
Voilà ce que j'ai modifié pour obtenir la derniere ligne de la colonne déterminée par cel.Column
Private Sub ComboBox3_Change()
Dim i As Byte, cel As Range
Dim Derligne As Integer
With Sheets ("Données")
For Each cel In .Range ("AI1", .Range("AI1").End(xlToRight))
If cel = ComboBox3.Value Then
ComboBox4.Clear
Derligne= .Cells (65536,cel.Column).End(xlup).Row
For i = 2 To Derligne
ComboBox4.AddItem (.Cells(i, cel.Column).Value)
Next i
End With
Exit Sub
End If
Next cel
End Sub
Bonne journée
 
Dernière édition:

JC de Lorient

XLDnaute Impliqué
Re : RowSourse

Bonjour à tous, salut JM

Merci JM mais j'ai une erreur
"Erreur compilation
référence incorrecte ou non qualifiée" sur cette ligne :
Derligne = .Cells(65536, cel.Column).End(xlUp).Row
j'ai enlevé le point et là ça passe
mais ma dernière ligne me ramène 1 au lieu de 12

Je ne sais pas, je ne sais plus !!!!
merci beaucoup

mille excuses !!!
ça marche
j'avais juste un souci de références de feuilles
merci encore
 
Dernière édition:

porcinet82

XLDnaute Barbatruc
Re : RowSourse

Salut tout le monde,

Et bien le temps de faire une grasse mat et je vois que plein de monde a apporter de l'aide a JC.

Hervé je prends par de tes remarques.

Pour JC, s'il y a un point devant le Cells, c'est parce que Jean Marie a rajouter un
With Sheets ("Données")
'code
End With
Regarde son code en détails et tu verras comme le With fonctionne.

Sinon quelques erreurs se sont logées dans le code de Jean Marie (notamment a la fin entre les End If, End With...). J'ai modifier son code de la manière suivante et ca a l'air de fonctionner, dumoins avec le fichier que je t'avais mis en exemple :
PHP:
Private Sub ComboBox1_Change()
Dim i As Byte, cel As Range
Dim Derligne As Integer
With Sheets("Données")
For Each cel In .Range("E1:" & .Range("IV1").End(xlToLeft).Address(0, 0))
If cel = ComboBox1.Value Then
ComboBox2.Clear
Derligne = .Cells(65536, cel.Column).End(xlUp).Row
For i = 2 To Derligne
ComboBox2.AddItem (.Cells(i, cel.Column).Value)
Next i
End If
Next cel
End With
Exit Sub
End Sub

Tiens nous au courant,

@+
 

JC de Lorient

XLDnaute Impliqué
Re : RowSourse

re tout le monde
Porcinet tu n'as pas du remarquer mais j'avais fait une modif dans mon post
en effet ton code marchait bien merci encore
Vu que tu "maitrises" Lol !
j'ai réussi a monter une usine a gaz !! (mais ça marche) avec le code suivant
Je pars d'un classeur
j'ouvre tous les classeurs de mon répertoire un par un
je fais une copie des données s'il y en a
je ferme mon classeur et j'enregistre sous le même nom
le seul HIC c'est que je n'aarive pas a protéger ma feuille !
Je pense que ce code peut etre largement simplifier
Avis aux amateurs !!!!

Sub Copie_Feuille_Résultats_et_Feuille_Données()
Dim a, b As Integer
Dim WB1, WB2 As Workbook
Dim nomfich As String
Dim classeurs, fichier, newclass As Object
Dim chemin As String
Application.ScreenUpdating = False
ActiveSheet.Unprotect ("vh")
ActiveSheet.Shapes("Button 222").Delete
ActiveSheet.Shapes("Button 223").Delete
ActiveSheet.Shapes("Button 224").Delete
ActiveSheet.Shapes("Button 225").Delete
Rows("1:1").RowHeight = 39
Range("A8").Select
chemin = ThisWorkbook.Path
Set WB1 = ActiveWorkbook
WB1.Sheets("Récap_Offre").Unprotect ("vh")
Set fichier = CreateObject("Scripting.filesystemobject").getfolder(chemin).Files
Application.DisplayAlerts = False
Sheets("Récap_Offre").Range("A4:K1000").ClearContents
Sheets("histo").Range("A3:K1000").ClearContents
For Each classeurs In fichier
If classeurs.Name <> ThisWorkbook.Name And _
classeurs.Name <> "Récap.xls" Then
Set newclass = classeurs
Workbooks.Open newclass
Set newclass = ActiveWorkbook
Set WB2 = ActiveWorkbook
Application.ScreenUpdating = False
WB2.Activate
WB2.Sheets("Récap_Offre").Unprotect ("vh")
WB2.Sheets("Récap_Offre").Range("A4").Select
If Range("A4") <> "" Then
b = Sheets("Récap_Offre").Range("A65536").End(xlUp).Row
Range("A4:K" & b).Copy
ActiveSheet.Paste Destination:=WB1.Sheets("Récap_Offre").Range("A4:K" & b)
Else: WB1.Sheets("Récap_Offre").Range("A4:K" & WB1.Sheets("Récap_Offre").Range("A65536").End(xlUp).Row + 2).ClearContents
End If
WB2.Sheets("Récap_Offre").Protect ("vh")
WB2.Sheets("Histo").Visible = True
WB2.Sheets("Histo").Unprotect ("vh")
WB2.Sheets("Histo").Select
If Range("A3") <> "" Then
b = Sheets("histo").Range("A65536").End(xlUp).Row
Range("A3:K" & b).Copy
ActiveSheet.Paste Destination:=WB1.Sheets("histo").Range("A3:K" & b)
Else: WB1.Sheets("Histo").Range("A4:K" & WB1.Sheets("histo").Range("A65536").End(xlUp).Row + 1).ClearContents
End If
WB1.Sheets("Récap_Offre").Protect ("vh")
WB2.Sheets("Récap_Offre").Protect ("vh")
nomfich = newclass.Name
newclass.Close True
ActiveWorkbook.SaveAs Filename:=chemin & "\" & nomfich, FileFormat:=xlNormal
Set WB1 = ActiveWorkbook
WB1.Sheets("Récap_Offre").Unprotect ("vh")
End If
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

merci a tout le monde
 

ChTi160

XLDnaute Barbatruc
Re : RowSourse

Salut JC

quand tu parles de ta feuille que tu veux reprotèger c'est laquelle Lol dans la procèdure

celle que tu as déprotègé pour la recherche ou celle sur laquelle tu recopies lol
il y a sur le forum @+Thierry qui a fait une réponse sur la protection via VBA lol en voici le texte si cela peut te servir

PROTECTION DE FEUILLES
Tout sur le Mode Protect UserInterfaceOnly True
Auteur: @+Thierry
Date: 29-01-03 00:09

Bonsoir Willy

Oui Très Bonne Question et tu as raison, l'aide est assez mal documentée et les exemples sont inexistants...

Voici le code :

Sub ProtectionSaufMacro ()
ActiveSheet.Protect UserInterfaceOnly:=True
End Sub

Que l'on peut aussi écrire comme ceci :

Sub ProtectionSaufMacro ()
ActiveSheet.Protect , , , , True
End Sub


Remarque IMPORTANTE de l'aide :
Si vous appliquez la méthode Protect et que l'argument UserInterfaceOnly a la valeur True dans une feuille de calcul et que vous enregistrez le classeur, l'intégralité du classeur (et pas uniquement l'interface) sera protégée lors de la réouverture du classeur. Pour déprotéger la feuille de calcul mais activer à nouveau la protection de l'interface utilisateur après l'ouverture du classeur, vous devez à nouveau appliquer la méthode Protect avec l'argument UserInterfaceOnly affecté de la valeur True.


Par conséquent j'en conclus qu'il est impératif de lancer le code à l'ouverture du fichier par l'évènementielle de ThisWorkBook Workbook_Open()

Puisque tu veux des infos sur cette procédure voici l'intégralité d'un poste de Frédérique Sigonneau, qui lui même reprenait Laurent Longre :


Bonsoir,

Protège ta feuille par macro, en utilisant la méthode Protect avec le
Paramètre UserInterfaceOnly à True. Ce paramètre autorise les
Modifications *par du code VBA* de cellules protégées.

Ce paramètre doit être réinitialisé à chaque ouverture du classeur.
Utilise le donc dans la procédure Workbook_Open de ton classeur :

Worksheets ("Feui1").Protect Password: ="zaza", UserInterfaceOnly: = True

FS

PS. Ci-dessous, extraits de l'aide de LL au sujet de ce paramètre :

[Copie]
L'aide sur ce paramètre est très mal formulée. Elle ne devrait pas dire:
"Cet argument a la valeur True pour protéger l'interface utilisateur,
mais pas les macros. Si cet argument n'est pas spécifié, la protection
s'applique à la fois aux macros et à l'interface utilisateur." Mais
plutôt quelque chose comme: "Cet argument a la valeur True pour protéger
la feuille des actions effectuées par l'utilisateur, mais pas de celles
qui sont effectuées par macro. Si cet argument n'est pas spécifié, la
protection s'applique à la fois aux manipulations effectuées par
l'utilisateur et par des macros."

Autrement dit, par exemple, après :

Feuil1.Protect UserInterfaceOnly:=True

L'utilisateur ne pourra pas saisir une nouvelle valeur dans la cellule
A1 de Feuil1 si celle-ci est verrouillée. En revanche, une macro pourra
modifier la valeur de cette cellule (Feuil1.Range("A1") = 5, par
exemple) qu'elle soit verrouillée ou non, et sans déclencher de message
d'erreur ou d'avertissement.

Ca peut être très utile par exemple dans le cas d'un classeur avec des
feuilles protégées vis-à-vis de l'utilisateur, où toutes les
manipulations sont réservées à des procédures VBA.

D'autre part, UserInterfaceOnly permet également de protéger les
feuilles tout en autorisant sur ces feuilles les manipulations par
l'utilisateur de filtres, TCD ou symboles du plan (propriétés
EnableAutoFilter, EnablePivotTable et EnableOutlining des feuilles de
calcul). Il permet également d'interdire ou autoriser la sélection de
cellules verrouillées (EnableSelection).
**********
- Protection de toutes les feuilles du classeur :

Private Sub Workbook_Open()
Dim Wksht As Worksheet
For Each Wksht In Me. Worksheets
Wksht.Protect UserInterfaceOnly:=True
Next Wksht
End Sub

- Protection uniquement des feuilles "Tata", "Toto" et "Tutu" :

Private Sub Workbook_Open()
Dim Wksht As Worksheet
For Each Wksht In Me.Worksheets (Array("Toto", "Tata", "Tutu"))
Wksht.Protect UserInterfaceOnly:=True
Next Wksht
End Sub
[Fin copie]


Voilà comme çà c'est une lacune de l'aide comblée, mais attention tout de même car certains codes sont refusés quand même, donc il faut bien tester... (Par Exemple l'instruction "AddComment" est refusée)

Bonne Nuit
@+Thierry

sinon un autre exemple
'pour protéger
Sheets("nom de ta feuille").Protect Password:="ton code", DrawingObjects:=True, Contents:=True, Scenarios:=True,

en espèrant avoir fait avancer la chose
bonne fin de Journée
 

porcinet82

XLDnaute Barbatruc
Re : RowSourse

re,

J'ai jeté un oeil a ton fichier et je ne pense pas qu'il soit possible de le raccourcir de beaucoup. Je te l'ai modifier de la manière suivante mais il reste a le tester (les modif se portent surtout sur la déclaration des variables) :
Sub Copie_Feuille_Résultats_et_Feuille_Données()
'modif ici : tu dois déclarer chacunes des variables en As Object, sinon seule la dernière est déclarée en tant que telle, les autre seront de type Variant
Dim a As Integer, b As Integer
Dim WB1 As Workbook, WB2 As Workbook

Dim nomfich As String
Dim classeurs As Object, fichier As Object, newclass As Object
Dim chemin As String

Application.ScreenUpdating = False
Application.DisplayAlerts = False

With ActiveSheet
.Unprotect ("vh")
.Shapes("Button 222").Delete
.Shapes("Button 223").Delete
.Shapes("Button 224").Delete
.Shapes("Button 225").Delete
.Rows("1:1").RowHeight = 39
.Range("A8").Select
End With

chemin = ThisWorkbook.Path
Set WB1 = ActiveWorkbook
WB1.Sheets("Récap_Offre").Unprotect ("vh")
Set fichier = CreateObject("Scripting.filesystemobject").getfolder(chemin).Files
Sheets("Récap_Offre").Range("A4:K1000").ClearContents
Sheets("histo").Range("A3:K1000").ClearContents
For Each classeurs In fichier
If classeurs.Name <> ThisWorkbook.Name And classeurs.Name <> "Récap.xls" Then
Set newclass = classeurs
Workbooks.Open newclass
Set newclass = ActiveWorkbook
Set WB2 = ActiveWorkbook

With WB2
.Activate
With WB2.Sheets("Récap_Offre")
.Unprotect ("vh")
.Range("A4").Select
If .Range("A4") <> "" Then
b = .Range("A65536").End(xlUp).Row
Range("A4:K" & b).Copy
ActiveSheet.Paste Destination:=WB1.Sheets("Récap_Offre").Range("A4:K " & b)
Else
WB1.Sheets("Récap_Offre").Range("A4:K" & WB1.Sheets("Récap_Offre").Range("A65536").End(xlUp).Row + 2).ClearContents
End If
.Protect ("vh")
End With

With WB2.Sheets("Histo")
.Visible = True
.Unprotect ("vh")
.Select
If .Range("A3") <> "" Then
b = .Range("A65536").End(xlUp).Row
.Range("A3:K" & b).Copy
ActiveSheet.Paste Destination:=WB1.Sheets("histo").Range("A3:K" & b)
Else
WB1.Sheets("Histo").Range("A4:K" & WB1.Sheets("histo").Range("A65536").End(xlUp).Row + 1).ClearContents
End If
WB1.Sheets("Récap_Offre").Protect ("vh")
.Sheets("Récap_Offre").Protect ("vh")
nomfich = newclass.Name
newclass.Close True
ActiveWorkbook.SaveAs Filename:=chemin & "\" & nomfich, FileFormat:=xlNormal
Set WB1 = ActiveWorkbook
WB1.Sheets("Récap_Offre").Unprotect ("vh")
End With
End With
End If
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub


@+
 

JC de Lorient

XLDnaute Impliqué
Re : RowSourse

Bonjour à tous sous ce soleil !

J'ai mis un peu de temps a vous répondre
j'ai fait mes tests avant
avec un peu de peine y suis arrivé (enfin je crois)
je tenais a vous remercier pour l'aide
Porcinet : pour la simplification du code
et ChTI pourle Mode Protect UserInterfaceOnly True
cette fonction est géniale !!!!!!!
Merci a vous et bon dimanche
 

Discussions similaires

Réponses
2
Affichages
362

Statistiques des forums

Discussions
312 413
Messages
2 088 199
Membres
103 764
dernier inscrit
nissassa