Lire et écrire valeur d'une cellule

Résolu
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011 - 6 sept. 2010 à 13:48
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011 - 8 sept. 2010 à 09:00
Actuellement je fais cette procédure de copier/coller :

ub RecupNumLot()
    
    Windows("analyses.xls").Activate    'On active analyses.xls le classeur
    Sheets("Données Rapports").Activate 'On active la feuille Données Rapports où se situe les données qu'on veut récupérer
    Range(cNumLot).Select               'On sélectionne la cellule qu'on veut récupérer

    Selection.Copy                      'On la copie
    
    Windows("exemple.xls").Activate     'On active exemple.xls dans lequel on va stocker les données
    ActiveSheet.Paste                   'On colle le numéro de lot dans la cellule active
    
End Sub


J'aimerai faire la même chose mais plutôt qu'un copier coller, faire une lecture écriture ... je sais que ça existe mais comment ça marche? Si vous connaissez un tuto...
Cela me permettra d'éviter les erreurs de mise en forme...

10 réponses

cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
7 sept. 2010 à 09:13
J'ai modifié mon code qui à l'air de fonctionner :

Function RecupPartielle(typeAnalyse As String, formeAnalyse As Integer, varAnalyse As String, valAnalyse As String)

Dim recupVar As String
Dim recupVal As String
recupVar = ""
recupVal = ""

    Call Ouvre
    
    Windows("exemple.xls").Activate
    Range("A2").Select
    
    'Boucle pour se positionner sur la première cellule vide
    Do While Not (IsEmpty(ActiveCell))
        NbLigne = NbLigne + 1
        Selection.Offset(1, 0).Select
    Loop
    
    ActiveCell.Value = formeAnalyse
    
    ActiveCell.Offset(0, 1).Range("A1").Select
    Call RecupNumLot
    
    ActiveCell.Interior.Color = RGB(255, 255, 255)
    
    'Cellule suivante On récupère le type d'analyse
    ActiveCell.Offset(0, 1).Range("A1").Select
    ActiveCell.Value = typeAnalyse
            
    'Cellule suivante On récupère la variable d'analyse
    ActiveCell.Offset(0, 1).Range("A1").Select
    
    Windows("analyses.xls").Activate
    recupVar = Range(varAnalyse).Value
    Windows("exemple.xls").Activate
    ActiveCell.Value = recupVar

    ActiveCell.Offset(0, 1).Range("A1").Select
    
    Windows("analyses.xls").Activate
    recupVal = Range(valAnalyse).Value
    Windows("exemple.xls").Activate
    ActiveCell.Value = recupVal
    ActiveCell.Interior.Color = RGB(255, 255, 255)

    'Sauvegarde et fermeture du fichier "exemple.xls"
    Windows("exemple.xls").Activate
    ActiveWorkbook.Save
    ActiveWorkbook.Close

End Function


Voilà à quoi il ressemble... Cependant le traitement est peut être plus long et moins transparent pour l'utilisateur j'ai l'impression...
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
6 sept. 2010 à 14:05
Bonjour,

Enregistre une macro avec Excel (Outils -> Macros -> Enregistrer)
Et regardes le code généré.

Mon site
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
6 sept. 2010 à 14:12
Gloups j'ai pas copié la bonne fonction :

Function RecupPartielle(typeAnalyse As String, formeAnalyse As Integer, varAnalyse As String, valAnalyse As String)

    Call Ouvre
    
    Windows("exemple.xls").Activate
    Range("A2").Select
    
    'Boucle pour se positionner sur la première cellule vide
    Do While Not (IsEmpty(ActiveCell))
        NbLigne = NbLigne + 1
        Selection.Offset(1, 0).Select
    Loop
    
    ActiveCell.Value = formeAnalyse
    
    ActiveCell.Offset(0, 1).Range("A1").Select
    Call RecupNumLot
    
    ActiveCell.Interior.Color = RGB(255, 255, 255)
    
    ActiveCell.Offset(0, 1).Range("A1").Select
    ActiveCell.Value = typeA
    
    ActiveCell.Offset(0, 1).Range("A1").Select
    
    Windows("analyses.xls").Activate
    Range(varAnalyse).Select
    Selection.Copy                                    **
    Windows("exemple.xls").Activate
    ActiveSheet.Paste                                 **
    
    ActiveCell.Offset(0, 1).Range("A1").Select
    
    Windows("analyses.xls").Activate
    Range(valAnalyse).Select
    Selection.Copy                                     **
    Windows("exemple.xls").Activate
    ActiveSheet.Paste                                  **
    ActiveCell.Interior.Color = RGB(255, 255, 255)

    'Sauvegarde et fermeture du fichier "exemple.xls"
    Windows("exemple.xls").Activate
    ActiveWorkbook.Save
    ActiveWorkbook.Close

