Macro DDE

  • Initiateur de la discussion Bernd Gestel
  • Date de début
B

Bernd Gestel

Guest
Salut,

Je suis pas tres doue pour tout les genre de programmations et aurait besoin d'un peu d'aide pour creer une macro sous Excel. Donc voila l'histoire: un logiciel externe fournit une valeur dans une (et une seule) cellule (disons R1C1) de mon fichier Excel. Cette valeur change toute les 1/10 de seconde environ. Ce que je voudrais simplement faire, c'est avoir toutes les valeurs donnes par le logiciel externe dans une colonne d'Excel. Pour ca, je devrais faire une macro qui reagit au changement de valeur de R1C1, et qui ecrit la valeur de R1C1 en R1C2 la 1ere fois, en R2C2 la 2eme fois, en R3C2 la 3eme... Donc voila, je suis un peu perdu et ce serait sympa si vous pouviez m'aider un peu SVP.
 
J

Jean-Marie

Guest
Bonjour Bernard

Essaye ceci, à mettre dans le Worksheet de la feuille recevant la valeur de ta DDE. (Clique droit sur l'onglet de la feuille, puis visualiser le code et tu colles le code ci-dessous).

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("A1")) Is Nothing Then: Exit Sub
Cells(Range("A65536").End(xlUp).Row + 1, 1) = Range("A1")
Range("A1") = ""
End Sub

@+Jean-Marie
 
J

Jean-Marie

Guest
Re...

Oups, Petite erreur, voilà le code corrigé

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("A1")) Is Nothing Then: Exit Sub
Cells(Range("B65536").End(xlUp).Row + 1, 1) = Range("A1")
Range("A1") = ""
End Sub

@+Jean-Marie
 
@

@+Thierry

Guest
Bonjour Beranrd, re Jean-Marie, le Forum

Je pense qu'il ne vaut mieux pas remettre "A1" à vide, de toute façon l'import externe écrase "A1", car sinon il faut gérer l'évènement EnableEvents qui est généré par le code lui même.... (Boucle sans fin)

Donc suppression pûr et simple de la ligne :
Range("A1") = ""

Si par contre celà pose problème avec le logiciel de Bernard alors il faut gérer comme suit :

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("A1")) Is Nothing Then: Exit Sub
Cells(Range("A65536").End(xlUp).Row + 1, 1) = Range("A1")
Application.EnableEvents = False
Range("A1") = ""
Application.EnableEvents = True
End Sub

Sinon c'est tout bon Jean-Marie dans la première mouture, la seconde au contraire s'incrémente pas ?

Bon Aprèm
@+Thierry
 
@

@+Thierry

Guest
Ah ok c'est en colonne 2 !! ok (R1C2 la 1ere fois, en R2C2 la 2eme fois, en R3C2 la 3eme)

Alors il faut :

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("A1")) Is Nothing Then: Exit Sub
Cells(Range("B65536").End(xlUp).Row + 1, 2) = Range("A1")
Application.EnableEvents = False
Range("A1") = ""
Application.EnableEvents = True
End Sub

@+Thierry
 
@

@+Thierry

Guest
Re...

You are Welcome Jean Marie

Et puis en relisant :

(R1C2 la 1ere fois, en R2C2 la 2eme fois, en R3C2 la 3eme)

Pour du vrai "R1C1" à la toute toute toute première fois.... !

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim L As Long

If Intersect(Target, Range("A1")) Is Nothing Then: Exit Sub
L = IIf(Range("B1") = "", 1, Range("B65536").End(xlUp).Row + 1)
Cells(L, 2) = Range("A1")
Application.EnableEvents = False
Range("A1") = ""
Application.EnableEvents = True
End Sub

Car sinon toute toute toute première fois.... part en R2C2...

Bon Aprèm
@+Thierry
 
B

bernd_gestel

Guest
Boh ca marche po!

Quand je change la valeur en L1C1 manuellement, que je clique sur une autre cellule et que je reclique sur L1C1 c'est Ok, les valeurs sont tout a tour ajoute a la colonne 2, c'est Ok.

Mais des que je lance le logiciel (Interactive Physics) qui envoie des donnees a Excel, il me dit qu'Excel a renvoye un message d'erreur. Et pas une seule valeur dans le fichier Excel!

Bon maintenant je suis conscient que c'est pas evident de reflechir aux messages d'erreurs d'un logiciel sans soi meme l'avoir sur la main, mais bon si vous avez une petite idee de ce qui arrive...

Merci

A+
 
@

@+Thierry

Guest
Bonsoir Bernard, Jean-Marie, le Forum

Oui comme tu dis justement assez difficile de présager ce qui se passe depuis un autre logiciel inconnu.

Bon on peut essayer deux choses :

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim L As Long

If Intersect(Target, Range("A1")) Is Nothing Then: Exit Sub
L = IIf(Range("B1") = "", 1, Range("B65536").End(xlUp).Row + 1)
Cells(L, 2) = Range("A1")
End Sub
On ne vide plus "A1" (de toute manière cette valeur sera écrasée)


Sinon si l'évènement "Change" n'est peut être pas capté alors on peut essayer l'évènement Calculate en prenant soins de mettre dans une cellule quelconque (non utilisée) une formule du Style

=SI(A1="";"Formule Bidon Pour déclencher l'événement Calculate";CONCATENER(A1;"Formule Bidon Pour déclencher l'événement Calculate"))


Et Donc dans le Private Module de Feuille (en écrivant j'y pense, as-tu bien mis le code dans le Private Module de Feuille ?) :

Private Sub Worksheet_Calculate()
Dim L As Long
If ActiveCell.Address <> "$A$1" Then
L = IIf(Range("B1") = "", 1, Range("B65536").End(xlUp).Row + 1)
Cells(L, 2) = Range("A1")
End If
End Sub

Voilà, c'est tout ce que je vois pour l'instant... Mais j'ai souvenir que j'envoyais le code d'un Code Barre envoyé depuis un Scanner à main dans la cellule A1, vers un UserForm qui remontait la BDD pour donner le nom de l'article, et je captais bien l'évènement...

Bon Courage
@+Thierry
 

Discussions similaires

Réponses
2
Affichages
330
Réponses
7
Affichages
581

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz