Forum: PC-Programmierung In VB.Net läufts. In VBA nicht :-/


von Rüttli (Gast)


Lesenswert?

Hallo Leute,

Habe mir aus einem vorhanden Programm eine Funktion rausgeholt, welche 
unter VB.NET ohne Problem läuft.
Unter VBA in Excel funktioniert es nicht :-(

Folgenden Code in ein Modul verfrachet.
Konnte Ihn auch schon ausführen.
Aber: #WERT!
1
Public Function GetLogoAbs(ByVal F As Long, ByVal t As Long) As Double
2
       GetLogoAbs = 0
3
        Dim B070 As Integer
4
        Dim B062 As Integer
5
6
        Dim B071 As Integer
7
        Dim B072 As Integer
8
        Dim B073 As Integer
9
        Dim B074 As Integer
10
        Dim B075 As Integer
11
        Dim B076 As Integer
12
        Dim B077 As Integer
13
        Dim B078 As Integer
14
        Dim B079 As Integer
15
        Dim B080 As Integer
16
        Dim B081 As Integer
17
        Dim B082 As Integer
18
        
19
        B070 = Int(t * 10)
20
        B062 = Int(F * 10)
21
22
        B071 = ((B070 * 32443) / 970) + 4849
23
        B072 = ((B070 * B070) * 3233) / -31970
24
        B073 = B071 - B072
25
        B074 = (B070 * B070) / 10
26
        B075 = (B070 * B070) / 120
27
        B076 = ((B074 * B070) * 45) / 26020
28
        B077 = ((B075 * B075) * 26) / -10090
29
        B078 = B076 - B077
30
        B079 = B073 + B078
31
        B080 = B070 / 20
32
        B081 = B079 + (B080 * (362 / 32000))
33
        B082 = (B081 * B062) / 1000
34
35
        GetLogoAbs = B082 / 1000
36
        GetLogoAbs = FormatNumber(GetLogoAbs, 1)
37
    End Function

Ich weiss, die Funktion ist nicht das gelbe vom Ei.
Aber das wurde mal aus einer SPS Steuerung extrahiert.

Woran könnte es liegen?

von Peter II (Gast)


Lesenswert?

Rüttli schrieb:
> Unter VBA in Excel funktioniert es nicht :-(

toll, und was geht nicht?

von Rüttli (Gast)


Lesenswert?

Die Funktion wird vorher verlassen und gibt #WERT! zurück.
Bin jetzt nicht der VBA Profi. Darum fag ich ja hier.

von Toni Tester (Gast)


Lesenswert?

Wie äußert sich das "läuft nicht"? Wird eine Exception geworfen, oder 
liefert sie "nur" nicht erwartungsgemäße Ergebnisse?
In letzterem Fall dürfte es sich wohl entweder um einen Über-/Unterlauf 
oder um einen Rundnungsfehler handeln.
Sind bei VB.Net die Bereichsgrenzen von Integers unterschiedlich? Bzw. 
erweitert VB.Net evtl. automatisch die Bereichsgrenzen entsprechend?

von Peter II (Gast)


Lesenswert?

Rüttli schrieb:
> Die Funktion wird vorher verlassen und gibt #WERT! zurück.

dann debugge dich mal durch. Sehe kein Grund warum sie verlassen werden 
sollte.

von Toni Tester (Gast)


Lesenswert?

Rüttli schrieb:
> Die Funktion wird vorher verlassen und gibt #WERT! zurück.

An welcher Stelle? Mit welchen Parametern?
Welche Werte haben die Variablen an der Stelle, an der abgebrochen wird?
=> Systematische Fehlersuche!

von MWS (Gast)


Lesenswert?

Rüttli schrieb:
> FormatNumber

Wird in VBA halt fehlen.

> Unter VBA in Excel funktioniert es nicht :-(

Dort gibt's die Format-Funktion.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

So unsäglich die VBA-Unterstützung des VB-Editors von Excel (und anderen 
Office-Produkten) auch sein mag, sie enthält einen Debugger, mit dem 
man so etwas im Einzelschrittbetrieb durchlaufen kann und sich die 
Inhalte von Variablen anzeigen lassen kann.

von Rüttli (Gast)


Lesenswert?

In dieser Zeile springt er raus:
B072 = ((B070 * B070) * 3233) / -31970

Es wird kein Fehler ausgegeben.

Er erreicht Formatnumber erst gar nicht.

von doedel (Gast)


Lesenswert?

ein Integer in VBA ist was anderes als ein Integer in VB.NET. Wenn Du 
die Parameter schon als LONG definierst und diese dann mit anderen 
Werten multiplizierst ... warum erwartest Du dann, dass das Ergebnis in 
Integer passt?

von Rüttli (Gast)


Lesenswert?

doedel schrieb:
> ein Integer in VBA ist was anderes als ein Integer in VB.NET

Das ist ganz schlecht. Dann würde ja (auch WENN meine Funktion 
funktionieren würde) das Ergebniss verfälscht :-(

von jonasbiensack (Gast)


Lesenswert?

VBA kann nur eine Anweisung pro Zeile! Also b = 5+5 aber nicht b = 
(5+5)*a*c;

Gruß J

von Rüttli (Gast)


Lesenswert?

Es wird als erstes von zb. 34.5 auf Integerzahl 345 gewandelt.
Das kommt noch von der SPS Steuerung. Die hat eben mit diesem Format 
gearbeitet.
Die Wandlung funktioniert auch noch.

von Peter II (Gast)


Lesenswert?

doedel schrieb:
> ein Integer in VBA ist was anderes als ein Integer in VB.NET.

wo hast du das her?

http://www.dotnetperls.com/integer
https://msdn.microsoft.com/de-de/library/06bkb8w2.aspx

scheint überall 32bit zu sein.

von doedel (Gast)


Lesenswert?

und wenn wir mal nachrechnen und den kleinsten Wert für f = 1 nehmen:

dann wird B070 = 10

und wie groß ist dann ((B070 * B070) * 3233) / -31970? Nach meiner 
Rechnung 291.330 ... und jetzt schau mal in die Definition von Integer 
und frage Dich, was passiert, wenn Du diesen Wert B072 zuweisen willst.

von doedel (Gast)


Lesenswert?

Peter II schrieb:
> doedel schrieb:
>> ein Integer in VBA ist was anderes als ein Integer in VB.NET.
>
> wo hast du das her?
>
> http://www.dotnetperls.com/integer
> https://msdn.microsoft.com/de-de/library/06bkb8w2.aspx
>
> scheint überall 32bit zu sein.

guckst Du Online-Hilfe von Excel: Integer variables are stored as 16-bit 
(2-byte) numbers ranging in value from -32,768 to 32,767. The 
type-declaration character for Integer is the percent sign (%).

von Rüttli (Gast)


Lesenswert?

Warum funktioniert das dann im VB.Net?

Dort geht es ohne Probleme.

von doedel (Gast)


Lesenswert?

Rüttli schrieb:
> doedel schrieb:
>> ein Integer in VBA ist was anderes als ein Integer in VB.NET
>
> Das ist ganz schlecht. Dann würde ja (auch WENN meine Funktion
> funktionieren würde) das Ergebniss verfälscht :-(

verfälscht wird da gar nichts ... Du musst nur statt Integer in VBA Long 
nehmen und alles wird gut.

von doedel (Gast)


Lesenswert?

Rüttli schrieb:
> Warum funktioniert das dann im VB.Net?
>
> Dort geht es ohne Probleme.

Weil ein Integer in VB.NET eben nicht das gleiche ist wie ein Integer in 
VBA. Das versuche ich ja die ganze Zeit zu sagen!

von doedel (Gast)


Lesenswert?

jonasbiensack schrieb:
> VBA kann nur eine Anweisung pro Zeile! Also b = 5+5 aber nicht b =
> (5+5)*a*c;
>
> Gruß J

Schmarrn ... natürlich geht das auch in VBA

von Rüttli (Gast)


Lesenswert?

Habe jetzt long deklariert. Funktioniert.

Scheinbar ist ein Überlauf in VBA anders als in VB.net

von doedel (Gast)


Lesenswert?

ein Überlauf ist ein Überlauf in VBA genauso wie in VB.NET. Wenn man die 
Programmierumgebung wechselt, muss man sich aber halt mit den 
Rahmenbedingungen wie z. B. den Datentyp-Definitionen vertraut machen.

von Michael A. (micha54)


Lesenswert?

jonasbiensack schrieb:
> VBA kann nur eine Anweisung pro Zeile! Also b = 5+5 aber nicht b =
> (5+5)*a*c;

Aha. Und woher hast Du diese Weisheit ?

Weder VBA noch VB.NET haben was mit Bascom zu tun.

Zum Thema:
Leider hat der TO nicht geschrieben, mit welchen Programmversionen er 
arbeitet. Bei VBA wärs nicht ganz unwahrscheinlich, wenn integers nur 16 
bit haben. Aber das Zitat von doedel kommt mir auch wie aus dem letzten 
Jahrtausend vor.

Gruß,
Michael

von ♪Geist (Gast)


Lesenswert?

Probiere Mal die Werte mit Komma und nicht mit Punkt an die Funktion zu 
übergeben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.