VBA - Modification de cellules visibles

Résolu/Fermé
Valou Choc Messages postés 5 Date d'inscription mardi 10 janvier 2012 Statut Membre Dernière intervention 11 janvier 2012 - 10 janv. 2012 à 14:34
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 11 janv. 2012 à 13:29
Bonjour,

J'ai un probleme dont je ne trouve pas la solution... J'espere que vous pourrez m'aider.

Je veux ecrire une macro afin de modifier des fichiers excel.
Mon fichier excel est tel que les 100 premieres lignes environ sont des dates de mises a jour (ce nombre varie tous les jours). dessous j'ai une ligne vide, un header dont je connais la configuration, puis mes donnees.

ce que je veux faire:
une fois que j'ai trouver le header, je veux ajouter un filtre, filtrer sur certaines valeurs de la colonne J et modifier le colonne I pour ces valeurs. Le probleme est que ces valeurs ne sont pas toujours sur la meme ligne que le jour precedent...

Est ce clair?
Comment puis je ecrire ca?

Je n'ai pas reussi a recuperer le numero de la ligne du header, j'ai donc pour l'instant admis que ce header est ligne 100 tous les jours.
J'ai réussi a filtrer la colonne J pour les valeurs que je veux:

ActiveSheet.UsedRange.Rows("100:" & ActiveSheet.UsedRange.Rows.Count).AutoFilter Field:=10, Criteria1:=Array _
("ATHK", "DBUD", "HIUD", "OHFC", "POHF", "TFDJ", "MJNC", "PLSX", "TGUJ"), Operator:= xlFilterValues

Apres ca, je ne sais pas du tout comment modifier les valeurs de ma colonne I.
J'ai essaye de definir un tableau contenant seulement les cellules visibles mais ca ne marche pas...:

Tab1 = ActiveSheet.UsedRange.Rows("100:" & Range("A" & Rows.Count).End(xlUp).Rows).SpecialCells(xlCellTypeVisible)

Quelqu'un arriverait a m'aider?
Merci!!!!!

A voir également:

2 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 janv. 2012 à 16:19
Bonjour,
1- si tes cellules J1, J2, J3 etc jusqu'à la ligne précédent ton "Header" sont remplies, la ligne de ton header peut être définie comme ceci :
Dim LigHeader As Long
LigHeader = Range("J1").End(xlDown).Row + 2

2- Pour résoudre ton problème, personnellement, je ne filtrerais pas la base de données. En fait, une boucle sur les données contenues en colonne J, avec un test si appartient au Array("ATHK", "DBUD", "HIUD", "OHFC", "POHF", "TFDJ", "MJNC", "PLSX", "TGUJ") alors on modifie la colonne I correspondante...
Pour te faire une démo, il faudrait connaitre au préalable le nombre de données à traiter...
Ton tableau comporte combien de lignes?

Note : pour le 1- on peux aisément remplacer J par A ou B ou...
--
Cordialement,
Franck P
0
Valou Choc Messages postés 5 Date d'inscription mardi 10 janvier 2012 Statut Membre Dernière intervention 11 janvier 2012
10 janv. 2012 à 16:25
Super pour le header, je vais essayer ca merci.

Pour la boucle, j'ai environ 15 000 lignes dans mon tableau, ca peut etre une solution mais ce ne serait pas un peu long?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 10/01/2012 à 16:34
Pas en passant par des variables tableaux.
J'te fait un test dans 5 minutes...
As tu une colonne vide? K, L ...
0
Valou Choc Messages postés 5 Date d'inscription mardi 10 janvier 2012 Statut Membre Dernière intervention 11 janvier 2012
10 janv. 2012 à 16:36
les colonnes A a W ont des donnees, ensuite toutes les colonnes sont vides.
Merci pour ton aide!
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 janv. 2012 à 16:51
Cette macro va te faire un test sur tes données. Si on trouve un élément de ton Array dans la colonne J, il va inscrire VRAI en Colonne X.
On remplacera plus tard le VRAI en colonne X par l'inscription de ce que tu veux en I.
Pour l'instant on va tester la vitesse d'exécution.
fais donc un test sur une copie de ton fichier et dis moi si le temps d'exécution te convient...
Sub test()
Dim LigHeader As Long, DrLig As Long, Lig As Long, Lign As Long, Cpt As Integer
Dim TablTri(), TablColJ()
Dim t

t = Timer
'on détermine la ligne du Header
LigHeader = Range("J1").End(xlDown).Row + 3
'on détermine la toute dernière ligne saisie colonne J
DrLig = Range("J" & Rows.Count).End(xlUp).Row
'On boucle entre ces 2 lignes
For Lig = LigHeader To DrLig
    'pour remplir une variable tableau (TablColJ) des données contenues colonne J
    ReDim Preserve TablColJ(Lign)
    TablColJ(Lign) = Range("J" & Lig).Value
    Lign = Lign + 1
Next Lig
'On entre dans une autre variable tableau nos critères de tri :
TablTri = Array("ATHK", "DBUD", "HIUD", "OHFC", "POHF", "TFDJ", "MJNC", "PLSX", "TGUJ")
'On boucle sur tous les éléments de notre variable de "tri"
For Cpt = LBound(TablTri) To UBound(TablTri)
    'On boucle du 1er au dernier élément du tableau contenant les données ColJ :
    For Lig = LBound(TablColJ) To UBound(TablColJ)
       'Si les éléments sont identiques
        If TablColJ(Lig) = TablTri(Cpt) Then
            Range("X" & Lig + LigHeader) = "VRAI"
        End If
    Next
Next
MsgBox "Test réalisé en : " & Timer - t & " secondes!"
End Sub
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 10/01/2012 à 17:00
Bon, je viens de tester, 1 .7 secondes pour 25 000 lignes. Ca devrait aller.

Dis moi comment et par quoi tu souhaites remplacer les données colonne I si J appartient à Array("ATHK", "DBUD", "HIUD", "OHFC", "POHF", "TFDJ", "MJNC", "PLSX", "TGUJ")
Les données sont multiples? Tu en as autant que dans l'array?
Exemple :
ATHK ==> IDEA
DBUD ==> COQUI
etc...
Si oui, donne moi l'array correspondant...

Ou alors tu remplaces systématiquement la donnée correspondante colonne I par une seule et même valeur? Si oui, laquelle?

Ou autre...


PS : la suite demain, si tu veux bien...
0
Valou Choc Messages postés 5 Date d'inscription mardi 10 janvier 2012 Statut Membre Dernière intervention 11 janvier 2012
10 janv. 2012 à 17:09
pour toutes ces donnees je remplace la valeur en colonne I par une seule et meme valeur, DIME.
J'ai d'autres modifications dans le genre a faire mais ca viendra plus tard. Si j'arrive a faire marcher celle ci, le reste sera plus simple :-)
1,7 secondes, c'est plus rapide que si je fais ces changements a la main... Super!

Demain me semble parfait! Passe une bonne soiree et merci encore de ton aide!!!
0