tranthanhan1962 Thành viên đẳng cấp    Bài viết: 2,376 Chủ đề: 86 Tham Gia: 30-10 -14 Điểm danh tiếng: 121 Tiền Access: 63,702.42Ac$ #1 20-04-20, 12:09 AM (Được chỉnh sửa: 20-04-20, 12:15 AM bởi tranthanhan1962.) Đa phần các bạn lập trình access điều kinh qua lập trình excel. Thông thường bắt đầu ở chổ record new macro ở excel để hỗ trợ cho công việc xử lý excel nhanh hơn, tốt hơn. Thế là bắt đầu làm quen với các dòng code của VBA. Một vài người gom khái niệm VB và VBA thành một. Đầu tiên phải nói đến VB (Visual Basic) có trước, nó được Microsoft phát triển từ việc thừa kế ngôn ngữ lập trình Basic. Sau khi Microsoft phát triển các công cụ văn phòng (office) nó được đưa vào các ứng dụng này để hỗ trợ như một công cụ bổ sung. Vì là bộ phận bổ sung tích hợp nên cũng ta thấy một số lệnh của VBA access khác với lệnh VBA của excel, word hoặc powerpoint. Cái này do sự chủ quan của Microsoft + yêu cầu của người dùng. Điển hình là trên table của mdb không thể tạo sum, count, average nhưng đến accdb thì lại cho phép (tuy có hơi tào lao nhưng cũng có nhiều người thích và office dễ bán hơn, Microsoft nghĩ vậy). Trong khuôn khổ bài viết này, tôi không đưa ra hết, tất cả các đối tượng thành phần của VBA vì nó rất nhiều. Bản thân nó là một ngôn ngữ dựa trên tiếng Anh là chủ yếu, nên đa phần hơi từa tựa tiếng Anh, vì vậy bạn nào học tiếng Anh tiếp cận nó rất tốt, ngày xưa tôi là dân Pháp văn nên đụng vào nó thấy khó vô cùng. Sau này, xác định rằng nó là tiếng gì kệ nó miễn là khi viết máy hiểu thì thôi. Trở lại vấn đề học code VB trên Access, như đã nói trên đa phần anh em code VBA excel rồi mới thâm nhập qua access. Chính vì vậy, cái nào đã biết từ excel sẽ được khai thác triệt để còn không tìm thấy lệnh phù hợp là rối liền. Như đã trình bày ở trên, VBA là bộ bận bổ sung cho từng loại công cụ, nên khi nó bổ sung cho access, nó sẽ bổ sung lệnh nào phù hợp, lệnh nào chủ quan Microsoft thấy không cần thiết nó sẽ bỏ. Đó là lý do tại sao trên report có runningsum còn trên form lại không, đó là lý do tại sau trên table của access 2003 không tính được sum, count còn access 2007 trở đi thì làm được chuyên này. Nói lan man quá, xin trở lại với vấn đề kinh nghiệm học VBA trên access. Thực ra học VBA trên access 2003 dễ hơn access 2007 trở đi (mặc dầu ngày xưa rất cưc) vì: F1 hay Help của access 2003 là ofline, nằm ngay trên máy, còn hiện nay bộ phận này nằm trên mạng, để xem được nó nó còn kiểm tra đủ thứ mới cho xem mà có khi có đủ rồi nó trỏ vào trang tào lao, đọc cũng chẳng hiểu được gì. Giờ đi vào nội dung. 1/ Chịu khó đọc hướng dẫn: Đây là cách đọc hướng dẫn trên access 2003, chỉ cần gõ vào Search Help nó sẽ ra ngay, sau đó chỉ cần quét toàn bộ nội dung đưa lên google search là hiểu đế 80-90% vấn đề. Cũng có cách khác là lên mạng tra nhưng chắng bao giờ nhanh bằng cái này. 2/ Chịu khó duyệt danh sách Complete Word VBA hỗ trợ rất tốt danh sách Complete Word (hoàn chỉnh từ), nếu chưa biết lệnh để xử lý chính xác có thể sử dụng danh sách này để thử cho từng mã lệnh, danh sác này liệt kê các phương thức hoặc thuộc tính của các đối tượng, có thể sẽ có một mã lệnh vừa ý. Nắm bắt đầy đủ cấu trúc lệnh của VBA access. Có khi nào chúng ta để ý 2 dòng đầu tiên khi mở giao diện soạn thảo lệnh VBA Option Compare Database Option Explicit Option Compare Database: Tùy chọn So sánh Cơ sở dữ liệu. kết quả này là so sánh chuỗi dựa trên thứ tự sắp xếp được xác định bởi ID ngôn ngữ của cơ sở dữ liệu nơi xảy ra so sánh chuỗi. Không có mệnh đề này khả năng so sánh các ID chuỗi bị hạn chế Option Explicit: Tùy chọn Cơ sở dữ liệu rõ ràng. Đây là vấn đề tường minh trong CSDL, nễiu không có nó CSDL chấp nhận tất cả các biến khi nó chưa được khai báo. Tất nhiên, khi chạy nó sẽ bị lỗi. Khi có mệnh đề này nó sẽ báo lỗi ngay khi biên dịch (combile), để có thể nhanh chóng sửa chữa Hầu như tất cả các mã lệnh VBA của gắn liền với event (sự cố, biến cố): Các thủ tục (Sub) hoặc công thức (Function). Ngoại trừ Function còn được sử dụng như là một công thức trong query, form, report 3/Xây dựng mã VBA trong module: Một đoạn mã code để thực thi một công việc gì đó được xây dựng như sau: a/ Bằng lệnh trực tiếp: Toán tử giữa các biến các function hệ thống hay tự viết : A+B;Sum();msgBox()… b/Các cấu trúc cơ bản: Nếu… thì (If…then); Chọn lựa (Select Case); Vòng lặp (Do…Loop; For…Next) Các cấu trúc này có thể sử dụng một mình hoặc lồng nhau. Tôi chỉ giới thiệu các cấu trúc cơ bản. Thực ra với từng loại cấu trúc cũng có nhiều kiểu khác nhau. Ví dụ: If …Then còn có If …Else If; Do…Loop có Do While, Do Until, While…Wend. Cái này các bạn tự nghiên cứu. c/ Một chuyên quan trọng khác là khi làm việc với các biến, hằng phải khai báo rõ ràng kiểu dữ liệu. Các biến, hằng cục bộ nằm trong module của đối tượng (form, report). Các biến hằng toàn cục nằm trong module toàn cục. Nếu nắm bắt được vấn đề chung này việc code VBA sẽ không còn là mối e ngại khi làm việc với VBA access Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ Website Find Xuân Thanh Lang Thang Miền Đất Lạ...     Bài viết: 1,768 Chủ đề: 92 Tham Gia: 25-03 -12 Điểm danh tiếng: 79 Tiền Access: 28,156.60Ac$ #2 20-04-20, 01:39 AM Đang có thời gian rảnh, viết tiếp đi Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp Trăm năm sau biết gặp được không? Cuộc đời sắc sắc không không Thì thôi ta cứ hết lòng vì nhau ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ Website Find tranthanhan1962 Thành viên đẳng cấp    Bài viết: 2,376 Chủ đề: 86 Tham Gia: 30-10 -14 Điểm danh tiếng: 121 Tiền Access: 63,702.42Ac$ #3 20-04-20, 07:21 AM Hì hì! Cùng nhau khai thác. Các bác hỗ trợ tí Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ Website Find Xuân Thanh Lang Thang Miền Đất Lạ...     Bài viết: 1,768 Chủ đề: 92 Tham Gia: 25-03 -12 Điểm danh tiếng: 79 Tiền Access: 28,156.60Ac$ #4 20-04-20, 08:03 AM (Được chỉnh sửa: 20-04-20, 08:07 AM bởi Xuân Thanh.) Với tôi thì chẳng biết tiếng Anh tiếng U gì ráo trọi á. Mặt chữ còn chưa thuộc nữa kìa Nhưng bù lại được cái ham học. Thấy cái gì "lạ" là phải "mò" cho bằng được. Còn nhớ ngày xưa ngày thì đi làm, tối về ôm cuốn sách của Ông Văn Thông đọc ngấu nghiến. Hồi đó làm gì biết VBA là cái chi chi. Toàn làm bằng Query không hà. Mấy nút bấm CommandButton một là dùng Wizard, hai là Macro chứ nói đến Sub với Function thì tịt ngắc. May nhờ có mấy cuốn sách này mà biết được thế nào là hàm, thế nào là hằng với biến...Có thời gian thức thâu đêm tới sáng mất hơn một tháng tay ôm cuốn sách, tay gõ bàn phím cũng làm được một cái nho nhỏ theo sách. Hồi đó đâu biết VBA, cứ đọc theo sách rồi làm theo. Thấy chỗ nào khó hiểu là phải tìm bằng ra tại sao lại viết như thế này mà không viết theo thế kia. Được một thời gian có cuốn sách của Ông giải thích rất cặn kẽ và chi tiết một số hàm trong sách(tất nhiên là không phải là toàn bộ). Từ đó dần dần vỡ lẽ ra nhiều điều. Rồi tập viết hàm theo suy nghĩ của mình. Lúc đầu nó lỗi tùm lum hết may là nhờ mấy dòng tô vàng của Access nên dần dần cũng hiểu đươc vấn đề. Từ đó ham viết hàm lắm. Tự nghĩ ra điều kiện để viết. Từ từ rồi nối cháo nó cũng nhừ. Vậy đó. Lúc đầu còn bỡ ngõ, khó khăn nhưng học riết rồi cũng làm được. Bây giờ ngồi đọc hàm người ta viết là biết rồi học theo. Nói thật không có gì bằng sách. Bây giờ Internet phát triển mạnh lại càng có nhiều điều kiện để học. Cái khó nhất khi viết VBA là phải định hình được giải thuật của nó. Giải thuật là mấu chốt cơ bản để giải quyết bài toán. Giải thuật chính là cái xương sống của bài toán. Giải thuật chính là hướng đi. Tìm được hướng đi tối ưu nhất thì bài toán được giải quyết nhanh gọn. Cũng giống như ta đi từ điểm A tới điểm B vậy. Tìm được đường đi ngắn nhất mà không gặp trở ngại gì trên đường đi thì đó chính là VBA Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp Trăm năm sau biết gặp được không? Cuộc đời sắc sắc không không Thì thôi ta cứ hết lòng vì nhau ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ Website Find tranthanhan1962 Thành viên đẳng cấp    Bài viết: 2,376 Chủ đề: 86 Tham Gia: 30-10 -14 Điểm danh tiếng: 121 Tiền Access: 63,702.42Ac$ #5 20-04-20, 02:27 PM (Được chỉnh sửa: 20-04-20, 02:28 PM bởi tranthanhan1962.) Theo lời dề nghị của bác Xuân Thanh. Mình sẽ đào sâu hơn các vấn đề chung trong việc tiếp cận lận trình VBA nhằm hệ thống hoá một cách tương đối về nó. Mong các bạn bổ sung thêm. Trước tiên ta sẽ đi vào phần Cấu trúc. Ngoài các lệnh trực tiếp phần cấu trúc sẽ hỗ trợ nhiều trong việc xử lý, chọn lựa, đặt các điều kiện cho các lệnh. 1/Cấu trúc Nếu ...Thì: a/Kiểu 1: If <điều kiện> Then <lệnh>. Đây là cách xử lý cấu trúc này đơn giản nhất và nó được viết trên một dòng: If tôi rảnh Then tôi sẽ đi chơi If A>0 Then B=A+5 b/Kiểu 2: Trong trường hợp nhiêu điều kiện đúng thực hiện nhiều lệnh thì không được đưa các lệnh chung một dòng phía sau từ khoá Then mà phải đưa nó xuống thành nhiều dòng giữa các tứ khoá: If tôi rảnh Then Tôi sẽ đi chợ Tôi sẽ mua cá Tôi sẽ mua rau End If If A>50 Then B=A+6 D=B*2 E=A/2 End If Chú ý, máy tính khống như chúng ta, mỗi lệnh phải được viết trên một dòng chứ không thể gom chung tôi sẽ đi chợ, mua cá, mua rau như cách nói của chúng ta. Ngược lại nếu có nhiều điều kiện thì tất cả các điều kiện phải được viết thành một dòng chứ không được tách ra như các lệnh. If tôi rảnh và trời không mưa Then tôi sẽ đi chợ If A>0 And B>5 Then C=A+B Khi có nhiều điều kiện phải xử lý các điều kiện thành một biểu thức rồi đưa biểu thức đó thành điều kiện. Vì vậy khi chỉ có một lệnh cho điều kiện đúng chúng ta chỉ cầm xử lý nó thành một dòng chứ không cần phải đưa nó vào giữa cập từ khoá: If...Then ... End If Thay vì viết If Nhap.Value = True Then ThanhTien.Value = SoLuong.Value * DonGia.Value End If Ta chỉ cần viết: If Nhap.Value = True Then ThanhTien.Value = SoLuong.Value * DonGia.Value Trường hợp cùng điều kiện khi có lệnh cho cách xử lý cả 2 trường hợp đúng và sai ta ta dùng thêm từ khoá Else Ví dụ: If Nhap.Value = True Then ThanhTien.Value = SoLuong.Value * DonGia.Value If Xuat.Value = True Then ThanhTien.Value = -SoLuong.Value * DonGia.Value => Vì Xuat.Value = True cũng có nghĩa nhap.Value = False => If Nhap.Value = True Then ThanhTien.Value = SoLuong.Value * DonGia.Value If Nhap.Value = False Then ThanhTien.Value = -SoLuong.Value * DonGia.Value => If Nhap.Value = True Then ThanhTien.Value = SoLuong.Value * DonGia.Value Else ThanhTien.Value = -SoLuong.Value * DonGia.Value End If Khi nhiều có trường hợp + nhiều lệnh và khó thể đưa các trường hợp vào một biểu thức thì ta lồng các cấu trúc If ... End If vào nhau If <điều kiện> Then <Lệnh> Else If <điều kiện> Then <Lệnh> End If End If Nếu các điều kiện có cùng chung đối tượng, ta có thể chuyển sang cấu trúc chọn lựa: Select Case Case... <Lệnh> ... Case... <Lệnh> ... End Select Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ Website Find mrsiro Cao Thủ Access    Bài viết: 271 Chủ đề: 44 Tham Gia: 05-12 -14 Điểm danh tiếng: 0 Tiền Access: 6,636.87Ac$ #6 20-04-20, 09:32 PM Câu lệnh có cấu trúc sau: Mã:If tôi có tiền then If msgbox("bạn có chắc muốn mua",vbYesNo) = vbYes then tôi mua End if Else tôi mua End if Có cách nào rút ngắn cú pháp của code trên không, bởi vì "tôi mua" xuất hiện 2 lần, mính muốn rút ngắn lại. Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14. Website Find tranthanhan1962 Thành viên đẳng cấp    Bài viết: 2,376 Chủ đề: 86 Tham Gia: 30-10 -14 Điểm danh tiếng: 121 Tiền Access: 63,702.42Ac$ #7 20-04-20, 09:36 PM (20-04-20, 09:32 PM)mrsiro Đã viết: Câu lệnh có cấu trúc sau: Mã:If tôi có tiền then If msgbox("bạn có chắc muốn mua",vbYesNo) = vbYes then tôi mua End if Else tôi mua End if Có cách nào rút ngắn cú pháp của code trên không, bởi vì "tôi mua" xuất hiện 2 lần, mính muốn rút ngắn lại. Câu trả lời là Mã:If tôi có tiền then tôi mua Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ Website Find Xuân Thanh Lang Thang Miền Đất Lạ...     Bài viết: 1,768 Chủ đề: 92 Tham Gia: 25-03 -12 Điểm danh tiếng: 79 Tiền Access: 28,156.60Ac$ #8 20-04-20, 09:39 PM (Được chỉnh sửa: 20-04-20, 09:50 PM bởi Xuân Thanh.) If tôi có tiền Then tôi mua Khổi mất công hỏi chị cho dài dòng văn tự vì đằng nào tôi cũng mua Èo. Post xong mới thấy bài của tranthanhan1962 Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp Trăm năm sau biết gặp được không? Cuộc đời sắc sắc không không Thì thôi ta cứ hết lòng vì nhau ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ Website Find tranthanhan1962 Thành viên đẳng cấp    Bài viết: 2,376 Chủ đề: 86 Tham Gia: 30-10 -14 Điểm danh tiếng: 121 Tiền Access: 63,702.42Ac$ #9 20-04-20, 09:52 PM (Được chỉnh sửa: 20-04-20, 09:57 PM bởi tranthanhan1962.) (20-04-20, 09:39 PM)Xuân Thanh Đã viết: If tôi có tiền Then tôi mua Khổi mất công hỏi chị cho dài dòng văn tự vì đằng nào tôi cũng mua Èo. Post xong mới thấy bài của tranthanhan1962 Đây là vấn đề quan trọng trong code. Làm sao cho máy hiểu công việc của mình một cách ngắn nhất. Viết code là làm toán chứ không phải làm thơ Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ Website Find mrsiro Cao Thủ Access    Bài viết: 271 Chủ đề: 44 Tham Gia: 05-12 -14 Điểm danh tiếng: 0 Tiền Access: 6,636.87Ac$ #10 20-04-20, 10:18 PM (Được chỉnh sửa: 20-04-20, 10:26 PM bởi mrsiro.) Nếu tôi có tiền thì không chắc chắn là tôi sẽ mua, nếu tôi đồng ý tôi mới mua: If tôi có tiền then If msgbox("bạn có chắc muốn mua",vbYesNo) = vbYes then tôi mua End if Vế sau: Else tôi mua End if Có thể có nhiều tiền hoặc ít tiền, lúc này tôi chắc chắn mua khỏi hỏi. Nếu số lương 1 lớn hơn số lượng 2 thì ấn đồng ý mới lưu. Nếu số lượng 1 bẳng số lượng 2, hoặc số lương 1 nhỏ hơn số lượng 2 thì lưu luôn khỏi hỏi: Mã:If txtSoluong1.value > txtSoluong2.value then If msgbox("bạn có chắc muốn lưu",vbYesNo) = vbYes then Lưu End if Else Lưu End if Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14. Website Find |