Tri et selection de données

  • Initiateur de la discussion Xavier
  • Date de début
X

Xavier

Guest
Bonjour,

Une question probablement facile mais je n'y arrive pas.
Je travaille avec un feuillet qui contient environ 125 colonnes et 16000 lignes soit environ 2 000 000 (125 fois 160000)de cellules. Les valeurs des cellules sont automatiquement mise à jour toutes les jours car ce feuillet est liée à des valeurs obtenues à l'aide d'une application qui est PowerPLay. Egalement le nombre de colonne et de ligne peuvent varier tous les jours.
Ce que je souhaiterai c'est avoir un moyen, macro... qui me recopie uniquement les cellules positives( valeurs différentes de 0) dans un autre feuillet. J'ai environ 50 cellules positives sur les 2 000 000. Mais attention cela varie chaque jour.
J'espère que ma question est claire et je vous remercie par avance de votre aide car ici je suis dépassé.
 

JCA06

XLDnaute Occasionnel
Bonsoir Xavier, le Forum,

Il faut peut-être que tu précise ce que tu as besoin de récupérer car la réponse sera complètement différente si tu dois juste récupérer en vrac la liste de tes valeurs positives ou s'il faut conserver le numéro de ligne et/ou le numéro de colonne.

D'autre part, afin de sélectionner la zone à traiter et de déterminer le test à appliquer, il est intéressant de connaître le type de données contenu dans tes cellules : uniquement numérique (même un zéro), alphanumérique ou même vide.

A plus.
 
X

Xavier

Guest
Merci pour les conseils,

En fait j'ai besoin de récupérer les valeurs des cellules mais les contenus des lignes et des colonnes correspondant à la cellule cible. En fait en X, sur ma première ligne, j'ai l'enemble des mes produits ( alphanumérique) et sur ma première colonne j'ai l'ensemble de mes clients ( alphanumérique). L'intersection me donne une valeur ( numérique).

J'espère que maintenant ma question est plus claire.
Merci encore pour l'aide.
Xavier
 

JCA06

XLDnaute Occasionnel
Bonsoir Xavier,

Voici une ébauche mais qui est à améliorer. En espérant que cela fonctionne !


Sub TriValeurPositives()


Dim colonne As Long
Dim ligne As Long
Dim c As Long
Dim l As Long
Dim i As Long
Dim j As Long

'
Let c = 2
Let l = 2
Sheets(1).Activate
Range('IV1').Select
Selection.End(xlToLeft).Select
Let colonne = ActiveCell.Column

Selection.End(xlDown).Select
Let ligne = ActiveCell.Row
Range('B2').Select
For i = 2 To colonne
For j = 2 To ligne
If Cells(j, i).Value > 0 Then
Worksheets(2).Cells(1, c).Value = Worksheets(1).Cells(1, i).Value
Worksheets(2).Cells(l, 1).Value = Worksheets(1).Cells(j, 1).Value
Worksheets(2).Cells(l, c).Value = Worksheets(1).Cells(j, i).Value
c = c + 1
l = l + 1
End If
Next j
Next i
End Sub

Bonne soirée !
 

ChTi160

XLDnaute Barbatruc
Salut'Xavier' et JCA06
une petite macro que j'ai testé et qui fonction mais 2 000 000 ????
Sub detecte()
Dim C As Variant
Dim recherche As String
Dim maplage As Range
Dim firstaddress As String
Dim x As Integer
Dim col As Integer
Dim derlgn As Integer, l As Integer
Dim tab1()
Application.ScreenUpdating = False
With Sheets('Feuil1')
derlgn = .Range('B65536').End(xlUp).Row'cherche la derniere ligne de la colonne B
col = .Range('A1').End(xlToRight).Column'cherche la dernire colonne de la ligne 1
Set maplage = .Range(.Cells(1, 2), .Cells(derlgn, col))'plage de recherche
recherche = '-*' 'recherche les tous qui commence par un moins

Set C = maplage.Find(recherche)
x = 1
If Not C Is Nothing Then
firstaddress = C.Address
Do
ReDim Preserve tab1(x)' charge un tableau
tab1(x) = C.Value
x = x + 1

Set C = maplage.FindNext(C)

Loop While Not C Is Nothing And C.Address <> firstaddress

End If
For l = 1 To UBound(tab1, 1)
Worksheets('Feuil2').Cells(l, 1) = tab1(l) 'vide le tableau en feuille 2 colonne 1
Next
End With
End Sub
 

JCA06

XLDnaute Occasionnel
Bonjour le ChTi160, Xavier, le Forum,

Ha ! c'est sur que c'est plus classe avec un tableau, et peut être plus rapide aussi. Par contre, tu ne récupéres que la valeur dans ton tableau alors qu'il faut également garder les entêtes (client et produit).

Tassez-vous dans le tableau ! il y a du monde qui arrive !

A plus.
 
X

xavier

Guest
Merci pour toutes vos réponses.
Afin que ma demande soit plus claire et que vous puisiez vous déchainer je vous joins le tableau EXcel sur lequel je travaille.
attention si vous ouvrez ce document, il y a un lien vers une application PowerPlay pour mettre à jour les datas.
n'en tenez pas compte et désactivé.
ensuite vous êtes libre sur la feuille 1 de faire se que vous voulez.
Je souhaite récupérer sur la feuille 1 les cellules de la feuille estimated sales europe avec la valeurs des cellules et bien entnendu la correspondance du contenu ligne et colonne.

Merci encore pour tout.

Xavier
 

JCA06

XLDnaute Occasionnel
Bonsoir Xavier,
Pour joindre un fichier, il doit être zippé et de taille inférieure à 50 ko.
Autant dire qu'il faut que tu mettes ton fichier au régime parce qu'avec tes 160 000 lignes et toutes tes colonnes, ça doit tout de même peser !

Est-ce-que tu as essayé de faire tourner ma macro ?
Ou d'abord, est-ce-que tu sais comment récupérer ce code ?

Si tu l'as fait, tu dois constater que le résultat obtenu est un tableau en page 2 identique à ta base de données, mais sans les valeurs à zéro.
A savoir que le principe est de balayer chaque cellule de B2 à la dernière du tableau en changeant d'abord de ligne puis ensuite de colonne, et lorsqu'une valeur supérieure à 0 est trouvée, les entêtes de lignes et de colonnes sont copiées en page 2 et la valeur à l'intersection.

Si tu veux une autre présentation, c'est tout à fait possible, avec par exemple les trois colonnes suivantes :
- produit
- client
- valeur

Si tu peux joindre un extrait de ton fichier, c'est préférable.

A plus
 
X

Xavier

Guest
En fait je ne suis pas un pro d'excel. Et pour moi le VBA c'est un peu du chinois mais je vais apprendre.
Je joins mon fichier très simplifié quelques lignes et colonnes et j'ai enlevé les links éeventuels vers d'autres aplications.

Un exemple : Je souhaite récuprérer sur la feuille 2 la valeur de la cellule B12 ( valeur = 107748) et les contenus des cellules correspondantes à savoir les cellules B1 et A12.
Et cela pour l'ensemble du tableau en feuille 1.

Voila pour ce soir.
Sinon, peux tu stp me dire comment récupérer les macro que tu me donnes.
Merci pour l'aide, c'est super
 

JCA06

XLDnaute Occasionnel
Bonjour Xavier, le Forum,

