Đố 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,911
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
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Mình nghĩ khai báo biến I As String cũng ổn hay sao á
gán biến I cho vùng kết quả
 
Upvote 0
Theo em thì sửa code của Bác Cò lại một chút.
PHP:
 StrReverse(Val(StrReverse(str))) * 10 ^ (Len(str) - Len(RTrim(Replace(str, 0, " "))))
Tôi nghĩ vầy cũng được chứ nhỉ:
PHP:
MsgBox Int(StrReverse(Val("1" & StrReverse(Text))) / 10)
Với Text là chuổi cho trước
---------------------------------------
Mình nghĩ khai báo biến I As String cũng ổn hay sao á
gán biến I cho vùng kết quả
Hình như không được anh à!
 
Upvote 0
Sao em điền có chuỗi vào thì MsgBox Int(StrReverse(Val("1" & StrReverse("12345dfgd"))) / 10) nó hiện bằng không vậy anh Ndu không biết text trong code là cái gì, cho em công thức Function cái này luôn đi, em không hiểu
 
Upvote 0
Sao em điền có chuỗi vào thì MsgBox Int(StrReverse(Val("1" & StrReverse("12345dfgd"))) / 10) nó hiện bằng không vậy anh Ndu không biết text trong code là cái gì, cho em công thức Function cái này luôn đi, em không hiểu

Với Text là tùy ý, ví dụ Text = "nmhung49" thì chạy code sẽ ra 49

Bạn thử nó với hàm tự tạo:

PHP:
Function NumberSeparate(Text As String) As Double
  NumberSeparate = Int(StrReverse(Val("1" & StrReverse(Text))) / 10)
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Hihi, nhờ Thầy Sealand mình mới biết cái Val ....val này, đề bài này làm phải có yêu cầu kiểu dữ liệu của kết quả mới làm trúng được, còn nếu không dùng vòng lặp thì "chơi" VbScript.RegExp cho nó "phẻ", khỏi suy tư cho cực
Híc
 
Upvote 0
Sao em điền có chuỗi vào thì MsgBox Int(StrReverse(Val("1" & StrReverse("12345dfgd"))) / 10) nó hiện bằng không vậy anh Ndu không biết text trong code là cái gì, cho em công thức Function cái này luôn đi, em không hiểu
Ở trên nói rồi mà:
- Nếu số nằm trước chữ thì MsgBox Val("12345dfgd") là đủ
- Nếu số nằm sau chữ thì.. dùng cái vừa rồi
 
Upvote 0
Hihi, nhờ Thầy Sealand mình mới biết cái Val ....val này, đề bài này làm phải có yêu cầu kiểu dữ liệu của kết quả mới làm trúng được, còn nếu không dùng vòng lặp thì "chơi" VbScript.RegExp cho nó "phẻ", khỏi suy tư cho cực
Híc
Câu đố này không nhằm mục đích xử lý chuổi hay tách số gì cả! Em chỉ muốn giới thiệu hàm Val thôi anh à! Vì có khi ta đã từng xài nhưng không để ý lắm
Ngoài ra cũng đâu phải bài toán tách số nào cũng dùng VbScript.RegExp được đâu anh
Ví dụ:
Cho chuổi 123abc456
Người ta chỉ muốn lấy số 123 thôi
-------------------------------------
Thử bài toán này để hiểu thêm về Val:
- Gõ ngày tháng vào cell A1 (ngày tháng đúng chuẩn)
- Dùng câu lệnh MsgBox Val(Range("A1").Value) xem kết quả là bao nhiêu?
Từ đó so sánh Val với CDate, CLng, CDbl
Rất thú vị đấy
 
Lần chỉnh sửa cuối:
Upvote 0
Mình lại đang phân vân, nếu mã số cho ra là NGHIA00001 thì nếu dùng Int(StrReverse(Val("1" & StrReverse(Text))) / 10) thì cho ra 1, nhưng lại muốn phải là 00001 thì không giải quyết được. Mặt khác, nếu text chỉ là NGHIA thì dùng dòng lệnh trên cho ra 0 mà thực tế, không có số 0 nào trong text. Cho nên phải thay đổi:
Nếu không muốn là 00001 mà chỉ là 1 và nếu không cho ra giá trị 0 thì làm như vầy đi:
PHP:
Function NumberSeparate(Text As String)
  a = Int(StrReverse(Val("1" & StrReverse(Text))) / 10)
  NumberSeparate = IIf(a = 0, "", a)
End Function

Nhưng không chính xác lắm, nếu là NGHIA0 thì lại cho giá trị ""

Vậy thì vòng lặp vậy, cho dù có cho ra giá trị là String thì đảm bảo được cấu trúc của số!

PHP:
Function TachSo(chuoi As String)
  Dim L As Long, kt
  For L = 1 To Len(chuoi)
    kt = Left(chuoi, 1)
    If Not IsNumeric(kt) Then chuoi = Replace(chuoi, kt, "")
  Next
  TachSo = chuoi
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Mình lại đang phân vân, nếu mã số cho ra là NGHIA00001 thì nếu dùng Int(StrReverse(Val("1" & StrReverse(Text))) / 10) thì cho ra 1, nhưng lại muốn phải là 00001 thì không giải quyết được. Mặt khác, nếu text chỉ là NGHIA thì dùng dòng lệnh trên cho ra 0 mà thực tế, không có số 0 nào trong text. Cho nên phải thay đổi:
Nếu không muốn là 00001 mà chỉ là 1 và nếu không cho ra giá trị 0 thì làm như vầy đi:
PHP:
Function NumberSeparate(Text As String)
  a = Int(StrReverse(Val("1" & StrReverse(Text))) / 10)
  NumberSeparate = IIf(a = 0, "", a)
End Function

Nhưng không chính xác lắm, nếu là NGHIA0 thì lại cho giá trị ""

Vậy thì vòng lặp vậy, cho dù có cho ra giá trị là String thì đảm bảo được cấu trúc của số!

PHP:
Function TachSo(chuoi As String)
  Dim L As Long, kt
  For L = 1 To Len(chuoi)
    kt = Left(chuoi, 1)
    If Not IsNumeric(kt) Then chuoi = WorksheetFunction.Substitute(chuoi, kt, "")
  Next
  TachSo = chuoi
End Function
Không dùng vòng lặp cũng được mà bạn.
PHP:
Function TachSo(Str As String) As String
TachSo = Int(StrReverse(Val("1" & StrReverse(Str))) / 10)
If TachSo = 0 Or Len(TachSo) < Len(Str) - InStr(Str & 0, 0) + 1 Then
    TachSo = Right(Str, Len(Str) - InStr(Str & 0, 0) + 1)
End If
End Function
 
Upvote 0
Không dùng vòng lặp cũng được mà bạn.
PHP:
Function TachSo(Str As String) As String
TachSo = Int(StrReverse(Val("1" & StrReverse(Str))) / 10)
If TachSo = 0 Or Len(TachSo) < Len(Str) - InStr(Str & 0, 0) + 1 Then
    TachSo = Right(Str, Len(Str) - InStr(Str & 0, 0) + 1)
End If
End Function

Đâu bạn thử với dãy chuỗi này xem: huuthang_bd0010001000123456, hình như ra #VALUE! thì phải!
 
Lần chỉnh sửa cuối:
Upvote 0
Đâu bạn thử với dãy chuỗi này xem: huuthang_bd0010001000123456, hình như ra #VALUE! thì phải!
Thực hiện tính toán trên số phải có giới hạn, đâu phải muốn bao nhiêu số cũng được. Do mọi người đang bàn đến hàm Val chứ nếu không bạn dùng VBScript.RegExp là vô địch rồi. Khỏi vòng lặp chi hết.
PHP:
Function TachSo(Str As String) As String
With CreateObject("VBScript.RegExp")
    .Pattern = "\D*"
    TachSo = .Replace(Str, "")
End With
End Function
 
Upvote 0
Thực hiện tính toán trên số phải có giới hạn, đâu phải muốn bao nhiêu số cũng được. Do mọi người đang bàn đến hàm Val chứ nếu không bạn dùng VBScript.RegExp là vô địch rồi. Khỏi vòng lặp chi hết.
PHP:
Function TachSo(Str As String) As String
With CreateObject("VBScript.RegExp")
    .Pattern = "\D*"
    TachSo = .Replace(Str, "")
End With
End Function

Đây là đố tách số chứ không nói hàm Val.

Bài toán thì có nhiều giải pháp, nhưng kết quả chỉ có 1. Nếu bạn dùng giải pháp nào đó ngắn gọn, dễ hiểu, hiệu quả, nhanh chóng, chính xác, thì đó là giải pháp tốt nhất. Chứ nếu như chống chế bằng việc giới hạn thì tôi nghĩ giải pháp không đảm bảo.

Riêng cái Hàm của tôi thì đã không đúng ngay từ đầu vì đã sử dụng vòng lặp đối với tác giả ra đề, nhưng kết quả tuyệt đối đúng với cấu trúc TextNumber.
 
Upvote 0
Tô màu bất kỳ cho cell

Như ta đã biết, Excel chỉ cho phép tô 56 màu cho cell mà thôi. Trong khi với các objects, ta có thể tô khoảng 16 triệu màu khác nhau
Câu hỏi: Liệu ta có thể tô màu bất kỳ cho cell được không? (màu Button Face chẳng hạn)
 
Upvote 0
Web KT

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

Back
Top Bottom