Copier le contenu d'une cellule Excel dans une appli non-windows

Bonjour, et merci d'avance d'être tolérants pour mes premiers pas chez vous!

Ma question est résumée dans le titre: je veux transférer des données excel dans une appli extérieure.

Je peux copier cette valeur et la coller, ça marche.

J'ai écrit une macro, avec, dedans:

Sub aaaa()

Selection.Copy
Application.Wait (Now + TimeValue("0:00:05"))
Application.SendKeys "^v"
With CreateObject("WScript.Shell")
.SendKeys "{NUMLOCK}"
End With
End Sub

Ca marche, mais je ne reviens pas sur excel pour une éventuelle suite... Comment faire?

Bonjour,

Vous pouvez utiliser la fonction AppActivate statement (VBA) | Microsoft Learn.

En écrivant, en dernière ligne de votre Sub :

AppActivate Application.Caption

Vous allez réactiver l'application Excel. On utilise Application.Caption pour désigner Excel. Application = Excel, et .Caption = le nom de Excel en String, puisque AppActivate utilise une String comme argument.

Merci beaucoup!

Et je vais abuser: commente faire pour bloquer le déroulement (userform?) pendant les manips (validation) sur l'autre application? (une alternative à wait).

Je vous en prie.

Désolé, je n'ai pas compris de quel déroulement vous parlez. Le scrolling ? La pause de votre Macro ? Vous ne pouvez pas controller votre Shell via VBA, et quant au temps d'attente… C'est apparemment compliqué :

Excel VBA Wait For Shell to Finish before continuing with script - Stack Overflow

Je pense que vos 5 secondes ne sont pas si mal.

Je vais essayer d'être clairce programme sera destiné à des personnes sans compétence particulière en informatique. Il faut donc qu'elles cliquent dans la fenêtre de réception, que la copie se fasse, et qu'elles valident par enter avant de revenir à excel...

Lors de l'éxécution d'une macro vous ne pouvez pas interagir avec XL… Je ne comprends donc pas ce que vous voulez bloquer.

Si vous voulez informer, vous pouvez utiliser un UserForm oui, mais il me semble que la remise au premier plan de XL est suffisante, non ?

Wait est selon moi le plus simple.

Je développe:

un userform avec un message du genre: "cliquez sur ok, puis cliquez dans la fenêtre "ouvrage" dans Decalog"

...

au bout des 3 secondes, le collage se fait.

(nouvel useform du genre: "appuyez sur ok, puis sur valider")?

Là, il faut encore valider (ou touche enter) dans Decalog.

puis revenir à excel, et, ensuite, sélectionner une autre cellule.

Ensuite, je boucle...

Si j'ai bien compris, ci-après une proposition. Effectivement c'est mieux quand vous prenez le temps d'expliquer ce que vous voulez.

Sub Boucle()
  Dim maConditionDarret As Boolean
  maConditionDarret = True  ' a definir

  Dim maSelection As Range

  On Error GoTo ExitSub
  Do

    Set maSelection = Application.InputBox("Selectionnez les cellules a copier : [Cancel] pour quitter", Type:=8)
    maSelection.Copy

    If MsgBox("Cliquez sur [Ok], puis cliquez dans la fenetre ""ouvrage"" dans Decalog", vbOKCancel) = vbOK Then
      aaaa
    End If

  Loop While Not maConditionDarret

ExitSub:
End Sub

Sub aaaa()

  Application.Wait (Now + TimeValue("0:00:05"))
  '  Application.SendKeys "^v"
  '  With CreateObject("WScript.Shell")
  '    .SendKeys "{NUMLOCK}"
  '  End With
  Debug.Print "Hello, i'm doing stuff"

  ' ici ca n'a aucun sens de verifier le retour de la msgbox puisqu'on ne peut pas revenir en arriere
  MsgBox "Appuyez sur OK, puis sur valider"

  AppActivate Application.Caption
End Sub

Encore merci de votre patience et de vos éclaircissements!

Je n'ai pas encore testé votre macro, mais plusieurs choses m'intriguent (peut-être à tort?):

- l'inputbox semble nécessiter une intervention, or, dans mon idée, la sélection se fait automatiquement, du genre: C7, déroulement, boucle, C8...

- et cette partie, que vous avez mis en commentaire:

' Application.SendKeys "^v"
' With CreateObject("WScript.Shell")
' .SendKeys "{NUMLOCK}"
' End With

Plus de senkeys?

le numlock est mis car le pavé numérique se déconnecte après sendkeys...

pardonnez mon innocence, je suis surtout autodicdate (avec aide extérieure, n'est-ce pas?

Et j'oubliais:

"Entre Ce que je pense, Ce que je veux dire, Ce que je crois dire, Ce que je dis, Ce que vous avez envie d'entendre, Ce que vous entendez, Ce que vous comprenez... il y a dix possibilités qu'on ait des difficultés à communiquer. Mais essayons quand même..."

Bernard Werber

Il n'y a pas de question bete quand on apprend. Pour l'inputbox vous avez raison, j'ai mal interprété "revenir à excel, et, ensuite, sélectionner une autre cellule". Je pensais que l'utilisateur devait sélectionner une cellule.

Pour les commentaires j'ai oublié de les enlever (pour tester j'avais mis un message via debug.print) mais bien évidemment pour vous il fallait les retirer.

Ci-après une correction

Sub Boucle()
  For Each c In Selection.Cells         ' ou ActiveSheet.Range("A1:A10").Cells
    c.Copy
    If MsgBox("Cliquez sur [Ok], puis cliquez dans la fenetre ""ouvrage"" dans Decalog", vbOKCancel) = vbOK Then
      MaMacro
    End If
  Next c
End Sub

Sub MaMacro()

  Application.Wait (Now + TimeValue("0:00:05"))
  Application.SendKeys "^v"
  With CreateObject("WScript.Shell")
    .SendKeys "{NUMLOCK}"
  End With

  ' ici ca n'a aucun sens de verifier le retour de la msgbox puisqu'on ne peut pas revenir en arriere
  MsgBox "Appuyez sur OK, puis sur valider"

  AppActivate Application.Caption
End Sub

Edit : citation de Werber que l'on devrait afficher en grand sur le forum ! Trop de personnes pensent que l'on est dans leur tete ahaha

ah ah, on progresse!

simplement, il n'y a pas de retour dans excel à chaque étape...il faut le réactiver!

Par ailleurs, je n'aime pas trop les msgbox, d'une part esthétiquement, d'autre part parce que là, je travaille sur deux fenêtres, et le msgbox a tendance à se mettre sur la séparation!

Des userforms, ce ne serait pas mieux?

Bonjour,

Bizarre que le retour à Excel ait disparu, la ligne AppActivate est toujours présente… Chez moi la macro me remettait bien XL au premier plan. Si vous avez 2 écrans j'imagine que ça peut buguer.

Pour le userform… Personnellement je trouve les MsgBox suffisantes, mais si vous voulez vous lancer dans la création d'un UF allez-y ! Moi ce n'est pas trop mon truc.

Bonjour,

Dans mamacro, j'ai simplement reporté la ligne appactivate juste après sendkeys, et ça marche!

enfin, ça marche, mais de manière erratique...

Voici ce que j'ai écrit:

Sub abaa()
Range("c8").Select
ActiveWorkbook.Names.Add Name:="anret", RefersTo:=ActiveCell
boucle:
Selection.Copy
If MsgBox("Cliquez sur [Ok] puis cliquez dans la fenetre ""ouvrage"" dans Decalog,", vbOKCancel) = vbOK Then
MaMacro
End If
Range("anret").Select
ActiveCell.Offset(1, 0).Select
If ActiveCell.Value = "" Then
Exit Sub
End If
ActiveWorkbook.Names.Add Name:="anret", RefersTo:=ActiveCell
GoTo boucle:
End Sub

Car votre proposition de plage prédéfinie impliquait d'aller jusqu'au bout, même s'il n'y avait rien dans les cellules...

Hum, c'est assez tordu comme manière de procéder, je vous assure qu'une boucle est plus adaptée ici. En reprenant votre "méthode", ci-après une proposition qui part de C8, vers le bas, et s'arrète à la première cellule vide.

Sub Boucle()
  ' definition de la plage des cellules pleines apres C8
  Dim maPlage As Range
  With ActiveSheet.Range("C8")
    maPlage = Range(.Cells, .End(xlDown))
  End With

  For Each c In maPlage
    c.Copy
    If MsgBox("Cliquez sur [Ok], puis cliquez dans la fenetre ""ouvrage"" dans Decalog", vbOKCancel) = vbOK Then
      MaMacro
    End If
  Next c
End Sub

Et mettez votre code entre balises </> svp.

là:

<maPlage = Range(.Cells, .End(xlDown))>

j'ai une erreur d'exécution 91...

excusez moi, erreur bete, ajoutez "Set" devant, c'est un objet.

  With ActiveSheet.Range("C8")
    Set maPlage = Range(.Cells, .End(xlDown))
  End With

Merci!

Et, pour ce qui est de mes macros, c'est assez tarabiscoté, en général! Je procède de façon pragmatique: j'imagine, j'essaie, je corrige, ça marche: c'est bon!

Et je n'hésite pas à solliciter, voire piller... Et vais mettre à profit ce que vous venez de m'apprendre!

Vous savez, j'ai connu Multiplan... c'est pour vous donner une petite idée de mon âge!

Alors voilà:

<Sub Boucle()

Dim maPlage As Range
With ActiveSheet.Range("C8")
Set maPlage = Range(.Cells, .End(xlDown))
End With

For Each c In maPlage
c.Copy
If MsgBox("Cliquez sur [Ok], puis cliquez dans la fenetre ""ouvrage"" dans Decalog", vbOKCancel) = vbOK Then
MaMacro
End If
Next c
End Sub
Sub MaMacro()

Application.Wait (Now + TimeValue("0:00:04"))
Application.SendKeys "^v"
AppActivate Application.Caption
With CreateObject("WScript.Shell")
.SendKeys "{NUMLOCK}"
End With
MsgBox "Appuyez sur OK, puis sur valider"
Application.Wait (Now + TimeValue("0:00:04"))

End Sub>

Juste comme ça: il n'y a pas moyen d'inverser les actions, dans le msgbox "cliquez sur OK, puis...": c'est assez illogique!

Donc, d'abord cliquer dans la fenêtre, puis ok?

Oui je me doutais bien que votre code retranscrivait directement votre cheminement de pensée, j'avais juste à coeur de vous proposer une solution "plus correcte".

Multiplan je ne connaissais pas...

Pour votre question vous pouvez bien entendu changer les messages comme bon vous semble, c'est du texte !

Tant que vous l'entourez bien avec des guillemets, aucun problème (et attention pour ouvrage : besoin de doubles guillemets pour ne pas "fermer" la chaine de caractères, cf. l'exemple).

Rechercher des sujets similaires à "copier contenu appli windows"