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:
Có bạn gửi file với nói rõ điều kiện.
Dạ báo cáo của em như sau:
- Cột số mắc Nếu chẩn đoán là A91.A hoặc A91.C hoặc tử vong (mã ICD của sốt xuất huyết) và trong khoảng thời gian từ ngày đầu tháng đến ngày cuối tháng thì sẽ đếm tất cả các xã theo điều kiện để tính ca mắc trong tháng
- Cột <= 15 là tính các ca có tuổi nhỏ hơn <= 15 tuổi
- Cột cộng dồn là số ca mắc từ đầu năm đến hiện tại.
- Các cột khác tương tự. Thay đổi chổ chẩn đoán A91.A là SXHD thường và cảnh báo, A91.C là SXHD nặng, TV là số ca tử vong.
 

File đính kèm

  • BC SXHD 2020.xlsm
    118.7 KB · Đọc: 8
Upvote 0
Dạ báo cáo của em như sau:
- Cột số mắc Nếu chẩn đoán là A91.A hoặc A91.C hoặc tử vong (mã ICD của sốt xuất huyết) và trong khoảng thời gian từ ngày đầu tháng đến ngày cuối tháng thì sẽ đếm tất cả các xã theo điều kiện để tính ca mắc trong tháng
- Cột <= 15 là tính các ca có tuổi nhỏ hơn <= 15 tuổi
- Cột cộng dồn là số ca mắc từ đầu năm đến hiện tại.
- Các cột khác tương tự. Thay đổi chổ chẩn đoán A91.A là SXHD thường và cảnh báo, A91.C là SXHD nặng, TV là số ca tử vong.
Bạn thử cái này nhé.Mình làm với 3 cột đầu.Bạn tìm hiểu mà hiểu được code thì chắc cũng nghĩ được làm các cột tiếp theo nhé.
Mã:
Sub baocaothang()
    Dim i As Long, lr As Long, arr, dic As Object, dk As String, ngaybd As Long, ngaykt As Long, kq() As Long, Data, T
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("danh_sach")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr < 2 Then Exit Sub
         arr = .Range("B2:K" & lr).Value
    End With
        For i = 1 To UBound(arr)
          If arr(i, 6) = "A91.A" Then
            dk = arr(i, 5)
            If Not dic.exists(dk) Then
               dic.Add dk, i
            Else
               dic.Item(dk) = dic.Item(dk) & "#" & i
            End If
          End If
        Next i
    With Sheets("SXHD_Thang")
         ngaybd = .Range("A7").Value2
         ngaykt = .Range("G7").Value2
         Data = .Range("B13:B26").Value
         ReDim kq(1 To UBound(Data), 1 To 11)
         For i = 1 To UBound(Data)
             dk = Data(i, 1)
             If dic.exists(dk) Then
                For Each T In Split(dic.Item(dk), "#")
                    If CLng(arr(T, 7)) >= ngaybd And CLng(arr(T, 7)) <= ngaykt Then
                       kq(i, 1) = kq(i, 1) + 1
                          If Year(Date) - Year(arr(T, 2)) <= 15 Then
                             kq(i, 2) = kq(i, 2) + 1
                          End If
                    End If
                    If Year(arr(T, 7)) = Year(Date) And CLng(arr(T, 7)) <= ngaykt Then
                       kq(i, 3) = kq(i, 3) + 1
                    End If
                Next
             End If
          Next i
         .Range("C13:M26").Value = kq
  End With
End Sub
 
Upvote 0
Bạn thử cái này nhé.Mình làm với 3 cột đầu.Bạn tìm hiểu mà hiểu được code thì chắc cũng nghĩ được làm các cột tiếp theo nhé.
Mã:
Sub baocaothang()
    Dim i As Long, lr As Long, arr, dic As Object, dk As String, ngaybd As Long, ngaykt As Long, kq() As Long, Data, T
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("danh_sach")
         lr = .Range("B" & Rows.Count).End(xlUp).Row
         If lr < 2 Then Exit Sub
         arr = .Range("B2:K" & lr).Value
    End With
        For i = 1 To UBound(arr)
          If arr(i, 6) = "A91.A" Then
            dk = arr(i, 5)
            If Not dic.exists(dk) Then
               dic.Add dk, i
            Else
               dic.Item(dk) = dic.Item(dk) & "#" & i
            End If
          End If
        Next i
    With Sheets("SXHD_Thang")
         ngaybd = .Range("A7").Value2
         ngaykt = .Range("G7").Value2
         Data = .Range("B13:B26").Value
         ReDim kq(1 To UBound(Data), 1 To 11)
         For i = 1 To UBound(Data)
             dk = Data(i, 1)
             If dic.exists(dk) Then
                For Each T In Split(dic.Item(dk), "#")
                    If CLng(arr(T, 7)) >= ngaybd And CLng(arr(T, 7)) <= ngaykt Then
                       kq(i, 1) = kq(i, 1) + 1
                          If Year(Date) - Year(arr(T, 2)) <= 15 Then
                             kq(i, 2) = kq(i, 2) + 1
                          End If
                    End If
                    If Year(arr(T, 7)) = Year(Date) And CLng(arr(T, 7)) <= ngaykt Then
                       kq(i, 3) = kq(i, 3) + 1
                    End If
                Next
             End If
          Next i
         .Range("C13:M26").Value = kq
  End With
End Sub
Dạ cảm ơn bạn rất nhiều, mình chạy được code rồi, các cột khác mình tạo ra 2 Sub thay điều kiện chẩn đoán sau đó dùng Call để khởi chạy 3 sub cùng lúc.
 
Upvote 0
Upvote 0
Em đang tạo đoạn code:
- In ra file PDF
- Tên file PDF là: Thong bao thanh toan
- Nơi lưu với đường dẫn D:\File dinh kem
(Mỗi lần in ra file PDF, đều đặt tên file là "Thong bao thanh toan", Đều lưu vào ổ D:\File dinh kem, Lưu các lần sau sẽ trùng tên thì được phép ghi đè lên file trước)

Hiện tại Em mới tạo được đoạn code hiển thị in như dưới đây. Em chưa đưa được vào đúng đường dẫn và đặt tên file rồi ghi đề lên tệp trước nếu trùng tên. Mong các tiền bối chỉ bảo. Tks nhiều!

Mã:
Sub PrintPDF()
ThisWorkbook.Sheets(1).PrintOut preview = False
End Sub
 
Upvote 0
Chào mọi người. Hiện em có 1 file demo công việc muốn mọi người giúp đỡ để tăng tốc thời gian khi chạy code update ở sheet Backupdata .Thay đổi năm và tháng, dữ liệu dựa vào file Holiday - OT.
 

File đính kèm

  • VH008165.xlsm
    306.2 KB · Đọc: 10
Upvote 0
Em đang tập viết code theo trên mạng.
Có một số chỗ em thử chỉnh sửa. Nhưng đều bị báo lỗi code.
(chi tiết em comment trong file excel VD Copy du lieu tu nhieu file khac nhau)

Em chưa hiểu rõ mình sai cú pháp code ở điểm nào. Mong các bác chỉ giáo và comment luôn lí do hộ em trong file excel cũng được.
=================================================================
File em gồm có
1. VD Copy du lieu tu nhieu file khac nhau (file chứa Marco)
2. Khu vuc 3 (file nguồn copy dữ liệu)
 

File đính kèm

  • VD Copy du lieu tu nhieu file khac nhau.xlsm
    23.5 KB · Đọc: 5
  • Khu vuc 3.xlsx
    13.4 KB · Đọc: 3
Upvote 0
Chào anh chị! Code dưới đây là ẩn dòng trống, và dãn dòng rộng ra khi thành phần ký đuôi không đủ trong 1 khổ A4 sẽ dãn dòng ra để sang trang. Code đang bị lỗi như hình dưới và có file đính kèm. Anh chị tải file kiểm tra sửa dùm em lỗi này ạ.

9999999.jpg
 

File đính kèm

  • GPE fixrow.xlsm
    186.1 KB · Đọc: 7
Upvote 0
Các anh chị có cách nào để code báo số lượng tìm được như hình không (phần khoanh tròn màu đỏ)
Em cảm ơn
Mình có thể dùng CountIf.
Mã:
Dim lnTotalResult As Long, strFind As String
With Worksheets("Sheet1")
    lnTotalResult = WorksheetFunction.CountIf(.UsedRange.Cells, strFind)
End With
Bài đã được tự động gộp:

Chào anh chị! Code dưới đây là ẩn dòng trống, và dãn dòng rộng ra khi thành phần ký đuôi không đủ trong 1 khổ A4 sẽ dãn dòng ra để sang trang. Code đang bị lỗi như hình dưới và có file đính kèm. Anh chị tải file kiểm tra sửa dùm em lỗi này ạ.

View attachment 242324
cái này: .PageSetup.PrintTitleRows chưa có giá trị
 
Lần chỉnh sửa cuối:
Upvote 0
Mình có thể dùng CountIf.
Mã:
Dim lnTotalResult As Long, strFind As String
With Worksheets("Sheet1")
    lnTotalResult = WorksheetFunction.CountIf(.UsedRange.Cells, strFind)
End With
Bài đã được tự động gộp:


cái này: .PageSetup.PrintTitleRows chưa có giá trị
sửa như nào bạn giúp mình luôn với, đây là code nhờ các anh chị viết cho giờ tìm lại bài cũ lâu lắm rồi nên không thấy
 
Upvote 0
Sub Vlookup_nhieu_gia_tri()
n = Application.CountIf(Range("a1:a30"), [c1])
Set rng = Range("a1:a30").Find([c1])
If Not rng Is Nothing Then
For i = 1 To n
Range("d" & i) = rng.Offset(, 1).value
Set rng = Range("a1:a30").FindNext(rng)
Next i
End If
End Sub
Tôi có code vlookup trả về nhiều giá trị như này. (giá trị tìm kiểm ở ô C1, trong vùng A1:A30, trả về cột D , giá trị ở cột B tương ứng)
nhờ mọi người chuyển thành function giúp ạ. Cám ơn
 
Upvote 0
Sub Vlookup_nhieu_gia_tri()
n = Application.CountIf(Range("a1:a30"), [c1])
Set rng = Range("a1:a30").Find([c1])
If Not rng Is Nothing Then
For i = 1 To n
Range("d" & i) = rng.Offset(, 1).value
Set rng = Range("a1:a30").FindNext(rng)
Next i
End If
End Sub
Tôi có code vlookup trả về nhiều giá trị như này. (giá trị tìm kiểm ở ô C1, trong vùng A1:A30, trả về cột D , giá trị ở cột B tương ứng)
nhờ mọi người chuyển thành function giúp ạ. Cám ơn
Bạn tạo array (rng.Offset(, 1).value ) kết quả rồi gán vào tên function thôi
 
Upvote 0
Bạn vận hành thử file:
 

File đính kèm

  • UDF.rar
    17.4 KB · Đọc: 10
Upvote 0
Web KT
Back
Top Bottom