Pointer VBA - SpeicherAdr auf andr. Obj.Attr Point

Bild

Betrifft: Pointer VBA - SpeicherAdr auf andr. Obj.Attr Point
von: ExtremeExceling
Geschrieben am: 03.09.2015 19:24:33


Hallo
an alle die sich mit VBA und DLLs und Zeigern (pointer) bzw. der Speicher-Adressierung bzw. deren Inhalte auskennen.
Fokus dieses Threads sind unteranderem die DLL-Funktionen DispCallFunc() und AddressOf() in Verbindung mit VBA
ich bin neu im Forum wobei ich es schon gut zum Lesen nutze.
ich weiß jetzt nicht ob mein Text-Formatierungen gegen irgendwelche Foren Richtlinien stoßen
ehrlich gesagt hatte ich mir diese nicht durchgelesen.
die Formatierungen Fett sollen die Wichtigkeit der Bereiche hervorheben.
Ich bedanke mich bei allen im Voraus für Eure Hilfe und Unterstützung.
viel Spaß beim lesen Rechtschreib-Fehler können häufiger vorkommen.
Thema:
Range(…).Value oder ein Object.Attribut verweisen lassen auf eine Speicheradresse bzw. den Inhalt der Speicheradresse eines sich ändernden unabhängigen Object.Attribut,.

Das sich ändernde Objekt ist eine PowerPoint.Player.currentPosition eines video mit der aktuellen Videozeit in Millisekunden.
Gut es funktioniert einwandfrei dieses Objekt bzw. dessen Attribut zu Adressieren und den Wert mit Umrechnung in eine Zelle schreiben mit Range(….).Value= …einPlayerObject….currentPosition etc.
Das ist aber nicht mein Fokus momentan, wen jemand fragen hat kann er sich melden. Dann versuche ich das irgendwie reinzustellen.
Die Methode wäre eigentlich das richtige, jedoch soll diese Zelle ständig alle jede Sekunde aktualisiert werden, während das Video abgespielt wird.
Dann dachte ich wie könnte ich es ggf. Auslösung durch ein Änderungsereignis sobald sich die Videozeit ändert dann per Event. Aber PowerPoint bietet hier keine Events dafür an.
hier eine kurze oder teil Liste der Ereignisse die PowerPoint zur Verfügung stellt.
http://www.pptfaq.com/FAQ00004_Make_your_VBA_code_in_PowerPoint_respond_to_events.htm
Es gäbe einerseits die Methode Worksheet.onTime etc.
bzw. https://www.herber.de/forum/archiv/788to792/790080_Event_zur_bestimmten_Systemzeit_ausloesen.html
besser dieses hier
http://www.online-excel.de/excel/singsel_vba.php?f=133
aber die onTime Methode finde ich nicht so passend für dieses Problem.
in dem Artikel ist unten eine Empfehlung für dieses Beispiel -> Link http://www.online-excel.de/excel/singsel_vba.php?f=96 beschrieben gibt es für so etwas eine bessere Lösung. Den Code hatte ich eine Excel Datei kopiert und versuchte diesen zu verstehen, weil das in etwa genau das ist was ich brauche.
zum letzten Link Menüleiste wird bei die Beispiel unter MS-Office 2013 unter dem Ribbon Menü Reiter Add-ins in dem Rahmen benutzerdefinierte Menüs angezeigt sobald sich diese Funktion öffnet. Beim Schließen des Workbooks werden die Menü Buttons wieder entfernt.
Problem gab es mit dem enable=false was soweit mir bekannt ein MS Office seitiges-Problem seit Version 2010 darstellt. Da gibt es ein Lösungsweg, habe es mit makro versucht jedoch mit win 7-10 hat man nicht gleich schreibrechte darauf da, sollte man da per Explorer im Admin Modus oder per Admin-User mit cmd oder Explorer per Admin machen, die Sicherheitseinstellungen bei Windows sind schon ein komisch, aber das ist ein anderes Thema.
Zurück zum Beisiel:
ich stellte dabei fest, die wichtigen Funktionen von .dlls genutzt werden.
Die wichtigsten sind diese:
AddressOf()
Infos:
https://msdn.microsoft.com/de-de/library/y72ewk2b.aspx
https://msdn.microsoft.com/en-us/library/office/gg264099.aspx
https://msdn.microsoft.com/de-de/library/office/Gg264347.aspx
Ziemlich gute Erklärung
https://www.herber.de/mailing/vb/html/vaopraddressof.htm (Erklärung)
https://www.herber.de/mailing/vb/html/vaopraddressofx.htm (Beispiel)

sehr gute Info und beste Erklärung die ich gefunden hatte (leider auf Englisch).
http://www.thevbzone.com/secrets.htm#AddressOf

und
http://www.vbforums.com/showthread.php?344319-Call-function-by-address-%28make-your-own-callbacks%29
das hier ist auch ganz aufschlussreich
http://codingdomain.com/visualbasic/win32api/callback/
DispCallFunc()
http://www.vbforums.com/showthread.php?798325-What-exactly-are-the-parameters-for-the-API-method-called-DispCallFunc
Allgemeines zu Pointer in VBA
http://www.codeproject.com/Articles/712/How-to-do-pointers-in-Visual-Basic
Allgemeines zu byVal und byRef
https://msdn.microsoft.com/en-us/library/eek064h4.aspx
ggf. sind die solche themen wie deepCopy und swallowCopy hier passend.
Anmerkung z.B. was ist wenn das Ziel-objekt nicht mehr im Speicher ist, dann kann ja vor der Speicheradressen-Zuweisung einfach das eobject zwischenspeichern in ein virtueles range object mit byVal.
Im Fall wenn der referenzierte Speicher des anderen Objects nicht mehr vorhanden ist, dann einfach dieses ObjeKt wieder auf den das ursprüngliche Range-Objekt zurückschreiben, so die einfach vorstellung
das jetzt mal so ganz grob pseudo-Code mäßig geschrieben.
public globalAPointerObject as object

Sub irgendEineSubRoutine()
	Set globalAPointerObject =speicherAddresZeiger (Range(“aB2“).value)
	‘sets Zeiger von Range(“aB2“).value  auf Speicheraddresse Object.Attribut
	
	on error ( bzw. (If speicherAdrresse nicht meinem object zugewiesen)) next
		set speicheraddresse von Range(“aB2“).value set = speicherAddresZeiger (globalARangeObject)
	err.clear
End Sub

--------------------
Also meine Frage ist unabhängig von meinem Problem bzw. allgemein.
unabhängig von Power-point oder Kombination von Excel mit PowerPoint
Info für die, welche es nicht kennen:
http://www.online-excel.de/excel/singsel_vba.php?f=43
Z.B. angewendet auf den Zellinhalt einer Excel Zelle ohne dieses ständig aufrufen zu müssen.
denn dieses letzte Beispiel
( http://www.online-excel.de/excel/singsel_vba.php?f=96 )
hatte genau das geschafft, nur nicht in eine Zelle sondern in ein Menü-Feld.
Sogar mit Verweis auf di Addresse + Umrechnung

Ich benötige einfach eine Methode möglichst als sub oder function um:
die Speicheradresse von einem ein Attribut eines anderen Objektes zu Pointen(Zeigen (als hat mit Zeiger bzw. Pointer zu tun)) zu einem anderen Object.attribute zu Pointen, besser wäre das Ganze noch mit möglicher Umrechnung zwischen drinnen.
naja vielleicht ist hier auch so eine Art ShallowCopy oder wie das heißt Sinnvoll
Könnt Ihr mir ein paar Beispiele machen, einfach das Beispiel aufgreifen in dem der Wert, anstatt in eine Menü-Leiste in ein Range(…).Value gespeichert und automatisch richtig referenziert wird. Bei Unklarheiten bitte fragen.
einfach ein konkreten sehr kurzen Beispiel-Code.

Da ich diese .dll Methoden nicht so ganz durchgehend verstanden habe kann.
Ich denke die Methoden dich benötige für mein Vorhaben sind DispCallFunc() in Verbindung mit AddressOf() und mit ggf. weiteren DLL basierten Funktionen.
Ich bedanke mich nochmals für die Hilfe

Bild

Betrifft: AW: Pointer VBA - SpeicherAdr auf andr. Obj.Attr Point
von: Silent_Warrior5
Geschrieben am: 03.09.2015 21:53:41
Hi, also wenn dir hier jemand helfen kann dann sicher Nepumuk ;) Gruß SW5

