Formül hesabı [Archive] - Excel Forum

PDA

Tüm Versiyonu Göster : Formül hesabı


pcman
06-01-2008, 19:44
Bir sitede kullanılan birsistemi projemde kullanmam gerikiyor

sitenin linki
http://www.meeberg.com/checkdigit.htm

Burda Yazılan Tank numarası doğrulanıyor ve son karekter veriliyor

Örneğin bu bir tank numarası burda tireden sonraki rakam verdiğim likte oluşuyor
ALTU 123 056-0
GESU 801 863-3
PCVU 125 684-0

verdiğim linkkin kaynak kodlarını bir yerekarar çözdüğümüzannediyorum :)

Harfler sayılara tanımlanıyor

Array("a",10,"b",12,"c",13,"d",14,"e",15,"f",16,"g",17,"h",18,"i",19,"j",20,"k",21,"l",23,"m",24,"n",25,"o",26,"p",27,"q",28,"r",29,"s",30,"t",31,"u",32,"v",34,"w",35,"x",36,"y",37,"z",38);


script bilmediğim için function çezemedim

Yardımcı olanan arkadaşlara şimdiden teşekkürler

modalı
07-01-2008, 01:47
Sayın pcman,

Tam olarak ne istediğinizi anlayamadım. Ancak ilgili uygulamayı Access e uyguladım. VBA kodlarından takip edebilirsiniz sanırım.

İyi çalışmalar

omerceri
07-01-2008, 06:23
Projeniz Excel'de ise aşağıdaki fonksiyonu kullanabilirsiniz
Kontenyer Numarasını tek hücreye boşluk vermeden giriniz.
Function deger(harf)
If Asc(harf) = 65 Then
deger = 10
ElseIf Asc(harf) > 65 And Asc(harf) < 76 Then
deger = Asc(harf) - 54
ElseIf Asc(harf) > 75 And Asc(harf) < 86 Then
deger = Asc(harf) - 53
ElseIf Asc(harf) > 85 And Asc(harf) <= 90 Then
deger = Asc(harf) - 52
End If
End Function
Function KonteynerKontNo(KonteynerNo)
For i = 1 To 10
If Not IsNumeric(Mid(KonteynerNo, i, 1)) Then
a = Application.Power(2, i - 1) * deger(Mid(KonteynerNo, i, 1))
Else
a = Application.Power(2, i - 1) * Mid(KonteynerNo, i, 1)
End If
b = b + a
Next
c = b Mod 11
If c = 10 Then
KonteynerKontNo = 0
Else
KonteynerKontNo = c
End If
End Function

pcman
07-01-2008, 08:25
Sn Modalı ve omerceri Çok teşekkür ederim

Sizin gibi Paylaşımcılarla excel.web.tr dahada keyifli bir ortam haline geliyor.

modalı
07-01-2008, 10:46
Benim eklediğim uygulamada ufak bir hata var. hesaplanan sayı 10 ise 0 olma ihtimalini eklememiştim.
calc fonksiyonunu şöyle değiştitin:


Public Function calc(testTal1 As Variant, testTal2 As Variant)
Dim inputStr
Dim sum, currentLetter, delsum, multiplier
inputStr = testTal1 & testTal2
sum = 0
multiplier = 1
For i = 1 To 10
currentLetter = Mid(inputStr, i, 1)

If Not IsNumeric(currentLetter) Then
delsum = getLetterValue(currentLetter)
Else
delsum = Val(currentLetter)
End If

sum = sum + (delsum * multiplier)
multiplier = multiplier * 2
Next i
calc = sum Mod 11
If sum Mod 11 = 10 Then
calc = 0
End If
End Function


Kırmızı olan kısım eklenecek.

İyi çalışmalar:)

pcman
07-01-2008, 13:11
teşekkürler

pcman
07-01-2008, 13:23
Sn Modalı zamanınız olunca Kobaca Bu kodların açıklamasını yaparmısınız

ör.. Tankno ilk 4 karekter harftir ve sayıya çevrilir a=10 başlar 4işlemler falan

İyi çalışmalar :)

omerceri
07-01-2008, 15:08
Sn pcman
İlk dört hanesi Konteyner Sahibinin kodları olup harflerle gösterilir ve son harfi U dur.
Sonraki 6 rakkam seri numarasıdır. 6 haneden küçük gösterilmişse başına 0 eklenerek 6'ya tamamlanır.
Harfler bir sabit sayıya denk gelir.
A 10
B 12
C 13
D 14
E 15
F 16
G 17
H 18
I 19
J 20
K 21
L 23
M 24
N 25
O 26
P 27
Q 28
R 29
S 30
T 31
U 32
V 34
W 35
X 36
Y 37
Z 38
Harflerin karşılığı bu sayılar ile seri numarasının rakamları,
sırası ile 2 üst 0'dan başlanarak, 2 üstü 9 kadar çarpılır.
örneğin

ALTU123056 numaralı konteyner

(A = 10) (2 Üst 0 = 1) 10 x 1= 10
(L = 23) (2 üst 1 = 2) 23 x 2 = 46
(T = 31) (2 üst 2 = 4) 31 x 4 = 124
(U = 32) (2 üst 3 = 8) 32 x 8 = 256
(1 = 1) (2 üst 4 = 16) 1 x 16 = 16
(2 = 2) (2 üst 5 = 32) 2 x 32 = 64
(3 = 3) (2 üst 6 = 64) 6 x 64 = 192
(0 = 0) (2 üst 7 = 128) 0 x 128 = 0
(5 = 5) (2 üst 8 = 256) 5 x 256 = 1280
(6 = 6) (2 üst 8 = 512) 6 x 512= 3072
__________
5060
sonra bu çıkan çarpım sonuçları toplanır.
bulunan sayı 11'e tam sayı kalana kadar bölünür. KALAN kontrol rakamıdir.
örnekte tam bölündüğü için kontrol rakkamı 0
Not
kalan 10 olduğu taktirde 0 kabul edilecek.

bu heplama için çok değişik biçimlerde kod yazılabilinir

modalı
07-01-2008, 15:12
Sayın pcman,

Bu işin algoritması çok basit:

1.Harf alanı ile sayı alanını birleştiriyoruz.
2. Yeni elde ettiğimiz metinin harflerini teker teker alıyoruz ve soruda verdiğiniz Array a göre numaralandırıyoruz. a=10, m=24 vs. Aynı zamanda da topluyoruz.
3.Sayısal alanlar direkt olarak toplama giriyor.
4. En sonunda genel toplamı 11 bölüp kalanı alıyoruz.
5. Bu kalan 0-9 arası ise hesaplanan kalan, yok 10 ise bu kez 0 olarak son digiti hesaplamış oluyoruz.

Başka soracağınız var ise memnuniyetle cevaplandırabilirim.

İyi çalışmalar

omerceri
07-01-2008, 15:21
Sn Modalı
Sayıların kendi değerlerinin toplamı değil, sayıların sırası ile 2 üst 0 den 2 üst 9'a kadar çarpımının toplamı


Özel Arama