Nhờ anh/chị trợ giúp về worksheet_change (1 người xem)

Liên hệ QC

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

jolieasa

Thành viên mới
Tham gia
12/9/13
Bài viết
21
Được thích
0
Chào các anh/chị trong diễn đàn GPE.
Em có vấn đề về worksheet_change mong được các anh/chị giúp đỡ.
Tình hình là sau khi tìm hiểu từ các anh/chị trên diễn đàn cùng với record Macro thì em cũng cơ bản hoàn thành được file của mình. File gồm 2 sheet "TL" (tiên lượng) và "DT CPXD" (dự toán), trong sheet "DT CPXD" ô C5, C19, C33,...(ô này cách ô kia 13 dòng) là tên của các hạng mục (công trình có nhiều hạng mục), ô C6-C18 là các chi phí của hạng mục đó. Em sử dụng Worksheet_BeforeDoubleClick khi DoubleClick vào cột A thì macro sẽ chạy. Bây giờ em muốn nhờ anh chị giúp đỡ khi tại các ô C5, C19, C33,... (tên hạng mục) có giá trị thì macro sẽ chạy thay vì double click thủ công vào cột A. "Phần thí nghiệm" luôn ở dưới cùng.
Em xin cảm ơn các anh/chị giúp đỡ
 

File đính kèm

Chào các anh/chị trong diễn đàn GPE.
Em có vấn đề về worksheet_change mong được các anh/chị giúp đỡ.
Tình hình là sau khi tìm hiểu từ các anh/chị trên diễn đàn cùng với record Macro thì em cũng cơ bản hoàn thành được file của mình. File gồm 2 sheet "TL" (tiên lượng) và "DT CPXD" (dự toán), trong sheet "DT CPXD" ô C5, C19, C33,...(ô này cách ô kia 13 dòng) là tên của các hạng mục (công trình có nhiều hạng mục), ô C6-C18 là các chi phí của hạng mục đó. Em sử dụng Worksheet_BeforeDoubleClick khi DoubleClick vào cột A thì macro sẽ chạy. Bây giờ em muốn nhờ anh chị giúp đỡ khi tại các ô C5, C19, C33,... (tên hạng mục) có giá trị thì macro sẽ chạy thay vì double click thủ công vào cột A. "Phần thí nghiệm" luôn ở dưới cùng.
Em xin cảm ơn các anh/chị giúp đỡ

thử code record macro này
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
 Set Rng = Union([c5], [c19], [c33])
 If Not Intersect(Target, Rng) Is Nothing Then
    For Each cell In Rng
        If IsEmpty(cell) Then
            MsgBox cell.Address & " rong"
            Exit Sub
       End If
    Next
    DTCPXD
 End If
Set Rng = Nothing
End Sub
 
Upvote 0
Cảm ơn anh đã giúp đỡ, em đã thêm vào và chạy thử nhưng ý em không phải vậy anh ạ. Thấy trong code anh em hiểu nôm na là 3 ô C5, C19, C33 có giá trị là code sẽ chạy. Ý em là các ô C5, C9, C33 và các ô tiếp theo (khoảng cách các ô là 13 dòng) cứ ô nào có giá trị là code sẽ chạy để thêm vào các chi phí của hạng mục đó. Giá trị ở đây có thể là số hoặc chữ.
Cảm ơn ạ
 
Upvote 0
Có anh/chị nào có thể giúp em giải quyết vấn đề này được ko ạ. Em cảm ơn lăm lắm
 
Upvote 0
Anh có thể nói rõ hơn giúp em được ko ạ, fai thêm đoạn code đó vào đâu. Em cảm ơn
 
Upvote 0
Anh có thể nói rõ hơn giúp em được ko ạ, fai thêm đoạn code đó vào đâu. Em cảm ơn

thử nha, ko được nữa thì đợi các cao thủ giúp hén...chúc bạn thành công
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, [c5:c100]) Is Nothing Then
    For i = 5 To 50 Step 14
        If IsEmpty("C" & i) Then
            MsgBox cell.Address & " rong"
            Exit Sub
       End If
    Next
    DTCPXD
 End If
End Sub
 
Upvote 0
Dạ, nó chạy từa lưa hạt mưa lun anh ạ !$@!!. Để em ví dụ như thế này cho anh dễ hình dung. Tại ô A19 em chạy code (double click tại A19), nó sẽ list ra nào là chi phí vật liệu, nhân công.... đó là các chi phi của hạng mục tại ô C19 (lúc này đang trống nên các kết quả tại E:I bị #N/A do hàm vlookup tham chiếu đến C19 trống). Ý em là thay vì cứ mỗi hạng mục mình fai double_click tại cột A rồi đánh tên hạng mục vào cột C thì em muốn tại C19 chỉ cần nhập tên của 1 hạng mục thì code sẽ đưa ra các chi phí của hạng mục đó. Và cứ thế nếu có hạng mục khác thì em lại đánh tên hạng mục vào ô C33 thì code sẽ chạy (như anh ghi bước nhảy từng hạng mục là 14), cứ thế cho đến hết. Nếu công trình có n hạng mục thì em chỉ nhập tên n hạng mục nó sẽ cho ra n chi phí của hạng mục.
Em chân thành cảm ơn
 
Upvote 0
Dạ, nó chạy từa lưa hạt mưa lun anh ạ !$@!!. Để em ví dụ như thế này cho anh dễ hình dung. Tại ô A19 em chạy code (double click tại A19), nó sẽ list ra nào là chi phí vật liệu, nhân công.... đó là các chi phi của hạng mục tại ô C19 (lúc này đang trống nên các kết quả tại E:I bị #N/A do hàm vlookup tham chiếu đến C19 trống). Ý em là thay vì cứ mỗi hạng mục mình fai double_click tại cột A rồi đánh tên hạng mục vào cột C thì em muốn tại C19 chỉ cần nhập tên của 1 hạng mục thì code sẽ đưa ra các chi phí của hạng mục đó. Và cứ thế nếu có hạng mục khác thì em lại đánh tên hạng mục vào ô C33 thì code sẽ chạy (như anh ghi bước nhảy từng hạng mục là 14), cứ thế cho đến hết. Nếu công trình có n hạng mục thì em chỉ nhập tên n hạng mục nó sẽ cho ra n chi phí của hạng mục.
Em chân thành cảm ơn

sao ko có cao thủ nào giúp bạn hết vậy???
thôi xài đỡ code cùi bắp của tui nha
khi bạn di chuyển qua các cell ở cột C, bạn thấy có một cài combobox, bạn hãy chọn

còn đoạn code của bạn, tôi ko hiểu nên để nguyên như vậy, ko thay đổi gi hết
về hàm vlookup thì bạn có thể dùng Find method
 

File đính kèm

Upvote 0
sao ko có cao thủ nào giúp bạn hết vậy???
thôi xài đỡ code cùi bắp của tui nha
khi bạn di chuyển qua các cell ở cột C, bạn thấy có một cài combobox, bạn hãy chọn

còn đoạn code của bạn, tôi ko hiểu nên để nguyên như vậy, ko thay đổi gi hết
về hàm vlookup thì bạn có thể dùng Find method
Dạ cảm ơn anh.
- File anh gởi em đã chạy thử nhưng vẫn ko đúng ý em ạ
- Code em làm chỉ là nhập dữ liệu vào các cells chứ có j cao siêu đâu mà anh bảo ko hiểu (anh cứ đùa em).
- Find method là j hả anh, nó có thể tự cập nhật nếu dữ liệu thay đổi như vlookup ko ạ
Chắc tại topic không có j mới mẻ nên ít lôi cuốn được các cao thủ (ngoại trừ anh, hihi), nên em đành fai tự mày mò theo hướng khác. Trong sheet "TH DT CPXD" có button "Tong hop du toan" dùng để xuất tên các hạng mục trong sheet "TL" qua. Tại cột STT (cột B) trước các hạng mục ta double_click để liệt kê các chi phí của hạng mục đó. Em có thể hỏi anh có cách nào tổng hợp 2 code này vào làm 1 được ko ạ.
Cảm ơn anh đã giúp đỡ
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chào các anh/chị trong diễn đàn GPE.
Em có vấn đề về worksheet_change mong được các anh/chị giúp đỡ.
Tình hình là sau khi tìm hiểu từ các anh/chị trên diễn đàn cùng với record Macro thì em cũng cơ bản hoàn thành được file của mình. File gồm 2 sheet "TL" (tiên lượng) và "DT CPXD" (dự toán), trong sheet "DT CPXD" ô C5, C19, C33,...(ô này cách ô kia 13 dòng) là tên của các hạng mục (công trình có nhiều hạng mục), ô C6-C18 là các chi phí của hạng mục đó. Em sử dụng Worksheet_BeforeDoubleClick khi DoubleClick vào cột A thì macro sẽ chạy. Bây giờ em muốn nhờ anh chị giúp đỡ khi tại các ô C5, C19, C33,... (tên hạng mục) có giá trị thì macro sẽ chạy thay vì double click thủ công vào cột A. "Phần thí nghiệm" luôn ở dưới cùng.
Em xin cảm ơn các anh/chị giúp đỡ

Bạn xem có đúng ý không.
1. Nhập dữ liệu vào C5 (hoặc C19, C33, C47. Tổng quát: Vào cột C dòng 5 + 14k, k = 0, 1, 2, ...) --> Enter
2. Cũng có thể khi C5 đã nhập trước đó và code đã chạy rồi --> chọn C5 --> sửa. Lúc đó code chạy lại cho C5 mới. Nhưng lần này sẽ không có chuyện thêm 13 dòng.
3. Khi nhập hoặc sửa C5 (C19, ...) thì code sẽ kiểm tra B6 (B20, ...). Nếu chưa có 1 thì thêm 13 dòng, còn nếu đã có 1 tức trước đó đã thêm 13 dòng thì thôi không thêm nữa. Vậy bạn chú ý là không tự thêm 1 vào B6, B20, B34, ...
 

File đính kèm

Upvote 0
Dạ, chính xác tuyệt đối rồi anh ạ. Cảm ơn anh rất nhiều. Nhưng có một điều nữa em có thể hỏi anh được ko ạ. Tức là như #10 em đã trình bày, vì bế tắc trong cách này 2-3 hôm nay nên em đành phải đi theo đường khác là tự động xuất tên hạng mục qua và chạy code = thủ công (double_click) để cho ra các chi phí của hạng mục đó. Một bên là tự động chạy chi phí khi nhập hạng mục (cách anh giúp đỡ) và một bên là tự động chạy tên hạng mục và ta double_click ra chi phí (cách em chỉnh sửa lại), đều phải qua 2 bước. Vậy em có thể hỏi anh có cách nào tích hợp được 2 code vào 1 ko ạ, chỉ một thao tác (ấn button chẳng hạn) để có thể xuất ra tên hạng mục và chạy chi phí của hạng mục đó.
Một lần nữa cảm ơn anh đã giúp đỡ
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ, chính xác tuyệt đối rồi anh ạ. Cảm ơn anh rất nhiều. Nhưng có một điều nữa em có thể hỏi anh được ko ạ. Tức là như #10 em đã trình bày, vì bế tắc trong cách này 2-3 hôm nay nên em đành phải đi theo đường khác là tự động xuất tên hạng mục qua và chạy code = thủ công (double_click) để cho ra các chi phí của hạng mục đó. Một bên là tự động chạy chi phí khi nhập hạng mục (cách anh giúp đỡ) và một bên là tự động chạy tên hạng mục và ta double_click ra chi phí (cách em chỉnh sửa lại), đều phải qua 2 bước. Vậy em có thể hỏi anh có cách nào tích hợp được 2 code vào 1 ko ạ, chỉ một thao tác (ấn button chẳng hạn) để có thể xuất ra tên hạng mục và chạy chi phí của hạng mục đó.
Một lần nữa cảm ơn anh đã giúp đỡ

1. Tôi chuyển Sub DTCPXD và Sub Loc của bạn thành chú thích, thay bằng Sub DTCPXD và Sub Loc mới.

2. Để lọc từ sheet TL thì phải có điều kiện. Tôi theo dõi thấy bạn dùng đk là dòng có tại cột A ký tự "A". Vậy tôi dùng đk này. Nhưng nếu trong dữ liệu thực không phải là "A" hoặc không luôn luôn là "A", vd. có thể là "A", "B", "C", ..., thì code sẽ sai.

3. Bạn thử với dữ liệu thực vì hiện tại TL chỉ có những rác như "tru", "sfg", những dữ liệu cần thì chưa có, tức = 0.
Bạn thử lần 1 với dữ liệu nào đó, sau đó thêm dữ liệu ở sheet TL (vd. "Nhà để máy cầy", "Nhà mát xa", "Spa" ...) rôi thử tiếp. Sau đó lại bỏ bớt dữ liệu trong sheet TL rồi lại thử.

4. Bạn chọn vùng dữ liệu cho VLOOKUP không đúng.
Ví dụ bạn có
Mã:
"=VLOOKUP(RC[-3],'TL'!R5C3:R101C15,9,0)"

Như thế là bạn tìm trong vùng C5:O101. Nhưng nếu TL có nhiều hơn 101 dòng thì sao?. Vd. "Nhà mát xa" nó ở dòng 120 thì sao?. Phải tìm trong toàn bộ vùng dữ liệu của sheet TL.
 

File đính kèm

Upvote 0
1. Tôi chuyển Sub DTCPXD và Sub Loc của bạn thành chú thích, thay bằng Sub DTCPXD và Sub Loc mới.

2. Để lọc từ sheet TL thì phải có điều kiện. Tôi theo dõi thấy bạn dùng đk là dòng có tại cột A ký tự "A". Vậy tôi dùng đk này. Nhưng nếu trong dữ liệu thực không phải là "A" hoặc không luôn luôn là "A", vd. có thể là "A", "B", "C", ..., thì code sẽ sai.

3. Bạn thử với dữ liệu thực vì hiện tại TL chỉ có những rác như "tru", "sfg", những dữ liệu cần thì chưa có, tức = 0.
Bạn thử lần 1 với dữ liệu nào đó, sau đó thêm dữ liệu ở sheet TL (vd. "Nhà để máy cầy", "Nhà mát xa", "Spa" ...) rôi thử tiếp. Sau đó lại bỏ bớt dữ liệu trong sheet TL rồi lại thử.

4. Bạn chọn vùng dữ liệu cho VLOOKUP không đúng.
Ví dụ bạn có
Mã:
"=VLOOKUP(RC[-3],'TL'!R5C3:R101C15,9,0)"

Như thế là bạn tìm trong vùng C5:O101. Nhưng nếu TL có nhiều hơn 101 dòng thì sao?. Vd. "Nhà mát xa" nó ở dòng 120 thì sao?. Phải tìm trong toàn bộ vùng dữ liệu của sheet TL.
Dạ, phải nói thật là rất cảm ơn anh. File anh gởi rất hay và đúng ý em ạ. Em sẽ test thử với các trường hợp của em xem thế nào, có gì mong anh chỉ giáo cho.
Còn vấn đề vlookup em cũng đã nhận ra mấy hôm nay, là khi dữ liệu nguồn phình to ra hoặc thu nhỏ lại thì công thức ko thay đổi theo. Em cũng tính hỏi nhưng thấy hỏi hoài cũng hơi ngại nên cũng có gắng tự tìm hiểu ạ.
Một lần nữa cảm ơn anh rất nhiều.
Còn điều kiên bên sheet "TL" là "A" thì luôn luôn vậy anh ah, vì công thức tính tổng sumif của em cũng căn cứ theo "A" nên ko thể khác được. Nên "A" là điều kiện duy nhất chứ ko có B hoặc C...
 
Upvote 0
Dạ em đã test qua thử và chưa thấy xuất hiện lỗi nào cả nhưng có 1 vấn đề nhỏ tí tì ti này thôi ah. Đó là khi ta quét toàn bộ dữ liệu từ hàng thứ 5 trở xuống và xóa rồi sử dụng code thì dữ liệu ở hàng thứ 4 sẽ bị xóa. Cứ như vậy xóa thêm 1 lần nữa rồi sử dụng code thì dữ liệu hàng 3 sẽ bị xóa cứ như vậy. Ko hiểu bị như vậy là do đoạn code nào gây ra mong anh chỉ giúp cách sửa ạ.
Em cảm ơn anh
 
Upvote 0
Dạ em đã test qua thử và chưa thấy xuất hiện lỗi nào cả nhưng có 1 vấn đề nhỏ tí tì ti này thôi ah. Đó là khi ta quét toàn bộ dữ liệu từ hàng thứ 5 trở xuống và xóa rồi sử dụng code thì dữ liệu ở hàng thứ 4 sẽ bị xóa. Cứ như vậy xóa thêm 1 lần nữa rồi sử dụng code thì dữ liệu hàng 3 sẽ bị xóa cứ như vậy. Ko hiểu bị như vậy là do đoạn code nào gây ra mong anh chỉ giúp cách sửa ạ.
Em cảm ơn anh

Lỗi tại tôi không lường được xóa tay thế này. Do tôi xuất phát từ tập tin của bạn ban đầu khi từ dòng 5 trở xuống đã có chút dữ liệu.

Bạn sửa thế này.
Trong sub Loc bạn tìm thấy ở gần đầu (sau dòng chú thích: "xoa du lieu cu") có dòng
Mã:
Sheet11.Range(Sheet11.[C5], Sheet11.[C65536].End(xlUp)).EntireRow.Clear

Bạn hãy xóa dòng đó đi và cũng ở dòng đó thay bằng
Mã:
Sheet11.Range("C5:C65536").EntireRow.Clear

hoặc tốt hơn là thay bằng
Mã:
    lastRow = Sheet11.[C65536].End(xlUp).Row
    If lastRow >= 5 Then             '  hoặc If lastRow > 4 Then
        Sheet11.Range("C5:C" & lastRow).EntireRow.Clear
    End If
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ, đã khắc phục được lỗi trên rồi ạ. Em cảm ơn anh rất là nhiều.
P/S:
Năm hết tết đến, chúc các anh/chị/em trong diễn đàn GPE một mùa xuân ấm áp và hạnh phúc bên người thân.
HAPPY NEW YEAR!!!!!
 
Upvote 0

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

Back
Top Bottom