Đố 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
 
Vậy theo bạn thì ADO hổng phải là VBA à?
Nếu bạn đố thế này:
"Lấy dữ liệu từ file đang đóng nhưng BẮT BUỘC không được dùng ADO"
thì đó lại là chuyện khác
Tôi nhớ có 1 đợt tôi trả lời =ADO vào 1 box bắt đầu học VBA thì mọi người cho tôi là ngoại đạo, bây giờ thì tiếp tục tôi post bài vào mục VBA thì bạn hỏi vặn tôi, thật tình tôi chẳng hiểu nổi.
 
Upvote 0
Tôi nhớ có 1 đợt tôi trả lời =ADO vào 1 box bắt đầu học VBA thì mọi người cho tôi là ngoại đạo, bây giờ thì tiếp tục tôi post bài vào mục VBA thì bạn hỏi vặn tôi, thật tình tôi chẳng hiểu nổi.
Quá đúng rồi còn gì
Bạn nghĩ người mới học VBA sẽ dễ dàng "nuốt trôi" được mấy kiến thức về ADO à?
Bạn đếm xem trên GPE này có bao nhiêu người BIẾT XÀI ADO? (chỉ biết thôi, khỏi cần nói đến GIỎI)
------------------------------------------------
Vậy tôi xin nói lại là không dùng ADO và Macro4 để lấy dữ liệu từ 1 file đang đóng.

Vậy còn không dùng cái gì nữa bạn liệt kê ra luôn đi
(vì nếu chỉ không dùng 2 cái bạn kể ở trên thì cũng còn.. hơi dễ)
 
Lần chỉnh sửa cuối:
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Thêm là không dùng chức năng import của excel và DAO.
Vậy nếu tôi dùng kiểu vầy:
Mã:
Sub GetData(ByVal FileName As String, ByVal SheetName As String, _
             ByVal RangeAddress As String, ByVal Target As Range)
  Dim strLink As String, strFile As String, strPath As String, strName As String
  On Error Resume Next
  strFile = Mid(FileName, InStrRev(FileName, "\") + 1)
  strPath = Mid(FileName, 1, InStrRev(FileName, "\"))
  strName = String(30, "z")
  RangeAddress = Range(RangeAddress).Address(1, 1)
  Application.DisplayAlerts = False
  strLink = "='" & strPath & "[" & strFile & "]" & SheetName & "'!" & RangeAddress
  Target.Worksheet.Parent.Names.Add strName, strLink
  With Target.Range(RangeAddress)
    .FormulaArray = "=" & strName: .Value = .Value
  End With
  Target.Worksheet.Parent.Names(strName).Delete
  Application.DisplayAlerts = True
End Sub
Mã:
Sub Test()
  Dim vFile, FileName As String, SheetName As String, RangeAddress As String
  vFile = Application.GetOpenFilename("Excel Files, *.xls;*.xlsx;*.xlsm")
  If TypeName(vFile) = "String" Then
    FileName = CStr(vFile)
    SheetName = "Sheet1"
    RangeAddress = "A1:D150"
    GetData FileName, SheetName, RangeAddress, Range("A1")
  End If
End Sub
Thì có được xem là hợp lệ không?
Ẹc... Ẹc...
 
Upvote 0
Hổng hẳn là đố, gần như bàn luận hơn:

Đề bài: viết code tính tổng các số nguyên từ n1 đến n2

[code 1]
tong = 0
for i = n1 to n2
tong = tong + i
next i

[code 2]
tong = (n2*n2 + n2 - n1*n1 - n1) / 2 + n1

Theo bạn thì code nào tốt hơn?
 
Upvote 0
Tôi viết 1 hàm tự tạo như thế này
PHP:
Function Check() As Boolean
Application.Volatile
For i = 1 To Sheets.Count - 1
    For j = i + 1 To Sheets.Count
        If Sheets(i).CodeName = Sheets(j).CodeName Then
            Check = True
            Exit Function
        End If
    Next
Next
End Function
Câu hỏi đặt ra là hàm trên có thể trả về kết quả True không? Nếu có thì khi nào?
 
Upvote 0
Tôi viết 1 hàm tự tạo như thế này
PHP:
Function Check() As Boolean
Application.Volatile
For i = 1 To Sheets.Count - 1
    For j = i + 1 To Sheets.Count
        If Sheets(i).CodeName = Sheets(j).CodeName Then
            Check = True
            Exit Function
        End If
    Next
Next
End Function
Câu hỏi đặt ra là hàm trên có thể trả về kết quả True không? Nếu có thì khi nào?

Khi i = j = Sheets.Count, tôi nghĩ như thế.
 
Upvote 0
Upvote 0
i không thể bằng Sheets.Count vì
Mã:
For i = 1 To [COLOR=#ff0000][B]Sheets.Count - 1[/B][/COLOR]
Và j cũng không thể bằng i vì
Mã:
For j =[COLOR=#ff0000][B] i + 1[/B][/COLOR] To Sheets.Count

Có lẽ không bao giờ chúng trở thành TRUE, cho dù ta có hoán đổi vị trí giữa các sheet với nhau.
 
Upvote 0
Đúng là vậy! Đã là ĐỐ VUI thì chắc chắn phải có điểm độc đáo riêng
Câu này thật sự mình không nghĩ ra. Thắng cho đáp án đi

Khi tạo một Sheet mới thì CodeName của sheet đó là chuỗi rỗng cho đến khi ta mở cửa sổ VBE.

Vậy anh chỉ cần tạo 2 sheet mới thì UDF sẽ trả về kết quả True.
 
Upvote 0
Mình đã thử tạo sheet mới, nhưng chỉ tạo 1 sheet nên chưa thành công. Tính thử tiếp thì nghe đt rồi bỏ luôn.
 
Upvote 0
Câu này đơn giản nhưng có thể có người chưa biết.
Hai cách viết như bên dưới có gì khác nhau không?
PHP:
Sub Test()
  ...
  If ... Then ...
  ...
End Sub
PHP:
Sub Test()
  ...
  If ... Then
    ...
  End If
  ...
End Sub
 
Upvote 0
Câu này đơn giản nhưng có thể có người chưa biết.
Hai cách viết như bên dưới có gì khác nhau không?
PHP:
Sub Test()
  ...
  If ... Then ...
  ...
End Sub
PHP:
Sub Test()
  ...
  If ... Then
    ...
  End If
  ...
End Sub

Về cấu trúc thì nó bớt đi dòng "End If", còn cách thực hiện thì nó cũng như nhau thôi.
 
Upvote 0
Khác là khác về kết quả khi run code chứ bỏ bớt cái "End If" thì nói làm gì bạn.


Tôi thì không nghĩ là vậy, bởi trong Help có ghi chú:

Single-Line Syntax

You can use the single-line syntax for short, simple tests. However, the multiple-line syntax provides more structure and flexibility and is usually easier to read, maintain, and debug.


Và điều đó cũng được nói tại đây:

http://msdn.microsoft.com/en-us/library/752y8abs.aspx
 
Upvote 0
Hình như cái 1 trả về 1 cái gì đó khi thỏa điều kiện.
Cái 2 thì có thể thêm vào nhiều kết quả.
 
Upvote 0
Web KT

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

Back
Top Bottom