Autor
|
Thema: Probleme mit Übergabe durch ByRef (828 mal gelesen)
|
LayKris Mitglied Student
Beiträge: 12 Registriert: 28.03.2012 @home: i5-750 @ 4x2,66GHz 4GB DDR3 Radeon HD5770 @mobile: Amd A8-3520 @ 4x2.5GHz 4GB DDR3 Radeon HD6740G2
|
erstellt am: 25. Mai. 2012 12:39 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe ein kleines Problemchen aus dem ich nicht ganz schlau werde... vielleicht verstehe ich da ja was grundlegend falsch, wenn dem so ist, klärt mich bitte auf Ich rufe innerhalb einer Sub eine Function auf, mit einem ByRef-Übergabewert. Meine Absicht ist eigentlich, den übergebenen Wert zu verändern. Innerhalb der Function funktioniert das auch wunderbar, aber im Kontext der Sub bleibt der Wert der Variable unverändert. Ich dachte, genau zu diesem Zweck wäre ByRef da, eben damit ich den Wert verändern kann? Wenn ich eine globale Variable definiere und diese direkt verändere funktioniert's zwar, aber das ist ja alles andere als elegant. Vielleicht hat ja jemand von euch eine Idee, warum das bei mir nicht klappt? Hier mal ein vereinfachter Beispiel-Code, um zu illustrieren was ich versuche: Code: Sub CATMain() Dim Wert1 As Integer TestFunc (Wert1) MsgBox (Wert1) End SubFunction TestFunc (ByRef Wert2 As Integer) Wert2 = 100 End Function
Wie gesagt nur ein sehr einfacher Beispielcode, aber im Grunde reicht der aus, um mein Problem zu illustrieren. Nach meinem Verständnis sollte ich eine MsgBox kriegen, die mir "100" sagt, oder? Leider sagt die bei mir "0". Habe ich was falsch gemacht/die Syntax nicht richtig angewandt oder spinnt mein Makro einfach unerklärlich rum? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 25. Mai. 2012 12:52 <-- editieren / zitieren --> Unities abgeben: Nur für LayKris
Hi, habe mal schnell probiert und herausgefunden, dass es so funktioniert: Code:
Sub CATMain() Dim Wert1 As Integer call TestFunc (Wert1) MsgBox (Wert1) End Sub Sub TestFunc (ByRef Wert2 As Integer) Wert2 = 100 End Sub
Also mit einer Prozedur anstatt Function.. BTW. bis VB6 ist ByRef eh die Standardübergabemethode, ist also nicht unbedingt notwendig, außer du programmierst in VB.NET.. P.S. Ist natürlich keine Lösung, weil irgendwie muss das ja auch mit Funktionen gehen [Diese Nachricht wurde von geekv5 am 25. Mai. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LayKris Mitglied Student
Beiträge: 12 Registriert: 28.03.2012 @home: i5-750 @ 4x2,66GHz 4GB DDR3 Radeon HD5770 @mobile: Amd A8-3520 @ 4x2.5GHz 4GB DDR3 Radeon HD6740G2
|
erstellt am: 25. Mai. 2012 13:01 <-- editieren / zitieren --> Unities abgeben:
Hey, danke schonmal für die schnelle Antwort. Dass ByRef Standard ist, wusste ich, aber ich wollte es hier nochmal deutlich machen. Habe das nochmal schnell ausprobiert, bei mir klappt's allerdings leider nicht. Also zumindest in meinem echten Makro, kann natürlich sein, dass das Beispiel hier funktioniert. Ist denn die Anwendung (also Syntax usw) soweit korrekt? EDIT: Bin jetzt drauf gekommen, wie das läuft, aber etwas wundern tut's mich schon, weil mir die Syntax so nicht bekannt war. Code: TestFunc Wert2:=Wert1
war die Lösung. Werd jetzt nochmal nachlesen, wie und vor allem warum das so funktioniert, aber hauptsache es tut erstmal [Diese Nachricht wurde von LayKris am 25. Mai. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 25. Mai. 2012 13:34 <-- editieren / zitieren --> Unities abgeben: Nur für LayKris
Puh, keine Ahnung, was bei dem Aufruf von dir passiert, aber ich glaube die Lösung gefunden zu haben Code:
Sub CATMain() Dim Wert1 As Integer TestFunc Wert1 MsgBox (Wert1) End Sub Function TestFunc (ByRef Wert2 As Integer) Wert2 = 100 End Function
Habe einfach die Klammern beim Funktionsaufruf entfernt! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
LayKris Mitglied Student
Beiträge: 12 Registriert: 28.03.2012 @home: i5-750 @ 4x2,66GHz 4GB DDR3 Radeon HD5770 @mobile: Amd A8-3520 @ 4x2.5GHz 4GB DDR3 Radeon HD6740G2
|
erstellt am: 25. Mai. 2012 13:38 <-- editieren / zitieren --> Unities abgeben:
Tatsache, das funktioniert bei mir dann auch. Ich hätte nicht gedacht, dass die Klammern da einen Unterschied machen, dachte die wären halt optional, wenn man eh nur einen Wert hat bzw werden auf jeden Fall gebraucht, wenn man mehrere Parameter hat. Und das mit dem ":=" kannte ich bisher nur aus C#. Klappt jetzt auf jeden Fall, Frage hat sich also erledigt. Besten Dank nochmal! EDIT: Habe grade nochmal etwas recherchiert und dabei rausgefunden, dass die Klammern wohl genau das bewirken (sollen), was bei mir nicht beabsichtigt war: nämlich dass der ursrüngliche Wert eben nicht verändert wird. Gut zu wissen. [Diese Nachricht wurde von LayKris am 25. Mai. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
geekv5 Mitglied Konstrukteur
Beiträge: 214 Registriert: 13.07.2011 Notebook<P>MSI GX660R Intel Core i5 460M 8GB DDR3 1GB Mobility HD5870 80GB Intel X25-M Postville 250GB HDD<P>Desktop<P>AMD Phenom II X4 965 1GB HD4890@ FirePro V8700 8GB DDR3-1600 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
|
erstellt am: 25. Mai. 2012 13:56 <-- editieren / zitieren --> Unities abgeben: Nur für LayKris
Ahja, also mit Klammern ist das sozusagen ein ByVal Parameter.. Mit Klammern funktioniert es allerdings auch, wenn man die Funktion/Prozedur mit Call aufruft, siehe meine erste Antwort.. Nur dachte ich vorhin, dass es an der Prozedur liegt.. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
buecherm83 Mitglied Ingenieur IT Application Software
Beiträge: 78 Registriert: 20.09.2011 SIEMENS NX10 CATIA V5 R26 VB7.1 Tecnomatix Process Designer/Simulate<P>Win7 64bit Office 2016
|
erstellt am: 21. Jul. 2016 08:54 <-- editieren / zitieren --> Unities abgeben: Nur für LayKris
Hallo, habe ein ähnliches Problem. Ich rufe gerne eine Function innerhalb eines Click Events auf. Bis jetzt sieht mein Code so aus. Code: Private Sub Button_Click() ... Dim TestVariable as String testfunktion Testvariable ... End SubFunction testfunktion (ByRef Testvariable as String) MsgBox Testvariable End Function
Mein Code überspringt die Funktion komplett. Ich habe es in einem neuen Makro getestet und da lief es. Ich habe keine Idee mehr voran es liegen kann. Gibt es irgendwelche weiteren Tips?
Danke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|