Đố 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
 
Upvote 0
Bài #1001 (con chó đốm) đó anh.
Uh, nói chung cách nào cũng ra kết quả tốt đẹp!

Nếu ta chọn Goto thì Ô được chọn sẽ Active, còn dùng scroll thì ô đang active ở đâu thì ở luôn ở đó. Tùy trường hợp mà dùng vậy!

Coi trong Help nó có nhiều cái thú vị lắm, lâu lâu thấy gì lạ lôi ra đố tiếp kakakaka.
 
Lần chỉnh sửa cuối:
Upvote 0
Uh, nói chung cách nào cũng ra kết quả tốt đẹp!

Nếu ta chọn Goto thì Ô được chọn sẽ Active, còn dùng scroll thì ô đang active ở đâu thì ở luôn ở đó. Tùy trường hợp mà dùng vậy!

Vì vậy em mới nói chứ đâu tự nhiên mà em nói vậy, có những câu hỏi chỉ có 1 đáp án nhưng có thể có những câu hỏi có nhiều đáp án khác nhau nhưng sẽ cho kết quả tương tự.
 
Upvote 0
Với 1 dòng code duy nhất không dùng dấu : để tách code vậy tôi muốn gán từ VBA, Giải, Pháp, Excel vào vùng A1:B2 vậy với đoạn code nào để làm việc này nhanh nhất (tức là 1 mỗi ô là 1 từ)
 
Upvote 0
Với 1 dòng code duy nhất không dùng dấu : để tách code vậy tôi muốn gán từ VBA, Giải, Pháp, Excel vào vùng A1:B2 vậy với đoạn code nào để làm việc này nhanh nhất (tức là 1 mỗi ô là 1 từ)
Có phải vầy không bạn
Mã:
    [A1:B2].FormulaArray = "={""VBA"",""Gi" & ChrW(7843) & "i"";""Pháp"",""Excel""}"
 
Upvote 0
Em đoán mò vậy: có phải phụ thuộc dấu phân cách trong công thức mảng theo từng máy không thầy?

Lúc đầu tôi nghĩ vậy nhưng sau đó test lại thì thấy không phải. Code VBA nó tự nhiên "hiểu" tuốt
Coi như đáp án này tạm chấp nhận đi, có điều theo suy nghĩ của tôi thì hình như tác giả yêu cầu GÁN GIÁ TRỊ chứ hổng phải GÁN CÔNG THỨC
 
Upvote 0
Với 1 dòng code duy nhất không dùng dấu : để tách code vậy tôi muốn gán từ VBA, Giải, Pháp, Excel vào vùng A1:B2 vậy với đoạn code nào để làm việc này nhanh nhất (tức là 1 mỗi ô là 1 từ)

Nếu là không quan tâm tiếng việt có dấu thì dùng đơn giản thế này

[GPECODE=vb][A1:B2] = [{"VBA","Giai";"Pháp","Excel"}][/GPECODE]

Còn thích có dấu thì thế này
[GPECODE=vb][A1:B2] = Evaluate("{""VBA"",""Gi" & ChrW(7843) & "i"";""Pháp"",""Excel""}")[/GPECODE]
 
Upvote 0
Nếu là không quan tâm tiếng việt có dấu thì dùng đơn giản thế này

[GPECODE=vb][A1:B2] = [{"VBA","Giai";"Pháp","Excel"}][/GPECODE]
Chính xác như thế trong đây mình chỉ muốn nhấn mạnh để hàm Evaluate để dùng khi gán trị vùng có nhiều hơn 1 hàng khi đó dùng hàm Array sẽ không làm được việc này. Với cách này chúng ta có thể gán tiêu đề, nhãn cho vùng nhanh nhất (có thế tốc độ chậm vì nó vẫn là 1 hàm). Thích hợp với tiếng Anh và tiếng Việt không dấu nếu có dấu thì dài hơn cũng là cách 2 của bạn Vodox đã đưa. Thanks
 
Upvote 0
Chính xác như thế trong đây mình chỉ muốn nhấn mạnh để hàm Evaluate để dùng khi gán trị vùng có nhiều hơn 1 hàng khi đó dùng hàm Array sẽ không làm được việc này

