Đố vui về VBA!

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,905
Nhằm cũng cố kiến thức về VBA cho các bạn mới bắt đầu và cả những bạn đang ứng dụng mà chưa hiểu nhiều về nó, tôi mở topic này với mong mõi qua những câu hỏi vui, các bạn sẽ nhận định lại sự hiểu biết cũa mình... (Kễ cã chính tôi cũng đang tập tành nên có rất nhiều cái chưa biết)
Mong rằng topic sẽ mang đến cho các bạn những khám phá thú vị với những cái tưỡng chừng như đã biết
Mong nhận dc bài viết về câu đố cũa các cao thủ! Còn các bạn mới thì đừng ngại khi đưa ra ý kiến cũa mình.. Có sai có sữa sẽ hoàn thiện!
Tôi xin mỡ màn trước bằng 1 câu hỏi đơn giãn
ANH TUẤN

CÂU HỎI 1: Tại sao biến K ko hoạt động?
Tôi muốn khi nhấn vào 1 button thì cell A1 sẽ tăng lên 1 đơn vị... Tôi đã làm như sau:
-Tạo 1 Command Button (nút nhấn thuộc thanh Control Toolbox), click phải chuột lên nút nhấn, chọn View code, rồi gõ vào đoạn code sau:
PHP:
Private Sub CommandButton1_Click()
   K = K + 1
   Range("A1").Value = K
End Sub
Ban đầu K chưa có gì, xem như =0, nhấn nút lần thứ nhất thì K dc tăng thêm 1, vậy K hiện tại sẽ bằng 1, và gán K vào cell A1 thì đương nhiên A1 sẽ =1... Nhấn nút lần 2, K lại dc tăng thêm 1 nên hiện tại K sẽ =2 và cell A1 cũng sẽ =2... vân vân.. từ đó diễn tiến tiếp...
Hi.. hi.. Điều này nghe qua có vẽ rất hợp lý, ấy thế mà khi nhấn nút nó chỉ hoạt động dc duy nhất 1 lần (A1 = 1) rồi thôi ko nhút nhít nữa...
Các bạn có thể giãi thích tại sao lại như thế ko? Tại sao những lần nhấn nút sau đó K lại ko tăng thêm tí nào (vì thực tế A1 vẫn cứ = 1 hoài) ?
ANH TUẤN
 
Theo tôi biết thì bài toán về số nguyên tố cực lớn thuộc nhóm các bài toán có độ phức tạp cao nhất (hình như gọi là NP-Hard). Trong đó có bài toán phân tích nhân tử áp dụng trong mật mã công khai. Khi đó tồn tại các số nguyên tố có đến hàng trăm chữ số.

Với khả năng tính toán có giới hạn trên trường số nguyên (trong Excel cũng như với hầu hết các ngôn ngữ lập trình) thì việc tính các số nguyên lớn thường phải dựa vào các hàm phụ trợ tính toán trên các chuỗi số (xây dựng các lớp để thực hiện các phép tính trên chuỗi số thay vì trên số).

(Có thể tham khảo các phần mềm toán chuyên dụng: MathLap, MathCad...)

Thân!
 
Upvote 0
Bác có thể nói rõ hơn không? Hiện em đang đi theo hướng tìm quy tắc của các số nguyên tố này và hình nhưng chưa có quy tắc nào phù hợp cả. Còn 1 vấn đề nữa em cũng đang nghĩ đến là việc tách số ra lớn ra nhiều số nhỏ hơn kiểu như 15815384 * 10 ^ 5 +1536157 nhưng không biết khi tách ra như vậy có ảnh hưởng gì đến kết quả không?
 
Lần chỉnh sửa cuối:
Upvote 0
Các bác ơi! Em tìm thấy trang này: http://www.codeproject.com/KB/cs/biginteger.aspx?print=true nhưng không biết cách dùng như thế nào? Mong ai đọc được English rành thì chỉ cho em với. Hình như nó nói về cách tính Big Integer nhưng cụ thể dùng ra sao thì ... ? Có ai giỏi toán học không? Dịch giùm em cái này ra Code với? Đọc vào mù luôn! http://vi.wikipedia.org/wiki/Ki%E1%BB%83m_tra_t%C3%ADnh_nguy%C3%AAn_t%E1%BB%91 http://vi.wikipedia.org/wiki/Kiểm_tra_Miller-Rabin http://vi.wikipedia.org/wiki/Kiểm_tra_Solovay-Strassen http://forums.congdongcviet.com/showthread.php?t=1366&page=2 Help!Help!Help!Help!Help!
 
Lần chỉnh sửa cuối:
Upvote 0
Lâu quá chẳng thấy ai ghé thăm, mà nếu có ghé cũng chẳng hỏi chuyện.. vui...
He... he...
Hôm nay xin góp cho bà con 1 câu hỏi đúng là.. vui vui đây
1> Đoạn code 1
PHP:
Sub Test1()
  With Range("D4")
    .Offset(2, 2).Select
    MsgBox Selection.Address
  End With
End Sub

2> Đoạn code 2
PHP:
Sub Test2()
  With Range("D4")
    .Cells(2, 2).Select
    MsgBox Selection.Address
  End With
End Sub
Theo các bạn thì 2 đoạn code trên đã làm điều gì?
- Cell nào sẽ được chọn?
- MsgBox ghi cụ thể là cái gì?
 
Upvote 0
Lâu quá chẳng thấy ai ghé thăm, mà nếu có ghé cũng chẳng hỏi chuyện.. vui...
He... he...
Hôm nay xin góp cho bà con 1 câu hỏi đúng là.. vui vui đây
1> Đoạn code 1
PHP:
Sub Test1()
  With Range("D4")
    .Offset(2, 2).Select
    MsgBox Selection.Address
  End With
End Sub
2> Đoạn code 2
PHP:
Sub Test2()
  With Range("D4")
    .Cells(2, 2).Select
    MsgBox Selection.Address
  End With
End Sub
Theo các bạn thì 2 đoạn code trên đã làm điều gì?
- Cell nào sẽ được chọn?
- MsgBox ghi cụ thể là cái gì?

Code 1:
Range("F6") được chọn [Cell(6,6)]
Msgbox ghi: $F$6

Code 2
Range("E5") được chọn [Cell(5,5)]
Msgbox ghi: $E$5

Hai đoạn code trên chỉ để select cell!
Code 1 dùng Offset. Lấy Range("D4") làm chuẩn

Code 2 khác chút, Range("D4").Cells(2,2): Range("D4") làm chuẩn, nên trong hệ quy chiếu này Rang("D4") tương đương cột mốc chính. Nên Cells(2,2) lúc này sẽ phải tính từ Range("D4") (Giống như ta dùng sheets("Sheet1").Cells(2,2), lúc này sheets("sheet1") là hệ quy chiếu, gốc của nó mặc định là A1 vậy!)
 
Upvote 0
Dear Anh
+ Với Test 1 thì ô được chọn là F6, và msgbox là $F$6

Với Test 2 thì ô được chọn là E5, và msgbox sẽ ghi là $E$5

ở test 2 này em thấy hay ở chỗ là tuy ghi là cells(2,2) nhưng lại thành E5

Anh chỉ thêm
 
Upvote 0
Cãm ơn Ca_dafiST-Lu! đã góp vui
Nhưng... chưa chắc những cái 2 bạn nói là đáp án đâu
Thế mới là ĐỐ VUI chứ (vì code đã có, chỉ việc copy và paste vào là chạy ---> Đâu có đơn giãn thế)
He... he...
 
Upvote 0
Anh ơi
Em thấy test 1 còn hiểu (đối với em). Nhưng Test 2 không biết giải thích thế nào.

Em chịu rồi
 
Upvote 0
Anh ơi
Em thấy test 1 còn hiểu (đối với em). Nhưng Test 2 không biết giải thích thế nào.

Em chịu rồi
Cái này giống hàm INDEX của công thức Excel ấy!
Ví dụ:
PHP:
Set Rng = Range("F5:I10")
Rng(2,2).Select
Có nghĩa là chọn dòng 2, cột 2 của Rng, tức chọn G6
===> Rng(1,1) = F5
===> Rng(0,0) = E4
===> Gần giống với Offset nhưng lệch với Offset 1 đơn vị
Đoạn code này:
PHP:
Sub Test2()
  With Range("D4")
    .Cells(2, 2).Select
    MsgBox Selection.Address
  End With
End Sub
viết rõ ra sẽ là vầy:
PHP:
Sub Test2()
    Range("D4")(2, 2).Select
    MsgBox Selection.Address
End Sub
(cứ nghĩ Range("D4") chính là Rng tôi ví dụ ở trên, bạn sẽ hiểu ngay)
 
Upvote 0
Gửi các bạn file đáp án! Xem thử bên trong nó nói cái gì nha!
Thí nghiệm này muốn nói với các bạn rằng:
- Một bài toán tưởng chừng đơn giản nhưng vẫn có thể ko đơn giãn như ta đã nghĩ
- Offset Properties có vẽ mang ý nghĩa "vật lý" hơn.... Nếu tính toán gì đó trên "giấy tờ" dựa vào Offset thì hãy coi chừng... sa bẫy (tôi đã từng bị như thế)..
- Hay nói cụ thể hơn: Range("A1").Offset(1,1) chưa chắc là cell B2 đâu nha
 

File đính kèm

  • DoVui_VBA_01.xls
    19.5 KB · Đọc: 82
Upvote 0
Gửi các bạn file đáp án! Xem thử bên trong nó nói cái gì nha!
Thí nghiệm này muốn nói với các bạn rằng:
- Một bài toán tưởng chừng đơn giản nhưng vẫn có thể ko đơn giãn như ta đã nghĩ
- Offset Properties có vẽ mang ý nghĩa "vật lý" hơn.... Nếu tính toán gì đó trên "giấy tờ" dựa vào Offset thì hãy coi chừng... sa bẫy (tôi đã từng bị như thế)..
- Hay nói cụ thể hơn: Range("A1").Offset(1,1) chưa chắc là cell B2 đâu nha
Cám ơn Bác nhiều, nhờ đó mới để ý dùng offset nhớ kiểm tra merge cell. Cái này Thầy Long lúc viết Code sort với hơn 3 côt có bẫy mà không để ý.
 
Upvote 0
Thanks anh Tuấn,

Theo em vấn đề ở đây không phải do offset hay cells quyết định. Mà nguyên nhân bị sai là do Select. Nhưng thế mơi thấy cần phải nghiên cứu rõ trường hợp select này.

Hi vọng có thể tham gia tiếp các câu đố sau của anh.
 
Upvote 0
Chào mọi người! Tôi có 1 câu hỏi...
Đây cũng không hẳn là câu đố vui nhưng tình huống của nó thì tôi nghĩ chúng ta rất thường gặp
- Có 1 danh sách nằm ở A1:C35
- Cột C chứa dử liệu: DL1, DL2... đến DL15 ( nằm lộn xộn)
- Cell E2 dùng Validation để chọn điều kiện
- Dùng Advanced Filter lọc ra kết quả đặt tại I1 theo điều kiện ở E2
Vấn đề là Advanced Filter trong file này làm việc không chính xác! Khi chọn điều kiện = DL1 thì nó lọc luôn DL10, DL11...
===> Vậy nếu bắt buộc phải dùng Advanced Filter thì phải làm cách nào
(Đương nhiên AutoFilter không bị tình trạng này)
Xin hãy xem file và cho biết giãi pháp
 

File đính kèm

  • Cauhoive_AdvancedFilter.xls
    21.5 KB · Đọc: 80
Upvote 0
Bác xem thử cái này nhé.

[Highlight=VB]Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim SL
If Target.Address = "$E$2" Then
Application.EnableEvents = False
SL = [E2]
[E2] = "=""=" & SL & """"
[I1].CurrentRegion.Clear
[A1].CurrentRegion.AdvancedFilter 2, [E1:E2], [I1]
[E2] = SL
Application.EnableEvents = True
End If
End Sub[/highlight]
 
Upvote 0
Advance Filter with Criteria is Text

Trước hết bạn có thể đọc cái này
PHP:
All items that begin with that text are filtered. For example, if you type the text Dav as a criterion, Microsoft Excel finds "Davolio," "David," and "Davis." To match only the specified text, type the following formula, where text is the text you want to find. =''=text''

và kiểm tra lại file đính kèm.

Thân!
 

File đính kèm

  • Cauhoive_AdvancedFilter.xls
    22 KB · Đọc: 60
Upvote 0
Bác xem thử cái này nhé.

[highlight=VB]Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim SL
If Target.Address = "$E$2" Then
Application.EnableEvents = False
SL = [E2]
[E2] = "=""=" & SL & """"
[I1].CurrentRegion.Clear
[A1].CurrentRegion.AdvancedFilter 2, [E1:E2], [I1]
[E2] = SL
Application.EnableEvents = True
End If
End Sub[/highlight]
Hay ghê...
Mấu chốt nằm ở chổ:
Nếu tôi không cho công thức này vào code thì tôi có thể đặt nó ở 1 cell phụ nào đó...
Tuyệt!
Trước hết bạn có thể đọc cái này
PHP:
All items that begin with that text are filtered. For example, if you type the text Dav as a criterion, Microsoft Excel finds "Davolio," "David," and "Davis." To match only the specified text, type the following formula, where text is the text you want to find. =''=text''
và kiểm tra lại file đính kèm.

Thân!
Thì ra nó nằm trong Help ---> Vậy mà không chịu xem... Hic...
Cảm ơn bạn!
 
Lần chỉnh sửa cuối:
Upvote 0
Các Anh ơi
Application.EnableEvents = False
có tương tự với
Application.volatile (false)

Không ạ

[A1].CurrentRegion.AdvancedFilter 2, [E1:E2], [I1]

Em đã record lại macro nhưng chữa hiểu số 2 ở trên ??

Các anh chỉ giúp
Xin cám ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Application.Volatile
Dùng trong khai báo hàm của người dùng (UDF), nếu đặt True (mặc định là False) thì hàm sẽ tự tính lại khi có sự tính toán trong 1 ô bất kỳ trên bảng tính có chứa hàm.
(The function will be recalculated whenever calculation occurs in any cells on the worksheet on which this function appears.)
Application.EnableEvents = True/False
Thiểt lập hoặc hủy bỏ bộ xử lý sự kiện của E. Thường được dùng trong các sub xử lý sự kiện để tránh tình trạng bị gọi lại trong khi chưa xử lý xong (sẽ tạo vòng lặp vô hạn)

Riêng chữ số sau AdvancedFilter là giá trị trong hằng xlFilterAction: xlFilterInPlace (=1) (lọc và đặt tại chỗ), hằng còn lại là xlFilterCopy (=2), lọc và copy đến vị trí khác.
 
Upvote 0
Bác xem thử cái này nhé.

[Highlight=VB]Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim SL
If Target.Address = "$E$2" Then
Application.EnableEvents = False
SL = [E2]
[E2] = "=""=" & SL & """"
[I1].CurrentRegion.Clear
[A1].CurrentRegion.AdvancedFilter 2, [E1:E2], [I1]
[E2] = SL
Application.EnableEvents = True
End If
End Sub[/highlight]
[E2] = "=""=" & SL & """"

Các anh ơi sao lắm "=" thế? giúp em hiểu được không?

Tks
 
Upvote 0
[E2] = "=""=" & SL & """"

Các anh ơi sao lắm "=" thế? giúp em hiểu được không?

Tks
Đưa chuổi công thức vào... 1 chuổi ---> Cái này sẽ rắc rối khi trong công thức có dấu "
Vì lẽ đó, đôi khi muốn dể nhìn người ta sẽ thay " thành Chr(34)
Hảy làm 1 cuộc thí nghiệm sau:
PHP:
Sub Test()
    Dim SL
    SL = "NDU"
    MsgBox "=""=" & SL & """"
End Sub
Xem nó ra cái gì ---> Từ đó suy ra ý nghĩa của những dấu "
 
Upvote 0
Web KT
Back
Top Bottom