intTypePromotion=3

Hướng dẫn sử dụng VBA trong Excel - Lê Thế Vinh

Chia sẻ: Le Vinh | Ngày: | Loại File: PDF | Số trang:15

0
516
lượt xem
220
download

Hướng dẫn sử dụng VBA trong Excel - Lê Thế Vinh

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Các phần mềm trong MS Office nói chung và Excel nói riêng là công cụ giúp chúng ta lưu trữ số liệu, xử lý số liệu trong quá trình làm việc rất hiệu quả, tiết kiệm thời gian, công sức. Nhằm giúp các bạn hiểu hơn về vấn đề này, mời các bạn cùng tham khảo nội dung tài liệu "Hướng dẫn sử dụng VBA trong Excel". Hy vọng đây là tài liệu tham khảo hữu ích cho các bạn.

Chủ đề:
Lưu

Nội dung Text: Hướng dẫn sử dụng VBA trong Excel - Lê Thế Vinh

  1. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh Hướng dẫn sử dụng VBA trong Excel 1. Giới thiệu Các phần mềm trong MS Office nói chung và Excel nói riêng là công cụ giúp chúng ta lưu trữ số liệu, xử lý số liệu trong quá trình làm việc rất hiệu quả, tiết kiệm thời gian, công sức. Ngoài các hàm đơn giản được trang bị sẵn trong thư viện của Excel như hàm Sum(), Max(), Min(), Text(), Value(), Left(), Vlookup () Average() v.v. Người sử dụng có thể lập trình, tạo ra các hàm, thủ tục phức tạp hơn theo nhu cầu sử dụng bằng cách dùng công cụ VBA (Visual Basic for Application), dùng ngôn ngữ lập trình VB, nhúng vào các ứng dụng của Microsoft như MS Word, PowerPoint, Auto CAD v.v. Ở đây chúng ta viết các hàm, thủ tục cho Microsoft Excel. 2. Vào ra chương trình, cài đặt để sử dụng hàm trong Excel a. Vào ra chương trình Bước 1. Khởi động Microsoft Excel, tạo một workbook mới (hoặc dùng Book1 như mặc định). Chọn Tools\Macro\Visual Basic Editor để mở cửa sổ soạn thảo VBA. Trong cửa sổ Project Explorer (nếu không thấy thì chọn View Project Explorer để mở nó), chọn VBAProject (Book1). Chọn Insert Module để thêm một module. Bước 2. Gõ nội dung hàm phepcong() vào module mới tạo. Ví dụ: Public Function Phepcong(x as double, y as double) as double Phepcong = x + y End Function Bước 3. Chuyển sang cửa sổ Excel để kiểm tra hàm bằng cách thử gõ vào ô bất kỳ, =Phepcong(x,y), kết quả trả về ô tương ứng là x+y. Ví dụ: = Phepcong(2,3) kết quả trả về là 5. b. Cài đặt và sử dụng hàm trong Excel Bước 1. Mô tả hàm để thuận tiện cho việc sử dụng. Trong cửa sổ Excel, chọn menu Tools\Macro\Macros để hiển thị hộp thoại Macro. Gõ tên hàm Phepcong vào ô Macro name, rồi bấm Options để mở tiếp hộp thoại Macro Options, gõ nội dung mô tả Nghệ An, 5/2013 1
  2. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh hàm vào ô Description, bấm OK để đóng hộp thoại Macro Options, cuối cùng bấm Cancel để đóng hộp thoại Macro. Bước 2. Lưu Book1 vào máy với tên file, ví dụ MyFunctions.xla; Bạn lưu file này đúng vị trí để mỗi lần MS Excel khởi động sẽ mặc định đưa ham vào thư viện chung, để sẵn sàng sử dụng. Ví dụ: Thư mục C:\Documents and Settings\Administrator\Application Data\ Microsoft\AddIns đối với MS 2003. Đóng MS Excel mà không cần ghi lại các thay đổi trên Book1. Bước 3. Dùng Windows Explorer để thêm mô tả cho Add-in bằng cách bấm chuột phải trên tên tập tin MyFunctions.xla, chọn mục Properties để mở hộp thoại Properties, chọn mục Summary để gõ mô tả vào ô Comments, gõ tên của Add-in vào ô Title. Chọn nút OK để chấp nhận các thông tin. Bước 4. Khởi động lại MS Excel, cài đặt add-in vừa tạo cho Excel bằng cách chọn menu Tools\Add-Ins để mở hộp thoại Add-Ins, chọn tên Add-in của ta trong danh sách Add-Ins available, rồi bấm chuột vào nút OK. Từ đây trở về sau, mỗi lần mở MS Excel, mặc định bạn có thể dùng được hàm Phepcong trong Add-in MyFunctions.xla. 3. Lưu ý một số khái niệm a) Thuộc tính RANGE Thuộc tính Range trả về một đối tượng, có thể là một cell đơn lẻ hoặc một dãy gồm nhiều cell. Trong lệnh gán giá trị của cell A1 vào cell A5 đưới đây, Range trả về giá trị chỉ gồm 1 cell: Worksheets("Sheet1").Range("A5").Value = Worksheets("Sheet1").Range("A1").Value Khi dùng với kiểu không xác định, Range trả về một dãy cell trên Sheet đang hoạt động. Để tránh nhầm lẫn kiểu "Râu ông nọ cắm cằm bà kia", ta kích hoạt một bảng tính bằng phương pháp Activate trước khi dùng thuộc tính Range mà không cần chỉ ra giới hạn cụ thể. Sau đây là cách điền vào vùng A1:H8 các số ngẫu nhiên bằng cách đặt công thức cho mỗi ô trong dãy mà trước đó Sheet1 đã được kích hoạt: Nghệ An, 5/2013 2
  3. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh Worksheets("sheet1").Activate Range("A1:H8").Formula = "=rand()" Chúng ta có thể đặt tên cho dãy cell và chỉ cho VBA tham chiếu đến tên này. Ví dụ, để ra lệnh xóa nội dung của một dãy có tên "Criteria" chúng ta viết: Worksheets(1).Range("criteria").ClearContents Nếu ta sử dụng một đối số (argument) mà đối số đó là địa chỉ dãy cell, thì phải định rõ địa chỉ đó theo kiểu A1 (nếu dùng kiểu R1C1 máy sẽ báo lỗi). b) Thuộc tính Cells Thuộc tính Cells sử dụng cú pháp Cells(row,column), với row là chỉ số hàng và column là chỉ số cột, để trả về một cell đơn lẻ. Chẳng hạn, chúng ta có thể gán giá trị 24 cho cell A1 bằng lệnh: Worksheets(1).Cells(1, 1).Value = 24 Và gán một công thức cho cell A2: ActiveSheet.Cells(2, 1).Formula = "=sum(b1:b5)" Cho dù chúng ta có thể dùng công thức Range("A1") để trả về cell A1 (không hề sai!), nhưng dùng thuộc tính Cells thì tiện lợi hơn bởi bạn có thể sử dụng một biến số đại diện cho hàng hoặc cột phục vụ yêu cầu lập trình. Hãy tham khảo ví dụ tạo tiêu đề cột và hàng trên Sheet1 sau đây, lưu ý sau khi bảng tính đã được kích hoạt, thuộc tính Cells có thể được sử dụng thoải mái mà không cần khai báo một sheet cụ thể nào vì nó trả về một cell trên sheet hoạt động. Sub SetUpTable() Worksheets("sheet1").Activate For theYear = 1 To 5 Cells(1, theYear + 1).Value = 1990 + theYear Next theYear For theQuarter = 1 To 4 Cells(theQuarter + 1, 1).Value = "Q" & theQuarter Next theQuarter End Sub Nghệ An, 5/2013 3
  4. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh Mặc dù bạn có thể sử dụng những hàm xử lý chuỗi của Visual Basic để thay đổi tham chiếu kiểu A1, nhưng để dễ hiểu hơn và rèn luyện kỹ năng lập trình của mình, bạn nên sử dụng kiểu Cells(1, 1). Nếu bạn sử dụng cú pháp expression.Cells(row,column), với expression là một biểu thức trả về một đối tượng Range, và row và column là vị trí tương đối so với góc trên trái của dãy cell thì kết quả trả về là một bộ phận của dãy. Trong ví dụ dưới đây, VBA chỉ đến Cell(1,1) tức là cell C5 trên bảng tính: Worksheets(1).Range("c5:c10").Cells(1, 1).Formula = "=rand() c) Kết hợp Range and Cells Phối hợp Range và Cells để tham chiếu đến một dãy cell, bạn hãy sử dụng cú pháp Range(cell 1, cell 2), với cell 1 và cell 2 là cell bắt đầu và cell kết thúc của dãy. Để đặt kiểu đường viền cho các cell bạn dùng lệnh sau: With Worksheets(1) .Range(.Cells(1, 1), .Cells(10, 10)).Borders.LineStyle = xlThick End With Ở đây cần lưu ý đến dấu chấm đằng trước thuộc tính Cells. Dấu chấm này quy định Worksheets(1) mà With đã nêu trước đó được áp dụng cho thuộc tính Cells để tiết kiệm chỗ và làm cho câu lệnh gọn hơn (nếu không có dấu chấm, thuộc tính Cells trả về các cell trên sheet hoạt động). 4. Một số ví dụ Sau đây là một số ví dụ xử lý chuỗi và số trong trường học. Option Explicit Dim k As Long Public luachon As Byte Public newValue As Double Public actCell As Range Public formu As String Public ass As String Public first As Boolean Function SoTCchuadat(Dayheso As Range, Daydiemthi As Range) As Integer ' Xac dinh Co tin chi Chua dat (co Diem
  5. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh SoTCchuadat = 0.5 For i = 1 To Daydiemthi.Columns.Count If (Daydiemthi.Columns.Cells(1, i) 0.5) Then SoTCTL = SoTCTL + Dayheso.Columns.Cells(i) End If Next i Else For i = 1 To Daydiemthi.Columns.Count If (Daydiemthi.Columns.Cells(1, i) = 0.5) Then SoTCTL = SoTCTL + Dayheso.Columns.Cells(i) End If Next i End If End Function Public Function Loc(diem As String) As Byte Dim lan1 As Byte Dim lan2 As Byte Dim s As String If Not KiemtraDiem(diem) Then Nghệ An, 5/2013 5
  6. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh MsgBox " Diem khong hop le" Loc = 0 Exit Function End If For i = 1 To Len(diem) If Mid(diem, i, 1) " " Then s = s & Mid(diem, i, 1) Next i diem = s If KiemtraDiem(diem) Then If Len(diem) = 4 Then If Mid(diem, 1, 1) = "(" And Mid(diem, 3, 1) = ")" Then lan1 = Val(Mid(diem, 2, 1)) lan2 = Val(Mid(diem, 4, 1)) End If If Mid(diem, 2, 1) = "(" And Mid(diem, 4, 1) = ")" Then lan1 = Val(Mid(diem, 1, 1)) lan2 = Val(Mid(diem, 3, 1)) End If If lan1 > lan2 Then Loc = lan1 Else Loc = lan2 End If End If If Len(diem) = 1 Then Loc = Val(diem) If diem = "10" Then Loc = 10 If Len(diem) = 5 Then Loc = 10 End If End Function Public Function Tinh_TBC(Dayheso As Range, Daydiemthi As Range) As Double ' Tinh diem Trung binh chung (TBC) Dim Tongheso As Integer Dim tam As Double Dim i As Integer Dim Nomon As Boolean Dim tam2 As String tam = 0 Tongheso = 0 Nomon = False For i = 1 To Dayheso.Count If Loc(Daydiemthi.Item(i).Value) < 5 Or Loc(Daydiemthi.Item(i).Value) > 10 Then Nomon = True End If Tongheso = Tongheso + Dayheso.Item(i).Value Nghệ An, 5/2013 6
  7. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh tam = tam + Dayheso.Item(i).Value * Loc(Daydiemthi.Item(i).Value) Next i If Tongheso = 0 Then Tongheso = 1 Tinh_TBC = Round(tam / Tongheso, 2) tam2 = Mid(Str(Tinh_TBC), 1, 5) Tinh_TBC = Val(tam2) End Function Public Function Tinh_TBC_XLLop(Dayheso As Range, Daydiemthi As Range) As Double ' Tinh diem TBC va Xet len lop Dim Tongheso As Integer Dim tam As Double Dim i As Integer Dim Nomon As Boolean Dim tam2 As String tam = 0 Tongheso = 0 Nomon = False For i = 1 To Dayheso.Count Tongheso = Tongheso + Dayheso.Item(i).Value tam = tam + Dayheso.Item(i).Value * Loc(Daydiemthi.Item(i).Value) Next i If Tongheso = 0 Then Tongheso = 1 Tinh_TBC_XLLop = Round(tam / Tongheso, 2) tam2 = Mid(Str(Tinh_TBC_XLLop), 1, 5) Tinh_TBC_XLLop = Val(tam2) End Function Public Function doidiemTC(Diemso As Double) As String ' Chuyen Thang diem 10 sang Thang diem 4 If Diemso
  8. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh If Diemso < 1.9 Then doidiemChu = "F" If 2
  9. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh Next i Tongso_DVHT_thieu = So_DVHT_thieu If Tongso_DVHT_thieu = 5 Then Xetlenlop = "Lªn líp" Else If ((Tongso_DVHT_thieu > 25) Or (TBC_Nam < 5)) And ((TBC_Nam < 3.5) Or (Sonamdahoc = 2 And TBC_Khoa < 4) Or (Sonamdahoc = 3 And TBC_Khoa < 4.5) Or (Sonamdahoc = 4 And TBC_Khoa < 4.8)) Then Xetlenlop = "Th"i häc" Else Xetlenlop = "T¹m ngõng häc" End If End If Xetlenlop = Xetlenlop & "; " & TBC_Nam & "; " & TBC_Khoa & "; " & Tongso_DVHT_thieu End Function Public Function TachKetqua(Ketqua As String) As String t = Ketqua If Len(Ketqua) < 10 Then TachKetqua = "'" Else For i = 1 To Len(Ketqua) If Mid(t, i, 1) = ";" Then TachKetqua = Mid(t, 1, i - 1) Exit For End If Next i End If End Function Public Function TachTBCKhoa(Ketqua As String) As String If Len(Ketqua) < 10 Then TachTBCKhoa = "" Else For i = 1 To Len(Ketqua) For j = i + 1 To Len(Ketqua) If Mid(Ketqua, i, 1) = ";" And Mid(Ketqua, j, 1) = ";" Then TachTBCKhoa = Mid(Ketqua, i + 1, j - i - 1) Exit For End If Next j Next i End If End Function Nghệ An, 5/2013 9
  10. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh Public Function TachTBCNam(Ketqua As String) As String If Len(Ketqua) < 10 Then TachTBCNam = "" Else For i = 1 To Len(Ketqua) If Mid(Ketqua, i, 1) = ";" Then Exit For Next i For j = i + 1 To Len(Ketqua) If Mid(Ketqua, j, 1) = ";" Then Exit For Next j TachTBCNam = Mid(Ketqua, i + 1, j - i - 1) End If End Function Public Function TachSoDVHTthieu(Ketqua As String) As String If Len(Ketqua) < 10 Then TachSoDVHTthieu = "" Else For i = 1 To Len(Ketqua) If Mid(Ketqua, i, 1) = ";" Then j = i Next i TachSoDVHTthieu = Mid(Ketqua, j + 1, Len(Ketqua) - j + 1) End If End Function Public Function KiemtraDiem(diem As String) As Boolean Dim s As String For i = 1 To Len(diem) If Mid(diem, i, 1) " " Then s = s & Mid(diem, i, 1) Next i diem = s KiemtraDiem = False For i = 0 To 10 If diem = i Then KiemtraDiem = True Exit Function End If Next i For i = 0 To 10 For j = 0 To 10 If diem = "(" & i & ")" & j Then KiemtraDiem = True Exit Function End If Next j Nghệ An, 5/2013 10
  11. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh Next i For i = 0 To 10 For j = 0 To 10 If diem = i & "(" & j & ")" Then KiemtraDiem = True Exit Function End If Next j Next i End Function Public Function Tach_Ten(Hoten As String) As String On Error Resume Next Dim dai As Byte Dim tam As String Hoten = Trim(Hoten) dai = Len(Hoten) i = dai Do If Mid(Hoten, i, 1) = " " Then Exit Do i = i - 1 Loop Until i = 1 Tach_Ten = Trim(Mid(Hoten, i, dai - i + 1)) End Function Public Function Tach_Ho(Hoten As String) As String On Error Resume Next Dim dai As Byte Dim tam As String Hoten = Trim(Hoten) dai = Len(Hoten) i = dai Do If Mid(Hoten, i, 1) = " " Then Exit Do i = i - 1 Loop Until i = 1 Tach_Ho = Trim(Mid(Hoten, 1, i - 1)) End Function Public Function Xet_TC_DuThi(Daydiemthi As Range) As String Dim Nomon As Boolean Xet_TC_DuThi = "Ko no mon" Nomon = False For i = 1 To Daydiemthi.Count If Loc(Daydiemthi.Item(i).Value) < 5 Or Loc(Daydiemthi.Item(i).Value) > 10 Then Nomon = True Nghệ An, 5/2013 11
  12. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh End If Next i If Nomon Then Xet_TC_DuThi = " * No mon *" End Function Public Function Tach_Ngay(Ngay As String) As String On Error Resume Next Dim dai As Byte Dim tam As String Ngay = Trim(Ngay) dai = Len(Ngay) i = 1 Do If Mid(Ngay, i, 1) = "/" Then Exit Do i = i + 1 Loop Until i = dai Tach_Ngay = Trim(Mid(Ngay, 1, i + 1)) End Function Public Function Tinh_TBC_Xet_HocBong(Dayheso As Range, Daydiemthi As Range, diemRenLuyen As Double) As Double Dim Tongheso As Integer Dim tam As Double Dim tamRL As Double Dim i As Integer Dim Nomon As Boolean Dim tam2 As String tamRL = diemRenLuyen tam = 0 Tongheso = 0 Nomon = False For i = 1 To Dayheso.Count If Loc_DiemLan1(Daydiemthi.Item(i).Value) < 5 Or Loc_DiemLan1(Daydiemthi.Item(i).Value) > 10 Then Nomon = True End If Tongheso = Tongheso + Dayheso.Item(i).Value tam = tam + Dayheso.Item(i).Value * Loc_DiemLan1(Daydiemthi.Item(i).Value) Next i 'If Nomon Then MsgBox "Cã sinh viªn: nî häc phÇn hoÆc ®iÓm kh"ng hîp lÖ", vbCritical If Tongheso = 0 Then Tongheso = 1 Tinh_TBC_Xet_HocBong = Round(tam / Tongheso, 2) tam2 = Mid(Str(Tinh_TBC_Xet_HocBong), 1, 5) Tinh_TBC_Xet_HocBong = Val(tam2) + tamRL End Function Nghệ An, 5/2013 12
  13. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh Public Function Loc_DiemLan1(diem As String) As Byte Dim lan1 As Byte Dim lan2 As Byte Dim s As String If Not KiemtraDiem(diem) Then 'MsgBox " Diem khong hop le" Loc_DiemLan1 = 0 Exit Function End If For i = 1 To Len(diem) If Mid(diem, i, 1) " " Then s = s & Mid(diem, i, 1) Next i diem = s If KiemtraDiem(diem) Then If Len(diem) = 4 Then If Mid(diem, 1, 1) = "(" And Mid(diem, 3, 1) = ")" Then lan1 = Val(Mid(diem, 2, 1)) lan2 = Val(Mid(diem, 4, 1)) End If If Mid(diem, 2, 1) = "(" And Mid(diem, 4, 1) = ")" Then lan1 = Val(Mid(diem, 1, 1)) lan2 = Val(Mid(diem, 3, 1)) End If Loc_DiemLan1 = lan1 End If If Len(diem) = 1 Then Loc_DiemLan1 = Val(diem) If diem = "10" Then Loc_DiemLan1 = 10 If Len(diem) = 5 Then Loc_DiemLan1 = 10 End If End Function Function MySumx(X As Range) As Double Dim YY, z, zz As String z = 0 Dim xzz For Each YY In X zz = YY z = z + abc(zz) Next YY MySumx = z End Function Function abc(a As String) As String Dim b, c b = Pos(a, ")") + 1 c = Mid(a, b, Len(a)) Nghệ An, 5/2013 13
  14. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh abc = c End Function Private Function Pos(st As String, substr As String) As Long Dim a, b, c a = Len(substr) b = 0 For c = 1 To Len(st) - a + 1 If Mid(st, c, a) = substr Then b = c End If Next c Pos = b End Function Function MySum(Heso As Range, diem As Range, Optional GiaTriThayThe As Double = 0) As Double Dim Y As Range, z, zz z = 0 zz = 0 Dim xzz As String, zxx As Double For Each Y In diem zz = zz + 1 xzz = abc(Y.Value) zxx = Val(xzz) If (zxx = 0) And (xzz "0") Then zxx = GiaTriThayThe End If z = z + zxx * Heso(, zz) Next Y MySum = z End Function Function MyAverage(Heso As Range, Giatri As Range, Optional BoQua As Boolean = False) As Double Dim Y, z, zz, zzz, zxx, xzz z = 0 zz = 0 zzz = 0 For Each Y In Heso zz = zz + 1 xzz = abc(Giatri(, zz)) zxx = Val(xzz) If Not (BoQua And (zxx = 0) And (xzz "0")) Then zzz = zzz + Y z = z + zxx * Y End If Next Y Nghệ An, 5/2013 14
  15. Lê Thế Vinh, Phòng Đào tạo, Trường ĐHSP Kỹ thuật Vinh MyAverage = z / zzz End Function Function SoTC0(Dayheso As Range, Daydiemthi As Range) As Integer 'Xac dinh Tong so Tin chi cua cac hoc phan co Diem =0. Dim i As Integer SoTC0 = 0 For i = 1 To Daydiemthi.Columns.Count If (Daydiemthi.Columns.Cells(1, i) = 0) Then SoTC0 = SoTC0 + Dayheso.Columns.Cells(i) End If Next i End Function Function TBCTL4(Dayheso As Range, Daydiemthi As Range) As Double 'Ham tinh diem TBCTL thang 4, doi voi cac hoc phan co Diem>=1.0 Dim i As Integer Dim soTC, tsoTC As Integer TBCTL4 = 0# tsoTC = 0 soTC = 0 For i = 1 To Daydiemthi.Columns.Count If (Daydiemthi.Columns.Cells(1, i) >= 1#) Then soTC = Dayheso.Columns.Cells(1, i) TBCTL4 = TBCTL4 + Daydiemthi.Columns.Cells(1, i) * soTC tsoTC = tsoTC + soTC End If Next i TBCTL4 = TBCTL4 / tsoTC End Function Chúc các bạn thành công! Tài liệu tham khảo: Bản hướng dẫn này có sử dụng một số tài liệu từ Internet. Nghệ An, 5/2013 15

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản