Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây (2 người xem)

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

  • Status
    Không mở trả lời sau này.

    ST-Lu!

    Love Wingchun
    Tham gia
    19/8/08
    Bài viết
    730
    Được thích
    546
    Nghề nghiệp
    Xích lô một thời
    Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

    Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

    BQT

    ----------------------------------------------------------------------------------------------------------------


    Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

    Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

    Cám ơn các anh chỉ giáo
     
    Chỉnh sửa lần cuối bởi điều hành viên:
    Hỏi cái này các Bạn đừng cười vì có vẻ ngớ ngẩn:
    Nhiều khi các đoạn code dài dùng nhiều If ....End If lồng vào nhau rất khó đọc code hoặc sửa chữa, có cách nào xác định nhanh được từng cặp của chúng với nhau không? Tương tự như vậy đối với Do ....Loop, v.v...
     
    Upvote 0
    Hỏi cái này các Bạn đừng cười vì có vẻ ngớ ngẩn:
    Nhiều khi các đoạn code dài dùng nhiều If ....End If lồng vào nhau rất khó đọc code hoặc sửa chữa, có cách nào xác định nhanh được từng cặp của chúng với nhau không? Tương tự như vậy đối với Do ....Loop, v.v...
    Có dễ nhìn hay không là do lúc viết code bạn bố trí chúng ngay hàng thẳng lối... cái nào 1 cặp thì chúng sẽ thẳng hàng nhau theo chiều dọc
    Xem hình minh họa

    untitled.JPG
     
    Upvote 0
    Có dễ nhìn hay không là do lúc viết code bạn bố trí chúng ngay hàng thẳng lối... cái nào 1 cặp thì chúng sẽ thẳng hàng nhau theo chiều dọc

    Ít thì được chớ nhiều quá (chương trình dự toán xây dựng đến hàng chục trang nếu copy sang Word, thiết kế hàng nhiều tháng, rồi sửa đi sửa lại), e rằng khó giữ được nề nếp!
    Nhân đây mình hỏi thêm, khi bấm vào lề trái thì nguyên dòng code thành màu nâu, có một chấm tròn ở đầu dòng, chức năng này để làm gì vậy?
     
    Upvote 0
    Ít thì được chớ nhiều quá (chương trình dự toán xây dựng đến hàng chục trang nếu copy sang Word, thiết kế hàng nhiều tháng, rồi sửa đi sửa lại), e rằng khó giữ được nề nếp!
    Nhân đây mình hỏi thêm, khi bấm vào lề trái thì nguyên dòng code thành màu nâu, có một chấm tròn ở đầu dòng, chức năng này để làm gì vậy?

    Để code của chương trình dễ đọc, bạn nên dùng Smart Indenter v3.5, tải về tại đây.
    Sau đó bạn cài đặt rồi sử dụng. Chương trình rất đơn giản và dễ sử dụng.

    Lê Văn Duyệt
     
    Upvote 0
    Hiệu chỉnh code vba cho hoàn hảo

    Chào các bác,
    Em có file excel quản lý hóa đơn nhưng do sử dụng công thức quá nhiều và cũng có nhiều dòng nữa nên máy chạy rất chậm. Em có thử viết code nhưng chưa hoàn hảo nên vẫn máy vẫn còn chạy chậm. Mong các bác xem và giúp em. Cảm ơn các bác nhiều.
    Note : bảng tính của em có thể lên đến 10.000 dòng
     

    File đính kèm

    Upvote 0
    Bạn cần nói rõ thay công thức ở cột nào, trang tính nào?

    Trong file của bạn công thức ở trang cuối toàn lỗi hay sao í; Vậy thì khó giúp bạn được rồi!
    Có lẻ bạn nên xử lí lại file & gởi lên cái khác.

    Chờ tin bạn & chúc vui vẻ.
     
    Upvote 0
    Chào bác ChanhTQ@,
    Cảm ơn Bác đã xem qua file. Em xin gởi lại file và có nói rõ trong file đính kèm nhờ bác xem hộ. Thực ra file Workbook này có đến 5 sheet: "bán ra"; "dskh bán ra";"kho"; "mua vào" và "dskh mua vào" nhưng vì 2 sheet sau cùng thì làm tương tự như 2 sheet đầu nên mình không đưa vào. Do đó, Bác thấy ở sheet "kho" có lỗi "REF" là như vậy. Nhờ bác giúp đỡ. Cảm ơn bác nhiều nha.
     

    File đính kèm

    Upvote 0
    Chào các bác,
    Em có file excel quản lý hóa đơn nhưng do sử dụng công thức quá nhiều và cũng có nhiều dòng nữa nên máy chạy rất chậm. Em có thử viết code nhưng chưa hoàn hảo nên vẫn máy vẫn còn chạy chậm. Mong các bác xem và giúp em. Cảm ơn các bác nhiều.
    Note : bảng tính của em có thể lên đến 10.000 dòng
    Mù mờ hiểu thế này
    Bạn nhập trong cột G, M, P thì gán công thức cho các cột kia, sau đó bỏ công thức chỉ lấy giá trị
    Tạm thời thế này, khi nhập code chỉ làm việc với vài cell trong hàng nên không ảnh hưởng tới tốc độ đâu, dữ liệu có "bi" nhiêu dòng cũng chẳng ảnh hưởng
    Mã:
    Private Sub worksheet_Change(ByVal Target As Range)
        On Error Resume Next
        If Not Intersect(Target, Range("g5: g20000")) Is Nothing Then
             With Target
                .Offset(, 1).Formula = "=if(RC[-1]="""","""",VLOOKUP(RC[-1],dskh!R1C1:R300C2,2,0))"
                .Offset(, -6).Formula = "=IF(RC[1]="""",r[-1]c,rc[1])"
                .Offset(, -4).Formula = "=IF(RC[4]="""",r[-1]c,MAX(R4C3:R[-1]C)+1)"
                .Offset(, -3).Formula = "=IF(RC[1]="""",r[-1]c,rc[1])"
                .Offset(, -1).Formula = "=IF(RC[1]="""",r[-1]c,rc[1])"
                .Offset(, -6).Resize(, 6).Value = .Offset(, -6).Resize(, 6).Value
                .Offset(, 1).Value = .Offset(, 1).Value
            End With
                Target.Offset(0, 6).Select
        End If
                    If Not Intersect(Target, Range("m5: m20000")) Is Nothing Then
                        With Target
                            .Offset(, 1).Formula = "=if(RC[-1]="""","""",rc[-1]*rc[-2])"
                            .Offset(, 2).Formula = "=IF(RC[-8]="""","""",SUMIF(R5C3:R200C3,RC[-12],R5C14:R200C14))"
                            .Offset(, 1).Resize(, 2).Value = .Offset(, 1).Resize(, 2).Value
                        End With
                            Target.Offset(1, -4).Select
                    End If
                                If Not Intersect(Target, Range("p5: p20000")) Is Nothing Then
                                    With Target
                                        .Offset(, 1).Formula = "=if(RC[-1]="""","""",rc[-1]*rc[-2])"
                                        .Offset(, 2).Formula = "=if(RC[-1]="""","""",rc[-1]+rc[-3])"
                                        .Offset(, 1).Resize(, 2).Value = .Offset(, 1).Resize(, 2).Value
                                    End With
                                        Target.Offset(1, -14).Select
                                End If
    End Sub
    Còn khi nhập xong bạn chọn Target.Offset(1, -4).Select ..vv...thì ...mình "hổng" hiểu bạn muốn làm gì
    Bạn thử kiểm tra xem chứ mình nhìn một hồi chóng mặt quá, sợ tỉnh lại phí mật 5 ve vừa chơi xong. Híc
    Thân
     
    Upvote 0
    Cảm ơn bác,
    Gần đúng rồi bác ơi. Còn chút nữa bác cố giúp em nha. Cảm ơn bác nhiều.
     

    File đính kèm

    Upvote 0
    Mấy chàng ngự lâm này để các dòng lệnh mất trật tự quá! Trước tiên là làm khó mình.

    Code của tác giả bước đầu có thể sửa như sau:

    PHP:
    Option Explicit
    Private Sub worksheet_Change(ByVal Target As Range)
        On Error Resume Next
     If Not Intersect(Target, Range("g5: g200")) Is Nothing Then
       ' dien ten khach hang:'
        Worksheets("bán ra").Range("h5:h200").Formula = _
            "=if(RC[-1]="""","""",VLOOKUP(RC[-1],dskh!R1C1:R300C2,2,0))"
      'dien ngày:'
        Worksheets("bán ra").Range("a5:a200").Formula = "=IF(RC[1]="""",r[-1]c,rc[1])"
       'dien so phieu:'
        Worksheets("bán ra").Range("c5:c200").Formula = "=IF(RC[4]="""",r[-1]c,MAX(R4C3:R[-1]C)+1)"
       'dien so hd:'
        Worksheets("bán ra").Range("d5:d200").Formula = "=IF(RC[1]="""",r[-1]c,rc[1])"
       'dien ma kh:'
        Worksheets("bán ra").Range("f5:f200").Formula = "=IF(RC[1]="""",r[-1]c,rc[1])"
       
        Target.Offset(0, 2).Select
         
     ElseIf Not Intersect(Target, Range("m5: m200")) Is Nothing Then
        Worksheets("bán ra").Range("n5:n200").Formula = "=if(RC[-1]="""","""",rc[-1]*rc[-2])"
        Worksheets("bán ra").Range("o5:o200").Formula = _
            "=IF(RC[-8]="""","""",SUMIF(R5C3:R200C3,RC[-12],R5C14:R200C14))"
        Target.Offset(1, -4).Select
     ElseIf Not Intersect(Target, Range("p5: p200")) Is Nothing Then
    
        Worksheets("bán ra").Range("q5:q200").Formula = "=if(RC[-1]="""","""",rc[-1]*rc[-2])"
        Worksheets("bán ra").Range("r5:r200").Formula = "=if(RC[-1]="""","""",rc[-1]+rc[-3])"
       
    1    Range("a5:a200").Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     2   Application.CutCopyMode = False
        
        
    3    Range("c5:c200").Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    4    Application.CutCopyMode = False
        
    5    Range("d5:d200").Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    6    Application.CutCopyMode = False
        
    7    Range("f5:f200").Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    8    Application.CutCopyMode = False
        
    9    Range("h5:h200").Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    10    Application.CutCopyMode = False
        
    11    Range("n5:n200").Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    12    Application.CutCopyMode = False
        
    13    Range("o5:o200").Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    14    Application.CutCopyMode = False
        
    15    Range("q5:q200").Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    16    Application.CutCopyMode = False
        
    17    Range("r5:r200").Select
         Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    18    Application.CutCopyMode = False
       
        Target.Offset(1, -14).Select
     End If
    End Sub
    Sửa lại vậy cho dễ nôm thôi, chứ thật ra còn nhiều vấn đề f ải bàn ở đây lắm:

    Trước tiên, sau tác giả lại không cho macro gán trực tiếp trị vô các ô mà lại fải gán công thức, rồi sau đó lại chuyển sang trị những công thức đó vậy?

    Thứ hai: Công việc copy & dán tại chổ như trên lặp đi lặp lại 18\2 lần cả thẩy; Sao bạn không "đặt thừa số chung như thế này nhỉ:

    (|) Tất cả các dóng lệnh từ ố lẽ đến số chẵn gần nhất ta thay bằng 1 dòng lệnh gọi 1 macro chung; Cụ thể như sau

    Mã:
     CopyToValues Range("a5:a200")
    Và ta thêm 1 macro để 18 dòng lệnh này gọi, đó là:


    PHP:
     Sub CopyToValues (Rng As Range)
       Rng.Copy
       Rng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False
     End Sub
    (Thực ra mệnh đề ",Transpose:=False" để cũng không sao mà có cũng không sao)

    Chuyện này cũng nói thêm, chắc cũng thừa tí chút:
    Câu lệnh
    Mã:
    Application.CutCopyMode = False
    chì nên xài 1 lần ở cuối macro mà thôi

    Thứ ba, & vấn đề mình cho là quan trọng, bạn cần xem xét: Đó là macro sự kiện thường người ta hay dùng để tự động hoá quá trình nhập hay sửa 1 record mà thôi (1 hàng dữ liệu);
    Ở đây bạn lại cho nó cập nhựt hết cả trang dữ liệu luôn là cơ sao. Bạn bị ai bắt làm chuyện đó à?;
    Thêm cái này nữa, chắc cũng không thừa: Tất tần tật con số 200 trong toàn bộ macro của bạn nên thay bằng hằng số nào đó , ví dụ vô đầu macro sự kiện ta khai báo

    Const Dg As Integer = 300

    Cái lợi ở đây là khi toàn bộ CSDL có tăng hay đổi thì ta chỉ việc sửa có 1 chổ ở khai báo này mà thôi.
    Bạn chớ coi thường chuyện này & cho nó là lẽ tẻ. Vì nếu ta không làm được những điều nhỏ lẻ, thì khó mà làm việc lớn được!

    Cũng những mong bạn tiến xa trên đường xây dựng code mà thôi!
     
    Upvote 0
    Chào bác,
    Cảm ơn bác đã xem qua bài. Giá mà bài này kèm theo cả file đính kèm thì hay biết mấy.Vì em mới tập làm vba nên không hiểu ý của bác cho lắm.
    Em thấy code của bác "concogia" hay lắm chỉ cần autofill các cột: A, C, D, E nữa thì mới đúng hàm sum if trong cột "tổng tiền hàng" và là thành công. Cảm ơn bác.
     
    Upvote 0
    Cảm ơn bác,
    Gần đúng rồi bác ơi. Còn chút nữa bác cố giúp em nha. Cảm ơn bác nhiều.
    Vậy thử cái này xem
    Mã:
    Private Sub worksheet_Change(ByVal Target As Range)
    Dim iDau, iCuoi, I
        On Error Resume Next
        If Not Intersect(Target, Range("g5: g20000")) Is Nothing Then
             With Target
                .Offset(, 1).Formula = "=if(RC[-1]="""","""",VLOOKUP(RC[-1],dskh!R1C1:R300C2,2,0))"
                .Offset(, -6).Formula = "=IF(RC[1]="""",r[-1]c,rc[1])"
                .Offset(, -4).Formula = "=IF(RC[4]="""",r[-1]c,MAX(R4C3:R[-1]C)+1)"
                .Offset(, -3).Formula = "=IF(RC[1]="""",r[-1]c,rc[1])"
                .Offset(, -1).Formula = "=IF(RC[1]="""",r[-1]c,rc[1])"
                .Offset(, -6).Resize(, 6).Value = .Offset(, -6).Resize(, 6).Value
                .Offset(, 1).Value = .Offset(, 1).Value
             End With
             If Target.Address <> "$G$5" And Target.Offset(-1) = "" Then
                iCuoi = Target.Row - 1
                    For I = iCuoi To 1 Step -1
                        If Cells(I, 7) <> "" Then iDau = I + 1: Exit For
                    Next
                With Range(Cells(iDau, 7), Cells(iCuoi, 7))
                    .Offset(, -6).Value = Cells(I, 7).Offset(, -6)
                    .Offset(, -4).Value = Cells(I, 7).Offset(, -4)
                    .Offset(, -3).Value = Cells(I, 7).Offset(, -3)
                    .Offset(, -1).Value = Cells(I, 7).Offset(, -1)
                End With
                    Cells(I, 7).Offset(, 8) = Application.WorksheetFunction.Sum(Range(Cells(iDau - 1, 7), Cells(iCuoi, 7)).Offset(, 7))
             End If
                Target.Offset(0, 6).Select
        End If
                    If Not Intersect(Target, Range("m5: m20000")) Is Nothing Then
                        With Target
                            .Offset(, 1).Formula = "=if(RC[-1]="""","""",rc[-1]*rc[-2])"
                            .Offset(, 2).Formula = "=IF(RC[-8]="""","""",SUMIF(R5C3:R200C3,RC[-12],R5C14:R200C14))"
                            .Offset(, 1).Resize(, 2).Value = .Offset(, 1).Resize(, 2).Value
                        End With
                            Target.Offset(1, -4).Select
                    End If
                                If Not Intersect(Target, Range("p5: p20000")) Is Nothing Then
                                    With Target
                                        .Offset(, 1).Formula = "=if(RC[-1]="""","""",rc[-1]*rc[-2])"
                                        .Offset(, 2).Formula = "=if(RC[-1]="""","""",rc[-1]+rc[-3])"
                                        .Offset(, 1).Resize(, 2).Value = .Offset(, 1).Resize(, 2).Value
                                    End With
                                        Target.Offset(1, -14).Select
                                End If
    End Sub
    Hy vọng trúng các yêu cầu của bạn
    Thân
     
    Upvote 0
    Cảm ơn bác rất nhiều, đã đúng nguyện vọng của em rồi nhưng có điều lạ là em nhập hóa đơn tiếp theo thì hóa đơn liền trước mới nhảy đúng còn không thì nó vẫn cứ nhảy sai. Em sẽ nghiên cứu thêm. Cảm ơn bác rất nhiều
     
    Upvote 0
    Các bạn cho hỏi
    1. Có hàm VBA nào tìm được giá trị lớn nhất của các số a, b ,c ,... không?
    2. Để tìm dòng cuối cùng cột B tôi dùng ([B65536].End(xlUp).Row), còn nếu muốn tìm dòng cuối cùng của hai hay nhiều cột liền nhau thì sao?
     
    Upvote 0
    Các bạn cho hỏi
    1. Có hàm VBA nào tìm được giá trị lớn nhất của các số a, b ,c ,... không?
    2. Để tìm dòng cuối cùng cột B tôi dùng ([B65536].End(xlUp).Row), còn nếu muốn tìm dòng cuối cùng của hai hay nhiều cột liền nhau thì sao?
    Câu 1: Ý anh có phải là tìm MAX không? Đơn giản là WorksheetFunction.Max thôi
    Câu 2: Anh thử code này xem:
    PHP:
    Sub Test()
      Dim Rng As Range
      Set Rng = Selection
      Rng.Find("*", , , , , xlPrevious).Select
    End Sub
    xlPrevious nghĩa là tìm ngược từ dưới lên
     
    Upvote 0
    Câu 1: Ý anh có phải là tìm MAX không? Đơn giản là WorksheetFunction.Max thôi
    Câu 2: Anh thử code này xem:
    PHP:
    Sub Test()
    Dim Rng As Range
    Set Rng = Selection
    Rng.Find("*", , , , , xlPrevious).Select
    End Sub
    xlPrevious nghĩa là tìm ngược từ dưới lên

    Giả sử mình muốn tìm dòng cuối cùng trong bốn cột G,H,I,J; vì mình không chọn nó nên làm vậy:
    C = WorksheetFunction.Max([G65536].End(xlUp).Row, [H65536].End(xlUp).Row, [I65536].End(xlUp).Row, [J65536].End(xlUp).Row)
    MsgBox C
    Cũng được kết quả nhưng có ngố không?
     
    Upvote 0
    Giả sử mình muốn tìm dòng cuối cùng trong bốn cột G,H,I,J; vì mình không chọn nó nên làm vậy:

    Cũng được kết quả nhưng có ngố không?
    Làm vậy nó... kỳ kỳ... Ẹc.. Ẹc... (chứ hổng phải là hổng được)
    Em nghĩ vầy thì hay hơn:
    PHP:
    Sub Test()
      MsgBox Range("G:J").Find("*", , , , , xlPrevious).Row
    End Sub
    --------------
    Nói vậy thôi chứ cho dù kỳ đi nữa thì cũng là cái mình TỰ NGHĨ RA, đúng không anh?
     
    Upvote 0
    Làm vậy nó... kỳ kỳ... Ẹc.. Ẹc... (chứ hổng phải là hổng được)
    Em nghĩ vầy thì hay hơn:
    PHP:
    Sub Test()
    MsgBox Range("G:J").Find("*", , , , , xlPrevious).Row
    End Sub
    --------------
    Nói vậy thôi chứ cho dù kỳ đi nữa thì cũng là cái mình TỰ NGHĨ RA, đúng không anh?

    May mà có 4 cột chớ nếu hơn 100 cột chắc mình tiêu rồi, dốt thật, cảm ơn ndu!
     
    Upvote 0
    Chào bác,
    Bác ơi em có công thức như sau:
    =SUBTOTAL(9;$E$7:E7)-SUBTOTAL(9;$F$7:F7)
    Em sẽ autofill công thức này đến 2000 ô thì khi trích lọc máy tính chạy chậm vậy bác có cách nào chuyển hẳn sang code vba đế cho máy tính chạy nhanh hơn không? Bác chỉ em với. Cảm ơn bác.
     
    Upvote 0
    Ví dụ tôi muốn dùng code để gán công thức cho ô A1 là =IF(B1="";C1;D1)
    Đang đứng tại ô B1, tôi viết code là ActiveCell.Offset(0, -1).Formula = "=IF(B" & ActiveCell.Row & "="";C" & ActiveCell.Row & ";D" & ActiveCell.Row & ")"
    Thì bị lỗi nhờ các AE giúp!
     
    Lần chỉnh sửa cuối:
    Upvote 0
    Status
    Không mở trả lời sau này.
    Web KT

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

    Back
    Top Bottom