OVH Cloud OVH Cloud

VBA et commande DDE automatisée

3 réponses
Avatar
Shaulva
Bonjour à tous,


JE suis débutant en VBA, et je cherche un peu d'aide pour terminer ma macro.
En fait j'utilise un logiciel qui transmet des données à Excel via un serveur
DDE pour mettre à jour la page en permanence sans aucune intervention
exérieure. Cette partie fonctionne très bien, par contre, en fonction des
valeurs que prennent les cellules, j'aimerais exécuter une commande vers le
logiciel via DDE. J'ai l'instruction vers le serveur, mais je n'arrive pas
l'activer. En fait, pour tester et éviter d'envoyer des erreurs au logiciel,
je teste avec l'execution d'un calcul.

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
' macro de mise à jour des matrices niveau 1

If (Target.Cells.Row = 4) And (Target.Cells.Column = 2) Then

Range("B7:B16").Select
Selection.FormulaArray = "=TDXDDE|FLUX!Info2?" + Trim((Cells(4, 2))) +
Trim((Cells(6, 2)))
Range("D7:I11").Select
Selection.FormulaArray = "=TDXDDE|FLUX!Carnet?" + Trim((Cells(4, 2))) +
Trim((Cells(6, 2)))

End If

End Sub


Cette première partie fonctionne très bien, les problèmes commencent en
dessous...



Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'macro de passage d'ordre niveau 1

If Range("L18").Value = 1 Then

J'ai mis cette commande en texte pour le moment

'channel = DDEInitiate("TDXDDE", "FLUX")
'DDEExecute channel, "[Ordre(" + Range("B1").Text + "," + Range("B4").Text +
"," + Range("B6").Text + "," + Range("B19").Text + "," + Range("D19").Text +
"," + Range("E19").Text + "," + Range("F19").Text +
",Limite,Jour,00000000,Comptant,TEST,NON)]"
'DDETerminate channel
'

Range("L16").Value = Range("G7").Value * Range("D19").Value

End If

End Sub


Ce calcul s'effectue quand la valeur d'une cellule =1. Avec cette solution,
ça fonctionne à peu près, mais il faut une intervention extérieur, par ex.1
clic dans une cellule. Hors j'aimerais que ça se fasse tout seul sans que
j'ai à intervenir. Comment pourrais-je faire?

De plus, j'ai une erreur d'execution 13 "incompatibilité de type" cette 2eme
partie....


Merci.

Par la même occasion, je suis à la recherche d'une formation VBA dans le 74
dans le cadre de formation professionnelle. Si certains se reconnaissent...

MErci,
Shaulva

3 réponses

Avatar
JB
On 31 jan, 19:24, Shaulva wrote:
Bonjour à tous,

JE suis débutant en VBA, et je cherche un peu d'aide pour terminer ma m acro.
En fait j'utilise un logiciel qui transmet des données à Excel via un serveur
DDE pour mettre à jour la page en permanence sans aucune intervention
exérieure. Cette partie fonctionne très bien, par contre, en fonction des
valeurs que prennent les cellules, j'aimerais exécuter une commande ver s le
logiciel via DDE. J'ai l'instruction vers le serveur, mais je n'arrive pas
l'activer. En fait, pour tester et éviter d'envoyer des erreurs au logi ciel,
je teste avec l'execution d'un calcul.

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
' macro de mise à jour des matrices niveau 1

If (Target.Cells.Row = 4) And (Target.Cells.Column = 2) Then

Range("B7:B16").Select
Selection.FormulaArray = "=TDXDDE|FLUX!Info2?" + Trim((Cells(4, 2))) +
Trim((Cells(6, 2)))
Range("D7:I11").Select
Selection.FormulaArray = "=TDXDDE|FLUX!Carnet?" + Trim((Cells(4, 2))) +
Trim((Cells(6, 2)))

End If

End Sub

Cette première partie fonctionne très bien, les problèmes commencen t en
dessous...

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'macro de passage d'ordre niveau 1

If Range("L18").Value = 1 Then

J'ai mis cette commande en texte pour le moment

'channel = DDEInitiate("TDXDDE", "FLUX")
'DDEExecute channel, "[Ordre(" + Range("B1").Text + "," + Range("B4").Tex t +
"," + Range("B6").Text + "," + Range("B19").Text + "," + Range("D19").Tex t +
"," + Range("E19").Text + "," + Range("F19").Text +
",Limite,Jour,00000000,Comptant,TEST,NON)]"
'DDETerminate channel
'

Range("L16").Value = Range("G7").Value * Range("D19").Value

End If

End Sub

Ce calcul s'effectue quand la valeur d'une cellule =1. Avec cette solut ion,
ça fonctionne à peu près, mais il faut une intervention extérieur , par ex.1
clic dans une cellule. Hors j'aimerais que ça se fasse tout seul sans q ue
j'ai à intervenir. Comment pourrais-je faire?

De plus, j'ai une erreur d'execution 13 "incompatibilité de type" cette 2eme
partie....

Merci.

Par la même occasion, je suis à la recherche d'une formation VBA dans le 74
dans le cadre de formation professionnelle. Si certains se reconnaissent. ..

MErci,
Shaulva


Bonjour,

Change() gère la modification, qu'elle soit exogène ou endogène:

Private Sub Worksheet_Change(ByVal Target As Range)
If [A2] = 1 Then
MsgBox "coucou"
End If
End Sub

http://cjoint.com/?cbfFlxuje6

Range("L16").Value = Cdbl(Range("G7").Value) *
Cdbl(Range("D19").Value ) ' si ,
Range("L16").Value = Val(Range("G7").Value) *
Val(Range("D19").Value ) ' si .

JB

Avatar
Shaulva

On 31 jan, 19:24, Shaulva wrote:
Bonjour à tous,

JE suis débutant en VBA, et je cherche un peu d'aide pour terminer ma macro.
En fait j'utilise un logiciel qui transmet des données à Excel via un serveur
DDE pour mettre à jour la page en permanence sans aucune intervention
exérieure. Cette partie fonctionne très bien, par contre, en fonction des
valeurs que prennent les cellules, j'aimerais exécuter une commande vers le
logiciel via DDE. J'ai l'instruction vers le serveur, mais je n'arrive pas
l'activer. En fait, pour tester et éviter d'envoyer des erreurs au logiciel,
je teste avec l'execution d'un calcul.

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
' macro de mise à jour des matrices niveau 1

If (Target.Cells.Row = 4) And (Target.Cells.Column = 2) Then

Range("B7:B16").Select
Selection.FormulaArray = "=TDXDDE|FLUX!Info2?" + Trim((Cells(4, 2))) +
Trim((Cells(6, 2)))
Range("D7:I11").Select
Selection.FormulaArray = "=TDXDDE|FLUX!Carnet?" + Trim((Cells(4, 2))) +
Trim((Cells(6, 2)))

End If

End Sub

Cette première partie fonctionne très bien, les problèmes commencent en
dessous...

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'macro de passage d'ordre niveau 1

If Range("L18").Value = 1 Then

J'ai mis cette commande en texte pour le moment

'channel = DDEInitiate("TDXDDE", "FLUX")
'DDEExecute channel, "[Ordre(" + Range("B1").Text + "," + Range("B4").Text +
"," + Range("B6").Text + "," + Range("B19").Text + "," + Range("D19").Text +
"," + Range("E19").Text + "," + Range("F19").Text +
",Limite,Jour,00000000,Comptant,TEST,NON)]"
'DDETerminate channel
'

Range("L16").Value = Range("G7").Value * Range("D19").Value

End If

End Sub

Ce calcul s'effectue quand la valeur d'une cellule =1. Avec cette solution,
ça fonctionne à peu près, mais il faut une intervention extérieur, par ex.1
clic dans une cellule. Hors j'aimerais que ça se fasse tout seul sans que
j'ai à intervenir. Comment pourrais-je faire?

De plus, j'ai une erreur d'execution 13 "incompatibilité de type" cette 2eme
partie....

Merci.

Par la même occasion, je suis à la recherche d'une formation VBA dans le 74
dans le cadre de formation professionnelle. Si certains se reconnaissent....

MErci,
Shaulva


Bonjour,

Change() gère la modification, qu'elle soit exogène ou endogène:

Private Sub Worksheet_Change(ByVal Target As Range)
If [A2] = 1 Then
MsgBox "coucou"
End If
End Sub

http://cjoint.com/?cbfFlxuje6

Range("L16").Value = Cdbl(Range("G7").Value) *
Cdbl(Range("D19").Value ) ' si ,
Range("L16").Value = Val(Range("G7").Value) *
Val(Range("D19").Value ) ' si .

JB

MErci pour la réponse, j'ai essayé, mais ça ne fonctionne toujours pas.
Du coup j'ai essayé de recréer les mêmes conditions en m'affranchissant du

serveur DDE.
J'ai modifié ton fichier d'affichage de l'heure pour recréer le problème.
Maintenant, l'objectif est d'afficher automatiquement "coucou" quand A21 =1
(affichage des secondes). Je testerai la solution sur mon fichier de test et
si ça ne fonctionne pas, je mettrai un lien pour le télécharger.

La macro devient:

Affiche l'heure (module1)
Dim temps
Sub majHeure()
Sheets("feuil1").Calculate
temps = Now + TimeValue("00:00:1")
Application.OnTime temps, "majHeure"
End Sub

Sub auto_open()
majHeure
End Sub

Sub auto_close()
On Error Resume Next
Application.OnTime temps, Procedure:="majHeure", Schedule:úlse
End Sub



(Feuil1)

Private Sub Worksheet_Change(ByVal Target As Range)
If [A21] = 1 Then
MsgBox "coucou"
End If
End Sub


http://cjoint.com/?cbkb2EEqOk


MErci,
A+,
Seb


Avatar
Shaulva



On 31 jan, 19:24, Shaulva wrote:
Bonjour à tous,

JE suis débutant en VBA, et je cherche un peu d'aide pour terminer ma macro.
En fait j'utilise un logiciel qui transmet des données à Excel via un serveur
DDE pour mettre à jour la page en permanence sans aucune intervention
exérieure. Cette partie fonctionne très bien, par contre, en fonction des
valeurs que prennent les cellules, j'aimerais exécuter une commande vers le
logiciel via DDE. J'ai l'instruction vers le serveur, mais je n'arrive pas
l'activer. En fait, pour tester et éviter d'envoyer des erreurs au logiciel,
je teste avec l'execution d'un calcul.

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
' macro de mise à jour des matrices niveau 1

If (Target.Cells.Row = 4) And (Target.Cells.Column = 2) Then

Range("B7:B16").Select
Selection.FormulaArray = "=TDXDDE|FLUX!Info2?" + Trim((Cells(4, 2))) +
Trim((Cells(6, 2)))
Range("D7:I11").Select
Selection.FormulaArray = "=TDXDDE|FLUX!Carnet?" + Trim((Cells(4, 2))) +
Trim((Cells(6, 2)))

End If

End Sub

Cette première partie fonctionne très bien, les problèmes commencent en
dessous...

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'macro de passage d'ordre niveau 1

If Range("L18").Value = 1 Then

J'ai mis cette commande en texte pour le moment

'channel = DDEInitiate("TDXDDE", "FLUX")
'DDEExecute channel, "[Ordre(" + Range("B1").Text + "," + Range("B4").Text +
"," + Range("B6").Text + "," + Range("B19").Text + "," + Range("D19").Text +
"," + Range("E19").Text + "," + Range("F19").Text +
",Limite,Jour,00000000,Comptant,TEST,NON)]"
'DDETerminate channel
'

Range("L16").Value = Range("G7").Value * Range("D19").Value

End If

End Sub

Ce calcul s'effectue quand la valeur d'une cellule =1. Avec cette solution,
ça fonctionne à peu près, mais il faut une intervention extérieur, par ex.1
clic dans une cellule. Hors j'aimerais que ça se fasse tout seul sans que
j'ai à intervenir. Comment pourrais-je faire?

De plus, j'ai une erreur d'execution 13 "incompatibilité de type" cette 2eme
partie....

Merci.

Par la même occasion, je suis à la recherche d'une formation VBA dans le 74
dans le cadre de formation professionnelle. Si certains se reconnaissent....

MErci,
Shaulva


Bonjour,

Change() gère la modification, qu'elle soit exogène ou endogène:

Private Sub Worksheet_Change(ByVal Target As Range)
If [A2] = 1 Then
MsgBox "coucou"
End If
End Sub

http://cjoint.com/?cbfFlxuje6

Range("L16").Value = Cdbl(Range("G7").Value) *
Cdbl(Range("D19").Value ) ' si ,
Range("L16").Value = Val(Range("G7").Value) *
Val(Range("D19").Value ) ' si .

JB

MErci pour la réponse, j'ai essayé, mais ça ne fonctionne toujours pas.
Du coup j'ai essayé de recréer les mêmes conditions en m'affranchissant du

serveur DDE.
J'ai modifié ton fichier d'affichage de l'heure pour recréer le problème.
Maintenant, l'objectif est d'afficher automatiquement "coucou" quand A21 =1
(affichage des secondes). Je testerai la solution sur mon fichier de test et
si ça ne fonctionne pas, je mettrai un lien pour le télécharger.

La macro devient:

Affiche l'heure (module1)
Dim temps
Sub majHeure()
Sheets("feuil1").Calculate
temps = Now + TimeValue("00:00:1")
Application.OnTime temps, "majHeure"
End Sub

Sub auto_open()
majHeure
End Sub

Sub auto_close()
On Error Resume Next
Application.OnTime temps, Procedure:="majHeure", Schedule:úlse
End Sub



(Feuil1)

Private Sub Worksheet_Change(ByVal Target As Range)
If [A21] = 1 Then
MsgBox "coucou"
End If
End Sub


http://cjoint.com/?cbkb2EEqOk


MErci,
A+,
Seb





Trouvé sur le forum excel download

Private Sub Worksheet_Calculate()
If [A21] = 1 Then
MsgBox "coucou"
End If

End Sub

J'ai essayé, ça fonctionne aevc l'heure, je vais tester sur mon autre
fichier maintenant.
Merci,
Seb