End Function


Je fais mes copier coller là où j'ai mis les étoiles. Etes vous sûr que je puisse réaliser cela en macro??
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
6 sept. 2010 à 14:56
Bonjour,
Je n'ai pas regardé ton script complet.. mais déjà pour un début de réponse :
oui on peut lire une valeur puis la recopier ailleur.

Par exemple:

Pour lire la valeur d'une cellule: (on peut le faire avec range ou cells)
mavariable = Cells(2,"A").value
mavariable = Range("A2").value

et pour écrire:
Cells(2,"A").value = mavariable
Range("A2").value = mavariable

pour plus d'infos sur l'utilisation du VBA, tu peux rechercher sur le net des infos sur la manipulation des feuilles et des cellules.

Bonne continuation.

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
0

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

Posez votre question
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
7 sept. 2010 à 09:27
Bonjour,

pour accélerer le traitement, je propose que tu passes par des tableaux de variable pour stoker tes valeurs puis pour toutes les recopier d'un coup sur ton autre classeur.
Penses aussi à "désactiver" la mise à jour de l'affichage pendant l'éxécution de ta macro...ça te fera encore gagner un peu de temps (application.screenupdating = false).

Pour ce qui est de tenir l'utilisateur informé de l'avancement du programme, tu peux utiliser la barre d'état pour y afficher des messages ou sinon te créer une progressbar.
Par exemple, tu comptes ton nombre de ligne à parcourir et tu fais un pourcentage entre la ligne où tu es / nb Total.


Pour la recherche de la dernière ligne, regardes également sur le net, il existe des fonctions qui permettent de le faire "mieux" (on va dire plus vite et plus proprement) qu'une boucle..


NB: pour l'utilisation de TABLEAUX, je te propose se lien :
UTILISER LES TABLEAUX EN VBA

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
7 sept. 2010 à 11:03
J'ai retesté mon programme et en fait c'est juste en pas à pas que le traitement est plus donc ça va...

Mais j'ai regardé toutes tes suggestions et vais les garder sous le coude...

Que veux tu dire par désactiver la mise à jour de l'affichage pendant l'éxécution de ma macro... ? De quelle macro tu parles à quel moment?? Et il va falloir que je réactive à chaque fois non? Je comprend pas trop de quel moment tu parles...

Logiquement l'utilisateur n'a pas besoin d'être informé...

La dernière ligne vide tu veux dire? Ben j'ai trouvé le code mis sur le net en fait... J'ai rien trouvé (pour ma part) de mieux... Mais je débute en vba et je ne sais pas peut être pas bien distinguer tout ça lol
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
7 sept. 2010 à 11:50
Bonjour,
Que veux tu dire par désactiver la mise à jour de l'affichage pendant l'éxécution de ma macro

pour l'affichage.. lorsque tu passes d'une feuille à une autre ou que tu t'y déplace, tu peux le voir à l'écran...cela ralentit un peu le programme.
En plaçant l'instruction
application.ScreenUpdating = false
au début de ton code permet de demander à ton programme de ne pas afficher ces "mouvements" pendant le traitement.
A la fin de ta macro, tu mets ensuite cette fonction à TRUE pour la réactiver.
Cela permet de faire gagner un peu de temps à ton programme.

Ensuite, pour "trouver" la dernière ligne de ton tableau, il existe différentes faço de procéder :
VOIR ICI

Pour ma part, j'utilise principalement :
Derniere_Ligne = Activesheet.Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row 'pour les lignes 


Bonne continuation et n'hésites pas à revenir poster sur le forum si tu as des soucis.

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
7 sept. 2010 à 16:58
Oh merci bien, j'ai utilisé l'instruction pour que les mouvements n'apparaissent pas et cela fonctionne à la perfection.
Par contre j'avoue ne pas trop comprendre ta ligne :
Derniere_Ligne = Activesheet.Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row 'pour les lignes 



J'ai pour ma part besoin de connaitre la première cellule vide de mon tableau comme tu as pu le voir dans mon code et à partir de là je remplis et passe à chaque fois à la cellule suivante (celle de droite). Ensuite je me replace à la première cellule vide (une ligne en dessous donc) et je recommence jusqu'à ce que je n'ai plus de valeurs pour le remplir ... Et je ne vois pas comment utilisé ton code où ceux de ton lien...
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
8 sept. 2010 à 07:45
Bonjour,
cette ligne te permet de connaitre l'emplacement de la dernière ligne de ton tableau ( donc +1 pour avoir la première ligne vide).
Ca permet juste de ne pas avoir à parcourir tout ton tableau pour la trouver (surtout si il y a beaucoup de lignes dedans )

mais bon, c'était juste une proposition... ta boucle fonctionne aussi

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
8 sept. 2010 à 09:00
Lol ok c'est gentil merci
0
Rejoignez-nous