Mở lớp học Lập trình VBA trong Excel CƠ BẢN - Hà Nội, khai giảng 17h30, 28/05/2017

Liên hệ QC
Là tôi nói tiêu đề đâu có khớp với cái "để xem đầy đủ khóa học...". Tiêu đề nói về lọc dữ liệu, cuối bài thì lại nói về khóa học nên mới bảo là không khớp. Lọc là lọc mà học là học hoặc là cả hai thì đưa luôn vào tiêu đề bài viết.
Có lẽ là bạn cần cân nhắc kỹ trước khi viết đầu b ài
Chào bạn,
Tiêu đề là "Lọc dữ liệu theo yêu cầu trong Excel", mà học viên học "Lập trình VBA trong Excel cơ bản" đang học buổi 3 họ đã có yêu cầu cụ thể như thế. Mục đích mình chia sẽ bài viết là để các bạn hiểu được, với những kiến thức VBA cơ bản trong khóa học giúp các bạn có thể giải quyết những bài toán thực tế trong công ty. Nhưng bài toán cơ bản mà có thể họ tự làm cả tháng trời vẫn chưa hoàn thành, nhưng khi học qua khóa học thì họ có thể hoàn thành sớm hơn thực tế rất nhiều lần.
Bạn nên đọc và hiểu kỹ vấn đề mình cần truyền đạt nhé.
Cảm ơn bạn!
 
Hàm đếm số ô trống trong một vùng bất kỳ

[FONT=&amp]Trong excel, để kiểm tra 1 ô trống ta có thể dùng hàm IS BLANK, để đếm 1 vùng có bao nhiêu ô trống có hàm COUNTBLANK, nhưng hàm đếm ô trống này sẽ đếm bao gồm cả những ô chỉ có 1 dấu nháy đơn. Khi dùng hàm ISBLANK để kiểm tra ô có giá trị là 1 giấu nháy đơn thì kết quả trả về là FALSE, chứng tỏ ô đấy không phải ô trống mà hàm COUNTBLANK lại đếm vào. Vậy hôm nay mình sẽ hướng dẫn các bạn viết 1 hàm đểm những giá trị là trống.
Giả sử ta có bài toán đơn giản như sau:
-> Đếm số ô trống trong 1 vùng dữ liệu bất kỳ.
Trong bài toán này, vùng dữ liệu bất kỳ là B4:E9, trong vùng dữ liệu có ô D7 chứa giá trị là dấu nháy đơn (không phải trống). Khi đó kết quả trả về phải là 11.
[/FONT]


[FONT=&amp]
demotrongdebai1.jpg



[/FONT]​
Để tạo ra một hàm tính tổng điểm theo những điều kiện trên, các bạn làm theo các bước sau:
Bước 1: Các bạn vào môi trường lập trình của Excel (phím tắt ALT+F11), tạo một module và copy code dưới đây vào trong module đó:
[GPECODE=vb]Option Explicit
Function DemOTrong(rng As Range) As Long
Dim i As Long ' Dem so ô cua vung
Dim j As Long ' Dem so o có du lieu trong vung
' Dem so ô cua vung
i = rng.Cells.Count
' Dem so o có du lieu trong vung
j = WorksheetFunction.CountA(rng)
'Tong so o trông
DemOTrong = i - j
End Function
[/GPECODE]
[FONT=&amp]
demotrongcode.jpg



[/FONT]​
Bước 2: Tại ô B2, chúng ta sẽ dùng hàm COUNTBLANK để đếm những ô có giá trị trống (hàm Excel thuần túy) B2=COUNTBLANK(B4:E9).

[FONT=&amp]
demotrongcountblank1.jpg
[/FONT]​

Bước 3: Tiếp tục dùng hàm DemOTrong mà chúng ta đã viết để so sánh kết quả, B3=DemOTrong(B4:E9). Các bạn chú ý kỹ kết quả của 2 hàm là COUNTBLANK và DemOTrong mà chúng ta tự viết, có 2 kết quả khác nhau. Nguyên nhân là mình đã giải thích ở đầu bài viết, nhưng ở đây mình xin được giải thích lại như sau: Hàm COUNTBLANK
sẽ đếm tất cả giá trị kể cả giá trị nháy đơn trong ô, mà khi dùng hàm ISBLANK để kiểm tra ô có giá trị nháy đơn vẫn trả về là FALSE (không phải ô trống, các bạn có thể kiểm tra thực tế trên 1 file excl bất kỳ). Còn hàm DemOTrong chỉ đếm những giá trị là trống, không đếm những ô có dấu nháy đơn.

[FONT=&amp]
demotrongketqua1.jpg



[/FONT]​
Các bạn vào đây download file ví dụ: Download
Để tìm hiểu thêm nhiều kiến thức về VBA cơ bản, các bạn tham khảo thêm tại khóa đào tạo VBA cơ bản của công ty. Link khóa học.

 

Trong việc lập trình, có những bài toán đơn giản ta có thể viết hàm hay thủ tục một cách dễ dàng, nhưng có những bài toán phức tạp mà kết quả của một hàm chúng ta cần phải kiểm tra kỹ lưỡng tiến trình nhận kết quả của chúng, và đôi khi xảy ra lỗi chúng ta cũng cần phải tìm lỗi do đâu... Để tìm lỗi và kiểm soát tiến trình VBA chạy các lệnh chúng ta cần sử dụng kỹ thuật Debug trong VBA và Excel. Tổng thể các bước làm trong môi trường VBA như sau :
1. Đặt con trỏ tại dòng lệnh muốn chặn lại để kiểm tra
2. Vào menu Debug, chọn mục "Toggle Breakpoint - F9"
3. Chạy lệnh: hàm hoặc thủ tục
4. Sau khi thực hiện bước 3. dòng lệnh sẽ được dừng lại ở nơi đặt Breakpoint.
5. Kết hợp với các cửa sổ Locals Window, Immediate để kiểm tra giá trị trong các biến, thuộc tính và biểu thức.
Video cách làm:


