Nói 1 cách đơn giản: Giống như bạn dùng công thức trên bảng tính vậy! Tức trên bảng tính bạn viết sao thì trong VBA cũng gần giống thế
Kinh nghiệm của tôi:
- Với những ai mới học VBA thì sẽ có rất nhiều câu hỏi TẠI SAO cần giải đáp
- Nếu cái gì cũng muốn biết tường tận thì e rằng dù có được trợ giúp bạn cũng không tài nào nhớ hết
- Vậy nên, cái gì chưa "ngộ" ra được, thôi hãy tạm bỏ qua 1 bên, nghiên cứu thứ khác
- Trong quá trình nghiên cứu các "thứ khác" có khi tình cờ ta lại "ngộ" ra được những vấn đề mà ta từng bỏ qua 1 bên ấy
Ngocmai từ lâu không dám đụng vào VBA, vì cái đầu óc tối tăm già cỗi của mình. Tuy nhiên vụ này ngocmai biết. Ngocmai hiểu rất đơn giản: Biến thì có thể "biến", chuỗi bên trong dấu " " thì không "biến".
(Nghề phù thuỷ của ngocmai là hô biến mà lị)
Thí dụ gõ công thức này trong sheet thì không thể biến:
="Ngày 19 tháng 01 năm 2012"
Muốn "biến", thì phải gắn biến vào, thí dụ:
="Ngày " & A1 & " tháng " & A2 & " năm 2012"
Vậy thì A1, A2 là biến. Biến mà "biến", thì kết quả công thức "biến" theo. Nếu sửa ô A1 thành số khác, thì kết quả ra chuỗi khác.
Nhưng còn 1 chỗ không biến, đó là "năm 2012", vậy công thức này chỉ xài được 1 năm rồi vứt bỏ.
Ngocmai từ lâu không dám đụng vào VBA, vì cái đầu óc tối tăm già cỗi của mình. Tuy nhiên vụ này ngocmai biết. Ngocmai hiểu rất đơn giản: Biến thì có thể "biến", chuỗi bên trong dấu " " thì không "biến".
(Nghề phù thuỷ của ngocmai là hô biến mà lị)
Thí dụ gõ công thức này trong sheet thì không thể biến:
="Ngày 19 tháng 01 năm 2012"
Muốn "biến", thì phải gắn biến vào, thí dụ:
="Ngày " & A1 & " tháng " & A2 & " năm 2012"
Vậy thì A1, A2 là biến. Biến mà "biến", thì kết quả công thức "biến" theo. Nếu sửa ô A1 thành số khác, thì kết quả ra chuỗi khác.
Nhưng còn 1 chỗ không biến, đó là "năm 2012", vậy công thức này chỉ xài được 1 năm rồi vứt bỏ.
Vậy em xin phép nhờ bác giúp cho em trong trường hợp này thì DongDau, DongCuoi, Nhom được sử dụng cụ thể ở hai công thức trên thì chúng là biến hay là chuỗi.
(Em thắc mắc nếu coi DongDau, DongCuoi là chuỗi thì tại sao khi sử dụng Range nó lại không nằm trong dấu "")?
Thế nhưng dòng này nó lại chịu sự quản lý của dấu "", ví dụ tại dòng
KetQuaCT(Nhom, 1) = "=SUM(R[1]C:R[" & (i - Nhom) & "]C)*RC[-2]"
Vậy em xin phép nhờ bác giúp cho em trong trường hợp này thì DongDau, DongCuoi, Nhom được sử dụng cụ thể ở hai công thức trên thì chúng là biến hay là chuỗi.
(Em thắc mắc nếu coi DongDau, DongCuoi là chuỗi thì tại sao khi sử dụng Range nó lại không nằm trong dấu "")?
Cả 2 dòng thí dụ trên, và cả nguyên đoạn code, biến vẫn là biến, chuỗi vẫn là chuỗi. Biến thì thảnh thơi không bị ràng buộc nên vẫn iu cuộc đời màu xanh, Chuỗi thì bị khoá đầu khoá đuôi bằng " nên giận đỏ mặt.
Ngoài ra, tất cả cái gì đã khai báo bằng lệnh Dim thì nó phải là biến, và suốt đời là biến. Nếu cố tình khoá đầu khoá đuôi, nó mới trở thành chuỗi, nhưng chuỗi này mang giá trị = tên biến, chứ không phải mang giá trị (số hoặc chuỗi) đã gán cho biến.
Ngoài ra, nếu cố tình ghi như sau:
Msgbox"Bien dongcuoi co gia tri là: " &dongcuoi
Thì kết quả sẽ là:
Bien dongcuoi co gia tri la 155
Nghĩa là: thằng nào đỏ tức là bị nhốt, dù là biến cũng không "biến" được. Thằng nào là biến và không bị nhốt, thì "biến" được
Ngocmai già cỗi ngu dốt không biết VBA, nhưng nhìn màu sắc cũng phân biệt được như thế đấy.
Đang định mắng đúng vào chỗ này. Trong cửa sổ code có khi còn lẫn lộn dấu " nào là đầu, dấu " nào là đuôi. Chứ đã post lên php code, xanh đỏ rõ ràng như vậy mà còn trông gà hoá cuốc thì đáng mắng thật.
Do trước kia em chưa tiếp xúc nhiều về VBA thành thử em không biết những đối tượng bôi màu đỏ, màu xanh để là gì nữa? em thực hành mấy bài toán nhỏ, khi đến phần khai báo mảng hễ không nhìn các bài mẫu trên diễn đàn là em làm toàn sai thôi; em cố nhớ theo kiểu nhớ máy móc cũng được mà không tài nào nhớ nổi.
May nhờ thày lưu ý cho, chị ngocmaipretty phân tích dùm, em ngồi từ chiều để nghiên cứu cho đến bây giờ thì em hoàn toàn hiểu được việc sử dụng dấu "" trong khai báo mảng VBA, ví dụ bây giờ em cho thừa dấu "" thành thế này cũng được:
PHP:
Sub thu()
[B9] = "=A" & "9" & "+ 10"
End Sub
Hỏi thì lo thày mắng cho, nhưng nếu không hỏi quả thực không biết bao giờ em mới phân biệt được.
1. Đọc code:
Post bài lên gpe sử dụng php code mới thấy xanh đỏ. Còn trong cửa sổ soạn thảo code thì đâu có xanh đỏ gì. Vậy phân biệt cách nào?
Hãy nhớ các nguyên tắc:
- Số lượng dấu " phải là chẵn, chia thành đủ cặp.
- Mỗi cặp thì có 1 mở và 1 đóng
- giữa mỗi cặp mở đóng, là chuỗi. trong 1 biểu thức nối nhiều chuỗi thành 1, giữa đóng chuỗi này và mở chuỗi kia, nếu có cái gì, thì là giá trị hoặc biến. (nếu là range... khi nối bằng dấu & cũng là lấy giá trị để nối).
thí dụ
KetQuaCT(Nhom, 1) = "=SUM(R[1]C:R[" & (i - Nhom) & "]C)*RC[-2]"
Tất cả đều đen thùi, không xanh không đỏ. Nhưng cứ đếm thứ tự đi: 1 mở, 2 đóng, 3 mở, 4 đóng, 5 mở, 6 đóng, .... thì sẽ thấy từng cặp, bên trong mỗi cặp là chuỗi cố định, bên ngoài các cặp mở đóng là giá trị hoặc biến.
2. Viết code:
Cũng phải nhớ nguyên tắc mở đóng. Có mở thì phải có đóng.
Nhớ thêm nguyên tắc mở đúng chỗ và đóng đúng chỗ. Đúng chỗ là đóng vào đúng chỗ cần kết thúc chuỗi.
Nếu muốn chẻ 1 chuỗi dài thành nhiều chuỗi con, nhét biến vào giữa, thì phải bổ sung dấu " cho chẵn.
thí dụ ta có:
[B9].Formula ="=A9+10*B9"
bây giờ ta không muốn lúc nào cũng + 10*B9, mà cộng với 1 giá trị thay đổi đó là biến iAdd nhân B9
chẻ ra:
[B9].Formula = "=A9+" & iAdd & "*B9"
Kiểm tra sau khi viết 1 câu nối chuỗi:
Mở cửa sổ immediate
Gõ iAdd = 100 rồi Enter
Gõ dấu ? rồi gõ chuỗi cần kiểm tra:
?"=A9+" & iAdd & "*B9"
và Enter
Nếu kết quả hiện ra là =A9+100*B9
thì đã làm đúng, tự thưởng 1 miếng mít. Gai mít để dành, sau này dùng
3. Giảng giải rồi, mà hỏi nữa thì mắng tiếp, và bắt dùng gai mít (để quỳ lên)
1. Đọc code:
Post bài lên gpe sử dụng php code mới thấy xanh đỏ. Còn trong cửa sổ soạn thảo code thì đâu có xanh đỏ gì. Vậy phân biệt cách nào?
Hãy nhớ các nguyên tắc:
- Số lượng dấu " phải là chẵn, chia thành đủ cặp.
- Mỗi cặp thì có 1 mở và 1 đóng
- giữa mỗi cặp mở đóng, là chuỗi. trong 1 biểu thức nối nhiều chuỗi thành 1, giữa đóng chuỗi này và mở chuỗi kia, nếu có cái gì, thì là giá trị hoặc biến. (nếu là range... khi nối bằng dấu & cũng là lấy giá trị để nối).
thí dụ
KetQuaCT(Nhom, 1) = "=SUM(R[1]C:R[" & (i - Nhom) & "]C)*RC[-2]"
Tất cả đều đen thùi, không xanh không đỏ. Nhưng cứ đếm thứ tự đi: 1 mở, 2 đóng, 3 mở, 4 đóng, 5 mở, 6 đóng, .... thì sẽ thấy từng cặp, bên trong mỗi cặp là chuỗi cố định, bên ngoài các cặp mở đóng là giá trị hoặc biến.
2. Viết code:
Cũng phải nhớ nguyên tắc mở đóng. Có mở thì phải có đóng.
Nhớ thêm nguyên tắc mở đúng chỗ và đóng đúng chỗ. Đúng chỗ là đóng vào đúng chỗ cần kết thúc chuỗi.
Nếu muốn chẻ 1 chuỗi dài thành nhiều chuỗi con, nhét biến vào giữa, thì phải bổ sung dấu " cho chẵn.
thí dụ ta có:
[B9].Formula ="=A9+10*B9"
bây giờ ta không muốn lúc nào cũng + 10*B9, mà cộng với 1 giá trị thay đổi đó là biến iAdd nhân B9
chẻ ra:
[B9].Formula = "=A9+" & iAdd & "*B9"
Kiểm tra sau khi viết 1 câu nối chuỗi:
Mở cửa sổ immediate
Gõ iAdd = 100 rồi Enter
Gõ dấu ? rồi gõ chuỗi cần kiểm tra:
?"=A9+" & iAdd & "*B9"
và Enter
Nếu kết quả hiện ra là =A9+100*B9
thì đã làm đúng, tự thưởng 1 miếng mít. Gai mít để dành, sau này dùng
3. Giảng giải rồi, mà hỏi nữa thì mắng tiếp, và bắt dùng gai mít (để quỳ lên)
Ngày cuối năm nhiều bận rộn lo toan, nhưng Anh PTM vẫn dành thời gian để dạy và mắng!, cặn kẽ, chi tiết từng tí như vậy (không có trong bất cứ sách vở nào). Thật là ấm áp tình thầy, tình anh em, tình bạn trong Anh. Rất đơn giản đời thường nhưng nghĩa cử lại cao cả, nhất là trong thời buổi này. Xin cám ơn Anh (và một số anh em khác) vì sự nhiệt huyết này.
Xin lỗi vì mình đã đi lạc đề topic nhưng đó là cảm xúc khi đọc bài viết của Anh Mỹ dành cho các bạn "trẻ". Nếu thấy không phù hợp thì nhờ Mod xóa đi!!!
Hồi lớp 10 tôi thường hay lẻo đẻo đi theo một anh 12 để nhờ ảnh chỉ cho lập trình Pascal. Cứ hỏi với vấn đề gì mà ảnh thấy khó trả lời là ảnh hỏi: Học chuỗi chưa? Nếu chưa thì đừng hỏi nữa!
Hồi đó rất tức, không biết chuỗi là cái gì mà ảnh làm "ghê" vậy! Tới lúc biết chuỗi là gì rồi thì mới ngớ ra là chuyện mà mình hỏi ảnh hồi xưa chẳng có liên quan gì đến chuỗi ráo trọi.
Nói về chuỗi và biến thì thực sự là 2 cái này theo tôi là không liên quan gì đến nhau.
- Chuỗi là ám chỉ một đoạn ký tự, đoạn ký tự này là nếu viết thẳng ra trong code thì phải nằm trong cặp dấu ngoặc kép ""
ví dụ: muốn gán vào ô A1 một đoạn ký tự abcd thì viết:
Mã:
[A1] = "abcd"
hoặc nếu đoạn ký tự "abcd" có sẳn được lưu trữ trong một nơi chứa giá trị khác ví dụ trong ô A2 có một chuỗi "abcd"
Và ta muốn ô A1 có đoạn ký tự đó có thể viết:
Mã:
[A1] = [A2]
--> Đoạn này được VBA ngầm hiểu là
Mã:
[A1].Value = [A2].Value
Sau đó ta sẽ có chuỗi "abcd" trong ô A1.
- Biến là một "vật thể" (đối tượng, object) lưu trử giá trị và thường được dùng để vận chuyển một giá trị nào đó. Tưởng tượng rằng nó như một chiếc xe tải. Tất nhiên nó chở cái gì là do người viết code yêu cầu và hoàn toàn có thể đổi thứ mà nó đang chở bằng thứ khác.
Ví dụ mình có một biến tên là: x
Yêu cầu x chở giá trị lớn nhất trong 3 ô A1, A2, A3 thì có thể viết đơn giản như thế này:
Mã:
If [A1]>=[A2] then
x = [A1]
Else
x = [A2]
End if
IF [A3]>=x then x = [A3]
Ví dụ tiếp theo mình có một biến tên là: x
Yêu cầu x lấy giá trị có độ dài dài nhất trong 3 ô A1, A2, A3 thì có thể viết đơn giản như thế này:
Mã:
If len([A1])>=len([A2]) then
x = [A1]
Else
x = [A2]
End if
IF len([A3])>=len(x) then x = [A3]
kết quả: nếu A1 = "ab", A2 = "ABC", A3 = "abcd" thì x = "abcd"
Trong ví dụ về biến thứ nhất thì biến lưu trữ giá trị là một số, trong ví dụ sau thì biến x lưu trử giá trị là một nhóm các ký tự.
Biến có thể được ép buộc phải là một thể loại giá trị nào đó ví dụ như là số, hoặc là chuỗi hoặc một dạng đối tượng... khi nó được khai báo và đoạn khai báo bắt đầu bằng chữ Dim
Ví dụ:
Dim x as double
Dim y as string
double: là một kiểu biến là số (có nhiều kiểu biến số)
string: là loại biến chuỗi.
Nếu là chuỗi thì không biến này không thể cộng trừ.