WinFuture-Forum.de: Excel VBA - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Office
Seite 1 von 1

Excel VBA möchte eine Prüfsumme berechnen


#1 Mitglied ist offline   Thomynator 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.485
  • Beigetreten: 20. Februar 08
  • Reputation: 36
  • Geschlecht:Männlich
  • Wohnort:Traunreut

geschrieben 28. Oktober 2010 - 11:53

Hallo an Alle erst mal.

Also:
ich habe Excel 2003 und erstelle eine "benutzerdefinierte Funktion" mit folgendem VBA Code (da is auch die Berechnung drin....

Public Function Interleaved_2_of_5(Zahl As Range) As Variant 
	Dim intIndex As Integer 
	Dim lngSum As Long 
	Dim blnSwitch As Boolean 
	If IsNumeric(Zahl.Text) Then 
		For intIndex = Len(Zahl.Text) To 1 Step -1 
			If Not blnSwitch Then 
				lngSum = lngSum + CInt(Mid$(Zahl.Text, intIndex, 1)) * 3 
			Else 
				lngSum = lngSum + CInt(Mid$(Zahl.Text, intIndex, 1)) 
			End If 
			blnSwitch = Not blnSwitch 
		Next 
		lngSum = lngSum Mod 10 
		If CBool(Len(Zahl.Text) + Len(CStr(lngSum)) Mod 2) Then 
			Interleaved_2_of_5 = CDbl(Zahl.Text & "0" & CStr(lngSum)) 
		Else 
			Interleaved_2_of_5 = CDbl(Zahl.Text & CStr(lngSum)) 
		End If 
	ElseIf Not IsEmpty(Zahl.Value) Then 
		Interleaved_2_of_5 = "Keine Zahl !" 
	End If 
End Function


So. Die Benutzerdefinierte Funktion wird auch erkannt und ich kann Sie nutzen. nur die Prüfsumme funktioniert nicht so recht.

Habe ein BSP: 0030449299002030 --> Prüfsumme ist 05 (also nur 5, aber da 2of5 Interleaved Modulo 10 nur grade stellen macht, setz ich da ne 0 davor)
aber wenn ich das mitn Excel mach bekomme ich das hier raus: 003044929900203000

die beiden nullen davor müssen sein (systembarcode zum abscannen) aber wo ist bitte mein Fehler wegen dem Prüfcode?

Hoffe mir ist zu helfen =)

lg

Tommy

Dieser Beitrag wurde von Thomynator bearbeitet: 28. Oktober 2010 - 12:00

0

Anzeige



#2 Mitglied ist offline   egal8888 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.036
  • Beigetreten: 23. September 10
  • Reputation: 25
  • Geschlecht:Männlich

geschrieben 28. Oktober 2010 - 12:40

Falsch:

Zitat

If CBool(Len(Zahl.Text) + Len(CStr(lngSum)) Mod 2) Then
Interleaved_2_of_5 = CDbl(Zahl.Text & "0" & CStr(lngSum))
Else
Interleaved_2_of_5 = CDbl(Zahl.Text & CStr(lngSum))
End If


Richtig:

Zitat

If CBool(Len(Zahl.Text) + Len(CStr(lngSum)) Mod 2) Then
Interleaved_2_of_5 = Zahl.Text & "0" & CStr(lngSum)
Else
Interleaved_2_of_5 = Zahl.Text & CStr(lngSum)
End If

Dieser Beitrag wurde von egal8888 bearbeitet: 28. Oktober 2010 - 12:42

0

#3 Mitglied ist offline   Thomynator 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.485
  • Beigetreten: 20. Februar 08
  • Reputation: 36
  • Geschlecht:Männlich
  • Wohnort:Traunreut

geschrieben 28. Oktober 2010 - 12:50

wow... das ging schnell =)

funktioniert einwandfrei =)

Vielen herzlichen Dank =)
0

#4 Mitglied ist offline   Thomynator 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.485
  • Beigetreten: 20. Februar 08
  • Reputation: 36
  • Geschlecht:Männlich
  • Wohnort:Traunreut

geschrieben 09. November 2010 - 12:19

So... muss das Thema leider noch mal hoch holen... es gibt momentan ein kleines Problem bei der Prüfziffer "0" wenn die Prüfziffer, wie in diesem Beispiel:

0005675453000010

null ist, bekomme ich hinten anstatt der "00" diese Ausgabe "010"
(komplett 0005675453000010010)

der aktuelle Code ist dieser hier:
Public Function Interleaved_2_of_5(Zahl As Range) As Variant
	Dim intIndex As Integer
	Dim lngSum As Long
	Dim blnSwitch As Boolean
	If IsNumeric(Zahl.Text) Then
		For intIndex = Len(Zahl.Text) To 1 Step -1
			If Not blnSwitch Then
				lngSum = lngSum + CInt(Mid$(Zahl.Text, intIndex, 1)) * 1
			Else
				lngSum = lngSum + CInt(Mid$(Zahl.Text, intIndex, 1)) * 3
			End If
			blnSwitch = Not blnSwitch
		Next
		lngSum = lngSum Mod 10
		If CBool(Len(Zahl.Text) + Len(CStr(lngSum)) Mod 2) Then
			Interleaved_2_of_5 = Zahl.Text & "0" & CStr(10 - lngSum)
			Else
			Interleaved_2_of_5 = Zahl.Text & "0" & CStr(10 - lngSum)
			End If
	ElseIf Not IsEmpty(Zahl.Value) Then
		Interleaved_2_of_5 = "Keine Zahl !"
	End If
End Function


kann mir da noch wer helfen? bin grad verwirrt..
das Problem könnte sein, dass ich sage "CStr(10 - lngSum)"
aber sowas in der Art brauche ich, da die anderen Prüfziffern (außer 0 und 5) nicht korrekt ausgegeben werden (sprich die lngSum ist "2" und die Prüfziffer die stehen muss ist die differenz von 10 zu der summe... nur wenn die berechnete Zahl null ist heißt es ja 10-0 =10 --> theoretisch richtig, nur stehen darf da nur die letzte Ziffer, sprich "0")
hmm...

Vielen Dank schon mal...

lg

Tommy

Dieser Beitrag wurde von Thomynator bearbeitet: 09. November 2010 - 12:23

0

#5 Mitglied ist offline   egal8888 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.036
  • Beigetreten: 23. September 10
  • Reputation: 25
  • Geschlecht:Männlich

geschrieben 09. November 2010 - 13:22

Wenn ich Dich richtig verstanden hab, dann müsste das sein, was Du möchtest:

If CBool(Len(Zahl.Text) + Len(CStr(lngSum)) Mod 2) Then
  Interleaved_2_of_5 = Zahl.Text & "0" & IIf(lngSum > 0, CStr(10 - lngSum), "0")
Else
  Interleaved_2_of_5 = Zahl.Text & "0" & IIf(lngSum > 0, CStr(10 - lngSum), "0")
End If

0

#6 Mitglied ist offline   Thomynator 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.485
  • Beigetreten: 20. Februar 08
  • Reputation: 36
  • Geschlecht:Männlich
  • Wohnort:Traunreut

geschrieben 09. November 2010 - 13:37

aah genau. das habe ich gesucht, vielen Dank..

(wobei ich da hätte auch selber drauf kommen können is ja nur ne wenn dann quasi -.-)

:huh:

Trotzdem mega thx

Dieser Beitrag wurde von Thomynator bearbeitet: 09. November 2010 - 13:38

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0