[video=youtube;8y7n1-V1NKk]https://www.youtube.com/watch?v=8y7n1-V1NKk[/video]​
 
Xóa, chèn dòng tự động giữa hai sheet

[FONT=&amp]Giả sử có bài toán như sau: Trong Sheet 1 có một vùng dữ liệu, Sheet 2 cũng có một vùng dữ liệu tương ứng. Yêu cầu bài toán là khi xóa một dòng bất kỳ ở Sheet 1 thì Sheet2 tự động xóa dòng tại vị trí đó. Tương tự với việc chèn dòng, khi Sheet 1 chèn một dòng bất kỳ thì Sheet 2 cũng sẽ chèn một dòng tương ứng với vị trí dòng dòng ở Sheet 1.
Giả sử có một vùng dữ liệu ở sheet 1 như sau:

vbaxoachendongdebai11.jpg


Tương tự với Sheet2 ta cũng có vùng dữ liệu tương ứng.

vbaxoachendongdebai21.jpg


Để giải quyết bài toán trên, các bạn làm theo các bước sau:
Bước 1: Copy code dưới đây vào module (vào môi trường lập trình (ALT+F11) chọn Insert-> Module để tạo mới Module và pate code dưới đây vào trong Module)
[GPECODE=vb]
Option Explicit
Sub XoaChenDong()
Dim lRow As Long
Dim IQuestion As String
IQuestion = MsgBox("Ban muon INSERT hay DELETE dong, Yes/No (Insert/delete).", vbYesNoCancel, "Thông báo")
Sheets("Sheet1").Select
'Luu vi tri dong can xoa vao bien lRow
lRow = ActiveCell.Row
Rows(lRow & ":" & lRow).Select
IQuestion = UCase(IQuestion)
If IQuestion = vbYes Then
Selection.insert
Sheets("Sheet2").Select
Rows(lRow & ":" & lRow).Select
Selection.insert
GoTo exitsub
ElseIf IQuestion = vbNo Then
Selection.delete
Sheets("Sheet2").Select
Rows(lRow & ":" & lRow).Select
Selection.delete
GoTo exitsub
Else
GoTo exitsub
End If
exitsub:
Sheets("Sheet1").Select
End Sub
[/GPECODE]
vbaxoachendong12.jpg

Bước 2:
Các bạn vào mỗi trường bảng tính, Insert một nút bấm để gán macro. Vào menu Developer -> Insert -> Button.

vbaxoachendong21.jpg


Sau đó các bạn đặt chuột vào một vị trí, kéo mộ vùng vừa đủ cho nút bấm, rồi gán Macro vừa tạo (XoaChenDong) vào nút bấm.

vbaxoachendong3.jpg


Bước 3: Sau khi hoàn thành việc gán Macro, các bạn đặt chuột vào 1 ví trí thuộc dòng bất kỳ cần chèn thêm dòng ở (mình đặt vào ô A6) tại dòng có mã hàng là HH003. Sau đó các bạn click vào nút Run -> khi đó sẽ hiển thị thông báo: "Bạn muon INSERT/DELETE dòng (I/D)". Các bạn gõ "I" (không phân biệt chữ viết hoa hay viết thường), sau đó chọn vào OK để nhận kết quả.

vbaxoachendong42.jpg


Sau khi click vào OK, trước dòng thứ 6 chứa mã hàng mã hàng HH003 sẽ chèn thêm một dòng.

vbaxoachendong51.jpg


Tương tự trước dòng thứ 6 chứa mã hàng HH004 ở sheet 2 cũng được chèn thêm một dòng ( do bảng dữ liệu ở sheet1 bắt đầu từ dòng 4, ở sheet2 bắt đầu từ dòng 3 nên khi chèn/xóa sẽ bị lệch 1 dòng).

vbaxoachendong61.jpg


Bước 4: Tương tự với bước 3, để xóa một dòng bất kỳ, ta cũng đặt chuột vào dòng đó, sao đó click chuột trái vào nút Run, để xóa dòng, tại hộp thoại thông báo, các bạn gõ chữ "D" sau đó click vào OK để nhận kết quả.

vbaxoachendong72.jpg


Sau khi click vào OK, tại sheet 1 sẽ xóa đi dòng thứ 8, dòng chứa mã hàng HH004.

vbaxoachendong81.jpg


Tương tự ở Sheet2, dòng sẽ bị xóa đi là dòng thứ 8, dòng chứa mã hàng HH004.

vbaxoachendong91.jpg


Các bạn vào đây download file ví dụ: Download

Để tìm hiểu VBA trong Excel là gì, tại sao làm Excel cần học, các bạn tham khảo khóa đào tạo VBA trong Excel cơ bản tại Bluesofts.net.



[/FONT]
 
Trong khóa học, các bạn sẽ được tìm hiểu các cấu trúc lệnh rẽ nhánh:
Minh xin giới thiệu cấu trúc 1 và ví dụ kèm theo mà trong khóa học các bạn sẽ được học: IF..END IF
[gpecode=vb]
If condition Then
block1
End If
[/gpecode]
Ví dụ 1:
Hiển thị hộp thoại để nhập mật khẩu, giá trị nhập vào được lưu vào biến MatKhau. So sánh, nếu mật khẩu khác
“bluesofts” thì lưu và đóng tập tin đang chạy.



Các bạn copy code này theo các bước ở các bài trước mình có hướng dẫn chi tiết. Các bạn chỉ cần copy vào một module và nhấn F5 để chạy code , nhận kết quả:
Code:
[GPECODE=vb]
Sub MatKhau()
Dim MatKhau As String
MatKhau = InputBox("Hay nhap mat khau:", "Dang nhap")
If Not MatKhau = "bluesofts" Then
'Neu mat khau <> "bluesofts" thi luu va thoat
ThisWorkbook.Close True]
Exit Sub 'Thoat khoi thu tuc hoac ham
End If
'Lam tiep
End Sub[/GPECODE]
Để tìm hiểu thêm nhiều kiến thức bổ ích, các bạn tham khảo tại khóa học: http://bluesofts.net/daotaothuchanh/daotaovbacoban.html
 
Kiểm tra, phát hiện sai xót trường số trong Excel

[video=youtube;hUvcLVtS8Nw]https://www.youtube.com/watch?v=hUvcLVtS8Nw[/video]

Trong nhiều trường hợp khi thao tác trên bàn phím, vô tình người dùng nhập trường số thành trường text như thêm dấu nháy đơn đằng trước, trường ngày gõ sai định dạng. Ví dụ: Định dạng mặc định trong máy tính đang là mm/dd/yyyy, nhưng người dùng lại gõ 31/12/2016 thì sẽ là sai. Hậu quả để lại tính toán sai, số liệu sai và báo cáo sai nếu không phát hiện raNgoài ra, trường hợp khó phát hiện hơn là sử dụng hàm để lấy ra giá trị nhưng lại lấy ra là Text. Ví dụ: ô A1 là HH-0K1, ta sử dụng hàm Right tại ô B1 để lấy ra số 1. Hàm Right(A1,1)=1 nhưng số 1 ở đây lại là Text chứ không phải là sốCách xử lý:Cách 1: Dùng Conditional FormattingBôi đen vùng cần kiểm tra rồi chọn Conditional Formatting àNew Rule àUse a formula to determine which cells to format. Phần Format values where this formula is true gõ công thức =istext(…). Xem video thao tác hướng dẫn.Cách 2: Dùng VBAĐoạn Macro sau đây sẽ giúp bạn trỏ con chuột đến từng ô có định dạng đang là Text để bạn sửa đến khi hoàn thành
VBA_CO_BAN_NOT_IS_NUMBERIC.png

Đăng ký học VBA trong Excel để tối ưu và hỗ trợ đắc lực hơn cho công việc. Đăng ký
Tại Đây

 
Bài viết này mình sẽ hướng dẫn các bạn tạo code để lọc toàn bộ dữ liệu là phiếu nhập từ sheet dữ liệu sang sheet phiếu nhập chỉ bằng Click chuột.Giả sử ta có một bảng dữ liệu nguồn như hình dưới đây, trong bảng dữ liệu ở cột A là ký hiệu phiếu nhập (PN) và phiếu xuất (PX). Yêu cầu bài toán là lọc ra toàn bộ dữ liệu từ sheet "DATA" là phiếu nhập vào sheet "Phieu Nhap" (Trích tài liệu học lập trình VBA trong Excel cơ bản tại Bluesofts).

VBALocPhieuNhap1.jpg


Trong sheet "Phieu Nhap", thứ tự các cột giống với sheet data, mục đích chính là lọc toàn bộ dữ liệu với điều kiện "ký hiệu" là "PN" sang bên sheet "Phieu Nhap".

VBALocPhieuNhap2.jpg


Để giải bài toán trên, các bạn làm theo các bước sau:Bước 1: Các bạn vào môi trường lập trình của Excel (phím tắt ALT+F11), tạo một module và nhập lại code dưới đây vào trong module đấy:

Bước 2: Tạo nút bấm: Sau khi các bạn copy xong code, các bạn trở về môi trường bảng tính, các bạn vào menu Developer -> Insert -> vào Button (tạo nút bấm). Sau đó ra ngoài bảng tính, các bạn giữ chuột trái và kéo một vùng vừa đủ cho nút bấm. Rồi sau đó bạn gán macro LocPhieuNhap vào nút bấm (chuột phải vào nút bấm, chọn vào Assige Macro), các bạn đổi tên nút bấm theo yêu cầu (RUN).

VBALocPhieuNhap6.jpg


Bước 3: Bạn click chuột ra ngoài nút bấm rồi lại click chuột trái lại lên nút bấm, sau đó các bạn mở Sheet PhieuNhap để xem kết quả.

VBALocPhieuNhap7.jpg


Các bạn vào đây tải file ví dụ: DOWNLOAD
Để tìm hiểu VBA trong Excel là gì, tại sao những người làm Excel cần học VBA, các bạn tìm hiểu tại khóa Đào tạo VBA trong Excel cơ bản tại Bluesofts.net.
 
Hướng dẫn tạo hàm tách Email trong chuỗi

Theo nhu cầu thực tế của các công ty, việc tìm kiếm và lập danh sách khách hàng là không thể thiếu. Trong danh sách khách hàng, quan trọng nhất là địa chỉ email của khách hàng. Việc tổng hợp email lại đang là vấn đề vất vả nhất, có nhiều người ngồi copy từng email trong một chuỗi bao gồm các thông tin khác của khách hàng. Việc làm này sẽ mất rất nhiều thời gian và công sức, làm giảm hiệu quả công việc. Vậy mình viết bài này nhằm hướng dẫn các bạn viết một hàm tách địa chỉ Email, khi có một danh sách khách hàng bao gồm email và thông tin khách hàng, các bạn chỉ việc gõ hàm =TachEmail(chuỗi) và nhấn Enter, rồi copy cho các ô còn lại, hàm sẽ tự động tách riêng danh sách Email cho các bạn.
Bước 1: Giả sử chúng ta có 1 danh sách khách hàng vào gồm Email, sdt, tên công ty,... ở cột A, mục đích của bài toán là tạo ra một hàm, khi chúng ta dùng hàm thì sẽ lọc ra danh sách Email ở cột bên cạnh. Các bạn thiết kế một mẫu dữ liệu tương tự như cơ sở dữ liệu trong dưới đây:

loc_email.jpg

Bước 2:
Sau khi thiết kế xong cơ sở dữ liệu, các bạn vào môi trường lập trình (Alt + F11 để vào môi trường lập trình), các bạn chọn tới menu Insert -> module để tạo mới một module. Sau đó các bạn copy code dưới đây vào trong module vừa tạo:

[GPECODE=vb]'...CODE....
Option Explicit
Function TachEmail(ByVal Chuoi As String) As Variant
Dim s As String, Email As String 'khao bao 2 chuoi s,email
Dim p1&, p2& ' khai bao 2 bien kieu long p1,p2
s = " " & Chuoi & " " 'gan s= chuoi, minh ghep them 2 dau cach de khi chuoi chi co email
Email = InStr(1, s, "@") ' tim vi tri cua "@" trong email
If Email > 0 Then ' xet dieu kien co ton tai email k?
p1 = InStr(Email, s, " ") 'tim vi tri cach trong lien truoc email
p2 = InStrRev(s, " ", Email) 'tim vi tri cach trong lien sau email
TachEmail = Mid(Chuoi, p2, p1 - p2) 'dung ham MID de lay ra email
Else
TachEmail = CVErr(xlErrNA) ' neu khong co email thi bao #N/A
End If
End Function
'... END CODE....[/GPECODE]

code_tach_email.jpg

Bước 3:
Sau khi hoàn thành việc copy code, các bạn vào môi trường bảng tính và tiến hành gõ hàm như sau:

chon_ham_email.jpg

Bước 4:
Các bạn đưa và đối số duy nhất của hàm là một chuỗi, các bạn gán như sau:

nhan_chuoi_email.jpg

Bước 5:
Khi nhận xong chuỗi, các bạn copy cho các dòng dữ liệu còn lại để nhận kết quả:

ket_qua_tach_email.jpg

Để tìm hiểu thêm kiến thức và có thể viết thêm nhiều hàm cần thiết, các bạn tìm hiểu thêm tại khóa đào tạo VBA trong excel cơ bản của công ty.
Link khóa học
Các bạn vào đây để tải file ví dụ:
Dowloand
 
Điền dữ liệu vào 2 cột tự động theo ý bằng VBA

Dim i As Long[FONT=&amp]Giải bài toán theo yêu cầu như sau:
Yêu cầu bài toán: Điền giá trị từ A1:A10 là 1:100, tương ứng mỗi giá trị tại cột A điền tiếp giá trị tại cột B từ B1:B100 nếu là:
- Dòng chẵn điền "Bluesofts.net"
- Dòng lẻ điền "Excelnangcao.com"
Để giải bài toán trên, các bạn làm theo các bước sau:

Bước 1: Các bạn tạo mới một module và copy code ở dưới đây vào.
[/FONT]
[GPECODE=vb]Sub VongLapFor()
Dim i As Long
For i = 1 To 100
Cells(i, 1).Value = i
If i Mod 2 = 1 Then
Cells(i, 2).Value = "Excelnangcao.com"
Else
Cells(i, 2).Value = "Bluesofts.net"
End If
Next i
End Sub[/GPECODE]
vbaVongLap1.jpg

Bước 2: Tại môi trường bảng tính, bạn tạo một nút bấm (hoặc Shap) để gán và chạy macro.

vbaVongLap0.jpg

Bước 3:
Click chuột trái vào nút bấm để chạy macro và nhận kết quả.

vbaVongLap2.jpg

Các bạn vào đây download file ví dụ: Download
Để tìm hiểu VBA trong Excel là gì, tại sao những người làm Excel cần học VBA, các bạn tìm hiểu tại khóa Đào tạo VBA trong Excel cơ bản tại Bluesofts.net.

 
Protect/UnProtect Sheet bằng câu lệnh VBA

Trong bài viết này mình sẽ hướng dẫn các bạn cách tạo thủ tục Protect/Unprotect Sheet để gán vào nút bấm trên bảng tính. Khi đó các bạn chỉ cần click chuột vào nút bấm, mà hình sẽ hiển thị thông báo "Ban muon Protect/Unprotect Sheet (YES/NO)", nếu các bạn chọn vào YES thì sẽ tự Protect Sheet, chọn No sẽ Unprotect Sheet. Để làm được như vậy, các bạn làm theo các bước sau:
Bước 1: Các bạn vào môi trường lập trình, các bạn tạo 1 module và copy code dưới đây vào trong module.
[GPECODE=vb]
Option Explicit
Sub Protect_UnProtectSheet()
Dim sh As Worksheet
Dim answer As Variant
Set sh = ThisWorkbook.Sheets("Sheet1")
answer = MsgBox("Ban muon Protect/Unprotect Sheet (YES/NO)", vbYesNo)
If answer = vbYes Then
sh.Protect 123 '123 la pass de protect
Else
sh.Unprotect 123
End If
End Sub[/GPECODE]

Bước 2:
Sau khi hoàn thành việc copy code vào trong module, các bạn trở về môi trường bảng tính, sau đó tạo một nút bấm rồi gán macro "Protect_UnProtectSheet" vào nút bấm.


protectsheet2.jpg


Bước 3:
Các bạn click chuột vào nút bấm sẽ hiển thị thông báo "Ban muon Protect/Unprotect Sheet (YES/NO)", nếu các bạn chọn vào YES thì Sheet1 sẽ tự Protect với mật khẩu là 123.


protectsheet3.jpg


Kết quả sau khi bạn chọn YES.


protectsheet4.jpg


