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

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

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

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

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

پسورد دیتابیس جدول لینک شده در اکسس


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


نمایش کامند بار بعنوان شورتکات منو


نمایش بصورت پنجره   

myBar.ShowPopup






MsoBarPosition enumeration (Office)











بازیابی رمز در اکسس قدیمی

offset : 0x42-0x68

47 5E EC 37 9C E1 9C FA 07 FB 28 E6 D2 13 8A 60 95 31 7B 36 34 D7 DF B1 B6 51 13 43 0E 0A B1 33 F5 C4 79 5B 53 10 7C

  XOR روش 



ROW Hex Char HEXNULL Bin1 Bin2 Pass Bin Hexbin Decode_pass
1 78 x 47 01111000 01000111 7847 00111111 3F ?
2 5E ^ 5E 01011110 01011110
00000000 00
3 D3 EC 11010011 11101100 D3EC 00111111 3F ?
4 37 7 37 00110111 00110111
00000000 00
5 A3 ú 9C 10100011 10011100 A39C 00111111 3F ?
6 E1 ß E1 11100001 11100001
00000000 00
7 9C £ 9C 10011100 10011100
00000000 00
8 FA · FA 11111010 11111010
00000000 00


در اکسس جدید امکان بازیابی با این روش وجود ندارد چون تاریخ  و زمان فایل نیز در کد شدن دخیل میشود. پس سعی   نکنید     منظور اکسس ۲۰۰۰ که با ۲۰۰۷ به بالا ایجادشده باشد

 Low Security وبصورت 


اگر با اکسس 2007 و بالاتر فایل ورژن پاینتر ساخته باشید تاریخ  و ساعت ساخت فایل برای کد گذاری در نظر گرفته خواهد شد و در هدر فایل ذخیره خواهد شد برای بدست آوردن رمزاین حقه را میشود  بکار گرفت  باید یک فایل با همان تاریخ و ساعت ایجادکرد و بعد از آفست 42 تا 68 دو فایل را بایت به بایت با هم مقایسه نمود ولی در آفیس ۲۰۱۰ به بالا از رمزنگاریهای مختلف استفاده شده و غیر قابل بازیابیست جز مهندسان مرتبط حوزه ی خودش 



درج ردیف و ایجاد ردیف در اکسل

درج ردیف در اکسل در صورتیکه ردیف پاک شود ردیف ها تغییر خواهند نمود 

Row()-1=



ایجاد ردیف اتومات 


ActiveCell.EntireRow.Insert XlShiftDown




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


شی CurrentProject چندین  کالکشن یا مجموعه  دارد که  محتوی اشیاء  AccessObject  داخل  دیتابیس جاری هستند  در جدول زیر نام کالکشن

و نوع شی ذکر شده  ، کالکشن ALLFORMS محتوی فرم های دیتابیس جاریست فرضا می توانید با پراپرتی های آن تعداد آنها را بدست آورید





ALLFORMS PROPERTIES






بررسی لود بودن فرم : 


Currentproject.AllForms.Item("Form1").isloaded


کالکشن Forms حاوی فرم های باز شده در دیتابیس جاریست و پراپرتی Count برای شمارش آنها.


تعیین تعداد فرم های باز شده
forms.count
تعیین تعداد فرم ها در دیتابیس جاری
currentproject.allforms.count


فیلتر خودکار در اکسل


فیلتر تمام  ردیف هایی که آیتم ثبتی آنها Printer یا Projector باشد.





کپی  ردیف های فیلتر شده به صفحه ی کاری اضافه شده 



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


وقتی شما شماره ای در کالمن B بالای Total (در کالمن A ) قرار بدهید ردیف ایجاد و کرسر به کالمن A روی ردیف ایجادشده خواهد رفت.



(Private Sub Worksheet_Change(ByVal Target As Range
If Target.Column <> 2 Then Exit Sub
If Cells(Target.Row, 2).Offset(1, -1) = "Total" Then
Rows(Target.Row + 1).Insert
Cells(Target.Row + 1, 1).Select
End If
End Sub

شمارش ردیف ها در اکسل




Returns a Range object that represents the cell at the end of the region that contains the source range. Equivalent to pressing END+UP ARROW, END+DOWN ARROW, END+LEFT ARROW, or END+RIGHT ARROW. Read-only Range object.

Syntax

(expression.End (Direction



lngLastRow = Cells(Rows.Count, 1).End(xlUp).Row



کنسل کردن رایت کلیک در اکسل



این رویداد زمانی اتفاق می افتد که در صفحه ی کاری کلیک راست انجام  شود.



Private Sub Worksheet_BeforeRightClick(ByVal Target

(As Range, Cancel As Boolean

اگر در آن رنج بود : 

Cancel=True


تابع تعیین موقعیت رشته داخل رشته ی دیگر Instrrev از آخر


InstrRev(stringcheckstringmatch, [ start

compare ]]


این تابع موقعیت یک String را داخل String دیگر بر می گرداند البته از اول نه آخر فقط از آخر دنبال String مورد نظر شما در String دیگر می گردد؛ اگر Start ( که آپشنال یا انتخابیست و نشاندهنده ی این است که  از کدام کاراکتر شروع کند ) نال باشد ارورمیدهد و اگر خالی رها شود از آخر شروع و اگر مقدار عددی داشته باشد تعداد کاراکتر StringCheck از اول رشته تا آن عدد اعلام شده است.


*****   جستجو از آخرین کاراکتر انجام میشود 


فرض کنید میخواهید موقعیت xy را در Azxyiopxy123 بیابید 


("Instrrev("Azxyiopxy123","xy


تابع بالا عدد ۸ را بر می گرداند ( یعنی از آخر شروع به جستجوی میکند ولی مقدار تابع از اولین کاراکتر است نه از آخر به اول )


مثال های خود اکسس  : 


(InstrRev ("alphabet", "a", 2
Result: 1
درمثال پائین نتیجه یک است چون شما Start
را از 3 اعلام کردید
در نتیجه فقط alp در نظر گرفته میشود و a در آن جستجو میشود
(InstrRev ("alphabet", "a", 3
Result: 1
(InstrRev ("alphabet", "a", 4
Result: 1
(InstrRev ("alphabet", "a", 5
Result: 5
(InstrRev ("alphabet", "a", 6
Result: 5

بازیابی پسورد دیتابیس تا فرمت ۲۰۰۳ امنیت پائین


Offset 2A


 Database Without Password


90 FF 85 9A 31 C5

79 BA ED 30 BC DF

CC 9D 63 D9 E4 C3

9F 46 FB 8A BC 4E

F4 51 EC 37 2F EE

9C FA B4 F4 28 E6

61 1C 8A 60


  Database With Password 1234 ( Low 

(Security 


90 FF 85 9A 31 C5

79 BA ED 30 BC DF

CC 9D 63 D9 E4 C3

9F 46 FB 8A BC 4E

C5 51 DE 37 1C EE

A8 FA B4 F4 28 E6

61 1C 8A 60

الگوریتم XOR


F4 XOR 31=C5

EC XOR 32=DE

2F XOR 33=1C

9C XOR 34=A8


Xor binaryhttp://xor.pw/#






مثال در سیستم دیگر و با تاریخ تولید متفاوت : 




طبق تصویر قبل ؛  از آفست  3E تا 41 برای کد کردن پیج هست و پسورد از آفست 42 ببعد هست  . مربوط به ۲۰۰۷ و ببعد نمی باشد.

خروجی جدول یا کوئری در فرمت txt



بهترین روش این است که در ریبون اکسس و تب اکسترنال باتن اکسپورت را زده و بعد از دایالوگ باکسی که باز میشود مسیر فایل را انتخاب کرد و گزینه Save  Import/Export در آنجا نحوه ی  فاصله گذاری و غیره را می توان تنظیم کرد قبل از ذخیره کردن و با متد DoCmd.RunSavedImportExport میتوان فراخوان کرد .

اکسپورت به اکسل


کپی رکوردست 




AutoFit  : 


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






عملگر منطقی


Between [Start Date] And [End Date] Or ([Start Date] Is 

(Null And [End Date] Is Null


Start و End هر دو نال باشند :

در پارت اول قبل از And 

Null And Null=Null 

در پارت دوم بعد از And 

Start is null=True

End is null=True

گفته شد اگر Null باشد تابع True  ، IsNull  را بر می گرداند پس 

داخل پرانتز میشود    ( True And True ) که طبق عملگر And  نتیجه پارات دوم True می شود 


مرحله آخر نتیجه ی پارت اول یعنی Null و پارت دوم True با توجه به Or بین آنهاست نتیجه طبق جد ول دوم : TRUE 

نتیجه ی آخر که True هست باعث میشود که تمام مقادر اعمال شود در Boolean گفته شد برای False  صفر در نظر می گیریم و برای True هر مقداری غیر از صفر 





شرط ساده در کوئری

جدول titles : 

title _id type price
-------- --------- -----
T01 history 21.99
T02 history 19.95
T06 biography 19.95
T13 history 29.99
T12 biography 12.9
SELECT title_id, type, price
FROM titles
('WHERE (type = 'history
('OR type = 'biography
AND price < 20;

در Sql بالا شرط بدین شکل است تنها  رکوردهائی را نمایش میدهد که فیلد type شان history  یا biography  و قیمت شان هم کوچکتر از 20 باشد  و نتیجه : 

title_id type price
-------- --------- -----
T06 biography 19.95
T02 history 19.95
T12 biography 12.99

فیلتر پیشرفته ( شرط کوئری )


فرض کنید کنترل چک باکسی در فرم ساخته اید به نام Check2 که در فرم اصلی با نام Form3 قرار گرفته میخواهید آن چک باکس را به رکوردسورس فرم وصل کنید به این منظور که هر زمان باتنی با نام فیلتر را فشردید بر حسب تگ آن چک باکس فیلتر در دیتیل  اعمال گردد. 


در تگ چک باکس  مقدار را وارد کنید (  فرض می کنیم میخواهیم فیلد تحصیلات در دیتیل با مقدار چک باکس فیلترشود  پس مقدار تگ را  دیپلم قرار می دهیم )  سپس به دیزاین فرم رفته و در رکورد سورس به کوئری بیلدر می رویم  ( با زدن سه نقطه کنار باکس رکوردسورس) . 


در قسمت Criteria فیلد Education  تایپ میکنیم 

Forms!Form3!Check2.Tag

حتما  در رویداد باتن فیلتر منبع فرم را ریکوئری کنید 

Me.Requery 

زمانیکه فرم باز شود دیتیل فرم طبق مقداری که در  پراپرتی تگ (  Tag ) چک باکس گذاشتید فیلتر میشود و امکان حذف فیلتر را ندارید. (مگر ساخت باتن دیگر و نوشتن Me.FilterOn=False )


اگر بخواهید زمان بازشدن فرم کل رکوردها نمایش داده شود و زمانیکه بر روی باتن فیلتر فشردیدآنوقت فیلترانجام شودباید دریک ستون دیگرفیلدEducation را انتخاب و توتالزرا Where کنید و سپس در کریتریای آن بنویسید 

(iif(Forms!Form3!Check2=True,Forms!Form3!Check2.Tag,False

موردبالا بعد از برداشتن تیک دیتیل را خالی نمایش میدهد که برای اینکار از Is Null آن چک باکس و  false در iff ذکرشده استفاده می کنیم.


فیلتر کردن تاریخ : 

-  دو تکست باکس به نام های Text12 و Text14در فرم دارید و می خواهید رکوردهای بین دو تاریخ درج شده در دو تکست باکس فیلترشود در همان کوئری بیلدر در شرط فیلد تاریخ می نویسید 

Between Forms!Form3!Text12 And 

Forms!Form3!Text14


*** Null معادل هیچ مقداری نیست  جمع مقادیر با Null همان Null میشود پس برای فیلد رکوردی که Null است یا کنترلی که Null است باید صفر در نظرگرفته شود تا جواب جمع Null نشود و ارور دریافت نکنید !!!

اگر یکی از تکست باکس ها یا جفت خالی باشند چه اتفاقی خواهد افتاد به رفتار عملگرها مراجعه کنید )  ؟!!!

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


Between True And Null=Null 

Between Null And True=Null

Between Null And Null=Null


( یکسری از دوستان فقط بلدن کپی کنن !!! در عبارت بالا  فاصله 

رعایت شود )


نکته !!!   اگر در تکست باکسها  الگوی ورودی یا Input Mask استفاده کردید برای تاریخ حتما باید مثل Input Mask فیلد تاریخ باشد یعنی اگر در فیلد تاریخ جدول  از 0 ;0000/00/00  استفادا کردید که اسلش ها هم درنظر گرفته میشود اگر Inpust Mask تکست باکس ها را فقط 0000/00/00 در نظر بگیرید چون مچ نمی شود خالی نمایش میدهد  و یا اگر اینپوت ماسک شما در جدول بصورت 0000/00/00 ( که اسلش ها در نظر گرفته نمی شود ) باشد و در تکست باکس از اینپوت ماسک استفاده نکرده باشید و خودتان تاریخ را با اسلش تایپ کنید باز هم مچ نمیشود چون در جدول فرضا 13980120 ثبت شده ولی شما در تکست باکس 1398/01/20 وارد کرده اید . ( پس خالی بودن دیتیل فرم بدین معنیست که مچ نشده چه تاریخ مورد نظر در مقدار فیلد جدول نباشد یا اینکه الگوی شما با تکست باکس نخواند )


پس اول چک کنید که الگوها یکی باشند !!! بعد از تطبیق دادن اگر شما یکی از تکست باکس ها را خالی رها کنید زمانیکه باتن فیلتر را کلیک می کنید باز هم دیتیل را خالی نمایش می دهد برای اینکه اگر یکی از آنها خالی بود از حالت فیلتر خارج شود کافیست با آن آدرس تکست باکس عبارت Is Null را بکار ببرید  ( بافاصله !!! ). اشتباه نکنید در محیط وی بی تابع  IsNull  وجود دارد.



Between (Forms!Form3!Text12 Or Forms!Form3!Text12 is Null) And

 (Forms!Form3!Text14 Or Forms!Form3!Text14 is Null)


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


Boolean Operation

  • not NULL = NULL

  • NULL or false = NULL

  • NULL or true = true

  • NULL or NULL = NULL

  • NULL and false = false

  • NULL and true = NULL

  • NULL and NULL = NULL




The Microsoft Access IsNull function returns TRUE if the expression is a null value. Otherwise, it returns FALSE.


فرضا در Text12 هیچ مقداری وجود ندارد ( Null )  یعنی  Null است و is Null برابر True ( چون  در اینجا تکست 12 Null است پس True را بر می گرداند ) پس طبق  بالا داریم   


Null Or True=True

AβAND(&amp;&amp;)OR(| |)NOT(exclA)
FALSEFALSEFALSEFALSETRUE
FALSETRUEFALSETRUETRUE
TRUEFALSEFALSETRUEFALSE
TRUETRUETRUETRUEFALSE
حال طبق جدول عملگرهای  منطقی بالا اگر تکست ۱۲ نال باشد مقدار پرانتز اول True هست ( طبق Operation Boolean ) و مقدار پرانتز دوم که True Or False هست هم میشود True و True And True نتیجتا True میشود 

در عملگر And اگر دو مقدار بولین فالز باشد فالز را بر می گرداند ولی اگر جفت ترو باشد ترو را

-داکیومنت برای  مقدار Boolean  :

Type Conversions

When Visual Basic converts numeric data type values to Boolean, 0 becomes False and all other values become True. When Visual Basic converts Boolean values to numeric types, False becomes 0 and True becomes -1.

در مورد Between...And : 

If exprvalue1, or value2 is Null, Between...Andreturns a Null value.



برای شرط تاریخ میتوان با Iif شرطی نوشت که اگر تکست باکس  شروع خالی بودبرای عملگر بزرگتر ( برای تکست باکس شروع ) First یا Min ( بهتر است استفاده شود ) فیلد تاریخ اعمال شود و برای عملگر کوچکتر ( برای  تکست باکس خاتمه ) اگر تکست باکس خاتمه خالی بود Last یا Max فیلد تاریخ ( که بهتر است )  

متدها و پراپرتی های Word


محتویات داخل داکیومنت ( Range )

Documents.Content

برگشت  آبجکت رنج کاراکترهای شروع تا آخر

(Documents.Range(Start,End

Object در داکیومنت اکتیو ورد بسیاره وبه پاگراف ها ، بوک مارک ها و سل ها اعمال میشه و Range استارت و پایانی دارد فرضا اول پاراگراف ۲ تا پایان پاراگراف ۴ 


.(2)ActiveDocument.Range(ActiveDocument.paragraphs

(Range.Start,ActiveDocument.Paragraphs(4).Range.End


  :  Rang.Copy 

ActiveDocument.Paragraphs(1).Range.Copy

اضافه کردن به آخر داکیومنت 
"ActiveDocument.Content.InsertAfter "end of documen
برای اضافه کردن به انتهای پاراگراف باید به رنج ایجاد شده اعمال شود
1-Doc.Paragraphs(1).Range.Start,Doc.Paragraphs(1).Range.End
Set doc = ActiveDocument _ =Set rngRange
_ ,doc.Range(doc.Paragraphs(1).Start
(doc.Paragraphs(1).End - 1 _ rngRange.InsertAfter
" This is now the last sentence in paragraph one."

انتخاب پارگراف بولد کردن فونت
: Range.Select

()Sub SelectParagraph ActiveDocument.Paragraphs(1).Range.Select Selection.Font.Bold = True End Sub


درج تکست Selection.TypeText
درج پارگراف جدید یا بلنک Selecttion.TypeParagrapg



Selection.Collapse Direction:=wdCollapseStart


برای درج تکست در فیلدهائی که در فرم تعبیه کردیم
فرضا برای کپی کردن فیلد رکوردی از جدول یا کوئری اکسس



"ActiveDocument.FormFields("Text1").Result = "Don Funk

باز کردن Word


باز کردن داکیومنت 

از رفرنس تیک Microsoft Word را بزنید و با کالکشن های آن کار کنید 


"Documents.Open FileName:="C:\MyFolder\Sample.doc


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

,expression.Open (FileNameConfirmConversions

 ReadOnlyAddToRecentFiles

PasswordDocumentPasswordTemplate

RevertWritePasswordDocument

WritePasswordTemplateFormat

EncodingVisibleOpenConflictDocument

(OpenAndRepairDocumentDirectionNoEncodingDialog


برای ذخیره ی داکیومنت  ( آرگومان ها آپشنال هستن )

_ , Documents.Save NoPrompt:=True
OriginalFormat:=wdOriginalDocumentFormat

اگر قبلا Save شده باشد با SaveAs

اکسپورت محتویات pdf به رنج اکسل


مراحلی که باید طی شود  


باز کردن pdf در محیط ورد      WordApp.Documents.Open 

کپی کردن محتویات ورد  WordApp.ActiveDocument.Content.Copy

پیست در رنج اکسل     WS.RANG("B4").COPY و WS.PASTESPECIAL