Ton fichier n'est pas là !
Mais bon, on va essayer tout de même de te faire rentrer le code dans une copie de ton fichier pour ne pas faire de dégâts !
1- Ouvrir l'éditeur vba avec les touches Alt+F11
2- Créer un module : Insertion/Module
3- Faire un copier coller du code ci-dessous
4- Adapter éventuellement les noms des feuilles dans les objets Worksheets('met le bon nom'). Tu remplaces donc dans mon code Feuil1 par le nom de ta feuille de données, et Feuil2 et Feuil3 par les noms des feuilles dans lesquelles les données seront copiées (et oui, il y a deux présentations prévues !).
L'apostrophe dans les code permet de mettre des commentaires qui devraient t'éclairer.
5- Lance la macro (qui s'appelle Xavier) à partir d'Excel par le menu Outils/Macro/Exécuter.
6- Va voir le résultat dans les feuilles o&ugrave; tu as choisi de copier les données.

ça devrait le faire.

A plus.

Voici le code à copier :

Sub Xavier()

Dim colonne As Long
Dim ligne As Long
Dim c As Long, l As Long, i As Long, j As Long

Let c = 2 ' Pour commencer à la colonne 2, 1ère colonne de données
Let l = 2 ' Pour commencer à la ligne 2, 1ère ligne de données
Worksheets('Feuil1').Activate ' Activer la feuille de données
Range('IV1').End(xlToLeft).Select ' Se placer sur la dernière colonne
Let colonne = ActiveCell.Column ' Enregistre le numéro de la dernière colonne
Selection.End(xlDown).Select ' Se placer sur la dernière ligne
Let ligne = ActiveCell.Row ' Enregistre le numéro de la dernière ligne
Range('B2').Select ' Se replacer sur la première donnée
For i = 2 To colonne ' Boucle qui va passer de la 1ère à la dernière colonne de données
For j = 2 To ligne ' Boucle qui passe de ligne en ligne
If Cells(j, i).Value > 0 Then ' Test de la valeur de la cellule : si > 0
With Worksheets('Feuil2') ' Alors je copie les données sur la feuille 2
.Cells(l, 1).Value = Worksheets('Feuil1').Cells(1, i).Value
.Cells(l, 2).Value = Worksheets('Feuil1').Cells(j, 1).Value
.Cells(l, 3).Value = Worksheets('Feuil1').Cells(j, i).Value
End With
' Autre présentation, tu pourra choisir !
With Worksheets('Feuil3') ' Alors je copie les données sur la feuille 2
.Cells(1, c).Value = Worksheets(1).Cells(1, i).Value
.Cells(l, 1).Value = Worksheets(1).Cells(j, 1).Value
.Cells(l, c).Value = Worksheets(1).Cells(j, i).Value
End With
l = l + 1 ' pour que les données soient copiées sur la ligne suivante
c = c + 1 ' pour que les données soient copiées dans la colonne suivante
End If
Next j ' je passe à la ligne suivante jusqu'à la dernière ligne
Next i ' puis je passe à la colonne suivante jusqu'à la dernière
End Sub
 
X

Xavier

Guest
MERCI MERCI MERCI MERCI à JCA06

cela fonctionne très très bien. Maintenant je dois mettre un peu en forme mes fichiers.


Je profite de tes connaissances. Est il possible de créer une macro qui envoie directement une feuille à quelqu'un via lotus notes, ma messagerie ???
 

JCA06

XLDnaute Occasionnel
Bonsoir Xavier,

On arrive à se synchroniser finalement !

Au fait, ton post initial commençais par 'une question probablement facile'...

C'est vrai que s'eut été extêment facile pour beaucoup de participants de ce forum, mais moi, je suis tout de même content d'y être arrivé !

Ceci est en fait un introduction pour ta nouvelle question !

La réponse est certainement Oui pour savoir si cela est possible !
En revanche, c'est non pour ce qui est de profiter de mes connaissances à ce sujet :(
Parce qu'à ce sujet....je n'ai pas de connaissances !

Mais bon, le forum est là et il te suffit de faire une recherche sur celui-ci, ou dans les archives, pour trouver ton bonheur !

En ciblant lotus, ça devrait donner quelque chose !

A plus.
 

Discussions similaires

Statistiques des forums

Discussions
312 668
Messages
2 090 739
Membres
104 644
dernier inscrit
MOLOKO67