Bước 4:
Để UnProtect Sheet các ban lại click chuột vào nút bấm sẽ hiển thị thông báo như ở bước 3, sau đó click vào NO thì sẽ tự động "Unprotect Sheet".


protectsheet5.jpg


Sau khi click vào NO sẽ có kết quả như sau:


protectsheet2.jpg


Các bạn vào đây tải file ví dụ: DOWNLOAD

Để tìm hiểu VBA trong Excel là gì, tại sao những người làm Excel cần học VBA, các bạn tìm hiểu tại khóa Đào tạo VBA trong Excel cơ bản tại Bluesofts.net.
 
Mình xin chia sẻ một phần mềm được thiết trên Excel và VBA, menu lệnh, userform, task pane, chữ chạy, treeview, listview unicode, ứng dụng chạy như phần mềm chuyên nghiệp của thầy Nguyễn Duy Tuân để các bạn tham khảo. (Mã nguồn của chương trình này được cấp cho các học viên học tại Bluesofts)
Các bạn đăng ký tham gia khóa học VBA trong Excel cơ bản tại đây:
Đăng ký học

[video=youtube;QLgponKYnLM]https://www.youtube.com/watch?v=QLgponKYnLM&amp;feature=youtu.be[/video]


 
Kiểm tra, phát hiện sai xót trường số trong Excel

[video=youtube;hUvcLVtS8Nw]https://www.youtube.com/watch?v=hUvcLVtS8Nw[/video]

Trong nhiều trường hợp khi thao tác trên bàn phím, vô tình người dùng nhập trường số thành trường text như thêm dấu nháy đơn đằng trước, trường ngày gõ sai định dạng.
Ví dụ: Định dạng mặc định trong máy tính đang là mm/dd/yyyy, nhưng người dùng lại gõ 31/12/2016 thì sẽ là sai. Hậu quả để lại tính toán sai, số liệu sai và báo cáo sai nếu không phát hiện ra.
Ngoài ra, trường hợp khó phát hiện hơn là sử dụng hàm để lấy ra giá trị nhưng lại lấy ra là Text.
Ví dụ: ô A1 là HH-0K1, ta sử dụng hàm Right tại ô B1 để lấy ra số 1. Hàm Right(A1,1)=1 nhưng số 1 ở đây lại là Text chứ không phải là số.
Cách xử lý:
Cách 1: Dùng Conditional Formatting
Bôi đen vùng cần kiểm tra rồi chọn Conditional Formatting sau đó vào phần Use a formula to determine which cells to format. Trong phần Format values where this formula is true gõ công thức =istext(…). Xem chi tiết ở video thao tác hướng dẫn trên.
Cách 2: Dùng VBA
Đoạn Macro sau đây sẽ giúp bạn trỏ con chuột đến từng ô có định dạng đang là Text để bạn sửa đến khi hoàn thành
VBA_CO_BAN_NOT_IS_NUMBERIC.png

Đăng ký học VBA trong Excel để tối ưu và hỗ trợ đắc lực hơn cho công việc. Đăng ký Tại Đây

 
Lọc ra danh sách tên sheet trong file vào một cột trong bảng tính

Trong thực tế, những người sử dụng Excel mà sử dụng nhiều sheet để nhập số liệu. Việc thống kê tất cả tên sheet bằng các hàm excel thông thường là một việc rất khó khăn. Vậy mình xin chia sẽ cho các bạn thủ tục hiển thị danh sách tên sheet trong một file bất kỳ vào một cột trong bảng tính một cách đơn giản nhất. Giả sử chúng ta có một file Excel gồm các sheet sau: Bluesofts.net1, Bluesofts.net2, Bluesofts.net3, Bluesofts.net4, Bluesofts.net5, Bluesofts.net6. Yêu cầu bài toán là lọc ra tên tất cả các sheet vào một cột bất kỳ trong 1 sheet.

vb0.jpg

Để giải bài toán trên, các bạn làm theo các bước sau:
Bước 1: Các bạn vào môi trường lập trình (nhấn phím tắt Alt+F11) , rồi bạn vào menu Insert -> chọn vào module để insert module, sau khi tạo xong module, các bạn copy code dưới đây vào trong module:
[GPECODE=vb]Sub LayTenSheet() Dim Sh As Worksheet
Dim I As Long
'Duyet tung sheet trong sheets, ghi ten sheet ra cot A
For Each Sh In Application.ThisWorkbook.Sheets
I = I + 1
Cells(I, 1).Value = Sh.Name
Next
End Sub[/GPECODE]

vb%20code.jpg

Bước 2
: Các bạn vào môi trường bảng tính, vào Menu Developer --> chọn Insert --> Button (Form Control) (Trường hợp trên thanh Menu chưa có thẻ Developer thì thực hiện như sau: File --> Options --> Customize Ribbon rồi tích chọn vào ô Developer và nhấn OK)

vb1.jpg

Sau khi chọn vào Button, các bạn đặt chuột vào 1 ví trí mà bạn muốn tạo nút bấm, giữ chuột trái và kéo một vùng đủ rộng của nút bấm,rồi thả chuột sẽ hiện ra bảng Assign Macro. Chọn tên Macro "LayTenSheet" rồi click chuột trái vào OK.

vb5.jpg


Bước 3: Sau khi Assign xong Macro thì bạn click chuột phải vào nút bấm vừa tạo và sửa tên theo ý của bạn, sau khi sữa tên xong, các bạn click chuột ra bên ngoài bảng tính.

vb3.jpg

Bước 4
: Tiếp theo các bạn click chuột trái vào nút bấm để nhận kết quả.

vb4.jpg

Tính ứng dụng của chức năng này:
- Trong môi trường doanh nghiệp file excel sẽ có rất nhiều sheets, việc sử dụng công thức giữa các sheets hoặc nhớ các tên sheets gặp nhiều khó khăn, đồng thời file excel có thể chia sẻ cho nhiều người sử dụng. Do đó, chức năng này sẽ giúp người dùng kiểm soát và sử dụng file excel hiệu quả hơn.
- Ngoài ra, khi tạo ra file excel tự động bằng công thức hoặc bằng VBA thì người dùng sẽ thường ẩn sheets tự động để không tác động vào tên, cấu trúc các sheets trong file excel. Tính năng này sẽ trở nên hữu ích cho người dùng để tạo các thêm các công thức từ các sheets bị ẩn theo cấu trúc ten_sheet!.
Ví dụ: =Sum(Bluesofts.net2!$B$5:$B$200).
Link tải file:
Tải file
Để tham khảo thêm nhiều kiến thức về VBA cơ bản, các bạn tìm hiểu tại khóa đào tạo lập trình VBA cơ bản trong excel..
Link khóa học:
Đăng ký học
 
Tạo hàm tách dãy số đầu tiên trong chuỗi

Chào các bạn, hôm nay mình sẽ giới thiệu cho các bạn hàm tách dãy số đầu tiên hoặc dãy số đầu tiên có ký tự "-" liên kết với dãy số tiếp theo. Để có hàm tách dãy số như trên, các bạn tiến hành làm theo các bước sau:
Bước 1: Tạo cơ sở dữ liệu gồm ký tự và số.

ham_tch_so_1.jpg


Bước 2: Vào môi trường lập trình VBA, các bạn vào menu INSERT -> MODULE để tạo một module, sau đó copy code dưới đây vào trong module vừa tạo.
[GPECODE=vb]
'...CODE....
Function TACHDAYSO(ByVal CHUOI As String) As String
Dim I As Long
Dim CH As String
Dim BATDAT As Boolean
For I = 1 To Len(CHUOI)
CH = Mid(CHUOI, I, 1)
If IsNumeric(CH) Or CH = "-" Then
If Not BATDAT Then
BATDAT = True
End If
TACHDAYSO = TACHDAYSO & CH
Else
If BATDAT Then
Exit Function
End If
End If
Next I
End Function
'...END CODE...[/GPECODE]
Sau khi pate vào sẽ tương tự như hình dưới đây:

ham_tach_so_2.jpg

Bước 3: Sau khi hoàn thành việc copy code, các bạn vào môi trường bảng tính Excel, các bạn gõ hàm =TACHDAYSO( ô chứa chuỗi ký tự và số).

ham_tach_so_3.jpg

Bước 4: Tiếp theo các bạn nhấn ENTER rồi copy công thức cho các ô còn lại và nhận kết quả:

ham_tach_so_4.jpg

Để tìm hiểu thêm nhiều kiến thức bổ ích về VBA, các bạn tìm hiểu tại khóa đào tạo VBA trong Excel cơ bản của công ty.
Link khóa học: Đào tạo VBA trong Excel cơ bản
Các bạn tải File ví dụ tại đây: Dowloand
 
Phóng to và thu nhỏ Userform và Controls trong Excel VBA

Trong VBA. Tạo userform chúng ta muốn co giãn form và các controls bên trong tự phóng to lên hoặc thu nhỏ theo tỷ lệ form. Bình thường không làm được nhưng với phương pháp lập trình VBA, API và sử dụng thuộc tính Userform.Zoom chúng ta làm được việc này.

zoomform.gif

Cách làm rất đơn giản. Bạn hãy làm theo hướng dẫn sau:
1. Mở Userform, View Code
2. Dán đoạn code sau vào
'****************************************
'Tac gia: Nguyen Duy Tuan
'Tel : 0904.210.337
'E.Mail :
tuanktcdcn@yahoo.com
'Website: www.bluesofts.net
'****************************************
[GPECODE=vb]
Private Sub UserForm_Initialize()
AllowResize = True
OldWidth = Width
OldHeight = Height
If Val(Application.Version) < 9 Then
hwnd = FindWindow("ThunderXFrame", Caption) 'XL97
Else
hwnd = FindWindow("ThunderDFrame", Caption) 'XL2000
End If
PrevStyle = GetWindowLong(hwnd, GWL_STYLE)
SetWindowLong hwnd, GWL_STYLE, PrevStyle Or WS_SIZEBOX Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
Label3.ForeColor = vbBlue
Dim I&
For I = 1 To 12
ComboBox1.AddItem "Tháng " & I
ListBox1.AddItem "Tháng " & I
Next I
End Sub[/GPECODE]
'--------------------------------------------------------------------
[GPECODE=vb]
Private Sub UserForm_Resize()
Dim tmpZoom&, CurStyle&
Dim tmpWidth As Double
If Not AllowResize Then Exit Sub
CurStyle = GetWindowLong(hwnd, GWL_STYLE)
tmpZoom = Round(Width / OldWidth * 100, 0)
If tmpZoom < ZoomMin Then tmpZoom = ZoomMin
If tmpZoom > ZoomMax Then tmpZoom = ZoomMax
AllowResize = False 'Ngan khong chay UserForm_Resize khi dang thay doi size
If tmpZoom = ZoomMin Or tmpZoom = ZoomMax Then
'Neu khong phai la phong to man hinh thi co lai kich co
If Not (CurStyle And WS_MAXIMIZE) = WS_MAXIMIZE Then
Width = tmpZoom * OldWidth / 100
Height = Width * OldHeight / OldWidth
End If
End If
If (CurStyle And WS_MAXIMIZE) = WS_MAXIMIZE Then
tmpWidth = OldWidth * Height / OldHeight
tmpZoom = Round(tmpWidth / OldWidth * 100, 0) 'limitZoom
End If
'Change height by width
'If Not ((CurStyle And WS_MAXIMIZE) = WS_MAXIMIZE Or ' (CurStyle And WS_MINIMIZE) = WS_MINIMIZE) Then
' Height = Width * OldHeight / OldWidth
'End If
AllowResize = True 'Cho phep resize
Zoom = tmpZoom
End Sub[/GPECODE]

Download mã nguồn
 
Ghi thông tin theo ý lên thanh trạng thái trong Excel.
Các bạn vào môi trường lập trình INSERT một MODULE copy code dưới đấy vào module và chạy chương trình (nhấn F5 hoặc click vào RUN).
[GPECODE=vb]
Sub GhiTrangThai()
Application.StatusBar = "HOANG PHONG"
End Sub[/GPECODE]
1.jpg
Để tìm hiểu thêm nhiều kiến thức bổ ích tại khóa đào tạo "Lập trình VBA trong excel cơ bản" của Công ty Cổ phần Bluesofts tổ chức.
Xem đầy đủ thông tin khóa học tại đây.
 
Lập báo cáo động kết hợp VBA và A-Tools

Trong thực tế công việc văn phòng, các bạn nhân viên thường phải làm nhiều loại báo cáo đặc thù theo nhu cầu của doanh nghiệp. Ngoài việc dùng công thức Excel thuần túy, nhiều người đã tìm hiểu về VBA trong excel để thiết kế những báo cáo đơn giản, hiệu quả, giảm dung lượng file và tăng tốc độ xử lý công thức, dữ liệu trong file. Hôm nay mình sẽ hướng dẫn các bạn làm một báo cáo động có kết hợp VBA và một công cụ mới là A-Tools. Mục đích là tạo được báo cáo động, lọc theo một điều kiện "Mã hàng" nhưng sẽ "lọc theo một hoặc nhiều mã hàng" .Giả sử ta có bài toán như sau: Có một bảng dữ liệu gồm nhiều cột, trong đó có cột "Mã hàng". Vậy yêu cầu bài toán là: Tôi muốn xem báo cáo theo một mã hàng hoặc nhiều mã hàng, khi tôi chọn một mã hàng thì lọc toàn bộ dữ liệu của mã hàng đấy, khi chọn 2 thì lọc toàn bộ dữ liệu của 2 mã hàng,... tương tự cho n mã hàng.Để giải quyết bài toán trên chúng ta làm như sau:Bước 1: Thiết kế mẫu file Excel gồm 3 sheet như sau:Sheet Setup: để lưu các thiết lập chung, ở đây chỉ có 1 sheet báo cáo nên chỉ cần lưu bảng dữ liệu điệu kiện gồm tất cả mã và tên hàng. Tôi tên vùng dữ liệu là DMCT_DT chẳng hạn, các bạn có thể đặt tên theo cách hiểu hoặc cấu trúc dữ liệu của mình (note: tên tiếng việt viết liền không giống, ngăn cách nhau bởi dấu gạch dưới).

lku8vkz0o7auag7zg.jpg


SheetData: Là nơi lưu trữ cơ sở dữ liệu của các bạn, hiện tại mình đang thiết kế theo cấu trúc "Sheetdata" vừa là nơi nhập liệu, vừa lưu trữ dữ liệu. Sau này các bạn có thể tìm hiểu thêm về VBA thiết kế Form nhập liệu riêng, sau khi lưu sẽ vào "Sheetdata", ở đây vùng dữ liệu mình đặt ten là DATA.

k6wkbun5w67ectpzg.jpg


SheetReport: Là sheet để xem báo cáo, cấu trúc báo cáo thì mình thiết kế như hình dưới đây, gồm 1 Shap để chọn mã hàng, Shap này sẽ hiển thị Form chọn danh mục mã hàng theo ý. Các dòng tiêu đề mình thiết kế bằng tiếng việt, có dòng tổng cộng ở phía dưới, khi lập công thức chỉ việc lập từ dòng thứ 2.

mc9xm734mmcd2rzzg.jpg

Bước 2:
Tiến hành thiết kế Form trong VBA.Các bạn vào môi trường lập trình VBA (ALT+F11), vào menu Insert ->chọn UserForm, trong Form các bạn thiết kế theo cấu trúc tùy ý, còn trong bài toán của mình thì mình thiết kế hình dưới đây, ở đây mình dùng gồm "CheckBook" (để chọn tất cả), "ListBook" (để lấy danh sách) và các "Button" (để thực hiện lệnh).

dbv2ba3tbifsei6zg.jpg


Để nạp danh sách vào "Listbox", các bạn chọn vào "Listbox", ở bên trái phần "Propties", các bạn vào "Categorized", tại phần "RowSource", các bạn gõ tên bảng chứa mã và tên mà chúng ta đã đặt trong "SheetSetup". Ở đây các bạn chú ý trường "ColumnCount": số cột trong bảng mà các bạn cần hiển thị trên "ListBook", hiện tại mình để là 2 thì có cả mã và tên cùng hiển thị.

Sau khi thiết lập xong, các bạn double click vào Button "Chọn" rồi copy code dưới đây vào trong thủ tục bạn vừa tạo.
[GPECODE=vb]Dim s As String
If cbAll.Value = True Then
For i = 0 To lbDanhMuc.ListCount - 1
If s = "" Then
s = lbDanhMuc.List(i, 0)
Else
s = s & "','" & lbDanhMuc.List(i, 0)
End If
Next i
Else
For i = 0 To lbDanhMuc.ListCount - 1
If lbDanhMuc.Selected(i) = True Then
If s = "" Then
s = lbDanhMuc.List(i, 0)
Else
s = s & "','" & lbDanhMuc.List(i, 0)
End If
End If
Next i
End If
s = "'" & s & "'"
ThisWorkbook.Sheets("Report").Range("C1").Value = s
Unload Me [/GPECODE]
Các bạn chú ý dòng : ThisWorkbook.Sheets("Report").Range("C1").Value = s, chữ "Report" chính là tên sheet báo cáo mình đã thiết lập.

r8dwfg1a3q7id38zg.jpg
...
Các bạn xem đầ đủ nội dung bài viết tại đây:
Link bài viết
Các bạn tải file ví dụ về chạy thử tại đây: Link download file
Đây là một bài toán cơ bản có kết hợp VBA và công thức tạo báo cáo động bằng A-Tools, sau khi các bạn tìm hiểu kỹ về cách làm báo cáo động bằng A-Tools kết hợp kiến thức VBA cơ bản, các bạn có thể thiết kế các file Excel nhanh gọn, đơn giản, giống như các phần mềm chuyên nghiệp trên Excel.Ở đây mình cũng xin chia sẽ nội dung khóa đào tạo VBA cơ bản của công ty cho những bạn có nhu cầu, điều kiện tham gia khóa học, các bạn vào đây để xem:
Link khóa học
 
Tạo hàm tách họ tên trong Excel
Đôi khi chúng ta gặp những trường hợp cần tách họ tên của một danh sách nhận viên, học sinh, hay sinh viên chẳng han. Chúng ta phải kết hợp nhiều công thức trong Excel, bài này mình hướng dẫn cho các bạn một hàm trong Excel, mà chỉ cần copy về là sử dung được. Để copy hàm này các bạn làm như sau:
Bước 1: Nhấn tổ hợp phím ALT+F11 để vào môi trường VBA. Vào menu Insert->Module - Tạo module
Bước 2: Copy đoạn code dưới đây dán vào module
[GPECODE=vb]Function TachHoTen(ByVal sHoVaTen As String, Optional ByVal bLayHo As Boolean = True) As String
Dim p As Long
p = InStrRev(sHoVaTen, " ")
If bLayHo Then
TachHoTen = Left(sHoVaTen, p - 1)
Else
TachHoTen = Right(sHoVaTen, Len(sHoVaTen) - p)
End If
End Function
[/GPECODE]
Bước 3: ALT+F11 để trở về môi trường bảng tính của người dùng
Giả sử cần tách họ tên trong ô A1, công thức như sau:
B1=TachHoTen(A1,true)
- Nếu đối số thứ 2 là True thì kết quả trả về là Họ.
- Nếu đối số thứ 2 là False thì kết quả trả về là Tên.
Để trải nghiệm thêm nhiều kiến thức về VBA và phương pháp lập trình , mình xin giới thiệu tới các bạn khóa đào tạo lập trình VBA cơ bảntrong Excel tại công ty cổ phần Bluesofts, khóa học sẽ mang lại cho bạn nhiều kiến thức bổ ích, đáp ứng nhu cầu công việc của mình.
Để tìm hiểu về nội dung, chương trình khóa học, các bạn truy cập link sau : Link khóa học
 
Thủ tục tính chiết khấu, tiền hàng và phải trả bằng VBA

Trong Excel, để giải quyết 1 bảng tính bằng công thức excel thuần túy, việc file năng, tốc độ xử lý chậm trong mỗi lần cập nhật công thức là chuyển thường xuyên của nhân viên văn phòng. Vì thế mà Microsofts đã tạo ra ngôn ngữ lập trình trên Excel, chỉ việc click vào 1 nút thì toàn bộ dữ liệu được cập nhật, không hề có công thức excel trong bảng tinh. Ví dụ ta có bài toán như sau: Tính tiền hàng, chiết khấu 10% và phải trả các mặt hàng nếu tỉnh là "Hà Nội", để giải bài toán trên ta làm theo các bước sau:

1zb1bi8z2j9gff5zg.jpg


Bước 1: Các bạn vào môi trường lập trình của Excel (phím tắt ALT+F11), tạo một module và copy code dưới đây vào trong module đấy:[gpecode=vb]Sub ChietKhau()
Dim I As Long
For I = 5 To 14
Cells(I, 7).Value = Cells(I, 6).Value * Cells(I, 5).Value
Cells(I, 8).Value = 0
If Cells(I, 3).Value = "Ha Noi" Then
Cells(I, 8).Value = Cells(I, 7).Value * 0.1
End If
Cells(I, 9).Value = Cells(I, 7).Value - Cells(I, 8).Value
Next I
End Sub[/gpecode]


0zsu1no8x0uaidmzg.jpg


Bước 2: Tạo nút bấm: Sau khi các bạn copy xong code, các bạn trở về môi trường bảng tính, vào menu Developer -> Insert -> chọn vào Button.

hgvdsihihdasonyzg.jpg


Sau khi click vào Button-> các bạn đặt chuột vào 1 vị trí trong bảng tính, giữ chuột trái và kéo một vùng vừa đủ nút bấm theo mong muốn của bạn. Sẽ hiển thị ra bảng thông báo Assign Macro, bạn chọn vào macro cần gán -> chọn vào OK.

brz373shj6jkqqyzg.jpg


Khi gán xong macro, bạn đổi tên nút bấm theo yêu cầu bài toán.

28x1u2t20mtnlcgzg.jpg


Bước 3: Bạn click chuột ra ngoài nút bấm, và click chuột trái lại lên nút bấm đề nhận kết quả.

ms758a7k8qzikuuzg.jpg


Xem đầy đủ thông tin khóa đào tạo VBA trong excel cơ bản tại đây
Các bạn vào đây tải file ví dụ:
DOWNLOAD



 
BQT nên để các dạng mục, bài viết thế này vào một mục riêng lẫn lộn lộn xộn vào mục bài mới thế này (?)
 
Web KT
Back
Top Bottom