Xin code vba yêu cầu phải nhập dữ liệu bắt buộc

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

siv2

Thành viên hoạt động
Tham gia
14/7/12
Bài viết
122
Được thích
7
Em có file có sẵn code khác rồi giờ e muốn thêm code để bắt buộc phải nhập dữ liệu ở các ô cùng dòng trên các cột ABCDEF thì mới được nhập dữ liệu ở cột G, và tương tự như vậy phải nhập H I J thì mới nhập được ở cột K . Cụ thể như file kèm thèo . Mong các bác giúp em trực tiếp trên file vì VBA em chưa biết tí gì ạ !!!!!!
 

File đính kèm

  • Chi Tiêu 2023 - Copy.xlsm
    217.2 KB · Đọc: 8
Em có file có sẵn code khác rồi giờ e muốn thêm code để bắt buộc phải nhập dữ liệu ở các ô cùng dòng trên các cột ABCDEF thì mới được nhập dữ liệu ở cột G, và tương tự như vậy phải nhập H I J thì mới nhập được ở cột K . Cụ thể như file kèm thèo . Mong các bác giúp em trực tiếp trên file vì VBA em chưa biết tí gì ạ !!!!!!
Thử cho cái này vào sheet Thu chi
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 7 Then
        If WorksheetFunction.CountIf(Target.Offset(, -6), "") > 0 Then
            Target = ""
            MsgBox "Nhap Thieu du lieu"
        End If
    End If
End Sub
 
Thử cho cái này vào sheet Thu chi
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 7 Then
        If WorksheetFunction.CountIf(Target.Offset(, -6), "") > 0 Then
            Target = ""
            MsgBox "Nhap Thieu du lieu"
        End If
    End If
End Sub
Code này chưa đủ

a = VBA.Array(7, 11)
b = VBA.Array(6, 3)
For i = 0 to 1
If Target.Column =a(i) Then
If WorksheetFunction.CountIf(Target.Offset(, -b(i)).Resize(, b(i)), "") > 0 Then
...
End If
End If
Next i
 
Thử cho cái này vào sheet Thu chi
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 7 Then
        If WorksheetFunction.CountIf(Target.Offset(, -6), "") > 0 Then
            Target = ""
            MsgBox "Nhap Thieu du lieu"
        End If
    End If
End Sub
- Bắt tội phạm phải bắt quả tang. Nó lén lén thò tay vào tủ, hoặc cấm búa đập kính tủ, hoặc rút dao rút súng ra mới là phạm tội. Chứ vừa mới đi ngang qua cửa hàng vàng bạc, đứng lại ngắm, đã tri hô bắt cướp?
- Offset mà không Resize thì chỉ có 1 ô thôi.
 
- Bắt tội phạm phải bắt quả tang. Nó lén lén thò tay vào tủ, hoặc cấm búa đập kính tủ, hoặc rút dao rút súng ra mới là phạm tội. Chứ vừa mới đi ngang qua cửa hàng vàng bạc, đứng lại ngắm, đã tri hô bắt cướp?
- Offset mà không Resize thì chỉ có 1 ô thôi.
Chú nói cháu mới nhận ra. Xin lỗi thớt. Xin lỗi bạn đọc. Em sai rồi. Viết vội. Giờ mới test. Có vẻ code chưa ổn lắm. Có lẽ nên tìm cách khác thay vì Worksheet_SelectionChange
Bài đã được tự động gộp:

a = VBA.Array(7, 11)
b = VBA.Array(6, 3)
Thưa chú. Cứ thi thoảng lại thấy cái chữ VBA.xxxx
Thay vì chữ đó : a = array(xxx)
b = array(xxx)
Thì khả năng nó xảy ra cái gì không mà cứ thấy nó lạ lạ ạ?
 
...

Thưa chú. Cứ thi thoảng lại thấy cái chữ VBA.xxxx
Thay vì chữ đó : a = array(xxx)
b = array(xxx)
Thì khả năng nó xảy ra cái gì không mà cứ thấy nó lạ lạ ạ?
Vụ này tôi giải thích vài lần rồi. Nhưng mà cũng hơi lâu. Tôi cũng không ngại nhắc lại cho các bạn hiếu học.

1. VBA là một trong những ngôn ngữ tồi nhất về tiêu chuẩn. Nó có cả đống hàm không thống nhất, gọi qua kiểu x thì làm việc hơi khác với gọi qua kiểu y.

2. Vì quan hệ mật thiết với bảng tính cho nên VBA phải phân loại mặc định cho Lower Bound (LBound) của mảng. Luật chung như sau:
- bất cứ mảng nào từ bảng tính ra thì mặc định LBound là 1.
- các mảng từ hàm VBA (Array, Split,...) cho ra thì mặc định LBound là 0.

3. Khi xuất hiện bên trong code thì "VBA" là từ khóa tên của đối tượng có tên là VBA. Vì vậy, hàm hay hằng đi với tiền tố (prefix) "VBA." là hàm/hằng tiêu chuẩn xác định của VBA. Không có tiền tố này thì có hai trường hợp xảy ra:
(i) hàm chưa chắc của VBA, mà có thể của đối tượng khác. Điển hình Evaluate là hàm của đối tượng bảng tính.
(ii) hàm rõ ràng là của VBA, nhưng chưa chắc theo tiêu chuẩn mặc định của VBA. Xem lại câu 1 ở trên, đó là ý của từ "hơi khác".

Điển hình (đây là câu trả lời trực tiếp ngay câu hỏi của bạn), hàm Array trả về mảng với LBound mặc định là 0. NHƯNG, nếu ở đầu module có lệnh "Option Base 1" thì hàm này sẽ tuân thủ theo lệnh đó: LBound mặc định là 1. Lưu ý là Option không hẳn chỉ có một chỗ để tuyên bố là đầu module, trên thực tế bạn có cách tuyên bố cho cả project. Vì GPE chỉ viết code lẻ cho nên họ chỉ quen module mà ít kinh nghiệm về project.

Để tránh ba cái mớ ốp-sần lộn xộn, người lười viết như tôi sẽ dùng cách ép hàm tuân thủ theo tiêu chuẩn đã xác định: gọi Array qua đối tượng VBA, tức là ghi rõ tiền tố "VBA.". Với thủ thuật này tôi an tâm coi như LBound của mảng là 0, không bao giờ sợ bất ngờ (do Option).
Lỡ code của tôi lụm đâu đó chạy theo kiểu mặc định LBound là 1 cho hàm Array thì tôi làm ngược lại, xóa các tiền tố "VBA.", và thêm Option Base 1 ở đầu.

Chú thích 1: người ta có thể nói tiền tố VBA làm cho hàm nhanh hay chậm hơn, tùy theo kiến thức cá nhân. Điều này đối với tôi không quan trọng. Nếu muốn nhanh thì tôi code C++. Đã code VBA thì tôi chỉ quan tâm mức độ đáng tin cậy của code.

Chú thích 2: Option là lệnh dẫn trình dịch chứ không phải code. Ở GPE này chỉ dùng Option Explicit cho nên người học quên bẵng là còn nhiều Options khác.

Chú thích 3 (quan trọng): tiền tố còn được dùng để gọi hàm/biến/hằng mà bên trong module đã bị phiên bản nội che mất.
Ví dụ Module 1 có hàm Public ChungChung(). Module 2 cũng có hàm này. Bên trong Module 2 mà gọi ChungChung thì đó là hàm của Module 2. Muốn gọi hàm kia thì dùng "Module1.ChungChung"
Tương tự, nếu bạn có đặt hàm nào đó trùng tên với hàm của VBA thì lúc gọi, bạn sẽ được hàm của mình. Muốn gọi hàm VBA thì thêm "VBA."
 
Ở GPE này chỉ dùng Option Explicit cho nên người học quên bẵng là còn nhiều Options khác.
Cám ơn chú bỏ thời gian giải thích để cháu cũng như mọi người hiểu. Đúng là cái này trước giờ chỉ cùng mỗi cái Option Explicit,
có nhìn thấy cái Option khác mà chẳng hiểu nên cứ lờ đi chứ không phải là quên bẵng.
các mảng từ hàm VBA (Array, Split,...) cho ra thì mặc định LBound là 0.
Cái đoạn này cũng có lần thắc mắc thấy nó luôn có LBound =0 mà không phải bằng 1. Nhưng rồi vài lần là cũng cứ mặc định để lái theo mà code.
Cái chú thích 3. Đúng là cần học hỏi vì có lần bản thân cháu cũng từng gặp phải. Loay hoay mãi không được không gọi được. đành phải copy lại nguyên bản cũng sub đó.
Cám ơn chú vì các thông tin trên ạ.
 
Web KT
Back
Top Bottom