Cái đó chưa chắc nha! Ít nhất tôi biết có 1 cách không dùng Evaluate, chỉ dùng Array bình thường cũng có thể làm được bài này đấy
 
Upvote 0
Cái đó chưa chắc nha! Ít nhất tôi biết có 1 cách không dùng Evaluate, chỉ dùng Array bình thường cũng có thể làm được bài này đấy
Thêm cách củ chuối sau, nó quá dài Thầy à.
Mã:
Range("A1:B2") = WorksheetFunction.Transpose(WorksheetFunction.Transpose(Array(Array("VBA", "Giai"), Array("Pháp", "Excel"))))
 
Upvote 0
Thêm cách củ chuối sau, nó quá dài Thầy à.
Mã:
Range("A1:B2") = WorksheetFunction.Transpose(WorksheetFunction.Transpose(Array(Array("VBA", "Giai"), Array("Pháp", "Excel"))))

Ủa! 1 cái Transpose là được rồi mà:
Mã:
Range("A1:B2") = WorksheetFunction.Transpose(Array(Array("VBA", "Pháp"), Array("Giai", "Excel")))
----------------------
Em rút gọn lại như sau:
Range("A1:B2") = WorksheetFunction.Transpose([{"VBA", "Giai";"Pháp", "Excel"}])
Cái này là... Evaluate mà... Và nếu Evaluate thì cần gì đến Transpose?
 
Lần chỉnh sửa cuối:
Upvote 0
Hôm nay mình có đề tài này vừa là câu đố vừa là cái mình đang không thể làm nên đưa ra xem coi anh chị nào có phương pháp hay không.
Bài toán là mình có 10 000 cột cần ẩn đi, ẩn 1 cột cách 1 cột. Yêu cầu là nạp địa chỉ vào mảng để ẩn cho nhanh. Điều kiện ràng buộc là chỉ 1 vòng lặp duy nhất.
 
Upvote 0
Hôm nay mình có đề tài này vừa là câu đố vừa là cái mình đang không thể làm nên đưa ra xem coi anh chị nào có phương pháp hay không.
Bài toán là mình có 10 000 cột cần ẩn đi, ẩn 1 cột cách 1 cột. Yêu cầu là nạp địa chỉ vào mảng để ẩn cho nhanh. Điều kiện ràng buộc là chỉ 1 vòng lặp duy nhất.

Hôm trước có nghe Hải nhắc vụ này và mình đề xuất dùng Union chứ không chơi địa chỉ dạng text
Kiểu vầy nè:
Mã:
Sub Test()
  Dim n As Long, rng As Range
  For n = 1 To 1000 Step 2
    If rng Is Nothing Then
      Set rng = Cells(1, n)
    Else
      Set rng = Union(rng, Cells(1, n))
    End If
  Next
  rng.EntireColumn.Hidden = True
End Sub
 
Upvote 0
Hôm trước có nghe Hải nhắc vụ này và mình đề xuất dùng Union chứ không chơi địa chỉ dạng text
Kiểu vầy nè:
Mã:
Sub Test()
  Dim n As Long, rng As Range
  For n = 1 To 1000 Step 2
    If rng Is Nothing Then
      Set rng = Cells(1, n)
    Else
      Set rng = Union(rng, Cells(1, n))
    End If
  Next
  rng.EntireColumn.Hidden = True
End Sub
Em cũng nghĩ phải xử cách này, chứ ngẫm nghĩ kỹ thì không dùng cách kia được. Không phải range có ít đối số mà là chuỗi string chỉ cho phép có 255 ký tự thì phải
Khi mình join cái mảng lại thì số ký tự vượt quá mức cho phép thì phải.

..............

Vừa kiểm tra xong, nếu 1000 thì chạy được nhưng với 10 000 thì đi pha cafe uống xong rồi khởi động lại Excel anh à.
 
Lần chỉnh sửa cuối:
Upvote 0
Vừa kiểm tra xong, nếu 1000 thì chạy được nhưng với 10 000 thì đi pha cafe uống xong rồi khởi động lại Excel anh à.

Thí nghiệm chơi thế thôi chứ liệu trên thực tế có ai đi ẩn 10.000 cột đâu ta?
Làm việc trên Range đương nhiên tốc độ chậm thôi
 
Upvote 0
Web KT

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

Back
Top Bottom