Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 12 von 12

Thema: Real Zahl von CP in Excel umwandeln

  1. #11
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Eric,

    Code:
    "&H" + Mid(strSource, 7, 2) 
     
    "&H" & Mid(strSource, 7, 2)
    in beiden Programmzeilen werden zunächst zwei Zeichenfolgen miteinander verkettet.

    In der ersten Programmzeile wird dabei der +-Operand verwendet und in der zweiten Programmzeile der &-Operand.

    Mit dem +-Operand kann man Zahlen addieren, man kann aber auch Zeichenfolgeoperanden miteinander verketten.

    Der &-Operand wird nur für String-Operanden definiert und seine Operanden werden immer zum String-Datentyp erweitert.

    Man sollte also bei der Verkettung von Zeichenfolgen den &-Operand verwenden, weil er nur für Zeichenketten definiert ist und das
    Risiko einer unbeabsichtigten Konvertierung verringert.

    Code:
    "&H" + Mid(strSource, 7, 2)
     
    CByte("&H" & Mid(strSource, 7, 2))
    Anschließend erfolgt in der zweiten Programmzeile eine Typkonvertierung der Zeichenfolge in ein Byte-Datentyp.

    Code:
    Dim bytArray(0 to 3) As Byte
     
    bytArray(0) = "&H" & Mid(strSource, 7, 2)
     
    bytArray(0) = CByte("&H" + Mid(strSource, 7, 2))
    Und zum Schluss erfolgt in beiden Programmzeilen eine Zuweisung zu einem Array-Element vom Byte-Datentyp.

    In der ersten Programmzeile kommt es durch die Zuweisung zu einer Typkonvertierung. Die Zeichenkette wird durch die Zuweisung
    zum Byte-Datentyp erweitert und dann dem Array-Element vom Byte-Datentyp zugewiesen.

    In der zweiten Programmzeile wurde die Typkonvertierung bereits durch die CByte-Funktion durchgeführt. Es erfolgt nur noch eine Zuweisung der Zeichenkette als Byte-Operanden zum Array-Element vom Byte-Datentyp.

    Zusammenfassung:

    Man kann sowohl den Programmcode aus der ersten Programmzeile als auch den Programmcode aus der zweiten Programmzeile verwenden.

    "Sauberer" programmiert ist meiner Meinung nach aber der Programmcode aus der zweiten Programmzeile.

    Gruß Kai

  2. #12
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich habe das VBA-Makro für Excel 2010 noch einmal überarbeitet:

    Code:
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
     
    Sub HEX32_IEEE754_32()
     
    ' =============================================
    ' Umwandlung
    ' 32-Bit-Hexadezimalzahl (42F1A395) in
    ' IEEE 754 32-Bit-Gleitkommazahl (120,8194962)
    ' =============================================
     
    Dim strSource As String
    Dim bytArray(0 To 3) As Byte
    Dim sngResult As Single
    Dim intCounter As Integer
     
    ' 32-Bit-Hexadezimalzahl aus Excel-Tabelle lesen
    strSource = Worksheets(1).Cells(2, 2).Value
     
    ' 32-Bit-Hexadezimalzahl mit führenden Nullen auffüllen
    For intCounter = 1 To 8 - Len(strSource)
        strSource = "0" & strSource
    Next intCounter
     
    ' 32-Bit-Hexadezimalzahl in Byte-Array umwandeln
    ' bei der Umwandlung die Reihenfolge der Bytes tauschen
    bytArray(0) = CByte("&H" & Mid(strSource, 7, 2))
    bytArray(1) = CByte("&H" & Mid(strSource, 5, 2))
    bytArray(2) = CByte("&H" & Mid(strSource, 3, 2))
    bytArray(3) = CByte("&H" & Mid(strSource, 1, 2))
     
    ' 32-Bit-Hexadezimalzahl in IEEE 754 32-Bit-Gleitpunktzahl umwandeln
    CopyMemory sngResult, bytArray(0), 4
     
    ' IEEE 754 32-Bit-Gleitpunktzahl in Excel-Tabelle schreiben
    Worksheets(1).Cells(2, 4).Value = sngResult
     
    End Sub
    In den Programmcode habe ich eine zusätzliche Abfrage für die Länge der von der Excel-Tabelle eingelesenen Zeichenkette eingefügt.
    Wenn die Zeichenkette weniger als 8 Zeichen lang ist, wird die Zeichenkette mit führenden Nullen als Zeichen aufgefüllt.

    Code:
    ' 32-Bit-Hexadezimalzahl mit führenden Nullen auffüllen
    For intCounter = 1 To 8 - Len(strSource)
        strSource = "0" & strSource
    Next intCounter
     
    Beispiel:
     
    42F1A395 -> Länge 8 Zeichen
     
     2F1A395 -> Länge 7 Zeichen -> 02F1A395
    Wenn die Zeichenkette weniger als 8 Zeichen lang wäre und nicht mit führenden Nullen als Zeichen aufgefüllt werden würde,
    würde es zu Problemen mit der Mid-Funktion bei der nachfolgenden Umwandlung der Zeichenkette in ein Byte-Array kommen.

    Code:
    ' 32-Bit-Hexadezimalzahl in Byte-Array umwandeln
    ' bei der Umwandlung die Reihenfolge der Bytes tauschen
    bytArray(0) = CByte("&H" & Mid(strSource, 7, 2))
    bytArray(1) = CByte("&H" & Mid(strSource, 5, 2))
    bytArray(2) = CByte("&H" & Mid(strSource, 3, 2))
    bytArray(3) = CByte("&H" & Mid(strSource, 1, 2))
    Gruß Kai
    Angehängte Dateien Angehängte Dateien

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 27.12.2010, 11:17
  2. INT Zahl in Kommazahl umwandeln
    Von Brian84 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 06.04.2009, 13:51
  3. Real zahl in INT umwandeln
    Von bacardischmal im Forum Feldbusse
    Antworten: 5
    Letzter Beitrag: 20.03.2009, 18:17
  4. INT-Zahl in eine S5T#-Zahl umwandeln ?
    Von Stefan B. im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 02.03.2006, 22:40
  5. 5-stellige ascii zahl in normale zahl umwandeln
    Von Anonymous im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 04.01.2006, 16:12

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •