Nếu 2 vùng chọn không cùng địa chỉ về Row thì sẽ hiện ra hộp thoại yêu cầu làm lại

Liên hệ QC

trungvdb

Thành viên thường trực
Tham gia
22/8/08
Bài viết
374
Được thích
171
Nghề nghiệp
Tài chính
Tôi có ý định tạo 2 vùng chọn, ví dụ như sau
PHP:
Sub thuchanh()
Set VungDk = Application.InputBox("Nhap dia chi vung Dieu kien", "Hop thoai 1", Type:=8)
Set VungKq = Application.InputBox("Nhap dia chi vung ket qua", "Hop thoai 2", Type:=8)
    End Sub

Để đảm bảo tính toán chính xác, tránh chọn lệch vùng dẫn đến kết quả sai, tôi muốn 2 vùng này phải thỏa mãn 2 điều kiện sau :
- Cùng số dòng như nhau
- đồng thời phải có dòng đầu tiên như nhau (kết hợp điều kiện trên dẫn đến dòng cuối như nhau)

- Ví dụ Hopthoai 1 lựa chọn từ A1:A10, Hop thoai 2 lựa chọn từ D1:D10 là hợp lệ do cùng địa chỉ về số dòng (1:10)
- Ví dụ Hopthoai 1 lựa chọn từ A1:A12, Hop thoai 2 lựa chọn từ D2:D13 là không hợp lệ do địa chỉ dòng khác nhau, mặc dù có cùng số dòng như nhau


Yêu cầu bài toán: Nếu lựa chọn sai điều kiện trên thì sẽ hiện ra hộp thoại thông báo (tựa như Vilidation trong Excel) với nội dung "Chú ý 2 vùng lựa chọn phải có địa chỉ về số dòng như nhau", sau đó yêu cầu chọn lại mới cho tiến hành câu lệnh tiếp theo.

Xin hãy chỉ cho tôi cách khai báo hộp thoại thông báo trên như thế nào.
 
Bạn thử với cái ni ra răng

PHP:
Option Explicit
Sub GPE()
 Dim Rng1 As Range, Rng2 As Range
 On Error GoTo Thoát
 
 Set Rng1 = Application.InputBox("Nhap dia chi vung Dieu kien", "Hop thoai 1", Type:=8)
 Set Rng2 = Application.InputBox("Nhap dia chi vung ket qua", "Hop thoai 2", Type:=8)
 If Rng1(1).Row = Rng2(1).Row And Rng1.Rows.Count = Rng2.Rows.Count Then
    MsgBox "Xin Chúc Mùng", , "GPE.COM"
 Else
    If Rng1(1).Row <> Rng2(1).Row Then
        MsgBox "Khong Cùng Dòng", , "Ban Fai Làm Lai!"
    ElseIf Rng1.Rows.Count <> Rng2.Rows.Count Then
        MsgBox "Khong Cùng Só Dòng", , "Ban Fai Chon Lai!"
    End If
    GPE
 End If
Thoát:              Exit Sub
End Sub
 
Upvote 0
PHP:
Sub thuchanh()
On Error Resume Next
Set vungdk = Application.InputBox("Nhap dia chi vung Dieu kien", "Hop thoai 1", Type:=8)
Set vungkq = Application.InputBox("Nhap dia chi vung ket qua", "Hop thoai 2", Type:=8)
If vungdk Is Nothing Or vungkq Is Nothing Then Exit Sub
If vungdk.Rows.Count <> vungkq.Rows.Count Or vungdk(1, 1).Row <> vungkq(1, 1).Row Then
    MsgBox "Sai roi ong noi! Lam lai!"
    thuchanh
Else
    MsgBox "ok, mi gioi!"
    'code chính'
End If
End Sub
 
Upvote 0
Tôi xin được chèn ngang Topic 1 chút, xin hỏi về khi nào viết Code vào Sheet riêng tức có cụm từ Private, khi nào viết vào Module.

Mặc dù tôi biết viết vào Insert/Module sẽ có tác dụng với nhiều Sheet theo ý muốn, nhưng tôi chưa hình dung trong trường hợp nào thực sự cần thiết mà khi viết bằng Insert/Module sẽ không giải quyết được vấn đề mà phải viết trên sheet riêng.
 
Upvote 0
Tôi có ý định tạo 2 vùng chọn, ví dụ như sau
PHP:
Sub thuchanh()
Set VungDk = Application.InputBox("Nhap dia chi vung Dieu kien", "Hop thoai 1", Type:=8)
Set VungKq = Application.InputBox("Nhap dia chi vung ket qua", "Hop thoai 2", Type:=8)
    End Sub

Để đảm bảo tính toán chính xác, tránh chọn lệch vùng dẫn đến kết quả sai, tôi muốn 2 vùng này phải thỏa mãn 2 điều kiện sau :
- Cùng số dòng như nhau
- đồng thời phải có dòng đầu tiên như nhau (kết hợp điều kiện trên dẫn đến dòng cuối như nhau)

- Ví dụ Hopthoai 1 lựa chọn từ A1:A10, Hop thoai 2 lựa chọn từ D1:D10 là hợp lệ do cùng địa chỉ về số dòng (1:10)
- Ví dụ Hopthoai 1 lựa chọn từ A1:A12, Hop thoai 2 lựa chọn từ D2:D13 là không hợp lệ do địa chỉ dòng khác nhau, mặc dù có cùng số dòng như nhau


Yêu cầu bài toán: Nếu lựa chọn sai điều kiện trên thì sẽ hiện ra hộp thoại thông báo (tựa như Vilidation trong Excel) với nội dung "Chú ý 2 vùng lựa chọn phải có địa chỉ về số dòng như nhau", sau đó yêu cầu chọn lại mới cho tiến hành câu lệnh tiếp theo.

Xin hãy chỉ cho tôi cách khai báo hộp thoại thông báo trên như thế nào.
Nếu chỉ xét vị trí dòng thì tôi nghĩ điều kiện thế này sẽ gọn hơn
Mã:
If vungdk.EntireRow.Address <> vungkq.EntireRow.Address Then
 
Upvote 0
Như thế này cũng được:

Mã:
Sub thuchanh()
Dim vungdk As Range, vungkq As Range
Do
On Error Resume Next
Set vungdk = Application.InputBox("Nhap dia chi vung Dieu kien", "Hop thoai 1", Type:=8)
Set vungkq = Application.InputBox("Nhap dia chi vung ket qua", "Hop thoai 2", Type:=8)
If vungdk Is Nothing Or vungkq Is Nothing Then Exit Sub
Loop Until vungdk.Rows.Count = vungkq.Rows.Count Or vungdk(1, 1).Row = vungkq(1, 1).Row
    'code chính'
End Sub
 
Upvote 0
Như thế này cũng được:

Mã:
Sub thuchanh()
Dim vungdk As Range, vungkq As Range
Do
On Error Resume Next
Set vungdk = Application.InputBox("Nhap dia chi vung Dieu kien", "Hop thoai 1", Type:=8)
Set vungkq = Application.InputBox("Nhap dia chi vung ket qua", "Hop thoai 2", Type:=8)
If vungdk Is Nothing Or vungkq Is Nothing Then Exit Sub
MsgBox vungdk(1, 1).Row & " - " &vungkq(1, 1).Row
Loop Until vungdk.Rows.Count = vungkq.Rows.Count Or vungdk(1, 1).Row = vungkq(1, 1).Row
    'code chính'
End Sub

Em thấy đâu có đúng
InputBox đâu tiên: Chọn A1
InputBox thứ hai: Chọn B2
Nó chẳng làm gì cả
Ngoài ra, sau khi chọn vùng không đúng đ/k, hộp InputBox hiện ra tiếp, bấm Cancel không được
Sửa lại
- Sửa OR thành AND
- Thêm On Error Resume Next lên đâu code
 
Upvote 0
Xin lỗi, mình sửa 2 dấu <> bằng dấu = rồi quên mất Or thành And
 
Upvote 0
PHP:
Sub thuchanh()
Set VungDk = Application.InputBox("Nhap dia chi vung Dieu kien", "Hop thoai 1", Type:=8)
    End Sub
Tôi chưa hiểu số 8 trong đoạn Code trên nó là gì? Liệu nó có phải biểu thị thuộc tính gì của Range? tôi thử thay đổi nó bằng số khác thì thấy báo lỗi.

--------------------
Tôi chưa bao giờ lập trình cũng như chưa từng được tham gia điều kiện đào tạo tạo bất kỳ trường lớp nào về những cái này nên chưa hiểu dấu hai chấm (Type:=8) được dùng khi nào?
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub thuchanh()
Set VungDk = Application.InputBox("Nhap dia chi vung Dieu kien", "Hop thoai 1", Type:=8)
    End Sub
Tôi chưa hiểu số 8 trong đoạn Code trên nó là gì? Liệu nó có phải biểu thị thuộc tính gì của Range? tôi thử thay đổi nó bằng số khác thì thấy báo lỗi.
Type trong InputBox thể hiện kiểu dữ liệu

Capture.JPG

Bạn có thể bôi đen dòng chữ "Application.InputBox" trong cửa sổ lập trình rồi bấm F1, sẽ có câu trả lời
-------------------
Tôi chưa bao giờ lập trình cũng như chưa từng được tham gia điều kiện đào tạo tạo bất kỳ trường lớp nào về những cái này nên chưa hiểu dấu hai chấm (Type:=8) được dùng khi nào?
Ví dụ ta có 1 Sub thế này
PHP:
Sub ThiNghiem(Thamso1 as Long, Thamso2 as Long, Thamso 3 as Long)
.................
End Sub
Khi áp dụng code này vào 1 code khác, ta gọi sub như sau
ThiNghiem ts1, ts2, ts3
(với ts1, ts2, ts3 là 3 tham số truyền vào)
Trong trường hợp ta chỉ xài ts1, ts3 và bỏ ts2, ta viết
ThiNghiem ts1, , ts3
Hoặc cũng có thể viết
Thinghiem ts1, thamso3:=ts3
Trở lại InputBox, cú pháp của nó là
Application.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)
Ở đây ta chỉ quan tâm đến Prompt, Title Type nên ta viết thành
Application.InputBox("Nhap dia chi vung Dieu kien", "Hop thoai 1", Type:=8)
Cũng có thể viết
Application.InputBox("Nhap dia chi vung Dieu kien", "Hop thoai 1", , , , , ,8)
Với cách viết màu đỏ ở trên, bạn thử nghĩ nếu không viết Type:=8 thì làm sao code nó biết được số 8 ấy thuộc tham số nào trong InputBox đây
Ẹc... Ẹc...
 
Lần chỉnh sửa cuối:
Upvote 0
--------------------
Tôi chưa bao giờ lập trình cũng như chưa từng được tham gia điều kiện đào tạo tạo bất kỳ trường lớp nào về những cái này nên chưa hiểu dấu hai chấm (Type:=8) được dùng khi nào?

Dấu hai chấm thường được sử dụng khi gán tính chất cho một đối tượng Object; khác với biến, mảng khi gán không có dấu này.
 
Upvote 0
Dấu hai chấm thường được sử dụng khi gán tính chất cho một đối tượng Object; khác với biến, mảng khi gán không có dấu này.

Sai

- Dấu : phải kèm theo dấu =
- Không phải gán tính chất cho 1 đối tượng, mà là gán giá trị cho 1 tham số. Tham số này có thể của 1 hàm, 1 sub, 1 method (phương thức)
 
Upvote 0
Web KT

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

Back
Top Bottom