Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Automatisch telefonieren mit Procall

Begonnen von Nabimba, Oktober 07, 2010, 13:45:36

⏪ vorheriges - nächstes ⏩

Nabimba

Hallo,

ich möchte aus meiner Accesstabelle heraus per Befehlsschaltfläche (Button) einen Kunden anrufen. Wenn ich das normalerweise mache, markiere ich die Nummer und drücke die Taste F8. Diese Taste ist bei Procall(stos) so belegt, dass sie automatisch wählt. Wenn ich Outlook nicht offen habe, wird auch nicht gewählt.

Ich kann bisher nur die Nummer markieren

Private Sub Befehl111_Click()
DoCmd.GoToControl "Telefon"
End Sub

Wenn ich dann die Tastenkombi F8 haben möchte hört mein Wissen auf. Ich habe es mit

Private Sub Befehl113_Click()
DoCmd.GoToControl "Telefon"
SendKeys "{F8}", False
End Sub

Probiert, ohne Ergebnis. Muss ich erst einen Befehl an Outlook senden, damit Procall angesprochen wird?

Kann mir jemand weiter helfen?

Danke im Voraus von jemanden, der überhaupt keine Ahnung hat

database

Hallo,

m.E. muss beim Senden von Tastenbefehlen an eine andere Applikation diese aktiviert sein, sonst sendest du an Access.

also z.B.  AppActivate "Microsoft Outlook"

Da du ja offenbar die Informationen aus dem Steuerelement 'Telefon'  benötigst (nehme an es ist die Telefonnummer),
wirst du diese ebenfalls an Outlook senden müssen
Also KÖNNTEST du folgendes mal ausprobieren:


Private Sub Befehl113_Click()
    Dim nummer as String
    nummer = Me!Telefon
    AppActivate "Microsoft Outlook"
    SendKeys nummer & "{F8}", False
End Sub



Vielleicht klappts - ist UNGETESTET und rein intuitiv in den Wind gereimt

Grüße

Peter

Nabimba

Leider klappt es nicht, ich bekomme:

Laufzeitfehler`5`, ungültiger Prozeduraufruf oder ungültiges Argument  (debugger : AppActivate "Microsoft outlook")

database

#3
Hallo,

um Outlook zu aktivieren muss es erstens gestartet sein und dann muss ein er der Standardordner angesprochen werden.

Versuche daher nochmals mit der Änderung:


Private Sub Befehl113_Click()
   Dim nummer as String
   nummer = Me!Telefon
   AppActivate "Posteingang - Microsoft Outlook"
   SendKeys nummer & "{F8}", False
End Sub


Möglicherweise hast du zum Wählen auch einen anderen Outlook-Container offen, dann trage diesen bitte ein wo jetzt 'Posteingang' steht.


Nabimba

Nein, funktioniert leider auch nicht...gleiche Fehlermeldung  :(

database

Hallo,

wir reden aber schon von Outlook und nicht von Outlook-Express.

Bei der 2. Variante die gleiche Fehlermeldung hmmm...

Hab' das jetzt selbst noch mal nachgestellt und siehe da - ebenfalls Fehler - MIST!
Nachdem ich Outlook beendet hatte und den Code ein 2. Mal durchlaufen ließ - kein Fehler - allerdings habe ich den Code mit F8 abgearbeitet, also hatte Outlook auch genug Zeit um vollständig zu starten.
Das Gleiche hatte ich unbewußt auch so probiert, als ich das Posting geschrieben habe, daher hat's damals auch fehlerfrei funktioniert
Mit kommt die ganze Geschichte ein wenig suspekt vor ...  sorry, da kann ich dir nicht recht viel mehr weiterhelfen. :-\

Greets

lumbumba

#6
Ich glaube das Outlook ständig die Ttelleiste ändert muß du die AppActivate-Funktion mit der ProzessID aufrufen statt dem Titelleistenstring.
Private Function GetOLPID() As Long
 Dim WMI, Prozesse, Prozess
 Dim i As Long
 Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
 Set Prozesse = WMI.ExecQuery("Select NAME, ProcessId from Win32_Process", , 48)
 For Each Prozess In Prozesse
   If Prozess.Name = "OUTLOOK.EXE" Then
     GetOLPID = Prozess.ProcessID
     Set Prozess = Nothing: Set Prozesse = Nothing: Set WMI = Nothing
     Exit Function
   End If
 Next
 Set Prozess = Nothing: Set Prozesse = Nothing: Set WMI = Nothing
End Function


jetzt noch der angepasste Code von database

Private Sub Befehl113_Click()
   Dim nummer as String
   Dim PID as long
   nummer = Me!Telefon
   Pid = GetOLPID()
   if Pid <> 0 then
      AppActivate PID
      SendKeys nummer & "{F8}", False
  end if
End Sub

Somit sollte hoffentlich nicht mehr die FM auftauchen.
---

database

#7
Hallo,

ja, das klingt plausibel!

Die ProzessID über WMI zu holen hatte ich auch schon überlegt aber dann irgendwie wieder verworfen.
Wahrscheinlich aus Frust oder so ...   ;D

So, habs mal ausprobiert - das rennt! (bis zum SenKey ohne Fehler - Procall hab' ich nicht daher kann ich das nicht prüfen)
Man könnte es jetzt noch weiter spinnen und für den Fall dass PID = 0 ist, Outlook automatisch starten ...
Naja, dann sind wir aber schon verdammt weit weg von Access-Problemen, das hat nix mehr mit Datenbanken zu tun.  ;D ;)

Greets

lumbumba

ZitatDie ProzessID über WMI zu holen hatte ich auch schon überlegt aber dann irgendwie wieder verworfen.
Wahrscheinlich aus Frust oder so ...
Kenn ich. Aba du weist ja, proggen ohne gezetter, gefluche und gekreische ist irgendwie langweilig!  ;D
ZitatMan könnte es jetzt noch weiter spinnen und für den Fall dass PID = 0 ist, Outlook automatisch starten ...
Hatte ich ursprünglich auch mit reingenommen, nur ich hab den Satz  Wenn ich Outlook nicht offen habe, wird auch nicht gewählt. von Nabimba so verstanden das dies auch so gewollt ist und Outlook nicht gestartet werden soll.


---

database

#9
Zitatproggen ohne gezetter, gefluche und gekreische ist irgendwie langweilig

ja ja und vor allem für Nichtraucher - früher hätt' ich ein paar Glimmstengel 'gefressen' und gut wär's ...   8)
ZitatOutlook nicht gestartet werden soll

... da kannst du eigentlich Recht haben...

Mal sehen, vielleicht besucht uns Nabimba noch mal und probiert deine Variante aus... bin gespannt

Grüße

Peter

EDIT: Benutzernamen ausgebessert

Nabimba

Klar besuche ich Euch noch mal...ich bin ja begeistert, dass es Leute gibt, die sich mit sowas auskennen und anderen weiter helfen...Danke dafür :)
...ich habe dafür überhaupt keine Ahnung mehr was ich hier mache und übertrage alles fein säuberlich...aber selbst damit tue ich mich als Person, die nix mit Programmieren am Hut hat, sehr schwer...was in welcher Folge usw.
Ich habe es eingegeben und bekomme jetzt den Hinweis, dass mir der Bezug fehlt (mehrdeutiger Name;get OLPID)...das hängt doch bestimmt meine Telefonnummer zusammen, oder? ist die mit den ganzen Sachen jetzt auch markiert wurden?
Ich sehe gerade, wenn ich jetzt den Button drücke, mit dem ich die Nummer markert habe, kommt die gleiche Fehlermeldung.
Ach ja, ich habe Outlook die ganze Zeit auf

database

Hallo,

Zitatmehrdeutiger Name;get OLPID

deutet darauf hin, dass im Ablauf deines Codes der Eintrag get OLPID mehrdeutig interpretiert werden kann - bitte kontrolliere die Schreibweisen des GESAMTEN Codes auf Fehler get OLPID ist OHNE Leerzeichen!
Am Besten ist es IMMER, mittels 'In Zwischenablage kopieren' einen geposteten Codeausschnitt zu kopieren und per 'Einfügen' in den VBA-Editor an die richtige Stelle zu verfrachten.
Die meisten Probleme entstehen durch Tippfehler - mal ein Leerzeichen zu viel, manchmal auch eine Zeile doppelt, etc.

Wie gesagt und bereits von mir gepostet - der Code läuft bei mir fehlerfrei durch - was ich nicht testen konnte ist natürlich die Auswirkung auf Procall - mangels Vorhandensein.
Aber der Code lief bis SendKeys fehlerfrei durch - auch Outlook wurde brav aktiviert.

Peter

Nabimba

Okay, kapiert...ich hatte es nicht in die Zwischenablage kopiert, sondern direkt rein und mußte dadurch die Zeilen verschieben, aber ich habe es kopiert und nicht getippt... und ein Problem für mich ist es schon die richtige Stelle zu finden...sorry für so viel Unwissenheit.
Ich habe es jetzt nochmal rein kopiert und bekomme die gleiche Meldung.
(Ach ja, gibt es eine Möglichkeit die Befehle nachträglich umzubenennen damit man sie leichter zuordnen kann?)


Private Function GetOLPID() As Long
  Dim WMI, Prozesse, Prozess
  Dim i As Long
  Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
  Set Prozesse = WMI.ExecQuery("Select NAME, ProcessId from Win32_Process", , 48)
  For Each Prozess In Prozesse
    If Prozess.Name = "OUTLOOK.EXE" Then
      GetOLPID = Prozess.ProcessID
      Set Prozess = Nothing: Set Prozesse = Nothing: Set WMI = Nothing
      Exit Function
    End If
  Next
  Set Prozess = Nothing: Set Prozesse = Nothing: Set WMI = Nothing
End Function

Private Sub Befehl113_Click()
    Dim nummer as String
    Dim PID as long
    nummer = Me!Telefon
    Pid = GetOLPID()
    if Pid <> 0 then
       AppActivate PID
       SendKeys nummer & "{F8}", False
   end if
End Sub

DF6GL

Hallo,

ich glaube nicht, dass Du den Code mit Copy&Paste aus Deinem VBA-Editor hierein kopiert hast...   ::) :o

database

 ;D
der steht so in #6

Zitatgibt es eine Möglichkeit die Befehle nachträglich umzubenennen
klar gibt es die - wenn du genau weißt was du tust .. sonst knallts bei der Ausführung möglicherweise enorm.

Wenn du z.B. getOLPID ansprichst ---
Dieser Name steht für GET OUTLOOK PROCESS ID
Den Namen hat lumbumba (ihr machts mich fertig mit eure Namen) so für seine Function gewählt, welche die Prozess-ID von Outlook ermitteln soll.
Wenn du diesen Namen ändern willst - z.B. auf 'BringeIDVonOutlook'  muss in deinem Code dann sinngemäß stehen


...
nummer = Me!Telefon
PID = BringeIDVonOutlook()
If PID <> 0 Then
...


und die Function die das leistet muss genauso heißen also


Private Function BringeIDVonOutlook() As Long
.....
....
...
..
.


Zum anderen Thema mit der Fehlermeldung ... schau mal im VBA-Editor unter Extras Verweise nach ob da vielleicht ein Verweis als 'NICHT VORHANDEN' markiert ist.
Zitat...dass mir der Bezug fehlt ...
gibts dazu eine Fehlermeldung mit Fehlernummer? Wenn nicht, dann KOPIER mal den untenstehenden Code und lese die Fehlermeldung aus:


Private Sub Befehl113_Click()
    Dim nummer as String
    Dim PID as long

    On Error GoTo errhandle

    nummer = Me!Telefon
    PID = GetOLPID()
    If PID <> 0 Then
       AppActivate PID
       SendKeys nummer & "{F8}", False
   End If

Exit Sub

errhandle:
MsgBox "Fehlernummer: " & Err.Number & vbCrLf & _
         "Fehler: " & Err.Description

End Sub