Question à propos d'une macro excel avec copie de données à intervalles de temps régulier

vincent le laborantin

Nouveau membre
Bonjour,
je suis chimiste et j'ai un problème avec une macro excel qui gère un analyseur.
En effet, cette macro contrôle mon appareil (un analyseur) à distance et devrait inscrire dans un tableau mes valeurs en temps réel, sauf qu'elle note mes valeurs que lorsque ma concentration dépasse 1000 ppb ( j’espère que c'est pas trop du chinois pour vous ... ).
Mais bon l'essentiel n'est pas la, sur ce tableau il est aussi noté dans les cases D3 à D5 les valeurs que je souhaiterai enregistrer, et ces valeurs varient en temps réel.
Donc pour enregistrer ces valeurs, je me suis dit que je pourrais faire une seconde macro dans le but de copier mes valeurs dans une autre fenêtre excel et cela à intervalle de temps régulier, genre toutes les 5 secondes.
Si j'ai decidé d'en faire une seconde, c'est parce que la premiere est beaucoup trop complexe ( 8000 lignes ... ) pour moi en tout cas et en plus creer par des allemands, bref le casse tete .
Donc mes questions, est il possible d'avoir une macro qui transefere des données d'une fenetre excel vers une autre et si oui avec la variable temps. ( Parce que je me vois pas faire des copier coller pendant 3h ou plus toutes les 5 secondes .... )

Merci d'avance pour vos réponses
Je suis dispo pour les éventuelles questions si c'est pas très clair .
 

zeb

Modérateur
Salut,

J'ai rien compris... jusqu'à : "est il possible d'avoir une macro qui transefere des données d'une fenetre excel vers une autre et si oui avec la variable temps."
:D

Oui, c'est possible.
:o

----------------------

Concernant la périodicité de tes actions, renseigne-toi sur Application.OnTime du VBA/Excel ou carrément sur l'API Windows que tu peux utiliser dans VBA.
;)

Pour ce qui est de la copie d'une feuille vers une autre, relis 80% de mes contributions sur ce site.

(Si tout ceci ne te suffit pas, je peux t'aider plus directement.)
 

vincent le laborantin

Nouveau membre
re bonjour, ( j'opte pour l'aide plus direct :D )

Arf, je me doutais que c'était pas très clair ce que je racontais ...
Bon jvais essayer de faire simple,
J'ai une macro qui est sensé m'afficher sous excel des données importées d'un appareil.
Sauf que dans le tableau excel qui apparait que je lance ma macro, il ne s'inscrit aucune valeur.
Les valeurs s'affichent seulement si l'appareil mesure des valeurs supérieurs à 1000, hors je souhaite travailler dans une gamme de 0 à 200.
J'ai essayé de chercher dans VBA mais le code est très long et je ne m'y connais pas vraiment

Donc deux choix pour moi en fait :
-Donc plus de lien ou je balance n'importe quoi sur le forum .....
-Ou, il me faudrait un bout de code que j’insère je ne sais pas trop où, qui puisse copier les cases D3, D4, D5 vers un autre classeur toute les x secondes en décalant d'une ligne a chaque intervalle de temps.

C'est plus clair ...?

Merci d'avance, pour toute question je suis la
Bonne chance
 

zeb

Modérateur
Modérateur : Méfiance, le lien proposé n'est pas une feuille Excel mais un SETUP.EXE !

-----------------------------------------------

Moi, je veux bien relire le code de tes amis allemands, mais c'est du boulot à plein temps, ça ! T'as un budget de combien pour mon salaire ?
Pis c'est quoi la licence d'utilisation de leur code ?

Bon, par contre, s'il s'agit de t'expliquer comment copier une cellule, ça devrait aller.
Sauf que tu vas le faire toi-même, que tu vas publier ton résultat ici, et que je vais t'expliquer que ce n'est pas bon et que je vais te montrer ce qu'il aurait fallu écrire ( :D - eh, sans rire, je vais vraiment le faire)

Or donc : copier une cellule d'un classeur à l'autre.

Tu vas donc ouvrir deux classeurs vides.
Dans une cellule d'une feuille de l'un, tu vas mettre une valeur.
Ensuite, tu vas démarrer l'enregistreur de macro.
Puis tu vas copier cette valeur et la mettre dans la cellule D3 d'une feuille de l'autre classeur.
Enfin, tu vas arrêter l'enregistreur de macro.

Et voilà. Il te reste à publier (*) ici le résultat de ta macro.
Et à attendre les commentaires et critiques désobligeantes qui ne manqueront pas de fuser.
Et à l'issue, tu sauras correctement copier une cellule.

Ensuite seulement, on verra pour le faire tous les x temps.
Remarque que je t'ai déjà donné une piste.

____________
(*) Attention, relire le règlement pour ne pas oublier la balise
Code:
 

vincent le laborantin

Nouveau membre
Bon ouai c'est vrai que c'était beaucoup demander, donc macro copier coller avec la condition de temps

Voila le code de ma macro copier coller ( je le fais pour les cellules qu'il faudra que je copie )

Code:
Sub copiercoller()
'
' copiercoller Macro
' Macro enregistrée le 04/01/2012 par Vincent
'

'
    Range("D3,D4,D5").Select
    Range("D5").Activate
    Selection.Copy
    Windows("Classeur2").Activate
    ActiveSheet.Paste
End Sub

J'espere que c'est correct ...
Donc maintenant il me faudrait seulement ajouter le décalage d'une ligne plus la condition temps

J'ai trouvé un bout de code ressemblant sur le net, mais je ne le comprends pas et je peux donc pas le modifier :

Code:
Sub Tempo()
    'Programmation de l'évènement toutes les secondes
    Tps = Now + TimeValue("00:00:05")
    Application.OnTime Tps, "Tempo"
    'Traitement
    Range("ligne").Copy
        With Sheets("Feuil2")
            .Range("A65536").End(xlUp)(2).PasteSpecial Paste:=xlPasteValues
        End With
    Application.CutCopyMode = False
End Sub
 
Sub StopTempo()
    On Error Resume Next
    'Stopper la gestion de l'évènement OnTime en cours
    Application.OnTime Tps, "Tempo", , False
End Sub

PS : j'ai supprimé ma boulette de mon fichier .exe

Merci d'avance


Edit 05/01/2012 : En fait cette macro fonctionne assez bien mais elle me copie mes valeurs les une au dessus des autres genre en A1,A2,A3 il se passe quelques secondes puis me les copie en A4,A5,A6 etc ... alors que je souhaiterai avoir un changement de colonne à chaque intervalle.
Ou bien m'inscrire les résultats dans 3 colonnes en A1,B1,C1 et descendre d'une ligne à chaque intervalle
Je pense que c'est lié à A65536 mais déjà je comprends pas son effet donc je ne sais par quoi le remplacer...
Une idée ??
 

vincent le laborantin

Nouveau membre
Bonjour,

Euh ... j'ai fait ce que tu m'as dit zeb mais les remarques n'ont pas fuser ...
Alors soit j'ai mal fait et je veux comprendre ce que j'ai pas bien fait ou sinon je comprends pas.
En attendant un sauveur ...
 

zeb

Modérateur
Oups désolé, mon message n'est jamais parti :confus:

Voilà à quoi il ressemblait
Mais ne sois pas si impatient.

D'abord, concentrons-nous sur la copie.
Voilà donc un condensé de tout ce qu'il ne faut pas faire :
- Sélectionner et/ou activer des objects
- Se baser sur cequi est sélectionné et/ou activé au lieu de considérer directement les objets
- Utiliser le presse-papier comme zone de données temporaire
- Cibler une zone "en dur".

Code:
Sub copiercoller()
    Range("D3,D4,D5").Select
    Range("D5").Activate
    Selection.Copy
    Windows("Classeur2").Activate
    ActiveSheet.Paste
End Sub

Evidemment, tous tes problèmes résident justement là.
C'était bien la peine de te demander de le faire :sarcastic:

A bas en fait il n'a pas été fini (je t'écrivais quand le boss a convoqué une réunion surprise.....)
 

zeb

Modérateur
Donc, dès qu'il s'agit de jongler avec les feuilles et les classeurs, il faut les préciser.
Range(..), ça n'existe pas. C'est : Application.Workbooks(..).Worksheets(..).Range(..)....
Dans la plupart des cas, laisser Excel se débrouiller avec les objets par défaut est suffisant.
Pas là.

Donc on va définir le classeur source, la feuille source et les cellules sources.
Puis le classeur cible, la feuille cible et les cellules cibles.

Ensuite, on ne va surtout pas faire un copier/coller presse-papier, mais une copie de cellules.

Code:
Sub copie_pascoller()
    Dim clas_source As Workbook
    Dim clas_cible  As Workbook
    Dim cell_source As Range
    Dim cell_cible  As Range
    
    ' // On considère que la macro est enregistré dans le classeur source
    Set clas_source = ThisWorkbook
    Set cell_source = clas_source.Worksheets(1).Range("D3;D5")
    
    Set clas_cible = Workbooks("Classeur2")
    set cell_cible = clas_cible.Worksheets(1).Range("D5")
	
	' // Et on copie !
	cell_source.Copy Destination:=cell_cible
	' // Et on cible une case plus bas
	Set cell_cible = cell_cible.Offset(1)
	
End Sub

Il y a juste un problème. Ca ne marche qu'une fois :(
Parce qu'on réinitialise tout à chaque fois.

Sortons donc l'initialisation :

Code:
' // Variables connues de plusieurs fonctions
Dim cell_source As Range
Dim cell_cible  As Range
Sub copie_ini()
    Dim clas_source As Workbook
    Dim clas_cible  As Workbook
    
    Set clas_source = ThisWorkbook
    Set cell_source = clas_source.Worksheets(1).Range("D3;D5")
    
    Set clas_cible = Workbooks("Classeur2")
    set cell_cible = clas_cible.Worksheets(1).Range("D5")
End Sub

Sub copie()
	cell_source.Copy Destination:=cell_cible
	Set cell_cible = cell_cible.Offset(1)
End Sub


Allez, un peu de condensation :

Code:
' // Variables connues de plusieurs fonctions
Dim cell_source As Range
Dim cell_cible  As Range
Sub copie_ini()
    Set cell_source = ThisWorkbook.Worksheets(1).Range("D3;D5")
    set cell_cible = Workbooks("Classeur2").Worksheets(1).Range("D5")
End Sub

Sub copie()
	cell_source.Copy Destination:=cell_cible
	Set cell_cible = cell_cible.Offset(1)
End Sub

Bon, ben maintenant, on cadence tout ça :
Code:
Sub AllezHopCestparti
	copie_initialisation
	Application.OnTime Now + TimeValue("00:00:05"), "copie"), ????????
End Sub

Les points d'interrogation représentent un mystère que je te laisse découvrir.
Il y a là des choses à écrire. Qu'en dit l'aide de la fonction OnTime ?
 

vincent le laborantin

Nouveau membre
Euh je dirais qu'il manque la fin d'instruction ....
Et c'est normal la parenthèse à la ligne trois de la fonction allezhopcestparti A la fin de : "copie") ??

Sinon je ne vois pas par quoi finir la condition, mais ce que je comprends pas c'est qu'il n'y a pas besoin de boucle ou un truc comme ca pour repeter la macro ?

Et aussi ligne 2 ce allezhopcestparti je suppose qu'il faut remplacer par copie_ini et pas copie_initialisation ?

Et pour finir j'ai un message d'erreur à la ligne 5 quand je lance copie :
Set cell_source = ThisWorkbook.Worksheets(1).Range("D3;D5")
Et je ne sais absolument pas pourquoi ...

Merci pour le temps passé sur mon cas désespéré ....
 

zeb

Modérateur

... :/
Demande à Excel


Non, retire-la. Merci.


C'est justement ce que je te demande de chercher : Demande à Excel.
La solution est à mettre à l'endroit des ?????


Oui, tu supposes bien. Merci.


Euh.... un grimlin est venu remplacer un point sur deux par une virgule dans la syntaxe
Code:
"D3:D5"
. Change ça aussi.


Il n'y a rien de désespéré si tu acceptes d'aller me lire l'aide d'Excel/VBA sur la fonction OnTime pour savoir quoi mettre à la place de ces fichus points d'interrogation !

:o
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 043
Membres
1 586 389
Dernier membre
ROCKET8
Partager cette page
Haut