[Excel VBA]Tranfert de valeurs

Résolu/Fermé
ks13 - 9 août 2006 à 13:30
 ledorian83 - 16 nov. 2011 à 21:21
Bonjour,
J'ai plusieurs feuilles contenant des chiffres de tous genres, et j'ai une feuille qui les regroupe tous. Les differentes feuilles servent, comme vous l'aurez compris a faciliter l'edition de ces chiffres. Quant a la page les regroupant, elle est utilisee comme une sorte de base de donnee pour un site. Voila le contexte. Le probleme est que je n'ai jamais touche a VBA et que pour eviter de grosses pertes de temps avec l'editions des chiffres, je voudrais creer une macro qui regroupe automatiquement tous ces chiffres. J'ai cherche sur le net, et j'ai reussi a creer une petite macro de test. Mais pendant les tests l'editeur de macros me dit que ma commande pour assigner une valeur a une cellule n'est pas valide. Voila la macro :

Sub test()
Set Sheet = ActiveWorkbook.ActiveSheet
Dim listePartenaires As Variant
listePartenaires = Array("feuille1", "feuille2", "feuille3", "feuille4", "feuille5", _
"feuille6", "feuille7", "feuille8", "feuille9", "feuille10", "feuille11")
For i = 0 To 10
Sheet.Range("A" & i).Select
Sheet.Selection.Value = listePartenaires(i)
Next i
End Sub

Comme je debute en VBA, et que j'ai a peu pres suivi les indications de certains sites, je ne vois pas trop bien ou j'ai commis une ou des erreurs. Et si possible je voudrais savoir si il est possible d'avoir une variable egale au nombre d'arguments du tableau, un peu comme nbarg = myArray.Argumets.Length en javascript. Merci d'avance.
A voir également:

27 réponses

ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
16 août 2006 à 11:31
okie, desole de pas avoir donne des nouvelle plustot, mais comme la plupart des gens, j'ai eu une pause ^^ .
j'en ai profite pour essaier de regler ce probleme de reseau que j'ai chez moi, et j'ai commence par une reinstallation de windows ^^; et malheureusement, meme si cette reinstallation a regle quelques problemes avec les disques durs, cela n'a pas regle le probleme de reseau u_u;, enfin bref. en ce qui concerne ton idee Armojax, j'ai eu l'approbation du responsable il y a quelques minutes (parti lui aussi en vaccances et impossible de le contacter u_u;), donc j'ai essaye ton idee et le probleme de liste incomplete semble resolu ^^
Merci pour ton aide, c'est vraiment sympa.

Sans vouloir abuser de ta gentillesse, j'ai juste un dernier truc a ajouter a cette macro :

il faut que je fasse un menu, avec 2 listes deroulantes : une liste pour les partenaires disponibles, et une avec les types disponibles.

les actions a la validation de ce menu sont : selection du partenaire selectionné, puis du type selectionné. si aucun partenaire n'est selectionné, ni aucun type, la liste sera complete et rangée (donc exactement le resultat actuel de la macro), si seulement le partenaire ou le type est selectionné, alors on ne prendra que le partenaire avec tous les types, ou que le type avec tous les partenaires (donc aucune selection = tous), et si on a un type et un partenaires definis, on n'aura que ca dans la liste (donc type + partenaire).

la solution a laquelle j'ai pensé etait de laisser la macro copier toute la liste en la rangeant, puis, parcourir la liste en supprimant les lignes qui ne correspondaient pas aux criteres. donc on aura uen fonction du genre :

if selectpart <> "" and selecttype <> "" then
Do Until Not IsNumeric(Cells(I, 1).Value)
If Cells(I, 2).Value <> selecttype and Cells(I,1) <> selectpart Then
'suppression de la ligne
End If
I = I + 1
Loop
elseif selectpart="" and selecttype <>"" then
Do Until Not IsNumeric(Cells(I, 1).Value)
If Cells(I, 2).Value <> selecttype Then
'suppression de la ligne
End If
I = I + 1
Loop

elseif selectpart<>"" and selecttype ="" then
Do Until Not IsNumeric(Cells(I, 1).Value)
If Cells(I, 1).Value <> selectpart Then
'suppression de la ligne
End If
I = I + 1
Loop
endif

les problemes que j'ai sont :
- les libellé (comme is ont ni indice ni id ils corresponderont pas aux criteres, normalement il suffit de mettre la fonction de supression avant l'ajout de libellés, mais comme je connais pa du tout vba je prefere verifier ^^;
- comme je viens de commencer en vb/vba je ne connais pas beaucoup de commandes specifiques a excel/vb, et je ne sais pas du tout comment faire une liste deroulante dans une feuille excel ^^;
- pareil pour la commande de suppression de lignes

ah vi, pour la date, bein comme explique dans la feuille exemple que j'ai posté (ou est-ce que ca a ete supprimé?) j'ai specifiquement separé la date du texte pour avoir la date au format texte et pouvoir l'utiliser dans d'autres parties ^^;
5
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
9 août 2006 à 14:16
Hello ks13,

Deux choses :

1) Tu fais varier ton indice de 0 à 10, ce qui te permet d'obtenir les 11 postes de ton tableau. OK.
Mais dans ta boucle For..., ça te conduit à atteindre la cellule A0 ("A" & i), et cette cellule n'existe pas.
Donc soit tu codes : "A" & i + 1,
soit tu mets en début de module Option Base 1, ce qui fait que l'indiçage de ton tableau ira de 1 à 11, et non de 0 à 10.

2) Remplace

Sheet.Range("A" & i).Select
Sheet.Selection.Value = listePartenaires(i)

par

Sheet.Range("A" & i).Value = listePartenaires(i)
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
9 août 2006 à 15:07
okay....a vrai dire le probleme du i = 0 a ete resolu aussi, c'est pas moi qui l'ai trouve apres avoir precipitament poste sur le forum, mais un ami qui est venu m'aider un peu apres que j'ai poste....

en fait, le probleme qui reste c'est le fait que le nombre d'arguments dans le tableau listPartenaires peut varier. pour le moment il y en a 11, mais de ces 11 seuls 5 one des valeurs dans leurs feuilles respectives. ce que je voudrais faire c'est une macro qui verifie chacune des feuilles, met dans un tableau les feuilles n'etant pas vides et rajoutant leur contenu dans la feuille qui regroupe toutes les valeurs. je sais qu'il est plus simple de prenre les feuilles une par une et de rajouter les valeurs qu'elles contiennent directement a la feuille generale, mais le tableau de valeurs n'est pas aussi simple, je dois trier les valeurs, et les placer sur la feuille generale selon leur genre, ce qui devrais donner quelque chose comme :

idpart | idtype | val 1 | val | commentaire |

type 1
1 | 1 | val 1 | val 2 | txt
1 | 1 | val 3 | val 4 | txt
2 | 1 | val 1 | val 2 | txt
2 | 1 | val 3 | val 4 | txt
3 | 1 | val 1 | val 2 | txt
3 | 1 | val 3 | val 4 | txt

type 2
1 | 2 | val 1 | val 2 | txt
1 | 2 | val 3 | val 4 | txt
2 | 2 | val 1 | val 2 | txt
2 | 2 | val 3 | val 4 | txt
3 | 2 | val 1 | val 2 | txt
3 | 2 | val 3 | val 4 | txt

le tri sera dans l'ordre suivant : type, part, val 1, val 2....commentaire

donc ce ne sera pas un simple copier/coller, d'ou mon idee d'utiliser le nombre d'arguments d'un tableau si possible. j'espere que cet exemple a eclairci un peu le probleme devant lequel je me trouve.

de plus, je viens de voir un nouveau probleme :

idType(i) = Range("A" & i).Value

j'ai essaye ici de faire assigner une rangee de valeurs a un tableau pour l'utiliser apres, mais contrairement a javascript ou php cela ne semble pas fonctionner. quelq'un pourrait me dire si il y a une moyen de faire une declaration de tableau dynamique?
0
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
10 août 2006 à 08:58
Comme je ne suis pas sûr de bien comprendre, il se peut que je réponde à côté de la plaque...

Je suppose que tu as une feuille Récap, et d'autres feuilles détail en nombre variable. Et tu veux avoir dans un tableau, dynamiquement, la liste des feuilles existantes. Si c'est bien ça, tu peux utiliser une petite routine de ce genre :
  Dim NbrF      As Integer
  Dim TabF(50)  As String
  Dim Feuille   As Worksheet
  
  NbrF = 0
  For Each Feuille In Worksheets
    If Feuille.Name <> "Récap" Then
      NbrF = NbrF + 1
      TabF(NbrF) = Feuille.Name
    End If
  Next
J'utilise, en début de module, Option Base 1, qui permet d'indicer le tableau en partant de la valeur 1 et non pas zéro.
Le tableau des noms de feuilles est dimensionné à 50. On le remplit avec le nom des feuilles existantes autres que Récap (nom à adapter), et NbrF contient le nombre de feuilles stockées en table.

Pour ta question idType(i) = Range("A" & i).Value, je ne comprends pas bien le PB. Ça te donne la valeur de la cellule Ai. mais que veux-tu obtenir exactement ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
10 août 2006 à 12:00
Alors,
deja merci pour ton aide avec la feuille Récap ^^, je connaissais pas la methode For Each Feuille In Worksheets, ca va effectivement me faciliter le travail. Quant a l'autre expression :
idType(i) = Range("A" & i).Value

ici, idType represente une cle id qui sers a identifier le genre de donnee, ie : id 1 = voiture neuve ; id 2 = voiture occasion.

je ne sais pas si je me suis exprime assez clairement, disons que les differentes feuilles, repressentant chacune un client different, contiennent les differentes offres ou demandes des ces clients. le but c'est de faire une fonction qui cree une feuille qui contiens toutes les donees de ces clients. les offres et demandes, ainsi que les clients ont chacun un id specifique pour les differentier, ie :
idclient 1 idtype 2 idgenre 1 = M. A offre voiture neuve ; idclient 2 idtype 1 idgenre 2 = M. B demande voiture occasion

le systeme mis en place sur le site utilise une feuille xls pour recuperer les donees et les utiliser, et ce que je veux faire c'est automatiser la creation de cette feuille ^^

pour le moment, ce que j'ai mis en place c'est :

>donner des valeurs aux cellules a partir d'un array
>reinitialiser la feuille (pour pas avoir des donnees qui trainent) avant de la remplir

ce qu'il me reste a faire :

>creer des arrays id, avec le nombre d'elements/arguments variable, apres lecture des donnees d'une feuille
>reutiliser ces arrays pour remplir la feuille Récap

(c'etait long n'est-ce pas?)

ce que j'avais en tete c'est que le programme lis les id un par un, les met dans l'array, et s'arrete des qu'il atteint une cellule vide. mon dileme viens du fait qu'en javascript on utiliserais quelque chose du genre :
myArray(i) = Value
d'ou l'expression
idType(i) = Range("A" & i).Value

or, apres l'avoir essaye, l'editeur me dit que ce n'est pas une syntaxe valable. et c'est la precisement que se situe le probleme.

l'autre probleme est que pour un loop, en javascript j'utiliserais
arg = myArray.Arguments.Length;
for (i=0; i<arg;i++){expression}
or, je n'ai aucune idee comment faire pour savoir le nombre d'arguments/elements que contiens un array ou si c'est meme possible.

maintenant je pense que j'ai clairement explique ma situation et le probleme, si vous voyez une solution merci d'avance ^^
0
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
10 août 2006 à 13:42
Pour aider, pourrais-tu éventuellement mettre un exemple de classeur, avec au moins 1 ou 2 modèles de feuilles détail, et idem pour la feuille récap.
Tu peux le mettre là :
https://www.cjoint.com/

Tu génères le lien et tu le colles ici.

A+
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
10 août 2006 à 14:38
oki, voici le fichier. pour info, il a ete tres, tres lourdement allegé ^^
ce n'est pas pour une petite liste qu'il y aurait besoin d'une macro ^^;

https://www.cjoint.com/?ikoKQYG438
0
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
10 août 2006 à 18:30
Hello ks13,

Je te retourne ton classeur :
https://www.cjoint.com/?ikszo6ALMX

Regarde dans le module Armojax si la macro Consolidation fait ce que tu veux, dans le principe. Après exécution, le résultat se trouve dans la feuille Global.
J'y copie bout à bout les données des feuilles partenaires, puis trie le tout sur les critères voulus. Ensuite, j'insère devant chaque type le libellé du type, et je supprime les lignes superflues.

Dis-moi si c'est quelque chose comme ça...
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
10 août 2006 à 20:25
o_O O_o ¬_¬;;

franchement, ca fait bien ce que je voulais, mais, coté code, le mien parais bourrin a coté du tien, enfin, pour ce que j'ai reussi a faire avec le peu de connaissances que j'ai du vba ^^;

en tout cas merci beaucoup, je m'attendais pas a avoir un si gros coup de main et merci aussi pour avoir pris le temps de m'ecrire le code directement dans le fichier ^^
maintenant il me reste juste a reussir a rajouter quelques truc dans le code apres avoir reussi a le comprendre....j'y ai jete un coup d'oeil et j'y ai compris que la moitié, a peu pres ^^;

si, malgre mes pas si grandes connaissances dans le html/javascript/php/css/asp je peut t'aider en retour de ce coup de main, je serais heureux de le faire ^^
0
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
10 août 2006 à 23:07
Bon, eh bien tant mieux si ça correspond à ce que tu veux.
Va voir là, tu trouveras de quoi piger l'autre moitié :-)
https://www.cjoint.com/?ikxhW2rigg
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
11 août 2006 à 10:16
Wah, c'est cool, merci beaucoup ^^
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
11 août 2006 à 10:31
ooops, j'ai mis trop de temps pour ecrir la modification de mon dernier message u_u;

alors, pour repondre a la question, le Len(Feuille.name) <5 n'est pas valable ^^; j'ai juste mis des abreviations, mais dans l'original, les noms sont complets, mais ce n'est pas si grave que ca, j'ai deja cree une fonction qui verifie le nom des feuilles d'apres la feuille contenant la liste des partenaires (c'etait avant que tu me passe ta macro ^^;).

Je voudrais savoir une chose, dans les feuilles, on a separe les differents types en ajoutant une ligne avec dans la 1ere colonne le nom du type precedé du caractere apostrophe " ' ", ce qui en vb signifie un commentaire, si j'ai bien compris, quand vb va traiter la feuille il va soit voir la ligne comme vide, soit l'ignorer, c'est cela?
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
11 août 2006 à 10:45
est-ce que tu pourrais me dire ce que fait cette commande?
feuille.cells et .row je reconnais, mais je ne vois pas ce que font le 65536 ainsi que end(xlup)

NbrLig = Feuille.Cells(65536, 1).End(xlUp).Row
0
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
11 août 2006 à 11:43
On peut repérér une cellule :
- soit avec la notation A1, dans laquelle les entêtes de colonnes sont des lettres A, B, C, etc.
- soir avec la notation L1C1, où les entêtes de colonnes sont numérotées 1, 2, etc.
Pour choisir : Outils/Options.../Général - Cocher ou non le style de référence L1C1.

En VBA, Range("B5") et Cells(5, 2) sont équivalents.
Pour une plage, les écritures suivantes sont aussi équivalentes :
- Range("A2:C5")
- Range(Cells(2, 1), Cells(5, 3))
En VBA, la notation L1C1 est souvent pratique quand on vent boucler sur les lignes et colonnes avec des indices.

Cells(65536, 1) représente la cellule A65536, c'est-à-dire la dernière ligne d'une feuille Excel, en colonne 1.
End(xlUp) : End est une fonction qui balaye les cellules et détecte la frontière entre les cellules vides et non vides. xlUp dit de balayer en remontant (et xlDown et descendant).
Comme on part d'une cellule vide du bas de la feuille, la fonction détecte la dernière ligne non vide de la colonne 1.

Feuille.Cells(65536, 1).End(xlUp).Row donne le n° de la ligne correspondante.
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
11 août 2006 à 11:37
Voici ce que j'utilise pour le nom de la feuille, j'ai du supprimmer les "/" car le programme les accepte pas dans les noms des feuilles

'On definit la date au format jj-mm-aaaa pour dater la feuille generale
Dim datef As String
datef = Date
Dim pdate As String
pdate = Mid(datef, 1, 2) & "-" & Mid(datef, 4, 2) & "-" & Mid(datef, 7)
Dim fdate As String
fdate = "ImportRate_" & pdate
'Fin definition

j'ai separé la date et le nom pour pouvoir utiliser la date separement si besoin est. apres j'ai fait ceci :

'Test et creation de la feuille generale
Dim Feuille As Worksheet
Dim testf As Boolean
testf = False
For Each Feuille In Worksheets
If Not (Feuille.Name <> fdate) Then
testf = True
End If
Next
If Not testf Then
Sheets.Add
Sheets(feuille1).Name = fdate
Else
Sheets(fdate).Cells.ClearContents
Range("A1").Select
End If
'fin test et creation

ici, le programme doit verifier si une feuille avec la date actuelle existe, si oui il la vide de son contenu (pour eviter des donees qui trainent), si non il la cree.
le probleme que je n'arrive pas a resoudre c'est de selectionner la feuille créée et changer son nom.
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
11 août 2006 à 17:05
ooops, il me semble qu'il y a eu un melange de messages o_O

bref, desole de t'importuner encore, mais j'ai rencontre un probleme avec ton code que je n'arrive pas a resoudre : j'ai copie tel-quelle la macro dans le classeur original, et le resultat apres que j'ai execute la macro n'est pas celui auquel je m'attendais : il n'a copie que les lignes avec idtype = 1, et rien des autres, mais tous les partenaires y sont par contre ^^;

vu que quand on defile vers le bas la feuille, on voit qu'il a selectionne la region ligne n°1600+ la commande avec End(xlUp) doit fonctionner correctement. mais je ne vois pas ce qui cloche ^^;
0
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
11 août 2006 à 17:18
Salut ks13,
Comme tu as dû adapter quelques petites choses, peux-tu mettre ici le code dans son état actuel ?
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
12 août 2006 à 16:36
alors, voici le code tel quel dans le fichier, desole mais je ne peut pas montrer le fichier original, normalement je n'aurais meme pas du montrer l'autre, meme s'il a ete allege et modifié ^^;. par consequent je ne peut que mettre le code de la macro.

Option Explicit

Sub Consolidation()

'On definit la date au format jj-mm-aaaa pour dater la feuille generale
Dim datef As String
datef = Date
Dim pdate As String
pdate = Mid(datef, 1, 2) & "-" & Mid(datef, 4, 2) & "-" & Mid(datef, 7)
Dim fdate As String
fdate = "ImportRate_" & pdate
'Fin definition

' désactivation de la mise à jour écran
Application.ScreenUpdating = False

Dim IdType As Integer
Dim I As Long
Dim NbrLig As Long
Dim NumLig As Long
Dim Feuille As Worksheet

' effacement de la feuille "Global" avant reconstruction
Sheets("Global").Cells.ClearContents

' on copie bout à bout dans la feuille "Global"
' le contenu des feuilles "partenaires"
NumLig = 1
For Each Feuille In Worksheets
If (Feuille.Name <> "Global" And _
Feuille.Name <> "listePartenaires" And _
Feuille.Name <> "listeType" And _
Feuille.Name <> "Config" And _
Feuille.Name <> "ImportRates-7-aout-2006" And _
Feuille.Name <> "fverif" And _ 'ceci est une feuille qui contient les differentes variables, c'est pour que je puisse verifier que toutes les variables sont traitees correctement
Feuille.Name <> fdate) Then
Feuille.Activate
NbrLig = Feuille.Cells(65536, 1).End(xlUp).Row
Feuille.Range(Cells(1, 1), Cells(NbrLig, 1)).EntireRow.Copy
Sheets("Global").Activate
Cells(NumLig, 1).Select
ActiveSheet.Paste
NumLig = NumLig + NbrLig
End If
Next

' tri des données sur : type / partenaire / valeur1
Cells.Sort Key1:=Range("B1"), Order1:=xlAscending, _
Key2:=Range("A1"), Order2:=xlAscending, _
Key3:=Range("H1"), Order3:=xlAscending, _
Header:=xlNo

' ajout du libellé du type devant chaque type
I = 1
IdType = 0
NbrLig = NumLig - 1
Do Until Not IsNumeric(Cells(I, 1).Value)
If Cells(I, 2).Value <> IdType Then
IdType = Cells(I, 2).Value
Rows(I).Insert shift:=xlDown
Cells(I, 1).Value = Sheets("listetype").Cells(IdType, 2).Value
NbrLig = NbrLig + 1
End If
I = I + 1
Loop

' suppression des lignes superflues issues des feuilles partenaires
Range(Cells(I, 1), Cells(NbrLig, 1)).EntireRow.Delete

Application.ScreenUpdating = True ' réactivation de la mise à jour écran

End Sub

comme il n'y a que quelques feuilles qui ne contiennent pas les donnees qu'on veut j'ai mis un <> pour chacune d'elles
0
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
12 août 2006 à 21:53
Je pense que le PB se situait au niveau de la sélection des feuilles partenaires. En travaillant par exclusion, il y a une feuille "non partenaire" qui a dû être sélectionnée à tort et qui a mis le souk.
J'ai modifié ça, en nommant explicitement les feuilles concernées. Ça donne :
For Each Feuille In Worksheets
    Select Case Feuille.Name
      Case "BF", "DisL", "DisM", "DisR", "Med", "Fin"
        Feuille.Activate
        NbrLig = Feuille.Cells(65536, 1).End(xlUp).Row
        Feuille.Range(Cells(1, 1), Cells(NbrLig, 1)).EntireRow.Copy
        Sheets("Global").Activate
        Cells(NumLig, 1).Select
        ActiveSheet.Paste
        NumLig = NumLig + NbrLig
    End Select
  Next
Tu peux remplacer ce bout de code.

Par ailleurs, on peut simplifier le calcul de la définition de la date :
  'On definit la date au format jj-mm-aaaa pour dater la feuille generale
  Dim fdate As String
  fdate = "ImportRate_" & Mid(Date, 1, 2) & "-" & Mid(Date, 4, 2) & "-" & Mid(Date, 7)
  'Fin definition
Essaie et vois si c'est mieux.

A+
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
12 août 2006 à 22:01
en fait, j'y ais deja pensé mais, le probleme c'est qu'il se peut qu'on ajoute d'autres feuilles sur lequelles prelever des donees et le programme doit les reconnaitre aussi, or comme avec cette idee il fo modifier la macro, donc ajouter les nouvelles feuilles manuellement, je ne pense pas que c'est une aussi bonne idee....mais, est-ce qu'il est possible de faire un truc comme :

For Each Feuille In Worksheets
Select Case Feuille.Name
If Not Case "Config", "listeType", "listePartenaires", "ImportRates-7-aout-2006", "fverif", fdate
Feuille.Activate
NbrLig = Feuille.Cells(65536, 1).End(xlUp).Row
Feuille.Range(Cells(1, 1), Cells(NbrLig, 1)).EntireRow.Copy
Sheets("Global").Activate
Cells(NumLig, 1).Select
ActiveSheet.Paste
NumLig = NumLig + NbrLig
End Select
Next
0
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
12 août 2006 à 22:23
Je suggère autre chose. Comme pour tout ensemble à définir, on a 2 solutions :
- un critère d'appartenance, ou bien...
- la liste des éléments.
Si la première solution est possible, c'est beaucoup plus facile à programmer, et l'ajout ou le retrait d'éléments ne fait rien modifier. C'est pour ça que j'avais utilisé la taille du nom des feuilles comme critère.

Pourquoi ne pas reconnaître les feuilles partenaires par leur nom. Par exemple, elles commenceraient toutes par P-.
On aurait :
P-Med, P-DisL, P-Fin etc.
Dans ce cas, il suffirait de remplacer :
Select Case Feuille.Name
  Case "BF", "DisL", "DisM", "DisR", "Med", "Fin"
  .....
End Select
par
If Left(Feuille.Name, 2) = "P-" Then
.....
End If
Est-ce que ça t'irait ?
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
12 août 2006 à 23:58
hmmmm, ca c'est une bonne idee, je vais voir si c'est possible avec le responsable ^^....enfin, demain, car ce soir c'est une peu tard ^^;
0
ks13 Messages postés 191 Date d'inscription lundi 12 juillet 2004 Statut Membre Dernière intervention 1 août 2011 23
16 août 2006 à 16:00
alors, j'ai cherché un peu, et voila ce que j'ai fini par obtenir comme code de selection :

'Debut selection de donnees d'apres criteres
a_row = 1
If part <> "" And type <> "" Then
Do Until Not IsNumeric(Cells(a_row, 1).Value)
If Cells(a_row, 2).Value <> type And Cells(a_row, 1) <> part Then
'suppression de la ligne
Rows(a_row).Delete Shift:=xlDown
End If
a_row = a_row + 1
Loop
ElseIf part = "" And type <> "" Then
Do Until Not IsNumeric(Cells(a_row, 1).Value)
If Cells(a_row, 2).Value <> type Then
'suppression de la ligne
Rows(a_row).Delete Shift:=xlDown
End If
a_row = a_row + 1
Loop

ElseIf part <> "" And type = "" Then
Do Until Not IsNumeric(Cells(a_row, 1).Value)
If Cells(a_row, 1).Value <> part Then
'suppression de la ligne
Rows(a_row).Delete Shift:=xlDown
End If
a_row = a_row + 1
Loop
End If
'Fin selection de donnees d'apres criteres

je ne sais pas encore si cela marche car je n'ai pas reussi a comprendre comment creer uen liste deroulante dans une feuille excel malgre quelques explications que j'ai trouvé sur ce forum et les tests que j'ai fait avec excel ^^;

est-ce qu'il serait possible que le programme verifie chaque feuille contenant "P-" devant le nom (oui, c'est une tres bonne idee ces prefixes, encore une fois merci pour l'idee ^^), et que si la feuille a un "P-" devant il l'enleve et l'ajoute a la liste, ou plus simple, il prends la liste de partenaires de la feuille listePartenaires. enfin, est-ce qu'il est possible de creer une liste deroulante avec vba dans une cellule a partir d'une plage de donees existante? et, surtout, comment on doit faire cela ^^;
0