sự kiện Worksheet_Change (1 người xem)

  • Thread starter Thread starter BoKuDo
  • Ngày gửi Ngày gửi
Liên hệ QC

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

BoKuDo

Thành viên chính thức
Tham gia
17/12/13
Bài viết
92
Được thích
5
Nghề nghiệp
Kế toán
Nhờ các bạn giúp mình code sự kiện sao cho tự tìm vị trí và tạo các công thức giống như vị trí các ô được tô màu đỏ trong file ví dụ mình đính kèm.
Mình cảm ơn nhiều!
 

File đính kèm

CSDL của bạn đẹp thiệt đấy; Nhưng chỉ để ngắm thôi!
Chứ VBA hay công thức cũng thua luôn!

Nếu bạn chịu bỏ trộn ô thì sẽ có người ra tay hỗ trợ bạn ngay.

Bạn nghĩ sao?
 
Upvote 0
CSDL của bạn đẹp thiệt đấy; Nhưng chỉ để ngắm thôi!
Chứ VBA hay công thức cũng thua luôn!

Nếu bạn chịu bỏ trộn ô thì sẽ có người ra tay hỗ trợ bạn ngay.

Bạn nghĩ sao?
Thực ra mình cũng rất muốn bỏ trộn ô để đơn giản hơn. Tuy nhiên mình vẫn chưa biết cách nào để bỏ trộn ô mà vẫn thể hiện được hết nội dung trong bảng tiến độ này.
Đây là bản gốc, biết khó nhưng hy vọng vẫn có hướng giải quyết.
Những ô màu đỏ là những vị trí mình muốn đưa vào sự kiện Worksheet_Change
Mình cảm ơn!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ồ. Em chưa đọc kỹ đề. Thành thật xin lỗi bác. Em gửi lại bác xem lại xem. Khi nào file tiến độ xong bác chia sẻ cho em tham khảo với nha.

Rất cảm ơn bạn đã giúp!
Có vấn đề là các công thức ở (Max, Min,..) xuất hiện tại nhiều dòng khác nhau khi mình thử xóa các ngày bên dưới, hoặc kích hoạt 1 cell thì dòng tại vị trí cell đó cũng xuất hiện các công thức (Max, Min,..)
 

File đính kèm

Upvote 0
Đúng rồi anh ah. Anh thêm sự kiện. Nếu mà dòng của cột C trắng thì thực hiện Code là được. Theo em thì anh dùng Sub hay hơn là dùng Worksheet_Change Vì mỗi lần thay đổi thì máy phải tính toán lại. Nếu dữ liệu nhiều nó cứ qoay qoay khố chựu lắm

 
Upvote 0
Thực ra mình cũng rất muốn bỏ trộn ô để đơn giản hơn. Tuy nhiên mình vẫn chưa biết cách nào để bỏ trộn ô mà vẫn thể hiện được hết nội dung trong bảng tiến độ này.
Đây là bản gốc,
. . . . Những ô màu đỏ là những vị trí mình muốn đưa vào sự kiện Worksheet_Change

Với file như vậy ta hoàn toàn có thể bỏ trộn & bỏ các dòng trống đi là được 1 CSDL hoàn chỉnh.

Vẫn tinh tươm & tiện trong di tu, bảo dưỡng nó.
 
Upvote 0
Công việc hiện tại của em cũng vướng vấn đề này
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Hiện tại em cũng đang dùng 1 công tác 3 dòng.Trong đó dòng thứ 2 sử dụng định dạng Conditional Fomartitng để vẽ tiến độ thi công.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Nếu ko bỏ dòng trống thì còn hướng nào khác ko bạn?

Tôi chỉ viết 1 Sub, khi cần thì bấm nút. Kết quả gán thẳng vào vị trí, không qua công thức được không?
Bạn muốn đưa vào sự kiện nào thì tuỳ, tôi thấy rất bất tiện khi mỗi lần động chạm vào sheet nó bị "cà giựt".
PHP:
Public Sub GPE()
Dim I As Long, Rws As Long, nMax As Long, nMin As Long
Rws = Range("I65536").End(xlUp).Row
nMin = 10 ^ 5: nMax = 0
For I = Rws To 11 Step -1
    If Range("C" & I) <> Empty Then
        If Range("H" & I).Value < nMin Then nMin = Range("H" & I).Value
        If Range("I" & I).Value > nMax Then nMax = Range("I" & I).Value
    Else
        If Range("D" & I) <> Empty Then
            Range("H" & I).Value = nMin
            Range("I" & I).Value = nMax
            Range("G" & I).Value = Range("I" & I).Value - Range("H" & I).Value + 1
            nMax = 0: nMin = 10 ^ 5
        End If
    End If
Next I
End Sub
 

File đính kèm

Upvote 0
Tôi chỉ viết 1 Sub, khi cần thì bấm nút. Kết quả gán thẳng vào vị trí, không qua công thức được không?
Bạn muốn đưa vào sự kiện nào thì tuỳ, tôi thấy rất bất tiện khi mỗi lần động chạm vào sheet nó bị "cà giựt".
PHP:
Public Sub GPE()
Dim I As Long, Rws As Long, nMax As Long, nMin As Long
Rws = Range("I65536").End(xlUp).Row
nMin = 10 ^ 5: nMax = 0
For I = Rws To 11 Step -1
    If Range("C" & I) <> Empty Then
        If Range("H" & I).Value < nMin Then nMin = Range("H" & I).Value
        If Range("I" & I).Value > nMax Then nMax = Range("I" & I).Value
    Else
        If Range("D" & I) <> Empty Then
            Range("H" & I).Value = nMin
            Range("I" & I).Value = nMax
            Range("G" & I).Value = Range("I" & I).Value - Range("H" & I).Value + 1
            nMax = 0: nMin = 10 ^ 5
        End If
    End If
Next I
End Sub

Rất cảm ơn a với đoạn code trên!
a có thể giúp e thêm 1 vấn đề nữa là ở cột C nhiều lúc mã hiệu ko ghi (Empty), thì vị trí các công thức xuất hiện sẽ gặp lỗi.
Do vậy để tránh việc này e muốn dựa vào cột B, từ B11 trở xuống sẽ có các ký tự A,1,2,...,B,1,2,3,...,C,... và những ký tự này là luôn có, do vậy nếu dựa vào các ký tự A, B, C, ... để đặt vị trí Max, Min,... thì thuận lợi hơn.
Em có tìm hiểu thấy có đoạn code dùng If Asc(cells(...))>=65 then gì gì đó mà ko biết làm thế nào để áp dụng vào đoạn code trên của a, nếu được nhờ a giúp cho.
 
Upvote 0
Với mình thì thầy Ba Tê đang hại bạn đó, về lâu về dài!

Thầy sao hại trò?! chỉ có trò ko biết mình đang hại chính mình "về lâu về dài" thôi. Vì đó là ý của mình và thầy Ba Tê chỉ hỗ trợ theo ý đó thôi.
Bạn HYen17 có thể nói cho mình biết những điểm bất cập của ý tưởng này để mình rút kinh nghiệm được ko?
Mình rất cảm ơn!
 
Upvote 0
Do vậy để tránh việc này e muốn dựa vào cột B, từ B11 trở xuống sẽ có các ký tự A,1,2,...,B,1,2,3,...,C,... và những ký tự này là luôn có, do vậy nếu dựa vào các ký tự A, B, C, ... để đặt vị trí Max, Min,... thì thuận lợi hơn.
-----------------------------------------------------------------------------------------------------------------------------------------------
Vậy thì mình dùng hàm IsText để phân biệt số và chữ của cột STT.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Rất cảm ơn a với đoạn code trên!
a có thể giúp e thêm 1 vấn đề nữa là ở cột C nhiều lúc mã hiệu ko ghi (Empty), thì vị trí các công thức xuất hiện sẽ gặp lỗi.
Do vậy để tránh việc này e muốn dựa vào cột B, từ B11 trở xuống sẽ có các ký tự A,1,2,...,B,1,2,3,...,C,... và những ký tự này là luôn có, do vậy nếu dựa vào các ký tự A, B, C, ... để đặt vị trí Max, Min,... thì thuận lợi hơn.
Em có tìm hiểu thấy có đoạn code dùng If Asc(cells(...))>=65 then gì gì đó mà ko biết làm thế nào để áp dụng vào đoạn code trên của a, nếu được nhờ a giúp cho.

Tôi không biết ý gì của bạn , tôi chỉ làm theo yêu cầu.
Tôi "đã đọc thấy" những ý như thế này (có lẽ bạn thay đổi rồi): Các mục chính gồm A,B, C..., Mục kế tiếp là 1,2,3..., mục kế tiếp là 1.1; 1.2; 1,3 .... cuối cùng là những ô trống trong các mục 1.1; 1.2; 1.3....
Như vậy trường hợp các mục bạn nói là ô trống là chi tiết của 1.1, 1.2... trùng với các ô trống mà bạn Merge thì sao.
Đúng như "lão đại" nói. Tôi hại bạn rồi. Xin rút thôi.
 
Upvote 0
Tôi không biết ý gì của bạn , tôi chỉ làm theo yêu cầu.
Tôi "đã đọc thấy" những ý như thế này (có lẽ bạn thay đổi rồi): Các mục chính gồm A,B, C..., Mục kế tiếp là 1,2,3..., mục kế tiếp là 1.1; 1.2; 1,3 .... cuối cùng là những ô trống trong các mục 1.1; 1.2; 1.3....
Như vậy trường hợp các mục bạn nói là ô trống là chi tiết của 1.1, 1.2... trùng với các ô trống mà bạn Merge thì sao.
Đúng như "lão đại" nói. Tôi hại bạn rồi. Xin rút thôi.
Dạ chắc có sự nhầm chút giữa yêu cầu của e với bạn nào đó.
Dù sao e cũng cảm ơn thầy Ba Tê đã hỗ trợ!
Chúc thầy và các thành viên GPE luôn vui vẻ!
 
Upvote 0
Bạn có thể nói cho mình biết những điểm bất cập của ý tưởng này để mình rút kinh nghiệm được ko?
Mình rất cảm ơn!

CSDL mà bạn đang xây dựng đó là chưa chuẩn.
Mà đã vậy, thao tác với nó sẽ là vật vã, nhiều hiểm nguy rình rập & bảo trì thì hỡi ơi!

Ví dụ bạn khó mà tự động hóa trong khâu nhập liệu;
Sửa chữa hay xóa bỏ dữ liệu nào đó không fải dễ.
CSDL của bạn như bức tượng ở quảng trường; thích hợp cho khách tham quan mà thôi.
 
Upvote 0
Dạ chắc có sự nhầm chút giữa yêu cầu của e với bạn nào đó.
Dù sao e cũng cảm ơn thầy Ba Tê đã hỗ trợ!
Chúc thầy và các thành viên GPE luôn vui vẻ!

Đúng là tôi nhầm với bài này:
http://www.giaiphapexcel.com/forum/...-theo-các-khoảng-định-sẵn&p=731552#post731552
---------------------------
Tôi khắc phục lại code trên như vầy, Nếu cột B là Number (1,2,3,...) thì so sánh Max, Min, Nếu không phải Number thì gán Max Min vào.
Bạn thử xem nhé. (Ban đầu bạn nên đưa tất cả những dạng dữ liệu có thể xảy ra để hình dung xử nó 1 lần)
PHP:
Public Sub GPE()
Dim I As Long, Rws As Long, nMax As Long, nMin As Long
Rws = Range("I65536").End(xlUp).Row
nMin = 10 ^ 5: nMax = 0
For I = Rws To 11 Step -1
    If Range("B" & I) <> Empty Then
        If IsNumeric(Range("B" & I)) Then
            If Range("H" & I).Value < nMin Then nMin = Range("H" & I).Value
            If Range("I" & I).Value > nMax Then nMax = Range("I" & I).Value
        Else
            Range("H" & I).Value = nMin
            Range("I" & I).Value = nMax
            Range("G" & I).Value = Range("I" & I).Value - Range("H" & I).Value + 1
            nMax = 0: nMin = 10 ^ 5
        End If
    End If
Next I
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
CSDL mà bạn đang xây dựng đó là chưa chuẩn.
Mà đã vậy, thao tác với nó sẽ là vật vã, nhiều hiểm nguy rình rập & bảo trì thì hỡi ơi!

Ví dụ bạn khó mà tự động hóa trong khâu nhập liệu;
Sửa chữa hay xóa bỏ dữ liệu nào đó không fải dễ.
CSDL của bạn như bức tượng ở quảng trường; thích hợp cho khách tham quan mà thôi.

Nhiều người tự vẽ ra biểu mẫu mà họ thích, không nghĩ rằng nó sẽ làm khó mình sau này.
Chuyện "trả giá" thì chỉ khi nào bản thân gặp rắc rối "lã mồ hôi" mới hiểu thôi.
Coi như làm bài tập "xử lý rắc rối" đi mà.
 
Upvote 0
Coi như làm bài tập "xử lý rắc rối" đi mà.
Thầy nói làm mình liên tưởng đến ngành GD của nước nhà quá
Chỉ đào tạo ra 1 lũ thiên lôi, nhưng vô nhận việc thì 1 móng thực tiển cũng chả có!
Lí thuyết thì họ thao thao bất tiệt;
Đào tạo châm chú đến lấy giải các kì thi quốc tế ở các môn học (toán, lí hóa, sinh,. . . .), Chủ nghĩa thành tích từ TW đến địa fương ; Từ trong Đảng đến các ban ngành đoàn thể.
Cái kiểu "Củ khoai to là do Nghị quyết!"
 
Upvote 0
Thầy nói làm mình liên tưởng đến ngành GD của nước nhà quá
Chỉ đào tạo ra 1 lũ thiên lôi, nhưng vô nhận việc thì 1 móng thực tiển cũng chả có!
Lí thuyết thì họ thao thao bất tiệt;
Đào tạo châm chú đến lấy giải các kì thi quốc tế ở các môn học (toán, lí hóa, sinh,. . . .), Chủ nghĩa thành tích từ TW đến địa fương ; Từ trong Đảng đến các ban ngành đoàn thể.
Cái kiểu "Củ khoai to là do Nghị quyết!"
Ko biết e có nằm trong "lũ thiên lôi" đó ko :)
hihi, đùa tí. Rất cảm ơn các thầy, các a trên GPE đã hỗ trợ e vấn đề này. E sẽ ngâm cứu lại những điều từ topic này để rút kinh nghiệm.
Chúc cả nhà vui vẻ!
 
Upvote 0
Thầy nói làm mình liên tưởng đến ngành GD của nước nhà quá
Chỉ đào tạo ra 1 lũ thiên lôi, nhưng vô nhận việc thì 1 móng thực tiển cũng chả có!
Lí thuyết thì họ thao thao bất tiệt;
Đào tạo châm chú đến lấy giải các kì thi quốc tế ở các môn học (toán, lí hóa, sinh,. . . .), Chủ nghĩa thành tích từ TW đến địa fương ; Từ trong Đảng đến các ban ngành đoàn thể.
Cái kiểu "Củ khoai to là do Nghị quyết!"

Cái lý thuyết mà mấy thằng đó thao thao chỉ là đồ dỏm! Tôi là dân chuyên lý thuyết đây. Mấy thằng lý thuyết đó gặp tôi bẻ cứng họng hết.
 
Upvote 0
Vậy rất xin bạn vui lòng viết 1 thuyết trình sơ đẵng nhất vể xây dựng 1 cơ sở dữ liệu đi bạn!
Xin cảm ơn trước bạn nha!
 
Upvote 0
sơ đẵng nhất vể xây dựng 1 cơ sở dữ liệu

Định nghĩa: csdl là một thiết kế để chứa và truy cập dữ liệu có quy củ.
CSDL có nhiều dạng, dạng gần với tính chất bảng trải rộng (spreadsheet) của Excel nhất là dạng CSDL Liên Hệ (Relational Database).

Có lẽ bạn muốn hỏi cái này.

Lý thuyết căn bản về CSDL:
Lưu ý từ "có quy củ" tôi đề cập ở trên. Muốn có quy củ phải có lề luật.
Máy tính cũng như một cái búa. Ai biết cầm búa cũng có thể đốn sạt một góc rừng. Nhưng nếu thiếu kế hoạch thì phần lớn gỗ chỉ bỏ đi, không khai thác được. CSDL cũng vậy, ai cũng có thể lập được một CSDL đáp ứng nhu cầu của mình. Nhưng nếu không thiết kế có quy hoạch từ đầu thì càng về sau, càng rắc rối.

Lý thuyết căn bản về CSDL LH:
CSDL LH được dựa trên lý thuyết đại số tập hợp (set theory). Mỗi bảng (table) là một tập hợp, mỗi dòng (row hay record/tuple) trong bảng là mọt phần tử của tập hợp; mõi cột trong bảng tượng trưng cho một tính chất (attribute) của phần tử. Sự liên hệ là một phép hàm, dùng một hay nhiều tính chất của một bảng để [tham] chiếu sang một hay nhiều bảng khác. Phép hàm có thể là trực tiếp, vd A trong bảng Bng1 tham chiếu đến B trong bảng Bng2 vì A có tính chất X liên hệ đến tính chất Y của B (X=Y hoặc có một hàm f sao cho f(X) = Y); cũng có thể là gián tiếp, vd A trong bảng Bng1 tham chiếu đến B trong bảng Bng2 gián tiếp qua C trong bảng Bng3.

Để CSDL LH hoạt động hiệu quả, người ta có những luật chuẩn để chuẩn hoá. Bậc chuẩn càng cao thì càng lý tuởng. Tuy nhiên, chỉ cần đến bậc 3 là lý tưởng lắm rồi. Giải thích lý thuyết mỗi bậc chuẩn thì mất vài trang giấy, quý vị chịu khó tìm tài liệu vậy.

Điều đáng để ý là bậc chuẩn càng cao thì càng lý tưởng, nhưng nó cũng ảnh hưởng đến tốc độ. Vì vậy, đôi khi người ta hy sinh chuẩn để tăng tốc.

Ví dụ điển hình nhất trong Excel là bảng dò (lookup table). Nếu bạn thiết kế chuẩn thì hàm VLookup (hoặc các hàm tương tự) hoạt động rất hiệu quả. Nếu VLookup không dò nổi thì do bảng của bạn không đúng chuẩn bậc 1.
Ví dụ điển hình của hy sinh chuẩn là khi bạn thấy công thức của mình quá dài thì nên đặt cột phụ (đặt cột phụ là hy sinh chuẩn bâc 2 hoặc 3).

Chú thích 1: bạn để ý sẽ thấy trên diễn đàn này, tôi hay tránh không đụng vào các đề tài sử dụng công thức quá dài hoặc quá rắc rối. Đối với tôi, làm thế là trái căn bản. Nếu gặp trường hợp quá rắc rối, thiết kế lại bảng mới là giải pháp đúng.

Chú thích 2: tôi cũng không thích đụng vào các bài "bảng của em có đến hằng chục ngàn dòng...". Ở con số đó, cần phải nhìn lại chức năng của Excel. Nếu khong thể dùng Access thì tốt hơn nên chuyển qua các phiên bản cao hơn (2013-16). Các phiên bản đời sau có các công cụ như PowerPivot, Data model, DAX và PowerQuery để làm việc với CSDL lớn.
 
Upvote 0

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

Back
Top Bottom