vlookup در اکسس وجود دارد ؟ قبلا در مورد توابع دومین اگریگیت مطلب منتشر کردیم مثل Dlookup و Dlast ولی توی این چالش کاربرد ندارن.
فراخوانی آخرین دیتای وارد شده در یک سطر اکسس ( Vlookup )
میدونم Vlookup تو اکسس نداریم 😉 ولی کاری که میخوایم بکنیم تو اکسل با Vlookup راحت قابل انجامه
- فرض می کنیم یک فایل اکسس داریم با دو تا آبجکت یک جدول و یک فرم
- نام فرم frmOrder و نام جدول tblOrder می باشد
- همانطور که در تصویر مشخص است جدول tblOrder دارای شش فیلد می باشد .
- که در واقع برای هر شماره سفارش ، پنج مرحله عملیات ثبت می شود .
- حالا ما میخواهیم وقتی کاربر در فرم frmOrder شماره سفارش را انتخاب کرد ، آخرین وضعیت آن سفارش در txtStatus نمایش داده شود .
به عنوان مثال اگر در فرم بالا و قسمت Order No عدد 4 وارد شد در Current Status گزینه in progress نمایش داده شود .
روش اول : استفاده از تابع If و تابع Dlookup
آبجکت txtOrder را در فرم frmOrder انتخاب میکنیم .
در قسمت رویداد AfterUpade وارد محیط کد نویسی می شویم.
قطعه کد زیر را در آنجا قرار می دهیم .
If Nz(DLookup("orderStep5", "tblOrder", "orderid=" & Forms!frmOrder!txtOrder), 0) <> 0 Then Me.txtStep = Nz(DLookup("orderStep5", "tblOrder", "orderid=" & Forms!frmOrder!txtOrder), 0) Else If Nz(DLookup("orderStep4", "tblOrder", "orderid=" & Forms!frmOrder!txtOrder), 0) <> 0 Then Me.txtStep = Nz(DLookup("orderStep4", "tblOrder", "orderid=" & Forms!frmOrder!txtOrder), 0) Else If Nz(DLookup("orderStep3", "tblOrder", "orderid=" & Forms!frmOrder!txtOrder), 0) <> 0 Then Me.txtStep = Nz(DLookup("orderStep3", "tblOrder", "orderid=" & Forms!frmOrder!txtOrder), 0) Else If Nz(DLookup("orderStep2", "tblOrder", "orderid=" & Forms!frmOrder!txtOrder), 0) <> 0 Then Me.txtStep = Nz(DLookup("orderStep2", "tblOrder", "orderid=" & Forms!frmOrder!txtOrder), 0) Else If Nz(DLookup("orderStep1", "tblOrder", "orderid=" & Forms!frmOrder!txtOrder), 0) <> 0 Then Me.txtStep = Nz(DLookup("orderStep1", "tblOrder", "orderid=" & Forms!frmOrder!txtOrder), 0) End If End If End If End If End If
در واقع کد بالا از آخرین ستون که در این مثال orderStep5 است شروع میکند و اگر خالی نبود مقدارش را نمایش می دهد.
روش دوم : استفاده از یک فیلد کمکی
جدول tblOrder را در نمای طراحی باز می کنیم .
یک فیلد به نام currentStatus از نوع short Text اضافه می کنیم .
یک فرم از روی جدول tblOrder می سازیم با نام frmOrder1 .
فرم ساخته شده را در نمای طراحی باز کرده و در رویداد AfterUpdate تک تک فیلدها کدی مانند کد زیر وارد می کنیم .
Me.currentStatus = Me.orderStep1
کد بالا باعث می شود که ستون currentStatus از جدول tblOrder همیشه شامل آخرین فیلد باشد.
کار تمام است و در رویداد AfterUpdate کنترل txtOrder کد زیر را وارد می کنیم .
Me.txtStep1 = Nz(DLookup("currentStatus", "tblOrder", "orderid=" & Forms!frmOrder!txtOrder), 0)
تمامی مراحل بالا در فیلم آموزشی زیر آورده شده و همچنین فایل تکمیل شد ههم برای دانلود قرار گرفته .
[su_button url=”http://s9.picofile.com/file/8360425526/OfficebazAccessVlookup.zip.html” target=”blank” style=”flat” background=”#864034″ size=”10″ wide=”yes” center=”yes” radius=”5″]دانلود فایل چالش [/su_button]
اولین چیزی که به ذهنم فعلا میرسه اینه که یه ستون از نوع محاسباتی توی table قرار بدیم که با یه iif تو در تو بیاد چک کنه کدوم سلول آخریه
مثلا اگه 3 تا ستون داشته باشیم اول ستون 3 پر بود 3 رو برگردونه در غیر این صورت دومی رو چک نه
اگه دومی بود 2 و….
قطعا راه های راحت تری هم هست یکم باید بیشتر فکر کنم
سلام
ممنون از پاسخ شما ، تقریبا درسنه ، ولی فیلد محاسباتی توی جدول تا جایی که امکان داره استفاده نشه بهتره ، چون بار پردازشی شدیدی داره و همیشه برنامه درگیر محاسبه هست ، محاسبات برای فرمها و گزارشات و کوئریها مناسبه
سلام تو دستورات دی لوکاپ ودی کانت و… جستجو درستون جداول انجام می دهد حالا باید دستوری نوشته بشه که تو سطر جدول جستجو کنه
خب همون اول گفتم که Dlookup و کلا دی اگریگیت اینجا کارایی نداره
بنظرم میتونیم از یک ستون کمکی استفاده کنیم که در اون آخرین وضعیت اون سفارش ثبت بشه
یکم کار داره و در ثانی باید ۵ ستون شما به هم مرتبط شوند
این ایده بسیار خوبیه و البته نیازی به ارتباط نیست و باید بگم فک کنم از کاری که خودم کردم بهتر باشه 🙂
استاد گرانقدر در روش فیلد کمکی در رویداد After Update فیلد جاری ،اضافه نمایید که در صورت تغییر در هر سفارش فیلدهای بعدی خالی شوند. اونوقت کد بدرستی عمل می نماید
سلام جناب بحری
خیلی چالش های خوب و کاربردی مطرح می کنید و بسیار هم آموزنده… شرمنده یک سوال این که : VLOOKUPاکسل رو استفاده کردم ولی می شه همین کار در اکسل رو بگید چطوره؟
اینجا می شه از کوئری کراس تب و فرمول DLAST هم استفاده کرد.
من که با کراس تب به نتیجه نرسیدم لااقل تو این مثال نتونستم به کار ببرم