Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Anh Chị cho em hỏi! khi xuất hiện msgbox thông báo phải tắt đi thì mới kích chuột được ra vùng khác phải làm như nào. Em xin cảm ơn
 
Upvote 0
Cho em hỏi có code nào bắt được sự kiện enter không?
Em muốn nếu khi em enter ở sheet chỉ định thì nó sẽ thực hiện một lệnh nào đó
Em tìm được code này trên mạng nhưng chưa làm cho nó chạy được (Em gán trực tiếp code này vào sheet)
PHP:
Private Sub BatsuKien()
    Application.OnKey "{ENTER}", "MyEnterEvent"
End Sub
Sub MyEnterEvent()
    Cells(RDB_Last(1, [B:B]), 2).Select
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi có code nào bắt được sự kiện enter không?
Em muốn nếu khi em enter ở sheet chỉ định thì nó sẽ thực hiện một lệnh nào đó
Em tìm được code này trên mạng nhưng chưa làm cho nó chạy được (Em gán trực tiếp code này vào sheet)
PHP:
Private Sub BatsuKien()
    Application.OnKey "{ENTER}", "MyEnterEvent"
End Sub
Sub MyEnterEvent()
    Cells(RDB_Last(1, [B:B]), 2).Select
End Sub
Thử dùng lệnh batsukien trong sub auto_open xem sao.
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi có code nào bắt được sự kiện enter không?
Em muốn nếu khi em enter ở sheet chỉ định thì nó sẽ thực hiện một lệnh nào đó
Em tìm được code này trên mạng nhưng chưa làm cho nó chạy được (Em gán trực tiếp code này vào sheet)
PHP:
Private Sub BatsuKien()
    Application.OnKey "{ENTER}", "MyEnterEvent"
End Sub
Sub MyEnterEvent()
    Cells(RDB_Last(1, [B:B]), 2).Select
End Sub
Sao bạn không đọc Help nhỉ? Bởi nếu có đọc thì sẽ biết:
- Phím Enter trên bàn phím số được ghi là "{ENTER}"
- Phím Enter thường được ghi là "~"
Vậy bạn đang cần cái Enter nào?
Ngoài ra, muốn code chạy khi gõ bàn phím thì đương nhiên phải kích hoạt nó trước. Cụ thể để code của bạn hoạt động thì phải chạy Sub BatsuKien trước, sau đó gõ phím rồi Enter mới có tác dụng
 
Upvote 0
Sao bạn không đọc Help nhỉ? Bởi nếu có đọc thì sẽ biết:
- Phím Enter trên bàn phím số được ghi là "{ENTER}"
- Phím Enter thường được ghi là "~"
Vậy bạn đang cần cái Enter nào?
Ngoài ra, muốn code chạy khi gõ bàn phím thì đương nhiên phải kích hoạt nó trước. Cụ thể để code của bạn hoạt động thì phải chạy Sub BatsuKien trước, sau đó gõ phím rồi Enter mới có tác dụng

Em có đọc về hai phím enter như thầy bảo và em chọn bắt sự kiện enter trên bàn phím số.
Em muốn khi em enter bàn phím số thì Sub MyEnterEvent sẽ chạy.
Cụ thể khi em enter thì em muốn nó sẽ tự động chuyển xuống dòng cuối cùng của cột B tại sheet mà em gán code.
 
Lần chỉnh sửa cuối:
Upvote 0
Em có đọc về hai phím enter như thầy bảo và em chọn bắt sự kiện enter trên bàn phím số.
Em muốn khi em enter bàn phím số thì Sub MyEnterEvent sẽ chạy.
Cụ thể khi em enter thì em muốn nó sẽ tự động chuyển xuống dòng cuối cùng của cột B tại sheet mà em gán code.
Xem thử đúng yêu cầu chưa.
 

File đính kèm

Upvote 0
Xem thử đúng yêu cầu chưa.
Đúng ý mình rồi, cảm ơn bạn nhé :)

Cho mình hỏi đoạn này có tác dụng gì mà xóa đi vẫn thấy chạy
PHP:
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    If Sh.Name = "GPE" Then Application.OnKey "{ENTER}", ""
End Sub

À có một điều là khi tải file về mình phải chuyển sang sheet khác để Enter rồi quay lại sheet GPE mới có tác dụng. Vì sao vậy nhỉ bạn?
 
Lần chỉnh sửa cuối:
Upvote 0
Cho mình hỏi đoạn này có tác dụng gì mà xóa đi vẫn thấy chạy
PHP:
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    If Sh.Name = "GPE" Then Application.OnKey "{ENTER}", ""
End Sub
Bạn thử xóa nó và chọn qua sheet1, sheet2 và nhấn Enter thử xem.
À có một điều là khi tải file về mình phải chuyển sang sheet khác để Enter rồi quay lại sheet GPE mới có tác dụng. Vì sao vậy nhỉ bạn?
Bạn thêm đoạn code này vào ThisWorkbook thử xem.
Mã:
Private Sub Workbook_Open()
    If ActiveSheet.Name = "GPE" Then Application.OnKey "{ENTER}", "MyEnterEvent"
End Sub
Cụ thể code trong ThisWorkbook sẽ là.
Mã:
Private Sub Workbook_Open()
    If ActiveSheet.Name = "GPE" Then Application.OnKey "{ENTER}", "MyEnterEvent"
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
     If Sh.Name = "GPE" Then Application.OnKey "{ENTER}", "MyEnterEvent"
End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    If Sh.Name = "GPE" Then Application.OnKey "{ENTER}", ""
End Sub
 
Upvote 0
Cho em hỏi hai cái này thì có gì khác nhau?
Tem = arr(i,1)
1. Dic.Add Tem, i
2. Dic.Item(Tem) = i

Em có đọc trong bài Tổng quan về Scripting Ditionary thì có đoạn code sau
PHP:
With MyDictionary
         .Add 1, "number"
         .Item("1") = "text"
End With

Như vậy về bản chất cái Tem trong 1 và 2 của em nó đều là key còn i là item có phải không?
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi hai cái này thì có gì khác nhau?
Tem = arr(i,1)
1. Dic.Add Tem, i
2. Dic.Item(Tem) = i
...

Khác nhau:
trường hợp 1, sẽ ghi thêm một cặp key-item với key là Tem và item là i. Vì vậy nếu đã có Tem sẵn rồi thì sẽ bị lỗi.
trường hợp 2, sẽ lôi cặp key-item với key là Tem ra và sửa item nó thành i. Nếu chưa có Tem thì tự thêm vào. Nếu đã có sẵn Tem thì item trước đó sẽ bị ghi chồng.
(chú: nhiều ngừoi ở diễn đàn này có thói quen dùng từ Tem để đặt tên cho biến. Theo lệ chung của lập trình thì tem, tmp temp chỉ nên dùng cho biến có giá trj tạm. Dùng để đặt tên key là lạm dụng)

Dictionary, theo định nghĩa là một tập hợp của những phát sinh, mỗi phát sinh là một cặp key-item.
 
Upvote 0
Phiếm bàn về "Tem":
Tôi đoán là khi viết code, ngừoi ta muốn nói đến từ "temporary" (tạm thời) trong tiếng Anh. Chứ thực sự, trong ngữ cảnh những đoạn code được dùng ở diễn đàn này thì Têm (trầu?) hay Tem (thư?) chả có nghĩa lý gì cả.
Với tên gọi (từ ngữ lập trình là identifier) "tem", người lập trình viên căn bản chỉ dùng cho biến có mục đích tạm, nó không nhất thiết phải mang ý nghĩa hay chỉ vào cái gì. Trường hợp điển hình là code hoán chuyển trị
tem = a: a = b: b = tem ' đoạn code hoán chuyển trị a và b
tem đáp ứng điều kiện thứ nhất: mục đích tạm; và điều kiện thứ hai: nó làm nhiệm vụ trung gian giữa a b mà không cần biết a và b là cái gì.
Cái "mục đích tạm" nó cần được diễn giải thêm rằng thường thì người đọc code tự động hiểu rằng cái tầm vực của trị này không đi xa quá 3 dòng.

Dùng tem cho trường hợp chung chung khác có thể gây hiểu lầm cho người không quen đọc code của mình.
Trên thực tế tem, tm, tmp, temp còn có thể là từ tắt của temperature.
 
Upvote 0
Chào mọi người.
Mình có file như này, muốn làm Macro Filter nhưng chỉ áp dụng được khi dùng Filter chữ,
Còn filter số trong file thì lại ra kết quả Blank.
Ví dụ Filter cột 2 (chữ) ra kết quả, nhưng cột 4 thì không.
 

File đính kèm

  • Testing.rar
    Testing.rar
    385 bytes · Đọc: 5
  • Filter 2.PNG
    Filter 2.PNG
    79.2 KB · Đọc: 4
  • Filter 4.PNG
    Filter 4.PNG
    50.7 KB · Đọc: 4
Upvote 0
Chào mọi người.
Mình có file như này, muốn làm Macro Filter nhưng chỉ áp dụng được khi dùng Filter chữ,
Còn filter số trong file thì lại ra kết quả Blank.
Ví dụ Filter cột 2 (chữ) ra kết quả, nhưng cột 4 thì không.
Nếu ý bạn muốn lọc những ô không rỗng thì Criteria1:="<>"

Chú ý: tôi chỉ đưa Criteria1:="<>", tức sau đoạn đó không còn gì đâu nhé. Tức chỉ có chân không thôi. Đừng sáng tạo thêm
 
Lần chỉnh sửa cuối:
Upvote 0
Chào mọi người.
Mình có file như này, muốn làm Macro Filter nhưng chỉ áp dụng được khi dùng Filter chữ,
Còn filter số trong file thì lại ra kết quả Blank.
Ví dụ Filter cột 2 (chữ) ra kết quả, nhưng cột 4 thì không.
Bạn viết code thế nào mà không được? Đưa file, đưa luôn code lên cho người ta biết chứ
Mà file csv thì làm gì có code trong đó?
 
Upvote 0
Bạn viết code thế nào mà không được? Đưa file, đưa luôn code lên cho người ta biết chứ
Mà file csv thì làm gì có code trong đó?
Ui chít quên, mình xin lỗi,
Code đây ạ

Mã:
    Sub test()

    Workbooks("testing.csv").Activate
    ActiveSheet.Range("$A:$I").AutoFilter Field:=4, Criteria1:="=*" & InputBox("Filter ") & "*"
    
    End Sub
Bài đã được tự động gộp:

Bạn xem bài #28, tại đây
Link

Đã giải quyết xong ạ.
Cảm ơn bạn nhiều :)
 
Upvote 0
Em có sub này. sub này là xét theo ngày trước xét với ngày sau.
Giờ em muốn nó xét theo 7 ngày thì sửa ở đoạn nào vậy.
Mong các Bác chỉ bảo giúp em ạ
Sub XuLy()
Dim dat1 As Date, dat2 As Date, lr As Long, arr As Variant, tmp As String, TongTam As Byte
Dim i As Long, j As Integer, m As Byte, N As Byte, kq(), kq2(), d As Integer, s As Integer
Dim bd As Long, kt As Long, ViTriCuoi As String
Dim i1 As Long, i2 As Long
dat1 = Sheet5.Range("F7").Value
dat2 = Sheet5.Range("H7").Value
Sheet7.Range("B2:C100000").ClearContents
With Sheet1
lr = .Range("B65000").End(3).Row
arr = .Range("B2:AC" & lr).Value

For i = 1 To UBound(arr)
If bd = 0 Then
If arr(i, 1) >= dat1 Then
bd = i
End If
End If
If kt = 0 Then
If arr(i, 1) >= dat2 Then
kt = i - 1
End If
End If
If bd > 0 And kt > 0 Then Exit For
Next i

If bd = 0 Or kt = 0 Then
MsgBox "Ngay Nhap Khong Hop Le"
Exit Sub
End If
ReDim kq(1 To 5672, 1 To kt - bd + 2)
For i = bd To kt
i2 = i2 + 1
i1 = 1
tmp = ""
tmp2 = ""
kq(1, i2) = arr(i, 1)
For j = 1 To 27
tmp = tmp & arr(i, j + 1)
tmp2 = tmp2 & arr(i + 1, j + 1)
Next j

For m = 1 To 106
For N = m + 1 To 107

i1 = i1 + 1
TongTam = Mid(arr(i + 1, 2), 4, 1)
ViTriCuoi = Mid(tmp2, m, 1) & "," & Mid(tmp2, N, 1)
If InStr(1, TongTam, Mid(tmp, m, 1)) > 0 Or InStr(1, TongTam, Mid(tmp, N, 1)) > 0 Then
kq(i1, i2) = 1
Else
kq(i1, i2) = 2
End If
If i = kt Then
kq(i1, i2 + 1) = ViTriCuoi
End If

Next N
Next m
Next i
End With
With Sheet12
.Range("E2").Resize(5672, 1000).ClearContents
.Range("E2").Resize(5672, kt - bd + 2).Value = kq
.Range("E2").Resize(5672, kt - bd + 2).EntireColumn.AutoFit
ReDim kq2(1 To 5671, 1 To 2)
For i = 1 To 5671
d = 0: s = 0
For j = 1 To kt - bd + 1
If kq(i + 1, j) = 1 Then
d = d + 1
Else
s = s + 1
End If
Next j
kq2(i, 1) = d
kq2(i, 2) = s
Next i
.Range("C3").Resize(5671, 2).Value = kq2
.Range("A2").Resize(5672, kt - bd + 5).Copy Sheet7.Range("B2")
.Range("D3").Offset(0, kt - bd + 2).Resize(5671, 1).Copy Sheet7.Range("AAA3")
End With
With Sheet7
.Range("F2:ZZ2").NumberFormat = "dd"
.Range("B3:AAA5673").Sort .Range("D3"), xlDescending
.Range("F1:ZZ1").EntireColumn.Hidden = False
.Range(.Cells(1, kt - bd + 1 + 6), .Cells(1, 702)).EntireColumn.Hidden = True
.Range("AAA2").Value = Sheet3.Range("D9").Value
.Select
End With
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom