Đố 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
 
Thêm câu nữa: Chia 1 cột thành nhiều cột không dùng vòng lặp, không dùng công thức (Viết code để thực hiện giống như file đính kèm mà không dùng vòng lặp, không dùng công thức)
Đã vò đầu bứt tóc mấy giờ chưa tìm được thuật toán.
Hóng.
 
Upvote 0

File đính kèm

  • Chia cot.xlsm
    31.9 KB · Đọc: 45
Upvote 0
Vô tình phát hiện và cũng không hiểu vì sao nó lại hoạt động như vậy luôn.
Nếu suy nghĩ một cách thông thường chắc không thể nào có đáp án cho câu đố này :D
Hay thật, tại sao đổ dữ liệu mảng xuống Range không theo quy tắc kích thước như vậy nhỉ?
Do Redim Preserve?
Chưa hiểu được cái này: Range(C1,C1:S6).Value = Mang, ai giải thích giùm.
 
Lần chỉnh sửa cuối:
Upvote 0
Vô tình phát hiện và cũng không hiểu vì sao nó lại hoạt động như vậy luôn.
Nếu suy nghĩ một cách thông thường chắc không thể nào có đáp án cho câu đố này :D
Mạnh thấy hay đó ... Ứng dụng viết cái Hàm Co và Giản phù hợp đấy !!!
 
Upvote 0
Hay thật, tại sao đổ dữ liệu mảng xuống Range không theo quy tắc kích thước như vậy nhỉ?
Do Redim Preserve?
Chưa hiểu được cái này: Range(C1,C1:S6).Value = Mang, ai giải thích giùm.
Theo mình thấy thì khi gán dữ liệu bằng cú pháp như vậy thì vùng thứ hai (C1:S6) sẽ có kết quả như vậy, vùng phía trước sẽ có kết quả bình thường, ô C1 trước dấu phẩy để vào để làm "chân gỗ" thôi.
 
