VBA Replace xin thêm bài dể hiểu

Liên hệ QC

chaukimsa

Thành viên chính thức
Tham gia
3/6/08
Bài viết
55
Được thích
26
Chào tất cả mọi người !
Hiện tại bài thực tập hàm VBA Replace , từ range a1 =0123456789 sẽ bằng 0101010101 với nguyên tắt số lẻ thì bằng 1 còn các số chẳn sẽ bằng 0. Minh đã có bài thực hành nhưng dài dòng lắm , mong được sự trợ giup chỉ giáo them của các ban , thành thật biết ơn
 

File đính kèm

Thử:
Mã:
Sub Replace_Curmowis2()
Dim i As Byte
For i = 2 To 9
        Range("a1").Replace i, i Mod 2
Next i
End Sub
 
Upvote 0
Thử:
Mã:
Sub Replace_Curmowis2()
Dim i As Byte
For i = 2 To 9
        Range("a1").Replace i, i Mod 2
Next i
End Sub
1. Mod 2 là con toán không hiệu quả. Muốn biết 1 số nguyên chẵn hay lẻ thì dùng toán tử And
Điển hình: IIF( i And 1, "i lẻ", "i chẵn")

2. Nếu chạy theo vòng lặp thì dùng nguyên tắc: i lẻ thì i+1 chẵn, và ngược lại
Như vậy chỉ cần test i 1 lần
le = False
For i = 2 To 9
...
le = Not le
Next i
 
Upvote 0
mình rất cảm ơn , hãy giúp mình thành một hàm tự tạo theo bài trên , thành thật biết ơn
 
Upvote 0
Anh VetMini có thể giải thích rõ hơn về phép and trong ví dụ trên được không? em có test thì ok, nhưng mà vẫn mù mờ về nó, cảm ơn anh nhiều
Biểu diễn các số dưới dạng nhị phân sẽ thấy:
001 and 001 = 001 = 1
001 and 010 = 000 = 0
100 and 010 = 000 = 0
100 and 100 = 100 = 4
 
Upvote 0
Anh VetMini có thể giải thích rõ hơn về phép and trong ví dụ trên được không? em có test thì ok, nhưng mà vẫn mù mờ về nó, cảm ơn anh nhiều
AND có thể là toán tử trong phép toán lôgic trên 2 biểu thức lôgíc, và cũng có thể là toán tử trong phép toán thực hiện trên các bit của 2 số nguyên.

a = b and c

(bit n của a) = (bit n của b) and (bit n của c)

bit = 0, 1

0 and 0 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 1

Tức and trả về 1 khi cả 2 bit = 1, ngược lại trả về 0.

Vd. b = 13 = 1101, c = 7 = 0111

a = wxyz

w = 1 and 0 = 0
x = 1 and 1 = 1
y = 0 and 1 = 0
z = 1 and 1 = 1

a = 0101 = 5

Tức 13 and 7 = 5
 
Upvote 0
AND có thể là toán tử trong phép toán lôgic trên 2 biểu thức lôgíc, và cũng có thể là toán tử trong phép toán thực hiện trên các bit của 2 số nguyên.

a = b and c

(bit n của a) = (bit n của b) and (bit n của c)

bit = 0, 1

0 and 0 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 1

Tức and trả về 1 khi cả 2 bit = 1, ngược lại trả về 0.

Vd. b = 13 = 1101, c = 7 = 0111

a = wxyz

w = 1 and 0 = 0
x = 1 and 1 = 1
y = 0 and 1 = 0
z = 1 and 1 = 1

a = 0101 = 5

Tức 13 and 7 = 5
Biểu diễn các số dưới dạng nhị phân sẽ thấy:
001 and 001 = 001 = 1
001 and 010 = 000 = 0
100 and 010 = 000 = 0
100 and 100 = 100 = 4
Cảm ơn Hữu Thắng và anh Batman nhiều, tôi đã rất rõ về vấn đề này rồi và có thêm kinh nghiệm về nó, xin chân thành cảm ơn
 
Upvote 0
Anh VetMini có thể giải thích rõ hơn về phép and trong ví dụ trên được không? em có test thì ok, nhưng mà vẫn mù mờ về nó, cảm ơn anh nhiều
Đầu tiên hết, bạn cần hiểu rõ rằng:

1. các toán tử Lô gic trong VBA, And Or và Not là phép tính trên bit chứ không phải trên trị.
Phép tính (N And M) tức là phép đem And tất cả các bit tương ứng giữa N và M. Nếu N và M không có bit nào là 1 ở cùng vị trí thì kết quả sẽ là 0.
Vì vậy, phép tính (N And 1) là phép tính xét xem cái bit nhỏ nhất của N có phải là 1 hay là 0 (số 1 có bit nhỏ nhất là 1 và các bit còn lại là 0)

2. số lẻ có bit nhỏ nhất là 1 và số chẵn có bit này là 0

3. Lênh If xét biểu thức của nó như sau: nếu kết quả là 0 thì coi như False, nếu bất cứ trị nào khác 0 thì coi như True.
Mọt số nguyên có bất cứ bit nào khác 0 thì coi như có trị khác 0.

Chiếu theo 3 điều trên, nếu ta xét kết quả của (N And 1) thì sẽ biết số N đó là chẵn hay lẻ.

Cách này rất hữu hiệu, nhấn mạnh rất hữu hiệu, vì toán tử And bit là toán tử tự nhiên của CPU, nó chạy rất lẹ. Trong khi đó, toán tử Mod cần phải chia, nhân, và trừ mới ra kết quả (*).

(*) Một số trình dịch hiện nay biết chia 2 và nhân 2 có nghĩa là dịch bit về phía trái/phải một bước. Phép dịch bit cũng rất nhanh. Một số trình dịch hạng chiến hơn biết cả Mod 2 có nghĩa là xét bit 1.
Nhưng tôi chưa hề nghe nói VBA có phần tự tối ưu hóa khi dịch code. (tôi chưa nghe không có nghĩa là không có)
 
Upvote 0
Đầu tiên hết, bạn cần hiểu rõ rằng:

1. các toán tử Lô gic trong VBA, And Or và Not là phép tính trên bit chứ không phải trên trị.
Phép tính (N And M) tức là phép đem And tất cả các bit tương ứng giữa N và M. Nếu N và M không có bit nào là 1 ở cùng vị trí thì kết quả sẽ là 0.
Vì vậy, phép tính (N And 1) là phép tính xét xem cái bit nhỏ nhất của N có phải là 1 hay là 0 (số 1 có bit nhỏ nhất là 1 và các bit còn lại là 0)

2. số lẻ có bit nhỏ nhất là 1 và số chẵn có bit này là 0

3. Lênh If xét biểu thức của nó như sau: nếu kết quả là 0 thì coi như False, nếu bất cứ trị nào khác 0 thì coi như True.
Mọt số nguyên có bất cứ bit nào khác 0 thì coi như có trị khác 0.

Chiếu theo 3 điều trên, nếu ta xét kết quả của (N And 1) thì sẽ biết số N đó là chẵn hay lẻ.

Cách này rất hữu hiệu, nhấn mạnh rất hữu hiệu, vì toán tử And bit là toán tử tự nhiên của CPU, nó chạy rất lẹ. Trong khi đó, toán tử Mod cần phải chia, nhân, và trừ mới ra kết quả (*).

(*) Một số trình dịch hiện nay biết chia 2 và nhân 2 có nghĩa là dịch bit về phía trái/phải một bước. Phép dịch bit cũng rất nhanh. Một số trình dịch hạng chiến hơn biết cả Mod 2 có nghĩa là xét bit 1.
Nhưng tôi chưa hề nghe nói VBA có phần tự tối ưu hóa khi dịch code. (tôi chưa nghe không có nghĩa là không có)
Dạ cảm ơn anh nhiều, em cũng đã được học hỏi và hiểu rõ bài này thông qua bài 6 và bài 7. Cộng thêm bài giải thích của anh nữa em nghĩ kiến thức này của em cũng khá vững để hiểu về nó, tuy rằng các vấn đề này có cách giải quyết khác, nhưng gặp cách giải quyết như trên em muốn hiểu nó để ai đó có hỏi thì mình có thể chém gió một tí, cảm ơn anh rất nhiều
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom