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:
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
    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
Em đang có một vấn đề nhờ các anh viết code giúp em ạ em nghĩ mãi không ra.
Em có một cột G ( là cột chênh lệch) khoảng 2K dòng . Nếu không lệch thì sẽ là 0 và nếu lệch sẽ là <> 0
Bây giờ em muốn viết một buttun để khi nhấp vào sẽ go to những ô lớn hơn hoặc nhỏ hơn 0 lần lượt từ trên xuống dưới
Ví dụ Ô G10 , G100 , G500 đang khác 0, thì khi click vào button đó sẽ lần lượt nhảy tới ô G10 , click lần 2 vào button đó sẽ tớ ô G100 , click lần 3 sẽ tới Ô G500 , Lần 4 sẽ Quay lại Ô G10. Nếu không có ô nào <> 0 sẽ hiện msgbox ( cân bằng)

Em cám ơn ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi khai báo Sub thế nào để nó chỉ chạy trong file chứa nó?
 
Upvote 0
Cho em hỏi khai báo Sub thế nào để nó chỉ chạy trong file chứa nó?
Thêm phần WorkBooks vào, ví dụ:
Thay vì viết:
PHP:
Dim lr&
    lr = Sheets(1).Range("B" & Rows.Count).End(3).Row
Thì viết:

PHP:
Dim lr&
    lr = Workbooks("abcd.xlsm").Sheets(1).Range("B" & Rows.Count).End(3).Row

Trong đó abcd là WorkBook ta cần tác động.
 
Upvote 0
Thêm phần WorkBooks vào, ví dụ:
Thay vì viết:
PHP:
Dim lr&
    lr = Sheets(1).Range("B" & Rows.Count).End(3).Row
Thì viết:

PHP:
Dim lr&
    lr = Workbooks("abcd.xlsm").Sheets(1).Range("B" & Rows.Count).End(3).Row

Trong đó abcd là WorkBook ta cần tác động.
Chỉ có cách này thôi à bạn. Vì Mình xây dựng form và gửi cho nhiều người. Họ sẽ đặt tên theo quy định của mình (Ví dụ là tên bộ phận) như vậy để mà gửi cho 10 người mình phải làm 10 cái form với code khác nhau.
 
Upvote 0
Chỉ có cách này thôi à bạn. Vì Mình xây dựng form và gửi cho nhiều người. Họ sẽ đặt tên theo quy định của mình (Ví dụ là tên bộ phận) như vậy để mà gửi cho 10 người mình phải làm 10 cái form với code khác nhau.
Vậy thì đặt tên WB bằng một biến đi,
ví dụ:

Mã:
vName = ThisWorkbook.Name
lr = Workbooks(vName).Sheets(1).Range("B" & Rows.Count).End(3).Row
 
Upvote 0
Vậy thì đặt tên WB bằng một biến đi,
ví dụ:

Mã:
vName = ThisWorkbook.Name
lr = Workbooks(vName).Sheets(1).Range("B" & Rows.Count).End(3).Row
Cảm ơn bạn! Như vậy ngoài những thủ thuật này thì không cách nào khác để cho code đó chỉ có tác dụng cho file chứa nó. Ngày xưa cứ nghĩ khai báo Private là nó chỉ chạy trên file đó còn Public là toàn bộ :D
 
Upvote 0
Cảm ơn bạn! Như vậy ngoài những thủ thuật này thì không cách nào khác để cho code đó chỉ có tác dụng cho file chứa nó. Ngày xưa cứ nghĩ khai báo Private là nó chỉ chạy trên file đó còn Public là toàn bộ :D
Cách viết tắt (Không thêm Workbooks) chỉ phù hợp khi bạn làm việc trên một WB. còn nếu bạn phải thường xuyên làm việc trên nhiều WB mình vẫn khuyên nên viết đầy đủ theo thứ tự: WB-WS-Range/Cell
 
Upvote 0
Bài #1476:
. Có phải làm (khai báo) gì đâu nhỉ? Phải hỏi lại gọi Sub bằng cách nào?
.. Biết thành viên này hay hỏi lòng vòng, sao không nêu luôn cái đang làm lên cho cụ thể vấn đề.
 
Upvote 0
Cách viết tắt (Không thêm Workbooks) chỉ phù hợp khi bạn làm việc trên một WB. còn nếu bạn phải thường xuyên làm việc trên nhiều WB mình vẫn khuyên nên viết đầy đủ theo thứ tự: WB-WS-Range/Cell
Ừm, cảm ơn bạn nhé!
Bài đã được tự động gộp:

Bài #1476:
. Có phải làm (khai báo) gì đâu nhỉ? Phải hỏi lại gọi Sub bằng cách nào?
.. Biết thành viên này hay hỏi lòng vòng, sao không nêu luôn cái đang làm lên cho cụ thể vấn đề.
Cảm ơn Befaint!
 
Upvote 0
K/G các anh chị, em có 1 file exel đính kèm cần dùng VBA để thực hiện ý tưởng gán nút thêm dòng và bớt dòng sao cho:
Khi muốn thêm 1 dòng để nhập dữ liệu thì người dùng nhấp vào biểu tượng thêm dòng, excel tự động thêm một dòng và nhảy các công thức liên quan. Tưng tự khi người dùng muốn xóa 1 dòng. Em chưa biết gì về VBA mong các anh chị viết giúp ạ, e cảm ơn rất nhiều.
 

File đính kèm

  • Book1.xlsx
    13.5 KB · Đọc: 5
Upvote 0
K/G các anh chị, em có 1 file exel đính kèm cần dùng VBA để thực hiện ý tưởng gán nút thêm dòng và bớt dòng sao cho:
Khi muốn thêm 1 dòng để nhập dữ liệu thì người dùng nhấp vào biểu tượng thêm dòng, excel tự động thêm một dòng và nhảy các công thức liên quan. Tưng tự khi người dùng muốn xóa 1 dòng. Em chưa biết gì về VBA mong các anh chị viết giúp ạ, e cảm ơn rất nhiều.
Dùng định dạng Table là được.
Chọn vùng dữ liệu, nhấn Ctrl + T, nhấn Enter. Vậy thôi.
 
Upvote 0
Em mới mò mẫm VBA có thắc mắc như sau, nhờ các anh chị chỉ giúp ạ:

Em muốn thêm một Cell chứa công thức bằng VBA

Công thức đó phải thỏa mãn:

Chứa 1 chuối text tiếng việt + một hàm tương ứng:

Ví dụ:
Tại ô A1 sẽ hiện lên hàm ="Số thứ tự là "&counta(B1:B5)

Em xin cảm ơn
 
Upvote 0
Em mới mò mẫm VBA có thắc mắc như sau, nhờ các anh chị chỉ giúp ạ:

Em muốn thêm một Cell chứa công thức bằng VBA

Công thức đó phải thỏa mãn:

Chứa 1 chuối text tiếng việt + một hàm tương ứng:

Ví dụ:
Tại ô A1 sẽ hiện lên hàm ="Số thứ tự là "&counta(B1:B5)

Em xin cảm ơn
Cái này mình Record Macro cũng sinh ra code cho bạn mà. Khi Record Macro thì những từ mình gõ tiếng việt Unicode sẽ không ghi lại được, vì vậy nó sẽ là những dấu "?". Bạn phải thay những dấu "?" này thành hàm chuyển mã phù hợp. Bạn tham khảo đoạn code dưới.
Mã:
Sub GPE()
    Range("A1").FormulaR1C1 = "=""S" & ChrW(7889) & " th" & ChrW(7913) & " t" & ChrW(7921) & " là ""&COUNTA(RC[1]:R[4]C[1])"
End Sub
 
Upvote 0
Cái này mình Record Macro cũng sinh ra code cho bạn mà. Khi Record Macro thì những từ mình gõ tiếng việt Unicode sẽ không ghi lại được, vì vậy nó sẽ là những dấu "?". Bạn phải thay những dấu "?" này thành hàm chuyển mã phù hợp. Bạn tham khảo đoạn code dưới.
Mã:
Sub GPE()
    Range("A1").FormulaR1C1 = "=""S" & ChrW(7889) & " th" & ChrW(7913) & " t" & ChrW(7921) & " là ""&COUNTA(RC[1]:R[4]C[1])"
End Sub
Em cảm ơn:
Hiện tại em đang copy code của 1 bác trong giải pháp excel.
Trong đó em gán được cho biến Text = UniVBAT("Soos thuws tuwj laf") với ý nghĩa biến Text sẽ gắn với chữ "số thứ tự là", Vậy nếu em đưa biến text này vào code thì làm thế nào ạ
 
Upvote 0
Web KT
Back
Top Bottom