Upvote 0
Cũng đơn giản thôi! Thuật toán dựa vào hàm FILES của macro4, nó có khả năng lấy list file trong 1 thư mục mà không cần vòng lập:
PHP:
Sub ConsolMutiFiles(Folder As String, ShName As String, SrcRng As String, Target As Range)
  Dim Temp As String
  Temp = ShName & "'!" & Range(SrcRng).Address(, , 2)
  If Right(Folder, 1) <> "\" Then Folder = Folder & "\"
  ActiveWorkbook.Names.Add "Arr", "=""'" & Folder & "[""&Files(""" & Folder & "*.*"")&""]" & Temp & """"
  Target.Consolidate Evaluate("Arr"), 9, 0, 1
  ActiveWorkbook.Names("Arr").Delete
End Sub
PHP:
Sub Test()
  Dim Folder As String, ShName As String, SrcRng As String
  Range("A2:B1000").ClearContents
  With CreateObject("Shell.Application")
    On Error Resume Next
    Folder = .BrowseForFolder(0, "", 1).Self.Path
  End With
  ShName = "Sheet1": SrcRng = "A2:B30"
  ConsolMutiFiles Folder, ShName, SrcRng, Range("A2")
End Sub
Vụ bẩy lỗi gì đó các bạn tự làm nha!
Cho em hỏi trường hợp ví dụ của em thì code thế nào anh? vì chạy ghi macro thì có nhưng để tối ưu hóa thành code thì chưa được, các anh, chị giúp em xem bài với!
 

File đính kèm

  • Thu nghiem.rar
    70.3 KB · Đọc: 6
Upvote 0
Được bữa thứ 7 không có gì làm, thôi thư giãn tí.
--
Thông báo trong code bên dưới có thể xuất hiện không? Cho ví dụ.
Mã:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If Not Sh Is ActiveSheet Then MsgBox "!@#$%"
End Sub
 
Upvote 0
Được bữa thứ 7 không có gì làm, thôi thư giãn tí.
--
Thông báo trong code bên dưới có thể xuất hiện không? Cho ví dụ.
Mã:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If Not Sh Is ActiveSheet Then MsgBox "!@#$%"
End Sub
Xuất hiện nếu như tại 1 sheet bất kỳ trong Workbook đó ta thêm code này, rồi chọn sheet đó.
Mã:
Private Sub Worksheet_Activate()
  Me.Visible = xlSheetHidden
End Sub
 
Upvote 0
Xuất hiện nếu như tại 1 sheet bất kỳ trong Workbook đó ta thêm code này, rồi chọn sheet đó.
Mã:
Private Sub Worksheet_Activate()
  Me.Visible = xlSheetHidden
End Sub
Cũng coi như là 1 đáp án. Nhưng sử dụng cùng 1 sự kiện như vậy cũng giống như viết thêm code vào (như code bên dưới) thì chưa "vui" lắm :D
Mã:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If Sh.Name = "Sheet1" Then Sh.Visible = xlSheetHidden
    If Not Sh Is ActiveSheet Then MsgBox "!@#$%"
End Sub
 
Upvote 0
Cũng đã lâu rồi, topic này không thấy hoạt động, giờ mình khởi động lại cho vui xuân nhé.
Câu đố này có lẽ đơn giản với một số người, nhưng cũng sẽ khó khăn cho đa số người nè.

Tôi có một TextBox trên UserForm, bằng thuật toán nào, thủ tục nào, sự kiện nào để khi tôi gõ phím nó chỉ ra đúng 1 ký tự dù có nhấn lâu phím đó.

Lưu ý, không phải gõ một ký tự mà gõ bao nhiêu cũng được, nhưng mỗi lần gõ dù có bị kẹt phím (nhấn lâu) nó vẫn chỉ ra 1 ký tự mà thôi.

Xin mời.
 
Lần chỉnh sửa cuối:
Upvote 0
Cũng đã lâu rồi, topic này không thấy hoạt động, giờ mình khởi động lại cho vui xuân nhé.
Câu đố này có lẽ đơn giản với một số người, nhưng cũng sẽ khó khăn cho đa số người nè.

Tôi có một TextBox trên UserForm, bằng thuật toán nào, thủ tục nào, sự kiện nào để khi tôi gõ phím nó chỉ ra đúng 1 ký tự dù có nhấn lâu phím đó.

Xin mời.
Em mò thế này
Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
TextBox1.Text = Left(TextBox1.Text, 0)
End Sub
 
Upvote 0
Em mò thế này
Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
TextBox1.Text = Left(TextBox1.Text, 0)
End Sub
Rất OK, nhưng rất tiếc nó chỉ gõ được đúng 1 ký tự, các ký tự sau không gõ tiếp được! Ý mình là mỗi lần gõ dù có bị kẹt phím vẫn chỉ cho ra 1 ký tự thôi.
 
Upvote 0
Rất OK, nhưng rất tiếc nó chỉ gõ được đúng 1 ký tự, các ký tự sau không gõ tiếp được! Ý mình là mỗi lần gõ dù có bị kẹt phím vẫn chỉ cho ra 1 ký tự thôi.
Em lại thêm 1 cách "tà đạo" này nữa
"Sự kiện Click CommandButton1"
Mã:
Private Sub CommandButton1_Click()
    Dim i&, txt$
    txt = Left(TextBox1.Text, 1)
    For i = 1 To Len(TextBox1.Text)
        If Mid(TextBox1.Text, i + 1, 1) <> Mid(TextBox1.Text, i, 1) Then
            txt = txt & Mid(TextBox1.Text, i + 1, 1)
        End If
    Next i
    TextBox1.Text = txt
End Sub
 
Upvote 0
Em lại thêm 1 cách "tà đạo" này nữa
"Sự kiện Click CommandButton1"
Mã:
Private Sub CommandButton1_Click()
    Dim i&, txt$
    txt = Left(TextBox1.Text, 1)
    For i = 1 To Len(TextBox1.Text)
        If Mid(TextBox1.Text, i + 1, 1) <> Mid(TextBox1.Text, i, 1) Then
            txt = txt & Mid(TextBox1.Text, i + 1, 1)
        End If
    Next i
    TextBox1.Text = txt
End Sub
Kakaka, đúng là "đông tà" thiệt, nhưng mình chỉ dùng 1 TextBox thôi, không có click mà chỉ gõ phím.
 
Upvote 0
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom