Giúp em hiểu thế nào là chuỗi, thế nào là biến

Liên hệ QC

Dauthivan

Thành viên tiêu biểu
Tham gia
15/8/08
Bài viết
565
Được thích
326
Em chưa phần biệt được những cái gì được coi là là chuỗi, những cái nào thế nào là biến. Chính vì vậy mà em không tài nào nhớ được cách dùng dấu "" trong VBA, cách dùng cụ thể trong bài toán, em có thắc mắc tại bài http://www.giaiphapexcel.com/forum/showthread.php?59834-Nhờ-tính-VL-NC-MTC-đối-với-mỗi-công-việc-chuyển-dữ-liệu-từ-hàng-dọc-sang-hàng-ngang/page3. Kính mong nhận được sự giúp đỡ.
 
Em chưa phần biệt được những cái gì được coi là là chuỗi, những cái nào thế nào là biến. Chính vì vậy mà em không tài nào nhớ được cách dùng dấu "" trong VBA, cách dùng cụ thể trong bài toán, em có thắc mắc tại bài http://www.giaiphapexcel.com/forum/showthread.php?59834-Nhờ-tính-VL-NC-MTC-đối-với-mỗi-công-việc-chuyển-dữ-liệu-từ-hàng-dọc-sang-hàng-ngang/page3. Kính mong nhận được sự giúp đỡ.
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
 
Lần chỉnh sửa cuối:
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ỏ.

Hy vọng viết thế này không bị mắng.
 
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ỏ.

Hy vọng viết thế này không bị mắng.
---------------------
Sử dụng biến trong mảng khó nhớ quá (khi nào thì nó phải có dấu " ", khi nào không)

Từ hôm nọ cho đến bây giờ, em cứ lung tung không nhớ được về việc cách sử dụng biến trong khai báo mảng:

em ví dụ Code

PHP Code:
Sub NhapCongThuc()
Dim DuLieu, KetQuaCT, DongDau As Long, DongCuoi As Long, CongViec As Long, Nhom As Long, ChiTiet As Long, i As Long, j As Long, TenShCT As String
DongDau
= 3
DongCuoi
= [C65536].End(xlUp).Row
DuLieu
= Range("A" & (DongDau + 1) & ":C" & DongCuoi).Value
Range
("G" & (DongDau + 1) & ":G" & DongCuoi).ClearContents
KetQuaCT
= Range("G" & (DongDau + 1) & ":G" & DongCuoi).Value
TenShCT
= "='" & ActiveSheet.Name & "'!"
For i = 1 To UBound(DuLieu, 1)
If
DuLieu(i, 3) = "Tr" & ChrW(7921) & "c ti" & ChrW(7871) & "p phí khác" Then
KetQuaCT
(i, 1) = "=15/100*R[" & (CongViec - i) & "]C"
ElseIf DuLieu(i, 1) <> "" Then
CongViec
= i
KetQuaCT
(CongViec, 1) = "="
ElseIf DuLieu(i, 1) & DuLieu(i, 2) = "" Then
Nhom
= i
KetQuaCT
(CongViec, 1) = KetQuaCT(CongViec, 1) & "+R[" & (Nhom - CongViec) & "]C"
Else
KetQuaCT(Nhom, 1) = "=SUM(R[1]C:R[" & (i - Nhom) & "]C)*RC[-2]"
KetQuaCT(i, 1) = "=RC[-2]*RC[-1]"
End If
Next
Range
("G" & (DongDau + 1) & ":G" & DongCuoi) = KetQuaCT
End Sub


DongDau, DongCuoi nó đều là biến, nhưng tại sao cách dùng lúc nó lại không cần nằm trong "" như ở đoạn này

PHP Code:
KetQuaCT = Range("G" & (DongDau + 1) & ":G" & DongCuoi).Value


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

PHP Code:
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 "")?
 
Bạn ngâm cứu cái này xem sao

PHP:
Option Explicit
Sub Type_()
 Dim Rws As Long, ViTri As Byte
 Dim GPE As String
 
 Rws = [A65500].End(xlUp).Row
 GPE = "Dòng Cuói: 0" & Rws & " "
 MsgBox 2 * Rws, , GPE
 ViTri = 1 + InStr(GPE, ":")
 Rws = Mid(GPE, ViTri, 7)
 MsgBox Len("A" & Rws), , Len("A" & CStr(Rws))
End Sub
 
---------------------
DongDau, DongCuoi nó đều là biến, nhưng tại sao cách dùng lúc nó lại không cần nằm trong "" như ở đoạn này

KetQuaCT = Range("G" & (DongDau + 1) & ":G" & DongCuoi).Value

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.
 
Lần này em chắc phải nhờ thày mắng cho thì mới hiểu ra các kiểu viết khác nhau, em đang lung tung cái vụ này

Nếu em viết Code sau đây (Tại màn hình Excel ô A9 ban đầu có giá trị bằng 2)
PHP:
Sub Macro1()
    [B9] = [A9] + 10
    End Sub
tại ô B9 hiện kết quả Value là 12 (tức 10+2).

Bây giờ em phải thêm vào Code như thế nào (không sử dụng tham chiếu dạng RC) để tại ô B9 sau khi hiện Code nó hiện ra công thức (=A9+10) ah.
 
Lần này em chắc phải nhờ thày mắng cho thì mới hiểu ra các kiểu viết khác nhau, em đang lung tung cái vụ này

Nếu em viết Code sau đây (Tại màn hình Excel ô A9 ban đầu có giá trị bằng 2)
PHP:
Sub Macro1()
    [B9] = [A9] + 10
    End Sub
tại ô B9 hiện kết quả Value là 12 (tức 10+2).

Bây giờ em phải thêm vào Code như thế nào (không sử dụng tham chiếu dạng RC) để tại ô B9 sau khi hiện Code nó hiện ra công thức (=A9+10) ah.

Bạn cứ việc gõ bình thường thôi: [B9].Formula ="=A9 + 10"

(Càng ngày thấy Chị Ngọc Mai càng dễ thương quá! Đầu óc sáng ngời chứ có tối tăm già cõi gì đâu ta?)
 
Lần chỉnh sửa cuối:
Bạn cứ việc gõ bình thường thôi: [B9].Formula ="=A9 + 10"


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.
 
Lần chỉnh sửa cuối:
Mắng thì vẫn mắng, nhưng vẫn phải giảng giải.

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)
 
Lần chỉnh sửa cuối:
Mắng thì vẫn mắng, nhưng vẫn phải giảng giải.

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ừ.
 
Web KT
Back
Top Bottom