Bảng 3.1 là dữ liệu về điện trở và độ rọi của một quang trở. Ta cần đi xác định mối quan hệ giữa điện trở và độ rọi đó.
Để thực hiện điều đó ta có thể dùng VBA xử lý dữ liệu và tìm công thức xấp xỉ cho mối quan hệ giữa điện trở và độ rọi (lux) của một quang trở:
- Khi ánh sáng chiếu vào quang trở thì điện trở của quang trở thay đổi, ánh sáng càng sáng thì điện trở càng giảm, tuy nhiên mối hệ giữa điện trở và ánh sáng không phải là tuyến tính mà thay đổi theo cấp số nhân (Như hình 3.15).
Bảng 3.1. Giá trị điện trở của quang trở phụ thuộc vào ánh sáng r lux 2000 1888 1800 1965 1600 2010 1400 2131 1200 2264 1000 2416 900 2519
800 2623 700 2715 650 2750 600 2807 550 2870 500 2926 450 3045 400 3083 350 3144 300 3220 250 3285 200 3355 160 3600
Hình 3.15. Mối quan hệ giữa điện trở (R) và độ rọi (lux)
- Tuy nhiên dạng mỗi quan hệ giữa log(lux) và log(R ) có thể coi là tuyến tính có dạng(Như hình 3.16):
log(lux) = m*log(R ) + b (3.1) - Từ đó ta có thể xấp xỉ công thức mối quan hệ của độ rọi và điện trở là:
Hình 3.16. Mối quan hệ giữa log(lux) và log(R )
Các bước phân tích dữ liệu độ rọi lux và điện trở của quang trở bao gồm:
- Nhập dữ liệu về điện trở tương ứng với độ rọi đo được vào bảng trong trang tính rawData
- Chạy đoạn code VBA để thực hiện tính toán và tìm công thức xấp xỉ. Các bước tính toán bao gồm:
o Tính các giá trị log(lux) và log(r)
o Tìm các tham số m, b trong mối quan hệ của độ rọi và điện trở của quang trở lux = Rm * 10b:
m = INDEX(LINEST(<dải chứa các giá trị log(lũ)>,<dải chứa các giá trị log(r)>),1).
b = INDEX(LINEST(<dải chứa các giá trị log(lũ)>,<dải chứa các giá trị log(r)>),2)
o Tính các giá trị lux và r theo công thức với các tham số m, b tìm được.
o Tính sai số giữa giá trị tính theo công thức với giá trị thực tế đo được
Lưu đồ thuật toán phân tích mối quan hệ giữa độ rọi(lux) và điện trở(r ) được thể hiện như hình 3.17.
Hình 3.17. Lưu đồ thuật toán
Thuật toán thực hiện các bước xử lý như sau:
- Đầu tiên ta nhập các giá trị tương ứng của điện trở(R ) và độ rọi(lux) của quang trở vào bảng trong Sheets rawData.
- Sau khi nhập xong ta chạy đoạn code như ở PL1. Đầu tiên ta sẽ tìm kích thước của bảng đã nhập trong Sheets rawData(số hàng và cột). Dựa vào kích thước đã tìm được ta copy vùng dữ liệu cần xử lý trong Sheets rawData xang Sheets Lux_Analysis.
- Sau khi dữ liệu được copy xang Sheets Lux_Analysis ta tính toán log10(lux) và log10(R). Bằng cách dùng vòng lặp for ta có thể dễ dàng tính toán các giá trị trên tương ứng với từng giá trị lux và R trong bảng dữ liệu.
- Tiếp theo ta sử dụng các giá trị log10(lux) và log10(R) tính toán được ở trên để đi tìm tham số m và b trong công thức xấp xỉ (3.2).
- Với giá trị tìm được của m và b ta tính toán được giá trị của lux theo công thức (3.2). Đây là giá trị tính toán theo công thức xấp xỉ nên cần tiến hành so sánh với giá trị thực tế. Ta tính sai số tương đối để thực hiện việc so sánh đó.
- Cuối cùng sau tất cả các bước trên việc tính toán đã hoàn thành và đoạn code đã chạy xong.
Việc tính toán để tìm công thức xấp xỉ trên (tìm các tham số m và b) có thể được thực hiện bằng đoạn code VBA ở PL1.
Để thực hiện việc sao chép dữ liệu từ trang tính “rawData” xang trang tính “Lux_Analysis” ta dùng lệnh sau:
Call CopySection("lux_analysis", "rawData", 1, 1, last_row1, last_col1, "lux_analysis", "Lux_Analysis", 1, 1)
Trong đoạn lệnh trên ta đã sử dụng một đoạn sub CopySection(PL2) với các tham số truyền vào theo thứ tự là:
- frmwkbook: tên WorkBooks nguồn nơi chứa dữ liệu cần sao chép (ở ví dụ này là lux_analysis).
- frmwksht: tên Sheets nguồn chứa dữ liệu cần sao chép trong WorkBooks nguồn (ở ví dụ này là rawData).
- r1: vị trí hàng ô đầu tiên của vùng cần sao chép trong Sheets nguồn (ở ví dụ này là 1). - c1: vị trí cột ô đầu tiên của vùng cần sao chép trong Sheets nguồn (ở ví dụ này là 1). - r2: vị trí hàng cuối cùng của vùng cần sao chép trong Sheets nguồn (ở ví dụ này là
last_row1).
- c2: vị trí cột cuối cùng của vùng cần sao chép trong Sheets nguồn (ở ví dụ này là last_col1).
- towkbook: tên WorkBooks đích nơi dữ liệu được sao chép đến (ở ví dụ này là lux_analysis).
- towksht: tên Sheets đích nơi dữ liệu được sao chép đến (ở ví dụ này là lux_analysis). - row: vị trí hàng ô đầu tiên do người dùng tự chọn để xác đinh vị trí chứa dữ liệu trong
Sheets đích (ở ví dụ này là 1).
- col: vị trí cột ô đầu tiên do người dùng tự chọn để xác đinh vị trí chứa dữ liệu trong Sheets đích (ở ví dụ này là 1).
Để tính toán các giá trị trong ví dụ này ta dùng đoạn code như ở PL3 để thêm vào các ô một công thức tương ứng. Trong đó các tham số cần truyền vào là:
- Sub AddFormula(wkbook, wksht, row, col, formula$) - wkbook: tên WorkBooks cần tính toán.
- wksht: tên Sheets cần tính toán.
- row: vị trí hàng của ô được thêm công thức vào. - col: vị trí cột của ô được thê công thức vào. - formula$: biến chứa công thức cần thêm vào.
Cụ thể trong ví dụ này ta đã dùng các lệnh như sau để thêm công thức vào: - Tính toán log10(lux) và log10(R):
Call AddFormula("lux_analysis", "Lux_Analysis", i, 3, formula$) formula$ = "=log(" & "B" & Trim(Str(i)) & ")"
Call AddFormula("lux_analysis", "Lux_Analysis", i, 4, formula$) - Tính toán giá các tham số m và b:
formula$ = "=INDEX(LINEST(D2:D" & Trim(Str(last_row1)) & ",C2:C" & Trim(Str(last_row1)) & "),1)"
Call AddFormula("lux_analysis", "Lux_Analysis", 3, 7, formula$) Call AddFormula("lux_analysis", "Lux_Analysis", 3, 9, formula$)
formula$ = "=INDEX(LINEST(D2:D" & Trim(Str(last_row1)) & ",C2:C" & Trim(Str(last_row1)) & "),2)"
Call AddFormula("lux_analysis", "Lux_Analysis", 3, 8, formula$) - Tính toán giá trị lux theo công thức xấp xỉ:
formula$ = "=10^H3"
Call AddFormula("lux_analysis", "Lux_Analysis", 3, 10, formula$) For i = 2 To last_row1
formula$ = "=A" & Trim(Str(i)) & "^G3*J3"
Call AddFormula("lux_analysis", "Lux_Analysis", i, 5, formula$) - Tính tóa sai số tương đối:
formula$ = "=Abs(E" & Trim(Str(i)) & "-B" & Trim(Str(i)) & ")/B" & Trim(Str(i)) & "*100"
Call AddFormula("lux_analysis", "Lux_Analysis", i, 6, formula$)
Ngoài ra trong ta còn sử dụng các hàm LastRow và LastCol để xác định phạm vi của dữ liệu trong một Sheets.
Hàm LastRow (ở PL5) sẽ tìm kiếm các hàng từ dưới lên và trả về giá trị của hàng chứa dữ liệu đầu tiên tìm thấy. Giá trị này chính là chỉ số hàng cuối cùng chứa dữ liệu.
Hàm LastCol(ở PL6) xẽ tìm kiếm các cột từ phải qua trái của trang tính và xẽ trả về giá trị của cột chữa dữ liệu đầu tiên tìm thấy. Giá trị này chính là chỉ số cột cuối cùng chứa dữ liệu.
Đoạn sub gop(wkbook, wksht, r1, c1, r2, c2) sẽ thực hiện gộp hai ô có địa chỉ hàng r1, cột c1(Cells(r1,c1)) và hàng r2, cột c2(Cells(r2,c2)) với nhau(ở PL9).
Đoạn sub VBColorCodes(wkbook, wksheet, ByVal vb_color_name As String, ByVal row As Integer, ByVal col As Integer) xẽ thực hiên việc tô màu nền những ô mong muốn(ở PL10).
Trong đó các tham số lần lượt là: - wkbook: tên WorkBooks - wksheet: tên Sheets
- vb_color_name: tên màu muốn tô(vbBlack, vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan, vbWhite).
- row: hàng của ô muốn tô - col: cột của ô muốn tô
Đoạn sub định dạng (Workbook, Worksheet, ByVal r1, ByVal c1, ByVal r2, ByVal c2) sẽ định dạng đường viền cho vùng được chọn (ở PL11).
Kết quả đạt được khi thực hiện với dữ liệu như trong Bảng 3.1 (Như trong hình 3.18)
Hình 3.18. Kết quả phân tích dữ liệu độ rọi lux và điện trở của quang trở
Các giá trị tìm được là: - m = -0.255493441
- b = 4.143133773
Với các giá trị trên ta có công thức xấp xỉ mối quan hệ của độ rọi và điện trở là: lux = R-0.255493441 * 104.143133773 (3.3) Dùng công thức 3.3 ta tính toán được giá trị độ rọi(lux ) theo điện trở(r ) như bảng 3.2
Gía trị lux tính theo công thức tìm được Sai số tương đối
1994.078548 5.618567176 2048.486 4.248651404 2111.06757 5.028237305 2184.332242 2.502686155 2272.077609 0.356784867 2380.419235 1.472713795 2445.367802 2.923072569 2520.074173 3.92397357
2607.533434 3.958252909 2657.375099 3.368178221 2712.278936 3.37445898 2773.250377 3.371067006 2841.611098 2.88410465 2919.143058 4.133232899 3008.323338 2.42220765 3112.727302 0.994678678 3237.766614 0.551758212 3392.156102 3.261981791 3591.167833 7.039279661 3801.855226 5.607089602
Bảng 3.2. Giá tri lux tính theo công thức và sai số tương đối
Sai số tương đối giữa giá trị xấp xỉ tính theo công thức 3.3 và giá trị thực tế được tính toán trong Sheets Lux_Analysis (Như bảng 3.2).
Từ bảng 3.2 ta thấy sai số tương đối của công thức khá nhỏ. Hầu hết sai số khoảng dưới 4%. Điều đó cho thấy việc tính toán công thức khá chính xác.
Qua ví dụ trên ta thấy việc ứng dụng VBA vào trong tính toán xử lý dữ liệu giúp tiết kiệm thời gian và có độ chính xác khá cao. Ta có thể xử lý những bộ dữ liệu tương tự một cách nhanh chóng hơn.
Hạn chế còn tồn tại khi thực hiện xử lý bằng đoạn code này là khi nhập giá lux và r vào mà để trống một số ô giá trị nào đó sẽ khiến quá trình tính toán bị sai lệch.