رفتن به مطلب

آموزش تهیه یک سند حسابداری ساده در اکسل


ارسال های توصیه شده

d2f4b90f0d89dcc38301f6838a879da8.jpg

درود

 

در این تایپیک نحوه ایجاد یک سند حسابداری ساده قرار داده میشه ، با توجه به اینکه رشته بنده حسابداری نیست امیدوارم دوستان گرامی ایرادات احتمالی این آموزش رو اصلاح و راهکار های بهتری نیز ارائه کنندsmile.png

 

 

 

بخش اول: مقدمات

 

در حسابداری سنتی سند حسابداری(Journal Voucher) برگه ای است که حداقل یک تراکنش مالی(شامل یک طرف بدهکار و یک طرف بستانکار) در آن نوشته می شده است. و چنین مدرکی پس از امضای مرجع ذی صلاح و صدور آن قابل ثبت در دفاتر کل، معین و روزنامه است.

با استفاده فراگیر از کامپیوتر در ثبت تراکنشهای مالی این دیدگاه نیز به طور کلی تغییر یافته است. سند حسابداری در ثبت رایانه ای رویدادهای مالی، عبارت است از یک فرم که کاربر می تواند یک/چند تراکنش مالی را در آن وارد نماید. هر تراکنش مالی مرکب از دو آرتیکل و هر آرتیکل در بردارنده حداقل یک کد حساب و مبلغ(بدهکار/بستانکار) می باشد به علاوه هر سند مالی الزاما دارای شماره سریال و تاریخ نیز هست.

 

حساب چیست؟

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

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

 

طرف راست حساب که در اصطلاح حسابداری آن را طرف بدهکار می نامند و طرف چپ حساب که در اصطلاح حسابداری آن را طرف بستانکار می نامند . در اصطلاح حسابداری ثبت رقمی در سمت راست یک حساب را بدهکار کردن و ثبت رقمی در سمت چپ حساب را بستانکار کردن آن حساب می گویند .

 

ساده ترین شکل حساب به دلیل شباهتی که با حرف لاتین ( T ) دارد به نام

" شکل تی " خوانده می شود که یک فرم ابتدایی می باشد و فقط توسط حسابداران به منظور تجزیه و تحلیل مسایل حسابداری و نیز توسط استادان در هنگام تدریس درس حسابداری مورد استفاده قرار می گیرد و الا در واحد های اقتصادی فرمهای کامل چاپی که دارای ستونهای متعدد می باشند به صورت اوراق جداگانه یا دفتر به کار می رود .

 

حسابهای موجود در یک موسسه را از جهتی می توان به سه دسته تقسیم نمود :

 

حسابهای دائمی

این حسابها همانطوری که از نامشان پیداست ، دائمی هستند . یعنی ، فقط مربوط به یک دوره مالی نبوده ، مانده آنها به دوره مالی بعد انتقال می یابد . حسابهای ترازنامه ، از نوع حسابهای دائمی می باشند . در پایان هر دوره مالی ، حسابهای دائمی مانده گیری می شوند . سپس مانده های جدید در ترازنامه پایان دوره منعکس گردیده ، به دوره مالی بعد نقل می گردند . به حسابهای دائمی ، حسابهای واقعی نیز گفته می شود .

 

 

حسابهای موقتی

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

حسابهای مربوط به صورت سود و زیان جزء حسابهای موقتی می باشند . زیرا همانطوری که گفته شد ، مانده این حسابها ( درآمد فروش ، خرید ، هزینه های مستقیم خرید ، برگشت از فروش و تخفیفات ، برگشت از خرید و تخفیفات ، تخفیفات نقدی خرید و فروش و کلیه هزینه ها ) به حساب خلاصه سود و زیان بسته می شوند . مانده حساب اخیر ، سود یا زیان ویژه دوره مالی است که به حساب سرمایه انتقال می یابد . در نتیجه در پایان دوره مالی ، مانده ای از این حسابها وجود ندارد که به دوره مالی بعد منتقل گردد.

 

حسابهای مخلوط

این حسابها ، همانطوری که از نامشان پیداست ، مخلوطی از حسابهای دائمی و موقتی می باشند . بدین ترتیب ، در پایان دوره مالی ، با استفاده از تعدیلات ، آن قسمت از مانده حساب را که جزء حسابهای موقتی است ( باید به صورت سود و زیان انتقال یابد ، یعنی در محاسبه سود یا زیان ویژه دوره مالی موثر است و به حساب خلاصه سود و زیان بسته می شود ) ، از آن جدا می نمایند و مابقی را که جزء حسابهای دائمی است ، به ترازنامه پایان دوره انتقال می دهند . پیش پرداختهای هزینه ، پیش دریافتهای درآمد از حسابهای مخلوط می باشند .

لینک به دیدگاه

داده هایی که برای یک سند حسابداری نیاز داریم

 

04a99bd05b877d4a63efbb49b8748f5d.jpg

 

تاریخ سند: تاریخ ایجاد سند است که یک بار وارد می شود.

شماره سند: شماره سند بر اساس سند هایی که تاکنون داشته ایم به صورت یک سریال منحصر به فرد وارد می شود

عنوان حساب: عناوینی مانند خرید، فروش، بدهی، حقوق و...

بدهکار: با توجه به عنوان حساب ها مشخص می شود و به تعداد عنوان حساب ردیف نیاز دارد

بستانکار: با توجه به عنوان حساب ها مشخص می شود و به تعداد عنوان حساب ردیف نیاز دارد

جمع: مجموع دو ستون بدهکار و بستانکار

شرح سند: توضیحی برای سند است که یکبار به عنوان اطلاعات کلی مطرح می شود

نام مؤسسه: یکبار مطرح شده و نام مؤسسه مربوطه است

شرح ردیف: به تعداد عنوان حساب ردیف نیاز دارد و جهت این است که شخص مراجعه کننده به راحتی اطلاعاتی در رابطه با آن حساب بدست آورد

شماره مدرک: جهت دسترسی راحت به اطلاعات استفاده می شود و به تعداد عنوان حساب ردیف نیاز دارد

تاریخ مدرک: گاهی ممکن است تاریخ سند با تاریخ مدرک مطابق نباشد لذا ستونی جهت تاریخ مدرک در نظر گرفته می شود

نام مشتری یا عطف: در یک مؤسسه مشتریان متعددی خرید و فروش انجام می دهند جهت دسترسی راحت تر به جزئیات مدرک برای اسامی مشتریان نیز ستونی در نظر گرفته می شود.

ردیف: تعداد خط های سند را مشخص می کند

سال مالی: سالی مربوط به سند

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

نام تنظیم کننده سند: جهت درج در انتهای سند استفاده می شود

 

[TABLE=class: ncode_imageresizer_warning, width: 800]

[TR]

[TD=class: td2][/TD]

[/TR]

[/TABLE]

71a09725f5b1556d72e02570fe605fa7.jpg

لینک به دیدگاه

[TABLE=class: ncode_imageresizer_warning, width: 800]

[TR]

[TD=class: td2][/TD]

[/TR]

[/TABLE]

a0887b14d68fa968b7e31407520e9910.png

تبدیل جدول اطلاعات به Table

ابتدا بایستی ردیف اول و عنوان ستون ها را انتخاب و از تب insert گزینه table را انتخاب کنیم به نحوی که نتیجه همانند شکل زیر گردد ،دقت کنید حتما در ابتدا یک خط برای سند انتخاب کنید تا پس از اعمال تنظیمات لازم برای همان یک خط به محض ایجاد یک خط جدید برای سند کلیه تنظیمات اعمال شده به خط جدید منتقل گردد. این نکته از اهمیت زیادی برای ما برخوردار است چون نمیدانیم سند چند خط خواهد داشت.

2e3f69164dc1332d9f4ff9f785b27c3b.jpg

 

 

 

[TR]

[TD=class: td2][/TD]

[/TR]

[/TABLE]

dd50985cfa591048e533617b98d5a4b8.jpg

 

دقت کنید گزینه my table has headers تیک خورده باشد.

 

[TR]

[TD=class: td2][/TD]

[/TR]

[/TABLE]

d0bde9c601f4bd7f6eac697e38764e60.jpg

بر روی table ایجاد شده کلیک کنید و از تب data گزینه فیلتر را غیر فعال نمایید تا زبانه های فیلتر نمایش داده نشوند.

49c0c7b4eaa583a00b481b8d13b9fa26.jpg

لیست کردن عنوان های حساب و نام مشتریان

در شیت مجزایی عنوان های حساب و نام مشتریان خود را وارد نموده آنهارا از طریق data validation به لیست فروریز تبدیل کنید برای آموزش این بخش به لینک زیر مراجعه کنید

 

 

 

70f982a9ca874071951cc3d7ba4f4997.jpg

 

در صورت وارد کردن عنوان و حساب و مشتری مغایر با لیست شما پیغامی تنظیم نمایید تا خطا صادر شود (شکل زیر)

 

c73e4658ca8c384f35edab6c8db8b043.jpg

شماره مدرک و بدهکار و بستانکار

این سه می بایست عدد باشند و بزرگتر از صفر لذا ابتدا بر روی سلول مربوط به هر کدام کلیک کرده CTRL+1 را فشار دهید و تنظیمات زیر را اعمال کنید.

557f5c8c206774bf362cbee5765899d0.jpg

 

سپس از طریق Datevalidation محدوده ای معتبر برای این اعداد تعریف نموده و پیغام خطای مناسب نیز وارد نمایید.

ac7bf4d46d76281962d4a57d59b77a49.jpg

 

 

83c1f82d4c0d4aa1c689a4c3a7677e1f.jpg

لینک به دیدگاه

80d0c078fa9134adb4b8b4993e0dfd98.jpg

تاریخ سند و مدرک

برای تاریخ دو کار می توانید انجام دهید

الف: از طریق format cell

با فشردن ctrl+1 همانند تصویر می توانید فرمت تاریخ را تعریف نمایید:

 

       0000"/"00"/"00  

 

76141dad65b991347df631a99c721d1f.jpg

 

ب : از طریق Datavalidation

تاریخ سند مربوط به یک روز است اما تاریخ مدرک امکان دارد مرتبط با روز های متعدد باشد. میتوان تاریخ را به صورت اعداد 6 رقمی از 111111 تا 999999 وارد کنیم یعنی همه تاریخ ها با فرمت مثلا 930331 وارد شود که این روش توصیه می شود.

0367741eebb5d4364c2a9fb3d6edd63f.jpg

 

 

a755c8ed34f0cd4eaf253a77832cf12f.jpg

نکته: می توان سلول هایی که داده در آنها وارد می شود رنگ یا Border متفاوت داشته باشند.

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

برای عنوان حساب و عنوان مشتری از طریق Validation list اطلاعات انتقال پیدا کند و با اضافه شدن عناوین لیست ایجاد شده به روز شود.

 

 

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

نام شرکت:

کد PHP:

 Public Function onvan()
onvan = "شرکت الف"
End Function  
 

 

 

نام مدیر عامل:

 

کد PHP:

 Public Function name1()
name1 = "مدیر عامل: خانم ب"
End Function  

 

نام تنظیم کننده:

 

کد PHP:

 Public Function name2()
name2 = "تنظیم کننده: خانم الف"
End Function  

 

سال مالی:

 

کد PHP:

 Public Function salemali()
salemali = "1393"
End Function  

 

ایجاد جمع سند اتوماتیک

بر روی تیبل ایجاد شده کلیک کنید در نوار ابزار از همانند تصویر بر روی Total Row کلیک کنید:

a413e911f91914a4d96534fe576c4a89.jpg

 

و در ردیف اضافه شده گزینه sum را برای بدهکار و بستانکار انتخاب کنید

 

 

 

2f8a3b5e0ad63b36f10dfe4ebbb0ce61.jpg

از این پس با اضافه شدن هر ردیف جمع کل بدهکار و بستانکار نیز محاسبه می گردد.کلمه جمع را می توانیم خودمان بنویسیم.

از طریق Name manager نام تیبل را به asnad تغییر می دهیم تا در ادامه از این نام در کد های خود استفاده کنیم.

لینک به دیدگاه

a8ae687d9877903f9e09d62f558712d4.png

اضافه کردن یک سطر به تیبل

 

در کنار سند یک دکمه گذاشته و آنرا به ماکروی زیر متصل میکنیم

Public Sub addroww()
Dim sheet As Worksheet
Dim table As ListObject
Set sheet = Application.ActiveWorkbook.Worksheets("asnad")
Set table = sheet.ListObjects.Item("asnad")
table.ListRows.Add
End Sub

 

در خط زیر asnad نام شیت حاوی سند حسابداری است

کد:

Set sheet = Application.ActiveWorkbook.Worksheets("asnad")

 

و در خط زیر ansad نام تیبل حاوی سند است

کد:


Set table = sheet.ListObjects.Item("asnad")

 

حذف سطر انتخاب انتخاب شده

 

برای حذف ردیف کد زیر را نوشته و آنرا به دکمه ای جهت حذف سند ارتباط دهید در این کد پس از انتخاب ردیف مورد نظر می توان انرا حذف کرد.

کد:


Public Sub dellrow()
Dim row1
Dim sheet As Worksheet
Dim table As ListObject
Set sheet = Application.ActiveWorkbook.Worksheets("asnad")
Set table = sheet.ListObjects.Item("asnad")
row1 = Application.ActiveCell.Row - table.DataBodyRange.Row + 1
On Error GoTo errhandler
table.ListRows(row1).Delete
errhandler:
If Err.Number = 9 Then
UserForm1.Show
End If
End Sub

 

[TABLE=class: ncode_imageresizer_warning, width: 800]

[TR]

[TD=class: td1, width: 20][/TD]

[TD=class: td2][/TD]

[/TR]

[/TABLE]

ad666808725b8d52ce55eb514ac7e396.jpg

حال اگر دقت کنید مشاهده خواهید کرد کلیه اعتباراتی که در سطر اول از طریق data validation اعمال کرده بودید در سطر های جدید نیز اعمال شده است.

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

375065093ba89afe260451bf689a5a77.jpg

 

جهت کنترل این خطا کدهای زیر را در نظر گرفته ایم

 

کد:

On Error GoTo errhandler
table.ListRows(row1).Delete
errhandler:
If Err.Number = 9 Then
UserForm1.Show
End If


 

در صورت بروز خطا کد به لیبل errhandler: منتقل می شود و کد خطا مورد بررسی قرار میگیرد اگر کد خطا 9 بود یوزرفرم1 نمایش داده می شود.

 

f4194e71b49089a630ba5b04e3d452b3.jpg

نکته : شما می توانید بجای فرم از msgbox استفاده کنید.

لینک به دیدگاه
47c6cc3867d5d47fe6807463421a33b4.jpg

اضافه کردن شماره ردیف

روش اول برای گذاشتن شماره ردیف استفاده از تابع row است

 

a6ea42ca9d76c2a58ed31877fb62e1c7.jpg

 

عدد 4 ناشی از 4 ردیفی بالایی است که در سند مورد استفاده قرار نگرفته است ، ایراد این روش این است که در صورت کم یا زیاد شدن ردیف این ترتیب به هم می ریزد

 

روش دوم

 

در این روش از تابعی با کد زیر استفاده میکنیم

 

 


Public Function rownumber(r1 As Range)
Dim sheet As Worksheet
Dim table As ListObject
Set sheet = Application.ActiveWorkbook.Worksheets("asnad")
Set table = sheet.ListObjects.Item("asnad")
rownumber = r1.Row - table.DataBodyRange.Row + 1
End Function

 

 

این تابع را در سند به شکل زیر بکار میگیریم:

 

9b28965b8df33dd2e5cd7c78811f72c6.jpg

 

در سلول اول ردیف تابع را فراخوانی می کنیم و در متغیر ورودی تابع یکی از ستون های روبروی ردیف اول مانند عنوان حساب را وارد می کنیم

در این صورت تمام ردیف ها به ترتیب شماره گذاری می شود و با حذف یا اضافه ردیف نیز این ترتیب به هم نمی ریزد

لینک به دیدگاه
47c6cc3867d5d47fe6807463421a33b4.jpg

اضافه کردن شماره ردیف

روش اول برای گذاشتن شماره ردیف استفاده از تابع row است

 

a6ea42ca9d76c2a58ed31877fb62e1c7.jpg

 

عدد 4 ناشی از 4 ردیفی بالایی است که در سند مورد استفاده قرار نگرفته است ، ایراد این روش این است که در صورت کم یا زیاد شدن ردیف این ترتیب به هم می ریزد

 

روش دوم

 

در این روش از تابعی با کد زیر استفاده میکنیم

کد:


Public Function rownumber(r1 As Range)
Dim sheet As Worksheet
Dim table As ListObject
Set sheet = Application.ActiveWorkbook.Worksheets("asnad")
Set table = sheet.ListObjects.Item("asnad")
rownumber = r1.Row - table.DataBodyRange.Row + 1
End Function

 

 

این تابع را در سند به شکل زیر بکار میگیریم:

 

9b28965b8df33dd2e5cd7c78811f72c6.jpg

 

در سلول اول ردیف تابع را فراخوانی می کنیم و در متغیر ورودی تابع یکی از ستون های روبروی ردیف اول مانند عنوان حساب را وارد می کنیم

در این صورت تمام ردیف ها به ترتیب شماره گذاری می شود و با حذف یا اضافه ردیف نیز این ترتیب به هم نمی ریزد

لینک به دیدگاه

39282997e45ef7cbf66a5f354e9c01ee.jpg

تهیه پشتیبان از سند

 

در این نمونه اسناد با همان فرمتی که تهیه شده اند بکاپ گیری می شوند ، در روش دیگر میتوان با فرمت یک دیتابیس از داده ها پشتیبان تهیه کرد به این نحو که برای هر فاکتور فیلدی(ستونی) در نظر گرفته و داده ها را ذخیره کرد

شیت جدیدی با نام bankasnad ایجاد می کنیم سپس در ماژولی کدهای زیر را می نویسیم

کد PHP:

 
Public  sheet As Worksheet, sh As Worksheet, hesab As Worksheet
Public  shomaresanad As Integer
Public Sub backup()
With Application
       .ScreenUpdating = False
       .EnableEvents = False
End With
Set sheet = Application.ActiveWorkbook.Worksheets("asnad")
Set sh = Application.ActiveWorkbook.Worksheets("bankasnad"(
Set hesab = Application.ActiveWorkbook.Worksheets("hesab")
Dim shsanad As Range, shsanadback As Range
Set shsanad = sheet.Range("h2")
Set shsanadback = hesab.Range("d1")
If sheet.Range("sumbed") <> sheet.Range("sumbes") Then
MsgBox    "سند تراز نیست"
GoTo ExitTheSub:
End If
On Error Resume Next
With sh
   fin = .Cells.Find(shomaresanad, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
End With
If fin <> "" Then
MsgBox    "این سند قبلا ذخیره شده"
GoTo ExitTheSub:
End If
Dim lrow As Integer, shlrow As Integer, StartRow
Dim lcol As Integer
Dim CopyRng As Range
On Error GoTo errhandler
lrow = LastRow(sheet(
shlrow = LastRow(s)
errhandler:
If Err.Number = 9 Then
UserForm2.Show
End If
StartRow = 2
Set CopyRng = sheet.Range(sheet.Rows(StartRow), sheet.Rows(lrow))
               If shlrow + CopyRng.Rows.Count > sh.Rows.Count Then
                   MsgBox  "ردیف های موجود در شیت bankasnad کافی نیست"
                   GoTo ExitTheSub
               End If
              CopyRng.copy
               With sh.Cells(shlrow + 2, "A")
                   .PasteSpecial xlPasteValues
                   .PasteSpecial xlPasteFormats
                   Application.CutCopyMode = False
               End With
   Application.GoTo sh.Cells(1)
   sh.Columns.AutoFit
   With Application
       .ScreenUpdating = True
       .EnableEvents = True
  End With
ExitTheSub:
Exit Sub
End Sub  

 

در قسمت declaration ماژول متغیرهای زیر را به صورت public تعریف میکنیم دلیل این کار این است که که در طول ماژول به مقادیر این متغیرها نیاز داریم و اگر دامنه (طول عمر) آنها محدود به سابروتین شود برنامه خواسته مارا محقق نخواهد کرد

کد PHP:

 
Public sheet As Worksheet, sh As Worksheet, hesab As Worksheet
Public shomaresanad As Integer  

 

قبلا از عمل پشتیبان گیری باید از تراز بودن سند مطمئن شویم تراز بودن به معنای برابر بودن حاصل جمع مقادیر بدهکار و بستانکار است

کد PHP:

 
If sheet.Range("sumbed") <> sheet.Range("sumbes") Then
MsgBox    "سند تراز نیست"
GoTo ExitTheSub:
End If  

 

در شیت asnad سلول حاصل جمع بدهکار را sumbed و سلول حاصلجمع بستانکار را sumbes نامیده ایم عدم تساوی این دو به مفهوم تراز نبودن سند است لذا در صورت بروز این خطا کد متوقف شده و تا رفع خطا و تراز کردن سند امکان تهیه پشتیبان نمی دهد.

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

 

کد PHP:

 On Error Resume Next
With sh
   fin = .Cells.Find(shomaresanad, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
End With
If fin <> "" Then
MsgBox    "این سند قبلا ذخیره شده"
GoTo ExitTheSub:
End If  

 

 

شیت asnad را در این کد به متغیر sheet اختصاص داده ایم و شیت backupasnad را به شیت sh

 

 

کد PHP:

 Set sheet = Application.ActiveWorkbook.Worksheets("asnad")
Set sh = Application.ActiveWorkbook.Worksheets("bankasnad")  
 

 

 

 

روال کار این است که کد محدوده سند را در شیت asnad کپی کرده و در شیت backupasnsd پیست میکند لذا متغیر هایی به شرح زیر نیاز داریم

Lrow : آخرین ردیف بکار رفته در شیت asnad

Shlrow : آخرین ردیف استفاده شده در شیت backupasnad

Startrow : ردیفی است که هر سند از آن ردیف شروع شده است در نمونه ما سند از ردیف 2 شروع شده است

Copyrng : محدوده ای از سند در شیت asnad که باید کپی شود

کد PHP:

 
Dim lrow As Integer, shlrow As Integer, StartRow
Dim CopyRng As Range  

 

تابع زیر آخرین ردیف بکار رفته شده در هر شیت را تعیین می کند:

 

کد PHP:

 
Function LastRow(sh As Worksheet)
   On Error Resume Next
   LastRow = sh.Cells.Find(what:="*", _
                           after:=sh.Range("A1"), _
                           Lookat:=xlPart, _
                           LookIn:=xlFormulas, _
                           SearchOrder:=xlByRows, _
                           SearchDirection:=xlPrevious, _
                           MatchCase:=False).Row
   On Error GoTo 0
End Function  

 

برای تعین آخرین ردیف بکار رفته در هر شیت کافیست نام متغیری که به هرشیت اختصاص داده ایم با این تابع فراخوانی نموده و مقدار آن را در ذخیره کنیم

کد PHP:

 

lrow = LastRow(sheet)
shlrow = LastRow(sh)  
 

 

حال در شیت asnad از ردیف 2 تا ردیف lrow انتخاب کرده و به متغیر copyrng اختصاص می دهیم

 

کد PHP:

 
StartRow = 2
Set CopyRng = sheet.Range(sheet.Rows(StartRow), sheet.Rows(lrow))
               If shlrow + CopyRng.Rows.Count > sh.Rows.Count Then
                   MsgBox  "ردیف های موجود در شیت bankasnad کافی نیست"
                   GoTo ExitTheSub
               End If
              CopyRng.copy  

 

ممکن است در شیت backupasnad تعداد ردیف های شیتی که استفاده کردیم تمام شده باشد که البته احتمال کمی دارد اما می توان آنرا چک کرد

 

کد PHP:

 

               If shlrow + CopyRng.Rows.Count > sh.Rows.Count Then
                   MsgBox  "ردیف های موجود در شیت bankasnad کافی نیست"
                   GoTo ExitTheSub
               End If  

 

 

حال محدوده copyrng را کپی کرده و بر اساس آخرین ردیف شیت backupasnad پیست می کنیم

 

کد PHP:

 
CopyRng.copy
               With sh.Cells(shlrow + 2, "A")
                   .PasteSpecial xlPasteValues
                   .PasteSpecial xlPasteFormats
                   Application.CutCopyMode = False
               End With  

 

 

بین هر سند دو ردیف فاصله گذاشته ایم تا تداخلی پیش نیاید.

نکته: برای اجرای این کد فایل برنامه بایستی فعال باشد یعنی در حالت انتخاب قرارداشته باشد در غیر این صورت خطای زیر صادر می شود:

کد PHP:

 
Subscript out of range (Error 9)  

 

 

می توان این خطا را کنترل کرد

کد PHP:

 
errhandler:
If Err.Number = 9 Then
UserForm2.Show
End If  

 

 

در یوزرفرم 2 پیغامی مبنی بر فعال کردن فایل صادر می شود اما پیشنهاد ما این است که فایل را فعال کنید و سپس کد را اجرا کنید تا مکررا با این پیغام روبرو نشوید.

برای اجرای این کد کلیدی به نام تهیه پشتیبان در نظر گرفته و کد را به آن اختصاص می دهیم.

 

1432eb5e2bda80d202e1d7bd17db6ac5.jpg

لینک به دیدگاه

9a0c9242661319483423e611457c872b.jpg

حذف سند

 

بعد از پکاب گیری سند جاری می بایست حذف شده و تیبل برای ثبت اطلاعات جدید آماده گردد، برای اینکار کد زیر را می نویسیم:

 

کد PHP:

 Sub del()
Dim shsanad As Range, shsanadback As Range
With Application
       .ScreenUpdating = False
       .EnableEvents = False
   End With
Set hesab = Application.ActiveWorkbook.Worksheets("hesab")
Set sheet = Application.ActiveWorkbook.Worksheets("asnad")
Set shsanadback = hesab.Range("d1")
Set shsanad = sheet.Range("h2")
shomaresanad = shsanadback.Value
Range("asnad[[بستانکار]:[عنوان حساب]]").Select
   Selection.ClearContents
shomaresanad = shomaresanad + 1
errhandler:
If Err.Number = 9 Then
UserForm2.Show
End If
shsanadback.Value = shomaresanad
shsanad.Value = shsanadback.Value
End Sub  

 

گفته شد هر سند شماره سند منحصر به فردی دارد ، قصد داریم این شماره به صورت اتوماتیک ایجاد گردد در شیت حساب سلولی در نظر میگیریم

کد PHP:

       Set shsanadback = hesab.Range("d1")  

 

 

c172ce479f873a6e66766901efc75a6f.jpg

 

عدد یک را در این سلول وارد میکنیم که نمایان گر شماره اولین سند است ، در شیت asnad در سلول h2 شماره سند وارد می شد

کد PHP:

 
Set shsanad = sheet.Range("h2")  

 

در بخش declaration ماژول متغیری از نوع public جهت ذخیره این شماره تعریف کردیم

کد PHP:

 
Public shomaresanad As Integer  

 

حال مقدار سلول d1 را به این متغیر نسبت می دهیم

کد PHP:

 
shomaresanad = shsanadback.Value  

 

محدوده سند را انتخاب نموده و پاک می کنیم

کد PHP:

 
Range("asnad[[بستانکار]:[عنوان حساب]]").Select
   Selection.ClearContents  

 

یک واحد به شماره سند می افزاییم

 

کد PHP:

 
shomaresanad = shomaresanad + 1  

 

 

مقدار سلول h2 در شیت asnad را برابر با متغیر shomaresanad قرار می دهیم

 

کد PHP:

       shsanadback.Value = shomaresanad  

 

همین مقدار را در شیت hesab و سلول d1 نیز ذخیره می کنیم تا برای سند بعدی مورد استفاده قرار گیرد

کد PHP:

 
shsanad.Value = shsanadback.Value  

 

 

برای اجرای کد آنرا به کلیدی تحت عنوان پاک کردن سند وصل می کنیم

 

3d3348e4d3cd3d9bcb1ea3f9fbbbd9dd.jpg

 

 

پایان

 

دانلود فایل مربوطه

لینک به دیدگاه

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...