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:
Trong VBA có cách nào để làm tròn số giờ trong mảng không anh chị
Ví dụ tại mảng Arr(i,j) của em có giá trị là 8:00:49s em muốn làm tròn thành 8:00:00 thì làm thế nào. Hay nói cách khác là cắt hẳn cái số giây đi.
 
Upvote 0
Trong VBA có cách nào để làm tròn số giờ trong mảng không anh chị
Ví dụ tại mảng Arr(i,j) của em có giá trị là 8:00:49s em muốn làm tròn thành 8:00:00 thì làm thế nào. Hay nói cách khác là cắt hẳn cái số giây đi.
Bạn thử vầy xem
Mã:
Arr(i, j)  = Int(Arr(i, j)  * 1440)/1440
 
Upvote 0
Trong VBA có cách nào để làm tròn số giờ trong mảng không anh chị
Ví dụ tại mảng Arr(i,j) của em có giá trị là 8:00:49s em muốn làm tròn thành 8:00:00 thì làm thế nào. Hay nói cách khác là cắt hẳn cái số giây đi.
???
Cắt hẳn số giây là làm tròn số phút. Làm tròn số giờ thì phải cắt luôn số phút.
Hàm MRound có thể làm chuyện này dễ dàng
= Application.MRound(x, "1:00") ' tròn thành giờ, cắt phút
= Application.MRound(x, "0:01") ' tròn thành phút, cắt giây
 
Upvote 0
Như file đính kèm, ở sheet 1 em có RẤT NHIỀU BẢNG (em chỉ liệt kê 3 bảng nhưng thực ra có khoảng 20-30 bảng như vậy) chứa thông tin.
Ở sheet 2 em muốn nó sẽ tổng hợp tất cả thông tin theo từng MARK NO. (Như em đã tổng hợp sẵn nhưng nó tốn rất nhiều thời gian vì phải copy vs paste từng dòng rồi lại phải lọc MARK NO. đó có số lượng hay không) Như sheet 2, em phải lọc tất cả những item mà MARK NO. có số lượng, cụ thể lọc từ A1 đến A4 rồi tiếp tục từ X1 đến X6, C1 đến C3.... Rồi phải xoá những dòng có số lượng bằng 0.
Nhờ các bác giúp đỡ dùm.
Bài đã được tự động gộp:

Như file đính kèm, ở sheet 1 em có RẤT NHIỀU BẢNG (em chỉ liệt kê 3 bảng nhưng thực ra có khoảng 20-30 bảng như vậy) chứa thông tin.
Ở sheet 2 em muốn nó sẽ tổng hợp tất cả thông tin theo từng MARK NO. (Như em đã tổng hợp sẵn nhưng nó tốn rất nhiều thời gian vì phải copy vs paste từng dòng rồi lại phải lọc MARK NO. đó có số lượng hay không) Như sheet 2, em phải lọc tất cả những item mà MARK NO. có số lượng, cụ thể lọc từ A1 đến A4 rồi tiếp tục từ X1 đến X6, C1 đến C3.... Rồi phải xoá những dòng có số lượng bằng 0.
Nhờ các bác giúp đỡ dùm.
 

File đính kèm

  • Test E-BOM.xlsx
    21.2 KB · Đọc: 6
  • Test E-BOM.xlsx
    21.2 KB · Đọc: 3
Upvote 0
Như file đính kèm, ở sheet 1 em có RẤT NHIỀU BẢNG (em chỉ liệt kê 3 bảng nhưng thực ra có khoảng 20-30 bảng như vậy) chứa thông tin.
Ở sheet 2 em muốn nó sẽ tổng hợp tất cả thông tin theo từng MARK NO. (Như em đã tổng hợp sẵn nhưng nó tốn rất nhiều thời gian vì phải copy vs paste từng dòng rồi lại phải lọc MARK NO. đó có số lượng hay không) Như sheet 2, em phải lọc tất cả những item mà MARK NO. có số lượng, cụ thể lọc từ A1 đến A4 rồi tiếp tục từ X1 đến X6, C1 đến C3.... Rồi phải xoá những dòng có số lượng bằng 0.
Nhờ các bác giúp đỡ dùm.
Bài đã được tự động gộp:

Như file đính kèm, ở sheet 1 em có RẤT NHIỀU BẢNG (em chỉ liệt kê 3 bảng nhưng thực ra có khoảng 20-30 bảng như vậy) chứa thông tin.
Ở sheet 2 em muốn nó sẽ tổng hợp tất cả thông tin theo từng MARK NO. (Như em đã tổng hợp sẵn nhưng nó tốn rất nhiều thời gian vì phải copy vs paste từng dòng rồi lại phải lọc MARK NO. đó có số lượng hay không) Như sheet 2, em phải lọc tất cả những item mà MARK NO. có số lượng, cụ thể lọc từ A1 đến A4 rồi tiếp tục từ X1 đến X6, C1 đến C3.... Rồi phải xoá những dòng có số lượng bằng 0.
Nhờ các bác giúp đỡ dùm.
Bạn xem lại file mẫu. Tại bảng 1 MARK NO.(A2) có 4 dòng khác không sao sang Sheet2 nó lại có 3 dòng vậy
PHP:
Sub Thu_ti_thoi()
    Dim sArr, dArr(1 To 65535, 1 To 10)
    Dim I As Long, fI As Long, K As Long, LastRow As Long, Ir As Long
    Dim Id As Long, Ic As Long, Itb As Long, Col As Long, J As Long
With Sheet1
    LastRow = .Range("H65535").End(xlUp).Row
    sArr = .Range("A1:M" & LastRow)
    fI = 1
    For I = fI To UBound(sArr)
        If sArr(I, 8) = "ITEM" Then Ir = I
        Id = .Range("H" & Ir).End(xlDown).Row
        Ic = .Range("H" & Id).End(xlDown).Row
        If Ic <= UBound(sArr) Then
            For Col = 7 To 1 Step -1
                For Itb = Id To Ic
                    If sArr(Itb, Col) <> Empty Then
                        K = K + 1
                        dArr(K, 1) = K
                        dArr(K, 2) = sArr(Id - 2, Col)
                        dArr(K, 3) = sArr(Itb, 8)
                        For J = 9 To 13
                            dArr(K, J - 5) = sArr(Itb, J)
                        Next J
                        dArr(K, 9) = sArr(Id - 1, Col) * sArr(Itb, Col)
                        dArr(K, 10) = "=RC[-3]*RC[-1]"
                    End If
                Next Itb
            Next Col
            fI = Ic + 1
        End If
    Next I
End With
With Sheet2
    If K Then
        LastRow = .Range("L65535").End(xlUp).Row
        .Range("L2").Resize(LastRow, 10).ClearContents
        .Range("L2").Resize(K, 10) = dArr
    End If
End With
End Sub
 

File đính kèm

  • Test E-BOM.xlsm
    34.7 KB · Đọc: 10
Lần chỉnh sửa cuối:
Upvote 0
Bạn xem lại file mẫu. Tại bảng 1 MARK NO.(A2) có 4 dòng khác không sao sang Sheet2 nó lại có 3 dòng vậy
PHP:
Sub Thu_ti_thoi()
    Dim sArr, dArr(1 To 65535, 1 To 10)
    Dim I As Long, fI As Long, K As Long, LastRow As Long, Ir As Long
    Dim Id As Long, Ic As Long, Itb As Long, Col As Long, J As Long
With Sheet1
    LastRow = .Range("H65535").End(xlUp).Row
    sArr = .Range("A1:M" & LastRow)
    fI = 1
    For I = fI To UBound(sArr)
        If sArr(I, 8) = "ITEM" Then Ir = I
        Id = .Range("H" & Ir).End(xlDown).Row
        Ic = .Range("H" & Id).End(xlDown).Row
        If Ic <= UBound(sArr) Then
            For Col = 7 To 1 Step -1
                For Itb = Id To Ic
                    If sArr(Itb, Col) <> Empty Then
                        K = K + 1
                        dArr(K, 1) = K
                        dArr(K, 2) = sArr(Id - 2, Col)
                        dArr(K, 3) = sArr(Itb, 8)
                        For J = 9 To 13
                            dArr(K, J - 5) = sArr(Itb, J)
                        Next J
                        dArr(K, 9) = sArr(Id - 1, Col) * sArr(Itb, Col)
                        dArr(K, 10) = "=RC[-3]*RC[-1]"
                    End If
                Next Itb
            Next Col
            fI = Ic + 1
        End If
    Next I
End With
With Sheet2
    If K Then
        LastRow = .Range("L65535").End(xlUp).Row
        .Range("L2").Resize(LastRow, 10).ClearContents
        .Range("L2").Resize(K, 10) = dArr
    End If