Bild

Betrifft: AW: Pointer VBA - SpeicherAdr auf andr. Obj.Attr Point
von: ExtremeExceling
Geschrieben am: 05.09.2015 15:16:40
Hallo ich hatte das noch nicht ausprobiert aber ich denke das diese Funktion wie hier beschrieben:
http://www.access-programmers.co.uk/forums/showthread.php?t=225415
kann ganz gut bei meinem zuwerst genannten Problem Verwendung finden.
Ergänzung:
Bei StartEintrag hatte ich denk Link vergessen wie man das Porblem (das ab ms-office 2010 auftritt) behenben einige maßen beheben kann wenn man Forms(Formen bz. letzten endes shapes) udn Buttons nicht richtig deaktivieren kann.
Beschreibung des Forms Problems
http://www.office-loesung.de/ftopic587365_0_0_asc.php
Microsft hat das Problem zur kenntniss genommen, ggf. auch nicht genug.
http://answers.microsoft.com/en-us/office/forum/officeversion_other-customize/excel-2010-enabledisable-buttons-via-vba/793de6e3-6c20-4706-876d-1421209aad98
Lösungsmöglichkeiten
entweder bei Forms bzw. shapes nicht .Enabled=False
einfach .visible=False zu nehmen.
Für diejenigen die nicht auf enabled verzichten können oder das Object bereits probleme macht, gibt es hier einen Lösungsvorschlag:
Der Lösungsweg ist: Das man bestimmte temporäre Dateien Löschen sollte, jedoch braucht man da widerum admin rechte oder vllt auch einfach Explorer als Admin ausführen.
http://stackoverflow.com/questions/27411399/microsoft-excel-activex-controls-disabled
Aber das nur mal zur Ergänzung zu meinem obigen Text. Meine Frage nach den Objekt verweisen ist immer noch offen.
Also der Foren-Beitrags-Editor ist komisch ich bekomme keine TextEinrückung hin weder mit _ Leerzeichen noch mit


  
hhmm das wird auch ausgefiltert tab indent=20 oder ähnliche Tags. Das resultiert wahrscheinlich als ein Xss-Schutz(Cros Site Scripting), naja ein Tab indend tag dürfte man ja wohl noch als ausnahme hinzuügen dürfen :-)
Ich bedanke mich für eure Mithilfe.

Bild

Betrifft: AW: Pointer VBA - SpeicherAdr auf andr. Obj.Attr Point
von: ExtremeExceling
Geschrieben am: 10.09.2015 17:16:22
Ich bin immernoch auf der Suche nach einer sinnvollen verbindung zwischen einem Sich ständig aktualisierenden Zellwert, der auf die Speicheraddresse bzw. auf ein Objekt.Attribut verweisen kann.
ich habe verschiendene sachen ausprobiert.
Dabei habe ich jetzt gesehen das, dass Beispiel von http://www.online-excel.de/excel/singsel_vba.php?f=96
hier
https://www.herber.de/bbs/user/100121.xlsm
ist in der Exceldatei ist der Code integriert mit fat allem wie im Beispiel aufgezeigt, jedoch bei der Aktualisierung des Timers habe ich nicht 1 millisekunde sondern das er alle 500millisekunden startet angeben.
Dann habe ich mir mir den Code nochmals genauer angesehen.
Es wurde keine funktion DispCallFunc() eingesetzt, es wurde AddressOf() eingesetzt und SetTimer und killtimer.
setTimer ist hier ganz praktisch erklärt http://www.vbarchiv.net/api/api_settimer.html
Habe dann den ganzen code sehr verkürzt aufs wesentliche.
Beispiel Code der auch in der Beigefügten Excel Arbeitsmappe enthalten ist.
'*************************************************************************************
'***** taken 'Entommen von ' Code Max Kaffl 2005 *****
'***** and from http://www.online-excel.de/excel/singsel_vba.php?f=96 *****
'***** and changed a little bit *****
'*************************************************************************************
Option Explicit
Option Private Module
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private lnghWnd As Long
Private lngStartTime As Long, lngPauseTime As Long
Private lngPresetTime As Long
Private blnPause As Boolean

Private Sub startTimer()
    Dim intIndex As Integer
    lngStartTime = timeGetTime - lngPresetTime
    lngPresetTime = 0
    
    'Get Excel Window, prozess-ID
    'I think that would also be possible
    lnghWnd = Application.hwnd
        
    
'SetTimer DLL-Function,' see here http:/ _
/www.vbarchiv.net/api/api_settimer.html
    ' lnghWnd number is to bind the timer on a specific window. ' 0 for window independent
    '
    
    ' AddressOf is the MemoryValue of the addressfunction
    '1000 stands for is for 1000 Milliseconds = 1Second
    SetTimer lnghWnd, 0, 1000, AddressOf displaying
End Sub

Private Sub stopTimer()
    
    lngStartTime = lngStartTime + (timeGetTime - lngPauseTime)
    KillTimer lnghWnd, 0
    
End Sub

Private Sub displaying(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal  _
lpTimerFunc As Long)
    'objCommandBarButton(5).Caption = fnc_strTime(timeGetTime - lngStartTime)
    
    'Deaktivate userinput
    If (Application.Interactive) Then Application.Interactive = False
    
    'deselect User Selection
    'ThisWorkbook.Sheets(1).Range("A1").Select
    
    'write value
    ThisWorkbook.Sheets(1).Range("A1").Value = Now 'Example with Actual Time
    'fnc_strTime (timeGetTime - lngStartTime)
    
    'aktivate userinput
    If (Not (Application.Interactive)) Then Application.Interactive = True
End Sub

Da ich in Excel direkt in eine Zelle schreibe und nicht wie im Beispiel auf einen Button.
Stürzt Excel ab. Also beim Beispiel vorher speichern und am besten keine Excel-Datei in diesem Application object offen halten das nicht gespeichert wurde.
Der Programmablauffunktioniert wunderbar, jedoch sobald ich im bearbeiten modus bin oder gerade dabei bin mehere Zellen zu markieren, oder gerade Zele Formatieren möchte Stürzt Exel ab. Da er nicht das Makro usführen kann, da ich gerade bearbeite.
So dachte ich breche die eingabe ab, mit:
'Deaktivate userinput
If (Application.Interactive) Then Application.Interactive = False
..... mache was....
'aktivate userinput
If (Not (Application.Interactive)) Then Application.Interactive = True
Im Debugger modus ist der auch zu Application.Interactive = False gegangen.
Da ich im Übewachen modus das Application-object(Excel) hatte, hatte er bei diesem Atribut keine änderung gezeigt. Das er es wirklich deaktiviert hätte.
Eine andere möglichkeit wäre das er wartet bis die usereingabe fertig ist und dann erst das makro ausführt.
https://msdn.microsoft.com/de-de/library/office/ff841248%28v=office.15%29.aspx
User eingabe vollständig blockieren
http://dotnet.mvps.org/vb/code/userinput/#BlockInput
Das ist aber doof; da ich den User-Eingabe-Stop kurzfristig nur in dieser Exceldatei haben möchte, da ich gleichzeitig in Powerpoint Aggieren möchte/muss. z.b. mit PlayButtons
Ok in diesem Workbook, gut es wäre alle 1/2 Sek oder sekunde und dann nur ganz kurz.
Application.Interactive
https://msdn.microsoft.com/de-de/library/office/ff841248%28v=office.15%29.aspx
ähhm ich habe gesucht und so wie es aussieht ist Application.Interactive
z.T. abhängig von Aplication.Volatile =true
oder vielleicht auch andere screenUpdating =true
bin mir dabei nicht sicher, wisst ihr darüber mehr.
siehe dazu anderen hatten auch schon solche probleme,
Fehler hatte ich jetzt noch nicht gefangen, zumindest ist er nicht hängengeblieben als ich auf Application.Interactive=false gestellt hatte. Das wird auch manchesmal gesagt.
http://www.knowexcel.com/view/205623-application-interactive-true-ignored-.html
-------
Ein ganz anderer Weg wäre z.B. wenn ich eine Globale Variable zum Start z.B. beim klicken eines Buttons Initialisiere oder befülle.
z.B. mein Playzeit des PowerPoint Video-Players .....Video....Shape. Player.CurentPosition.
So diese Variable ändert sich sozusagen von Selbst ständig.
Wäre es möglich per VBA einem BereichsNamen eine Globale Varible zuzuweisen und Das excel diese dann automatisch anspricht.
Mt anderen worten eine BereichsName mit Formel also ohne Bereich. Problem wäre dann aber wiederum das man ein Namensbereich welcher nicht auf ein Zelle(Range Bereich) verweist.
Wenn er eine Formel hat mit der Evaluate formel auswerten müsste was dann ebenfalls wiederum subs benötigen würde
Das beste wäre
....
Range("A2").Value = Namensbereich der auf eien GlobaleVBAVariable Verweist.
oder
Range("A2").Value = SpeicherAdresssenInhalt einer Variable
ich brauche eine Aktualisierungen im Tabellenblatt bzw. bei der Zelle ca. jede Sekunde, wobei ich eigentlich Application ontime meiden wollte oder ist auch nciht so besonders wegen SetTimer.
probiert bitte mal die Buttons in der Excel datei aus mit dem debugen.
Wenn man eine Weitere aktion (zelleingabe/Mehre Zellen markieren bei gedrückter Maustaste, texteingabe, etc.) macht und Excel will durch den gestzt Timer (setTimer) Das Makro ausführen stürzt wie schon beschrieben excel ab.
Habt ihr andere Ideen?
Ich denke das ist ganz interessant auch für andere die vor ähnlichen Problemen stehen.
wie kann man eigentlich User direkt anfragen :-) oder kann man auch in ander Office-Foren (z.B. office-loesung.de) Quer-verweisen,
ich denke: das ist nicht gerene gesehen oder?
bzw. verstöst das gegen die Forenregeln ?
Ich erwarte eure Antworten :-)

Bild

Betrifft: AW: Pointer VBA - SpeicherAdr auf andr. Obj.Attr Point
von: ExtremeExceling
Geschrieben am: 05.09.2015 15:17:58
DERSELBE EINTRAG NOCHMAL MIT AKTIVIERTEN LINKS
Hallo ich hatte das noch nicht ausprobiert aber ich denke das diese Funktion wie hier beschrieben:
http://www.access-programmers.co.uk/forums/showthread.php?t=225415
kann ganz gut bei meinem zuwerst genannten Problem Verwendung finden.
Ergänzung:
Bei StartEintrag hatte ich denk Link vergessen wie man das Porblem (das ab ms-office 2010 auftritt) behenben einige maßen beheben kann wenn man Forms(Formen bz. letzten endes shapes) udn Buttons nicht richtig deaktivieren kann.
Beschreibung des Forms Problems
http://www.office-loesung.de/ftopic587365_0_0_asc.php
Microsft hat das Problem zur kenntniss genommen, ggf. auch nicht genug.
http://answers.microsoft.com/en-us/office/forum/officeversion_other-customize/excel-2010-enabledisable-buttons-via-vba/793de6e3-6c20-4706-876d-1421209aad98
Lösungsmöglichkeiten
entweder bei Forms bzw. shapes nicht .Enabled=False
einfach .visible=False zu nehmen.
Für diejenigen die nicht auf enabled verzichten können oder das Object bereits probleme macht, gibt es hier einen Lösungsvorschlag:
Der Lösungsweg ist: Das man bestimmte temporäre Dateien Löschen sollte, jedoch braucht man da widerum admin rechte oder vllt auch einfach Explorer als Admin ausführen.
http://stackoverflow.com/questions/27411399/microsoft-excel-activex-controls-disabled
Aber das nur mal zur Ergänzung zu meinem obigen Text. Meine Frage nach den Objekt verweisen ist immer noch offen.
Also der Foren-Beitrags-Editor ist komisch ich bekomme keine TextEinrückung hin weder mit _ Leerzeichen noch mit


  
hhmm das wird auch ausgefiltert tab indent=20 oder ähnliche Tags. Das resultiert wahrscheinlich als ein Xss-Schutz(Cros Site Scripting), naja ein Tab indend tag dürfte man ja wohl noch als ausnahme hinzuügen dürfen :-)
Ich bedanke mich für eure Mithilfe.

 Bild

Beiträge aus den Excel-Beispielen zum Thema "PLZ aus Zelle filtern"