Nhờ giúp đỡ: Code hiện kết quả tại 1 vùng sau khi nhập liệu tại 1 ô

Liên hệ QC

vodanhkiemtu

Thành viên mới
Tham gia
31/1/09
Bài viết
15
Được thích
1
Xin kính chào các anh chị,
Em nhờ giúp đỡ viết code để nhập dữ liệu trên file đính kèm, nhằm hạn chế sử dụng công thức excel:
Cụ thể như sau:
- Ở sheet "NhapLieu": sau khi em nhập dữ liệu từ cột A đến cột G, thì các dòng ở cột M,N,O sẽ tự nhảy kết quả mà không phải sử dụng công thức như đang để trên file
Em xin cảm ơn sự giúp đỡ của các anh chị ạ.
 

File đính kèm

  • QuanLyKho.xlsx
    34.1 KB · Đọc: 11
Em mới tìm hiểu về VBA nên có thể do trình bày khó hiểu, làm các anh chị không thể hỗ trợ được.
Sau 1 ngày mày mò, học lóm code thì em viết được đoạn này gọi là tạm đáp ứng được nhu cầu của em
Các anh chị xem giúp em, xem đoạn Code này có khả năng xảy ra lỗi gì không với ạ:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Application.ScreenUpdating = False
With ActiveWorksheets
If Not Application.Intersect(Range("G:G"), Range(Target.Address)) Is Nothing Then
Range("M4:O4").Copy
Target.Offset(0, 6).Resize(1, 3).PasteSpecial xlPasteFormulas
Target.Offset(0, 6).Resize(1, 3).Value = Target.Offset(0, 6).Resize(1, 3).Value
Target.Offset(0, 4).Select
End If
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.CutCopyMode = Fall
End Sub
 

File đính kèm

  • QuanLyKho.xlsm
    42 KB · Đọc: 15
Upvote 0
1.
Mã:
With ActiveWorksheets
Không có cái gọi là ActiveWorksheets, chỉ có ActiveSheet. Do không có cái gọi là ActiveWorksheets mà bạn không có Option Explicit nên ActiveWorksheets được coi là biến kiểu Variant không được định nghĩa tường minh. Và dĩ nhiên do không được thiết lập giá trị nên ở dòng code trích ở trên nó có giá trị Empty, tức vô dụng.

Thế nếu sửa thành
Mã:
With ActiveSheet
...
    Range("M4:O4").Copy
...
End With
???

Nên biết là Range("M4:O4").Copy luôn là copy vùng M4:O4 của sheet đang hoạt động. Tức cho dù là With ActiveSheet hay With <sheet bất kỳ> thì Range("M4:O4").Copy luôn là copy vùng M4:O4 của sheet đang hoạt động. Như vậy thì With ActiveSheet là không cần thiết. Còn nếu muốn copy vùng của sheet XYZ cho dù ở thời điểm chạy code nó có hoạt động hay không thì phải là
Mã:
With XYZ
...
    .Range("M4:O4").Copy
...
End With
Chú ý có dấu chẩm ở trước Range...
Trong trường hợp của bạn code luôn thao tác trên sheet NhapLieu nên có thể viết
Mã:
With ThisWorkbook.Worksheets("NhapLieu")
...
    .Range("M4:O4").Copy
...
End With
hoặc đơn giản là With Me. Do code nằm trong module của sheet NhapLieu nên Me ám chỉ "tôi", tức sheet có code hiện hành, tức sheet NhapLieu.

2. Tôi hiểu dụng ý của bạn là: nếu có sự thay đổi trong cột G thì copy vùng M4:O4 của sheet NhapLieu rồi dán nhưng chỉ công thức vào vùng ở dòng hiện hành vào cột M:O, tiếp theo biến thành giá trị. Nếu bạn luôn chỉ nhập dữ liệu vào từng ô chứ không copy ở đâu đó rồi dán hàng loạt vào nhiều ô trên sheet thì code như bạn cũng được, đơn giản. Bạn chỉ phải để lại 3 công thức trong M4:O4. Tuy nhiên nếu bạn sửa lại dữ liệu ở hàng 4, vd. G4 thì code sẽ xóa mất công thức trong M4:O4, chính xác là chúng bị thay bởi giá trị rồi. Sau đó khi nhập vd. vào G11 thì không còn công thức trong M4:O4 để copy vào M11:O11 nữa.

Còn một bất cập nữa là khi bạn nhập vào vd. D11, E11, F11, G11 thì bạn có kết quả ở M11:O11. Nếu bây giờ bạn nhìn thấy là vd. E11 bạn nhập nhầm, dụng ý là khác, vậy bạn sửa E11. Nhưng code hiện thời chỉ kiểm tra xem dữ liệu có được nhập vào cột G hay không nên khi bạn sửa E11 thì code trong IF ... End If không được thực hiện nên kết quả trong M11:O11 không được làm mới.

Vậy thì nếu bạn muốn giữ code hiện có, vì nó cũng đơn giản thôi, thì nên sửa như sau.

Lưu ý rằng chính xác phải là Application.CutCopyMode = False chứ không phải là Application.CutCopyMode = Fall. Để như cũ cũng được vì do không có Option Explicit nên Fall được coi là biến kiểu Variant không được định nghĩa tường minh. Và dĩ nhiên do không được thiết lập giá trị nên ở dòng code trích ở trên nó có giá trị Empty, tương đương với False. Nhưng để Fall như bạn hơi kỳ. Tôi hiểu là do gõ có thiếu sót thôi.


Bạn tự kiểm tra kỹ.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
'    chỉ thực hiện khi nhập liệu từ dòng 5 trở đi (dòng 4 là dòng đầu tiên và chứa công thức) và chỉ khi thay đổi 1 cell.
    If Target.Count > 1 Or Target.Row <= 4 Then Exit Sub
'    chỉ thực hiện khi nhập dữ liệu vào các cột D, E, F (E, F ảnh hưởng tới cột O), G
    If Application.Intersect(Range("D:G"), Target) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Me.Range("M4:O4").Copy
    With Me.Range("M" & Target.Row).Resize(1, 3)    ' vùng Mx:Ox, với x là dòng đang nhập liệu ở cột D, E, F hoặc G
        .PasteSpecial xlPasteFormulas
        .Value = .Value
    End With
    Me.Range("K" & Target.Row).Select ' chọn ô cùng dòng với Target nhưng ở cột K. Hoặc Target.Offset(0, 11 - Target.Column).Select
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Application.CutCopyMode = False
End Sub
 
Upvote 0
Em cảm ơn anh đã chỉ cho em những lỗi sai và sửa lại code giúp em ạ
Em mới chập chững khám phá VBA nên còn gà mờ quá.

Code này đã chạy tốt rồi ạ.
Nhưng có 1 vấn đề là:
1. Bình thường em nhập theo thứ tự là cột D-->E-->F rồi mới nhập đến cột G, sau khi nhập xong cột G thì sẽ nhảy thẳng sang cột K để nhập tiếp
- Còn với Code này thì khi e nhập ở cột D, thì ô nhập liệu cũng sẽ chuyển luôn sang cột K, rồi lại phải quay lai nhập tiếp cột E, xong lại chuyển sang cột K
Có cách nào để khi nhập các cột D, E, F thì vẫn cho kết quả ở cột M:O, nhưng không bị nhảy ô sang cột K không ạ

2. Anh Có thể giúp em phát triển thêm code này với mục đích sau không ạ:
- Sau khi em nhập dữ liệu cột J (số lượng) và K (đơn giá), thì ở cột L (thành tiền) sẽ tự nhảy kết quả bằng J*K nếu cột O (LoaiNV) là N (nhập kho)
 
Upvote 0
2. Anh Có thể giúp em phát triển thêm code này với mục đích sau không ạ:
- Sau khi em nhập dữ liệu cột J (số lượng) và K (đơn giá), thì ở cột L (thành tiền) sẽ tự nhảy kết quả bằng J*K nếu cột O (LoaiNV) là N (nhập kho)
Thế nếu O <> "N" thì L có giá trị gì không? Để trống, sẽ tự nhập tay?
 
Upvote 0
Em mới tìm hiểu về VBA nên có thể do trình bày khó hiểu, làm các anh chị không thể hỗ trợ được.
Sau 1 ngày mày mò, học lóm code thì em viết được đoạn này gọi là tạm đáp ứng được nhu cầu của em
Các anh chị xem giúp em, xem đoạn Code này có khả năng xảy ra lỗi gì không với ạ:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Application.ScreenUpdating = False
With ActiveWorksheets
If Not Application.Intersect(Range("G:G"), Range(Target.Address)) Is Nothing Then
Range("M4:O4").Copy
Target.Offset(0, 6).Resize(1, 3).PasteSpecial xlPasteFormulas
Target.Offset(0, 6).Resize(1, 3).Value = Target.Offset(0, 6).Resize(1, 3).Value
Target.Offset(0, 4).Select
End If
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.CutCopyMode = Fall
End Sub
Tham khảo chủ đề này có thể hợp ý
 
Upvote 0
Thế nếu O <> "N" thì L có giá trị gì không? Để trống, sẽ tự nhập tay?
Nếu O <> "N" thì tạm để trống để nhập tay anh ạ,
Em tính đến trường hợp nếu O là "X", thì phải có hàm xác định được giá xuất kho, sau đó mới xét đến.
Để em tìm hiểu và tự làm trước, vướng đâu thì mới hỏi tiếp ạ.
 
Upvote 0
Nhưng có 1 vấn đề là:
1. Bình thường em nhập theo thứ tự là cột D-->E-->F rồi mới nhập đến cột G, sau khi nhập xong cột G thì sẽ nhảy thẳng sang cột K để nhập tiếp
- Còn với Code này thì khi e nhập ở cột D, thì ô nhập liệu cũng sẽ chuyển luôn sang cột K, rồi lại phải quay lai nhập tiếp cột E, xong lại chuyển sang cột K
Thế thì gán cho bước nhẩy sang K điều kiện là cột vừa nhập là cột G - cột 7. Tức sửa thành
Mã:
If Target.Column = 7 Then Me.Range("K" & Target.Row).Select ' chọn ô cùng dòng với Target nhưng ở cột K. Hoặc Target.Offset(0, 11 - Target.Column).Select
2. Anh Có thể giúp em phát triển thêm code này với mục đích sau không ạ:
- Sau khi em nhập dữ liệu cột J (số lượng) và K (đơn giá),
Thế có nghĩa là code phải phản ứng cả khi nhập dữ liệu vào cột J và K chứ không chỉ vào D:G. Vậy phải sửa thành
Mã:
If Application.Intersect(Range("D:G,J:J,K:K"), Target) Is Nothing Then Exit Sub
thì ở cột L (thành tiền) sẽ tự nhảy kết quả bằng J*K nếu cột O (LoaiNV) là N (nhập kho)
Thế thì sau dòng
Mã:
If Target.Column = 7 Then Me.Range("K" & Target.Row).Select ' chọn ô cùng dòng với Target nhưng ở cột K. Hoặc Target.Offset(0, 11 - Target.Column).Select

phải thêm cụm
Mã:
If Me.Range("O" & Target.Row).Value = "N" Then
    Me.Range("L" & Target.Row).Value = Me.Range("J" & Target.Row).Value * Me.Range("K" & Target.Row).Value  ' nhập giá vào cột L
Else
    Me.Range("L" & Target.Row).Value = Empty    ' xóa  giá cũ nếu có
End If
---------
Thay cho
Mã:
Me.Range("L" & Target.Row).Value = Me.Range("J" & Target.Row).Value * Me.Range("K" & Target.Row).Value

cũng có thể dùng - vừa đẹp để ôn kiến thức With ... Lưu ý là có các "dấu chấm" trước Offset và Value
Mã:
With Me.Range("J" & Target.Row)
    .Offset(0, 2).Value = .Value * .Offset(0, 1).Value
End With
 
Lần chỉnh sửa cuối:
Upvote 0
Em cảm ơn anh ạ, hiện tại em đã thực hiện được đúng mong muốn, và học thêm được 1 số kiến thức nữa rồi.

Mã:
If Target.Column = 7 Then Me.Range("K" & Target.Row).Select ' chọn ô cùng dòng với Target nhưng ở cột K. Hoặc Target.Offset(0, 11 - Target.Column).Select
Từ gợi ý của anh, em đã làm theo cách này, để sau mỗi lần nhập liệu ở 1 cột thì sẽ chuyển sang cột tiếp theo để nhập liệu

Mã:
    If Target.Column = 4 Then Me.Range("E" & Target.Row).Select
    If Target.Column = 5 Then Me.Range("F" & Target.Row).Select
    If Target.Column = 6 Then Me.Range("G" & Target.Row).Select
    If Target.Column = 7 Then Me.Range("J" & Target.Row).Select
    If Target.Column = 10 Then Me.Range("K" & Target.Row).Select
    If Target.Column = 11 Then Me.Range("L" & Target.Row).Select
Có đoạn code này em thấy nếu không sử dụng thì vẫn có kết quả đúng, vậy thì có cần không ạ
Mã:
Else
    Me.Range("L" & Target.Row).Value = Empty    ' xóa  giá cũ nếu có
End If
Sau này nếu em muốn tính thành tiền cho phần xuất kho, thì sẽ phát triển tiếp ở code này ạ
Mã:
If Me.Range("O" & Target.Row).Value = "N" Then
    Me.Range("L" & Target.Row).Value = Me.Range("J" & Target.Row).Value * Me.Range("K" & Target.Row).Value  ' nhập giá vào cột L
Else
    Me.Range("L" & Target.Row).Value = Empty    ' xóa  giá cũ nếu có
End If

em sẽ thêm phần
Mã:
Else If Me.Range("O" & Target.Row).Value = "X" Then
    Me.Range("L" & Target.Row).Value = Me.Range("J" & Target.Row).Value * [DON_GIA_XUAT]  ' nhập giá vào cột L
Else
    Me.Range("L" & Target.Row).Value = Empty    ' xóa  giá cũ nếu có
End If


Code hiện tại của em đây ạ:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
'    chi? thu?c hiê?n khi nhâ?p liê?u tu` do`ng 5 tro? di (do`ng 4 la` do`ng dâ`u tiên va` chu´a công thu´c) va` chi? khi thay dô?i 1 cell.
    If Target.Count > 1 Or Target.Row <= 4 Then Exit Sub
'    chi? thu?c hiê?n khi nhâ?p du~ liê?u va`o ca´c cô?t D, E, F (E, F a?nh huo?ng to´i cô?t O), G
    If Application.Intersect(Range("D:G,J:K"), Target) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Me.Range("M4:O4").Copy
    With Me.Range("M" & Target.Row).Resize(1, 3)    ' vu`ng Mx:Ox, vo´i x la` do`ng dang nhâ?p liê?u o? cô?t D, E, F hoa?c G
        .PasteSpecial xlPasteFormulas
        .Value = .Value
    End With
    If Target.Column = 4 Then Me.Range("E" & Target.Row).Select
    If Target.Column = 5 Then Me.Range("F" & Target.Row).Select
    If Target.Column = 6 Then Me.Range("G" & Target.Row).Select
    If Target.Column = 7 Then Me.Range("J" & Target.Row).Select ' cho?n ô cu`ng do`ng vo´i Target nhung o? cô?t K. Hoa?c Target.Offset(0, 11 - Target.Column).Select
    If Target.Column = 10 Then Me.Range("K" & Target.Row).Select
    If Target.Column = 11 Then Me.Range("L" & Target.Row).Select
        If Me.Range("O" & Target.Row).Value = "N" Then
            Me.Range("L" & Target.Row).Value = Me.Range("J" & Target.Row).Value * Me.Range("K" & Target.Row).Value  ' nhâ?p gia´ va`o cô?t L
        Else
            Me.Range("L" & Target.Row).Value = Empty    ' xo´a  gia´ cu~ nê´u co´
        End If
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Application.CutCopyMode = False
End Sub
 
Upvote 0
Mã:
If Target.Column = 7 Then Me.Range("K" & Target.Row).Select ' chọn ô cùng dòng với Target nhưng ở cột K. Hoặc Target.Offset(0, 11 - Target.Column).Select
Từ gợi ý của anh, em đã làm theo cách này, để sau mỗi lần nhập liệu ở 1 cột thì sẽ chuyển sang cột tiếp theo để nhập liệu

Mã:
    If Target.Column = 4 Then Me.Range("E" & Target.Row).Select
    If Target.Column = 5 Then Me.Range("F" & Target.Row).Select
    If Target.Column = 6 Then Me.Range("G" & Target.Row).Select
    If Target.Column = 7 Then Me.Range("J" & Target.Row).Select
    If Target.Column = 10 Then Me.Range("K" & Target.Row).Select
    If Target.Column = 11 Then Me.Range("L" & Target.Row).Select
Có đoạn code này em thấy nếu không sử dụng thì vẫn có kết quả đúng, vậy thì có cần không ạ
Kết quả gì? Nếu nói về giá trị thì đúng dù có hay không có code ở trên, nhưng nếu không có code trên thì khi nhập xong D ô hoạt động đâu có là ở cột E?
Nhưng code trên có thể rút ngắn thành
Mã:
If Target.Column = 7 Then
    Target.Offset(0, 3).Select
Else
    Target.Offset(0, 1).Select
End If
Có đoạn code này em thấy nếu không sử dụng thì vẫn có kết quả đúng, vậy thì có cần không ạ
Mã:
       Else
Me.Range("L" & Target.Row).Value = Empty ' xóa giá cũ nếu có
End If
Nếu bạn hỏi đoạn trích ở trên có cần không thì tôi giải thích như sau. Vd. bạn nhập đầy đủ dữ liệu và bạn có giá trong cột L do cột O = "N". Nếu bây giờ bạn phát hiện là mình đã nhập không đúng ý và bạn sửa lại cột E và/hoặc cột F, và với E mới và/hoặc F mới bạn có O = "NB" thì sao? Có code trên thì cột L sẽ được xóa còn không có code trên thì cột L vẫn có giá trị cũ -> không ĂN KHỚP với O = "NB". Vậy tôi viết code lường trước các trường hợp thự́ tự nhập liệu, chỉnh sửa. Bạn càng lường trước được nhiều tình huống thì càng tốt.

em sẽ thêm phần
Mã:
Else If Me.Range("O" & Target.Row).Value = "X" Then

Else If phải viết liền là ElseIf
 
Lần chỉnh sửa cuối:
Upvote 0
Không ai code như thế này cả:
If Target.Column = 4 Then Me.Range("E" & Target.Row).Select
If Target.Column = 5 Then Me.Range("F" & Target.Row).Select
If Target.Column = 6 Then Me.Range("G" & Target.Row).Select
If Target.Column = 7 Then Me.Range("J" & Target.Row).Select
If Target.Column = 10 Then Me.Range("K" & Target.Row).Select
If Target.Column = 11 Then Me.Range("L" & Target.Row).Select
VBA phải tét đủ 6 lần If's
Dùng Select Case thì trung bình tét 6/2 = 3 lần
Select Case Target.Column
Case 4, 5, 6, 10, 11
Me.Cells(Target.Row, Target.Column+1).Select
Case 7
Me.Cells(Target.Row, Target.Column+3).Select
End Select
 
Upvote 0
Không ai code như thế này cả:
If Target.Column = 4 Then Me.Range("E" & Target.Row).Select
If Target.Column = 5 Then Me.Range("F" & Target.Row).Select
If Target.Column = 6 Then Me.Range("G" & Target.Row).Select
If Target.Column = 7 Then Me.Range("J" & Target.Row).Select
If Target.Column = 10 Then Me.Range("K" & Target.Row).Select
If Target.Column = 11 Then Me.Range("L" & Target.Row).Select
VBA phải tét đủ 6 lần If's
Dùng Select Case thì trung bình tét 6/2 = 3 lần
Em cảm ơn anh đã chỉ bảo ạ. Em mới tìm hiểu về VBA nên vẫn còn mang tư duy của hàm excel để áp dụng.
Nhờ anh @VetMini@batman1 nên em biết thêm được 2 cách viết code thay thế cho đoạn "If" dài dòng của em nữa
Mã:
If Target.Column = 7 Then
    Target.Offset(0, 3).Select
Else
    Target.Offset(0, 1).Select
End If
Mã:
Select Case Target.Column
Case 4, 5, 6, 10, 11
Me.Cells(Target.Row, Target.Column+1).Select
Case 7
Me.Cells(Target.Row, Target.Column+3).Select
End Select

Nếu bạn hỏi đoạn trích ở trên có cần không thì tôi giải thích như sau. Vd. bạn nhập đầy đủ dữ liệu và bạn có giá trong cột L do cột O = "N". Nếu bây giờ bạn phát hiện là mình đã nhập không đúng ý và bạn sửa lại cột E và/hoặc cột F, và với E mới và/hoặc F mới bạn có O = "NB" thì sao? Có code trên thì cột L sẽ được xóa còn không có code trên thì cột L vẫn có giá trị cũ -> không ĂN KHỚP với O = "NB". Vậy tôi viết code lường trước các trường hợp thự́ tự nhập liệu, chỉnh sửa. Bạn càng lường trước được nhiều tình huống thì càng tốt.
Em hiểu đoạn này rồi ạ, đúng là em không nghĩ đến trường hợp này luôn.
 
Upvote 0
2. Tôi hiểu dụng ý của bạn là: nếu có sự thay đổi trong cột G thì copy vùng M4:O4 của sheet NhapLieu rồi dán nhưng chỉ công thức vào vùng ở dòng hiện hành vào cột M:O, tiếp theo biến thành giá trị. Nếu bạn luôn chỉ nhập dữ liệu vào từng ô chứ không copy ở đâu đó rồi dán hàng loạt vào nhiều ô trên sheet thì code như bạn cũng được, đơn giản.
Anh chỉ giúp em với trường hợp ở đoạn tô đậm với ạ.
File làm việc của em sẽ chia cho nhiều người làm, ai phụ trách kho nào thì làm kho đấy
Em là người tổng hợp dữ liệu vào, nên sẽ phải copy dữ liệu ở các file khác qua, có lúc còn delete hoặc insert thêm nhiều dòng nữa
Hôm nay em copy sang thì thấy có lúc hiện lên bảng báo lỗi mà không biết vì sao.
 
Upvote 0
Hôm nay em copy sang thì thấy có lúc hiện lên bảng báo lỗi mà không biết vì sao.
Một câu chung chung thế thì làm sao tôi hình dung được bạn định làm gì, từng bước thao tác của bạn ra sao và lỗi gì.
Đính kèm tập tin rồi dựa vào nó để mô tả từng bước thao tác.
 
Upvote 0
Một câu chung chung thế thì làm sao tôi hình dung được bạn định làm gì, từng bước thao tác của bạn ra sao và lỗi gì.
Đính kèm tập tin rồi dựa vào nó để mô tả từng bước thao tác.
Vâng a, Em làm thao tác là copy cả 1 hàng từ file có cùng cấu trúc, rồi Paste Value sang file đích
Nhưng có lúc thì lại bị lỗi, hiện lên 1 bảng Debug, có lúc thì lại không bị lỗi gì cả
Để em nhớ lại thao tác rồi test kỹ lại rồi trình bày lại sau ạ.
 
Upvote 0
Em cảm ơn anh đã chỉ bảo ạ. Em mới tìm hiểu về VBA nên vẫn còn mang tư duy của hàm excel để áp dụng.
Nhờ anh @VetMini@batman1 nên em biết thêm được 2 cách viết code thay thế cho đoạn "If" dài dòng của em nữa
....
"biết" chưa đủ. Cần phải hiểu thấu đáo điểm chọn lựa giữa IF-THEN-ELSEIF-ELSE và SELECT-CASE (*)

Nếu bạn sửa lại code của mình cho hiệu quả hơn một chút (trung bình 3 lần so sánh thay vì 6)
If Target.Column = 4 Then
Me.Range("E" & Target.Row).Select
ElseIf Target.Column = 5 Then
Me.Range("F" & Target.Row).Select
Else If Target.Column = 6 Then
Me.Range("G" & Target.Row).Select
ElseIf Target.Column = 7 Then
Me.Range("J" & Target.Row).Select
ElseIf Target.Column = 10 Then
Me.Range("K" & Target.Row).Select
If Target.Column = 11 Then
Me.Range("L" & Target.Row).Select
End If

Thì hiệu quả hơn trước đó nhưng vẫn không hiệu qủa bằng Select-Case
Lý do: code trên vẫn phải truy cập trung bình 3 lần trị Target.Column
Với Select-Case, bạn chỉ truy cập Target.Column một lần, và dùng nó trong bộ nhớ để so sánh.

Như vậy:
1. nếu điều kiện chỉ là xét một biến hay biểu thức nào đó với nhiều kết quả khác nhau thì Select-Case là tốt nhất
2. nếu điều kiện thay đổi theo từng trường hợp thì If-Then-Else tốt hơn.
Ví dụ:
If Target.Column = 4 Then
Me.Range("E" & Target.Row).Select
ElseIf Target.Offset(0, 1).Column = 6 Then ' đừng thắc mắc chỗ vô duyên của nó, chỉ là ví dụ cho thấy biều thức so sánh có thay đổi
Me.Range("F" & Target.Row).Select
Else If Target.Column + 2 = 8 Then
Me.Range("G" & Target.Row).Select
...
End If
(trường hợp này Select-Case chả có lợi hơn gì cả)

(*) Trong một tài liệu nọ ở diễn đàn này, có phần khuyên dùng IF-ELSE chứ không nên SELECT-CASE. Theo tôi là người viết bài ấy không đủ kinh nghiệm về SELECT-CASE
 
Upvote 0
Xin kính chào các anh chị,
Em nhờ giúp đỡ viết code để nhập dữ liệu trên file đính kèm, nhằm hạn chế sử dụng công thức excel:
Cụ thể như sau:
- Ở sheet "NhapLieu": sau khi em nhập dữ liệu từ cột A đến cột G, thì các dòng ở cột M,N,O sẽ tự nhảy kết quả mà không phải sử dụng công thức như đang để trên file
Em xin cảm ơn sự giúp đỡ của các anh chị ạ.
Góp ý cho bạn:
1/ Trong File tôi thấy bạn theo dõi việc quản lý kho nên liên quan đến công việc nhập, xuất.
2/ Công việc này nó liên quan đến phiếu nhập, xuất. Vì vậy, bạn nên sử dụng SheetForm để tạo phiếu, sau khi in phiếu xong thì lưu vào sheet NhapLieu.
3/ Tại SheetForm nên sử dụng UserForm có Lixt Box chứa DMVT và DM_DNX thì mới có thể chọn nhập liệu nhiều loại vật tư cùng một lúc.
 
Upvote 0
1. nếu điều kiện chỉ là xét một biến hay biểu thức nào đó với nhiều kết quả khác nhau thì Select-Case là tốt nhất
2. nếu điều kiện thay đổi theo từng trường hợp thì If-Then-Else tốt hơn.
Em cảm ơn anh đã chỉ bảo sâu thêm ạ, em sẽ ghi nhớ vấn đề này để sử dụng Code hiệu quả hơn
Góp ý cho bạn:
1/ Trong File tôi thấy bạn theo dõi việc quản lý kho nên liên quan đến công việc nhập, xuất.
2/ Công việc này nó liên quan đến phiếu nhập, xuất. Vì vậy, bạn nên sử dụng SheetForm để tạo phiếu, sau khi in phiếu xong thì lưu vào sheet NhapLieu.
3/ Tại SheetForm nên sử dụng UserForm có Lixt Box chứa DMVT và DM_DNX thì mới có thể chọn nhập liệu nhiều loại vật tư cùng một lúc.
Hic, vì kiến thức VBA của em mới ở mức độ mẫu giáo thôi nên kiến thức này hơi cao siêu với em ạ.
Nếu được, anh có thể cho em xin link 1 số bài viết về những gợi ý của anh không. Em cảm ơn ạ.
 
Upvote 0
Em cảm ơn anh đã chỉ bảo sâu thêm ạ, em sẽ ghi nhớ vấn đề này để sử dụng Code hiệu quả hơn

Hic, vì kiến thức VBA của em mới ở mức độ mẫu giáo thôi nên kiến thức này hơi cao siêu với em ạ.
Nếu được, anh có thể cho em xin link 1 số bài viết về những gợi ý của anh không. Em cảm ơn ạ.
Bạn tham khảo thử File này (gần giống với cái bạn cần).
Tôi không rảnh để giúp từ A đến Z. Vì vậy, bạn tham khảo và tự phát triển thêm theo gợi ý ở bài 17.
 

File đính kèm

  • UserForm QL_VT.xlsm
    85.4 KB · Đọc: 18
Upvote 0
Web KT

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

Back
Top Bottom