End With
End Sub
Kỳ ha, sao chạy code không giống đáp án tý nào:(
 
Upvote 0
Còn tôi nghĩ AutoFilter mới đơn giản nhất, chỉ 1 dòng code là đủ. Bạn tin không?
Em tin là chỉ 1 dòng code, nhưng bảng của em nó còn lắm thứ khác, nên để filter cho chuẩn thì lại phải tạo điều kiện lọc cho các dòng khác, không nó lọc luôn đi mất. Em đang mấy mò làm mấy cái này nên hơi lơ ngơ. Cám ơn bác ạ.
 
Upvote 0
Em tin là chỉ 1 dòng code, nhưng bảng của em nó còn lắm thứ khác, nên để filter cho chuẩn thì lại phải tạo điều kiện lọc cho các dòng khác, không nó lọc luôn đi mất. Em đang mấy mò làm mấy cái này nên hơi lơ ngơ. Cám ơn bác ạ.
Ủa là sao hả bạn? Đằng nào thì code cũng lọc những giá trị khác rổng tại cột A, tức ẩn những giá trị rổng. Vậy chẳng phải nếu dùng AutoFilter cũng đi đến cùng kêt quả sao?
Hình như bạn chưa biết code AutoFilter thì phải? Thôi thì bạn cứ làm bằng tay và record macro quá trình sẽ thấy ngay code
 
Upvote 0
Bạn xem lại file mẫu. Tại bảng 1 MARK NO.(A2) có 4 dòng khác không sao sang Sheet2 nó lại có 3 dòng vậy
PHP:
Sub Thu_ti_thoi()
    Dim sArr, dArr(1 To 65535, 1 To 10)
    Dim I As Long, fI As Long, K As Long, LastRow As Long, Ir As Long
    Dim Id As Long, Ic As Long, Itb As Long, Col As Long, J As Long
With Sheet1
    LastRow = .Range("H65535").End(xlUp).Row
    sArr = .Range("A1:M" & LastRow)
    fI = 1
    For I = fI To UBound(sArr)
        If sArr(I, 8) = "ITEM" Then Ir = I
        Id = .Range("H" & Ir).End(xlDown).Row
        Ic = .Range("H" & Id).End(xlDown).Row
        If Ic <= UBound(sArr) Then
            For Col = 7 To 1 Step -1
                For Itb = Id To Ic
                    If sArr(Itb, Col) <> Empty Then
                        K = K + 1
                        dArr(K, 1) = K
                        dArr(K, 2) = sArr(Id - 2, Col)
                        dArr(K, 3) = sArr(Itb, 8)
                        For J = 9 To 13
                            dArr(K, J - 5) = sArr(Itb, J)
                        Next J
                        dArr(K, 9) = sArr(Id - 1, Col) * sArr(Itb, Col)
                        dArr(K, 10) = "=RC[-3]*RC[-1]"
                    End If
                Next Itb
            Next Col
            fI = Ic + 1
        End If
    Next I
End With
With Sheet2
    If K Then
        LastRow = .Range("L65535").End(xlUp).Row
        .Range("L2").Resize(LastRow, 10).ClearContents
        .Range("L2").Resize(K, 10) = dArr
    End If
End With
End Sub

Đúng rồi đó bạn, đó là lỗi của mình. Chính vì lý do vừa mất thời gian vừa lại hay nhập sai như vậy mình mới cần các bạn giúp đỡ.
Như code của bạn thì mình thấy nó đi đúng hướng nhưng hình như nó có vấn đề với vòng lặp.
Như bài mình đã điền thủ công thì giá trị ở cột B sẽ chạy lần lượt từ A1 đến A cuối (phải sang trái) rồi tiếp tục X1 đến X cuối bên trái, C1 đến C cuối bên trái...... Và nó có bao nhiêu giá trị khác 0 thì sẽ có bấy nhiêu dòng chứa nó. Nhưng khi chạy code của bạn thì có quá nhiều dòng được lặp lại không cần thiết.
Mong bạn xem lại giúp mình. Mình cảm ơn!
 
Lần chỉnh sửa cuối:
Upvote 0
Các bác giúp em sửa cái bên dưới này với. Em không học về lập trình mà chỉ mầy mò tự làm mấy cái mình cần thôi nên kém lắm ạ.
Chuyện là vầy, em lượm được đoạn code của bác @ndu96081631 để in sheet em cần thành .pdf, em copy vào module. Nhưng em muốn làm tự động để mỗi khi em in ra 1 cái thì nó sẽ sao lưu ra 1 file .pdf đặt ở một vị trí trong thư mục backup. Nên em đặt Call đấy trong ThisWorkbook. Nhưng khi chạy thì nó báo lỗi
Runtime error '28'
OUT OF STACK SPACE.

Nhờ các bác sửa giúp cho hết lỗi ạ.

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Call PDF
End Sub
----

Sub PDF()
Dim wks As Worksheet
Dim FileName As String
Set wks = ActiveSheet
'With ThisWorkbook
FileName = "C:\Backup\PAYMENT SLIPS" & "\Prntd_" & wks.Range("G8").Value & "_PS No." & wks.Range("A13").Value & Format(Now, "_yymmdd_hhmmss")
'Worksheets.Select
wks.ExportAsFixedFormat 0, FileName
wks.Select
'End With
End Sub
 
Upvote 0
Các bác giúp em sửa cái bên dưới này với. Em không học về lập trình mà chỉ mầy mò tự làm mấy cái mình cần thôi nên kém lắm ạ.
Chuyện là vầy, em lượm được đoạn code của bác @ndu96081631 để in sheet em cần thành .pdf, em copy vào module. Nhưng em muốn làm tự động để mỗi khi em in ra 1 cái thì nó sẽ sao lưu ra 1 file .pdf đặt ở một vị trí trong thư mục backup. Nên em đặt Call đấy trong ThisWorkbook. Nhưng khi chạy thì nó báo lỗi
Runtime error '28'
OUT OF STACK SPACE.

Nhờ các bác sửa giúp cho hết lỗi ạ.

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Call PDF
End Sub
----

Sub PDF()
Dim wks As Worksheet
Dim FileName As String
Set wks = ActiveSheet
'With ThisWorkbook
FileName = "C:\Backup\PAYMENT SLIPS" & "\Prntd_" & wks.Range("G8").Value & "_PS No." & wks.Range("A13").Value & Format(Now, "_yymmdd_hhmmss")
'Worksheets.Select
wks.ExportAsFixedFormat 0, FileName
wks.Select
'End With
End Sub

Nhiều khả năng lệnh exportasfixedformat kích hoạt lại thủ tục Workbook_BeforePrint gây tràn stack. Bạn thử sửa thành
Private Sub Workbook_BeforePrint(Cancel As Boolean)
dim xxx as boolean
xxx=application.enableevents
application.enableevents=false
Call PDF
application.enableevents=xxx

End Sub
 
Upvote 0
Nhiều khả năng lệnh exportasfixedformat kích hoạt lại thủ tục Workbook_BeforePrint gây tràn stack. Bạn thử sửa thành
Private Sub Workbook_BeforePrint(Cancel As Boolean)
dim xxx as boolean
xxx=application.enableevents
application.enableevents=false
Call PDF
application.enableevents=xxx

End Sub


Bạn nói đúng quá, mình làm lại như bạn viết, chạy chuẩn luôn. Cám ơn bạn nhiều lắm!
 
Upvote 0
Dear all

mình có đoạn code như dưới đây, tuy nhiên khi rất chậm, mình lại đang đặt nó với sự kiện open workbook nên cần nó chạy nhaanh hơn 1 chút,
ai có cách nào cải thiện tốc độ giúp mình trong trường hợp này không
Mã:
Sub xu_ly_thong_bao_sheet_co_ban()
'Sheet1.Shapes("Rectangular Callout 50").Visible = msoFalse ' ân dôi tuong
'Sheet1.Shapes("Rectangular Callout 50").Visible = msoTrue ' hien doi tuong
Dim CB_dang_ky As Long, CB_dang_kiem As Long, CB_bao_hiem As Long, CB_phi_bao_tri As Long, CB_phu_hieu As Long, CB_bao_duong As Long, CB_thay_lop As Long, CB_thay_ac_quy As Long
Dim i As Long
LR = Sheet2.Cells(Rows.Count, "A").End(xlUp).Row ' hiện LR mới đến khoảng 300
For i = 5 To LR
Sheet2.Cells(i, "AA").Value = Application.WorksheetFunction.YearFrac(Sheet2.Range("K" & i), CLng(Date), 3)
Next i
CB_dang_ky = Application.WorksheetFunction.CountIf(Sheet2.Range("AA5:AA" & i), ">24") 'dem so ngay lon today - 7 trong cot "N"
Sheet1.Shapes("Rectangle 57").TextFrame2.TextRange.Characters.Text = CB_dang_ky 'dien ky tu vao doi tuong
Sheet2.Range("AA5:AA" & i).ClearContents
CB_dang_kiem = Application.WorksheetFunction.CountIfs(Sheet2.Range("N5:N1000"), "<=" & CLng(Date) + 7)  ' dem so ngay nho hon today + 7 trong cot "N"
Sheet1.Shapes("Rectangle 53").TextFrame2.TextRange.Characters.Text = CB_dang_kiem 'dien ky tu vao doi tuong
CB_bao_hiem = Application.WorksheetFunction.CountIfs(Sheet2.Range("P5:P1000"), "<=" & CLng(Date) + 30)  ' dem so ngay nho hon today + 30 trong cot "P"
Sheet1.Shapes("Rectangle 63").TextFrame2.TextRange.Characters.Text = CB_bao_hiem 'dien ky tu vao doi tuong
CB_phi_bao_tri = Application.WorksheetFunction.CountIfs(Sheet2.Range("S5:S1000"), "<=" & CLng(Date) + 30)  ' dem so ngay nho hon today + 30 trong cot "S"
Sheet1.Shapes("Rectangle 66").TextFrame2.TextRange.Characters.Text = CB_phi_bao_tri 'dien ky tu vao doi tuong
CB_phu_hieu = Application.WorksheetFunction.CountIfs(Sheet2.Range("R5:R1000"), "<=" & CLng(Date) + 60)  ' dem so ngay nho hon today +60 trong cot "R"
Sheet1.Shapes("Rectangle 69").TextFrame2.TextRange.Characters.Text = CB_phu_hieu 'dien ky tu vao doi tuong
End Sub
 
Upvote 0
Dear all

mình có đoạn code như dưới đây, tuy nhiên khi rất chậm, mình lại đang đặt nó với sự kiện open workbook nên cần nó chạy nhaanh hơn 1 chút,
ai có cách nào cải thiện tốc độ giúp mình trong trường hợp này không
Mã:
Sub xu_ly_thong_bao_sheet_co_ban()
'Sheet1.Shapes("Rectangular Callout 50").Visible = msoFalse ' ân dôi tuong
'Sheet1.Shapes("Rectangular Callout 50").Visible = msoTrue ' hien doi tuong
Dim CB_dang_ky As Long, CB_dang_kiem As Long, CB_bao_hiem As Long, CB_phi_bao_tri As Long, CB_phu_hieu As Long, CB_bao_duong As Long, CB_thay_lop As Long, CB_thay_ac_quy As Long
Dim i As Long
LR = Sheet2.Cells(Rows.Count, "A").End(xlUp).Row ' hiện LR mới đến khoảng 300
For i = 5 To LR
Sheet2.Cells(i, "AA").Value = Application.WorksheetFunction.YearFrac(Sheet2.Range("K" & i), CLng(Date), 3)
Next i
CB_dang_ky = Application.WorksheetFunction.CountIf(Sheet2.Range("AA5:AA" & i), ">24") 'dem so ngay lon today - 7 trong cot "N"
Sheet1.Shapes("Rectangle 57").TextFrame2.TextRange.Characters.Text = CB_dang_ky 'dien ky tu vao doi tuong
Sheet2.Range("AA5:AA" & i).ClearContents
CB_dang_kiem = Application.WorksheetFunction.CountIfs(Sheet2.Range("N5:N1000"), "<=" & CLng(Date) + 7)  ' dem so ngay nho hon today + 7 trong cot "N"
Sheet1.Shapes("Rectangle 53").TextFrame2.TextRange.Characters.Text = CB_dang_kiem 'dien ky tu vao doi tuong
CB_bao_hiem = Application.WorksheetFunction.CountIfs(Sheet2.Range("P5:P1000"), "<=" & CLng(Date) + 30)  ' dem so ngay nho hon today + 30 trong cot "P"
Sheet1.Shapes("Rectangle 63").TextFrame2.TextRange.Characters.Text = CB_bao_hiem 'dien ky tu vao doi tuong
CB_phi_bao_tri = Application.WorksheetFunction.CountIfs(Sheet2.Range("S5:S1000"), "<=" & CLng(Date) + 30)  ' dem so ngay nho hon today + 30 trong cot "S"
Sheet1.Shapes("Rectangle 66").TextFrame2.TextRange.Characters.Text = CB_phi_bao_tri 'dien ky tu vao doi tuong
CB_phu_hieu = Application.WorksheetFunction.CountIfs(Sheet2.Range("R5:R1000"), "<=" & CLng(Date) + 60)  ' dem so ngay nho hon today +60 trong cot "R"
Sheet1.Shapes("Rectangle 69").TextFrame2.TextRange.Characters.Text = CB_phu_hieu 'dien ky tu vao doi tuong
End Sub

Có ai quan tâm không nhỉ?
 
Upvote 0
Web KT
Back
Top Bottom