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

Liên hệ QC
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

  • Copy of hoàn chỉnh.rar
    85.4 KB · Đọc: 30
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

  • HD.rar
    86.1 KB · Đọc: 28
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

  • HD1.rar
    82.1 KB · Đọc: 17
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