کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی
کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی

تابع تبدیل عدد به حروف در اکسس



 قصد دارید عددی را به  حروف فارسی یا انگلیسی برگردانید بنده بعنوان یک مبتدی و در این سطح به شما دوست اکسسی عزیز عرض میکنم بنده در ذهن خودم تصور کردم اول می بایست تبدیل اعداد در همان سه رقم اول یعنی یکان دهگان و صدگان را انجام دهم سپس یک تابع جداکننده اعداد سه رقم سه رقم ایجاد کنم و در نهایت در تابعی بگویم برای سه رقم اول هیچ رشته ای  برای سه رقم دوم ،  هزار  سه رقم سوم میلیون و الی ..... در نظر بگیر که بعد از این سه رقم ها به رشته ای که میخواهید بسازید اضافه گردد. ( Public Function )









در بالا یونیک چارت وجود دارد بجای فارسی کردن پنجره Vba وچون اکسس یونیکد فارسی را ساپورت نمیکند بهتر است از یونیکد بالا در تابع Chrw برای نمایش معادل فارسی در تکست باکستون استفاده بنمائید...


در مرحله اول  شما می توانید تابعی برای تبدیل حروفی اعداد بصورت ۳ تایی  بسازید و از آرایه کمک بگیرید و طبق گفته بالا برای حروف از یونیکد فارسی آن استفاده کنید 



S(0)=CHRW(1589)+Chrw(1601)+Chrw(1585)    صفر

S(1)=Chrw(1740)+Chrw(1705)   یک

.

.

.

S(10)=ده

S(20)=بیست

.

.

S(90)=نود

S(100)=یکصد

S(200)=دویست

.

.

S(900)=نهصد



در اینجا باید بین سه رقم لوپ بزنید و معادل فارسی هر عدد که در آرایه تنظیم کردید را برگرداند برای اینکار باید فرضا عدد شما 123 باشد می بایست این عدد به 100 20 و 3 تجزیه شده و این 3 عدد را در آرایه بیابد و معادلش را چاپ کند.


 



در تصویر بالا مشاهده می کنید که برای بدست آوردن 100، 20 و 3  از ترکیب دو تابع Left و Mid استفاده شده . از تابع Mid استفاده شد تا اعداد 1 ، 2  و 3 را جدا کند و به فرمت 000 در آورد


For i=1 To Len("123")

C=Len("123")

X=CVal(Left(Mid("123",i,1) & "000",C))

'Mid("123",i,1) : 

'Mid("123",1,1)=1 & "000"=100

'Mid("123",2,1)=2 & "000"=200

'Mid("123",2,1)=3 & "000"=300

'C=3 Then Left(100,3)=100

'C=2 Then Left(200,2)=20

'C=1 Then Left(300,1)=3

Ret=Ret & IIf(Ret="","",Chrw(1608)  &  S(X)

C=C-1

Next 

Function=Ret


فانکشن بالا ترجمه گرتون میشه که عدد سه رقمی رو تبدیل به حروفی میکنه که در آرایه ای ذخیره شده اند


حال باید تابع دیگری بنویسید که عددتون رو سه رقم سه رقم جدا بنماید.


اول دانستن کاربرد Back Slash در Vba


Dim MyValue

MyValue = 11 \ 4   ' Returns 2.

MyValue = 9 \ 3   ' Returns 3. 

MyValue = 100 \ 3   ' Returns 33.


تصویر زیر هم در نظر داشته باشید



با تابع String می توانید کاراکتر مورد نظرتون را به تعداد مورد نیاز چاپ کنید فرضا در تصویر بالا 8 بار کاراکتر صفر تکرارشده و با تابع فرمت گفته شده عدد دو در شکل و غالب صفرها نمایش داده شود ساده ترین راه اینه که اول مشخص کنید عددتون چند قسمت میشود فرضا عدد 1234 ... طولش 4 است 


4\3=1

4 Mod 3<>0  Then 1+1=2

n=2

پس 1234 شامل دو پارت میشود ( n ) یکی 1 و دیگری 234 


 بین یک تا عدد n لوپ زده شود For i=1 To n و قبل از آن با دو تابع تصویر بالا رشته "001234" حاصل می شود یعنی جای عدد 8 باید 2×3 قرار داده شود وبجای "2" رشته عددی "1234"، سپس با تابع Mid می توانید سه رقم سه رقم جدا کنید


چون n برابر 2 است پس دوبار حلقه تکرار می شود

آرگومان اول Mid همان نقطه شروع(Start) و بعدی طول (Length) است در لوپ اول از اولین کاراکتر شروع میکند و رشته ای با طول 3 را برمی گرداند در لوپ دوم یعنی n=2 نقطه شروع باید بشود 4 بخاطر همین از Start=Start+3 استفاده شده و طول ثابت است چون در هر لوپ رشته ای با طول ۳ مد نظر ما است اساتید بزرگ .


Start=1

For i=1 To n

K=Mid("001234",C,3)

'Mid("001234",1,3)=001

'Mid("001234",4,3)=234

Ret=Ret & IIf(Ret="","",",") & k

Start=Start+3

Next

Function=Ret


فرض کنید عدد 234 دارید 


3\3=1 AND 3 MOD 3=0 Then n=1

Mid("234",1,3)


عدد 23


2\3=0  AND 2 MOD 3<>0 Then   n=0+1

Mid("023",1,3)


عدد 12345678 : 


8\3=2 And 8 Mod 3<>0 Then n=2+1=3

Mid("012345678",1,3)=012

Mid("012345678",4,3)=345

Mid("012345678",7,3)=678


برای عدد 12345678 بالا با فرمت "012345678"  و n=3 توسط تابع Mid  و تکرار لوپ به تعداد n سه عدد جداگانه بدست آوردیم. کلیات این تابع میشود جدا کردن ارقام بصورت ۳ تایی و در نهایت در تابع اصلی استفاده میشود.



مرحله آخر تابع اصلی است که عدد از کاربر گرفته می شود فرضا تابع (GetValue(n As Long و عدد را داخل تابع جداکننده می گذارد و جواب آن که بصورت    "012,345,678" است را با تابع Split  جدا کرده و می گوئیم که یکی یکی در تابع ترجمه گر قرار دهد و  به حروف برگرداند حال در اینجا چیزی که مورد نیاز است حروف هزار ، میلیون ، میلیارد و .... 


درمثال بالا می توانید در همان تابع آرایه ای بسازید و حروف هزار ، میلیون ، میلیارد ، تریلیون و تریلیارد را ذخیره کنید و چون   i  در عملیات تابع Mid نقشی ندارد می توانید بنویسید FOR i=n To  1 ، در نتیجه اگر فرض کنیم تابع دیگری نسازیم می توانیم در تابع دوم بگوئیم 


Dim A(1 To 5 ) As String

A(1)=""

A(2)="هزار" USE CHRW !!!

A(3)="میلیون" USE CHRW

A(4)="میلیارد"


و اگر نام تابعی که سه رقم اعداد را به حروف بر می گردانیم (T(num باشد در تابع Mid باید گفت 


Ret=Ret &  IIf(Ret="",""," " & Chrw(1608)

 T(k) &  A(n) 


در شروع لوپ Ret جوابی ندارد توسط تابع IIF چک شده اگر جواب داشت از حرف "و" استفاده شود چک میکنیم 

String : 12345678

8\3=2 AND 8 Mod 3 <>0 Then n=(8\3)+1=3

n=3

Ret=""

A(3)="یک میلیون"

Ret="یک میلیون "

 n=2

Ret="یک میلیون" ' ( Ret <>"" )  Use "و"

A(2)="هزار"

Ret="یک میلیون (  و ) سیصد و چهل و پنج هزار "

n=1

Ret="یک میلیون و سیصد و چهل و پنج هزار " ' ( Ret<>"" )  "و"

A(1)=""

Ret=یک میلیون و سیصد و چهل و پنج هزار(  و ) ششصد و هفتاد و هشت

End Loop!!!

بسیار ساده به ساخت  توابعی برای تبدیل عدد به حروف فارسی پرداخته شد در صورت وجود مورد یا اشتباه لطفا در نظرات تصحیح شده درج گردد




تصویر بالا هم  احتیاجی به ذخیره حروف فارسی در آرایه نداره و کلا اعداد ۳ رقم ۳ رقم جدا شده و فقط بین آنها از عبارت هزار استفاده شده و جای کمتری هم گرفته.