Giúp chỉnh code workbook_changge (1 người xem)

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

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

USB1394

Thành viên hoạt động
Tham gia
20/12/08
Bài viết
173
Được thích
12
Nghề nghiệp
Lính triều đình
Đoạn code dưới đây sẽ hiện hộp thoại thông báo khi ta chọn ô L10 vào ô này phải không có dữ liệu . Vấn đề của mình là : khi ta chọn các ô khác cũng hiện hộp thoại này đương nhiên ô chọn phải không có dữ liệu . Ví dụ : ô L10 , L14 , L15 , L16 , L20 . Ở đây ta không dùng ElseIf mà ta dùng giải pháp khác (cho code đơn giản) . Mong các bạn giúp đỡ , xin cám ơn
+-+-+-++-+-+-++-+-+-+

Mã:
 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      If Target.Address = "$L$10" And [L10].Value = "" Then
              Msgbox “Run Marco”
      End If
  End Sub
 
Đoạn code dưới đây sẽ hiện hộp thoại thông báo khi ta chọn ô L10 vào ô này phải không có dữ liệu . Vấn đề của mình là : khi ta chọn các ô khác cũng hiện hộp thoại này đương nhiên ô chọn phải không có dữ liệu . Ví dụ : ô L10 , L14 , L15 , L16 , L20 . Ở đây ta không dùng ElseIf mà ta dùng giải pháp khác (cho code đơn giản) . Mong các bạn giúp đỡ , xin cám ơn
+-+-+-++-+-+-++-+-+-+

Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$L$10" And [L10].Value = "" Then
Msgbox “Run Marco”
End If
End Sub

Đề là workbook_changge, code là Worksheet_SelectionChange!

Giả sử bạn muốn có tác dụng trên cột L (cột thứ 12)
Bạn thay dòng:
If Target.Address = "$L$10" And [L10].Value = "" Then
thành
If Target.Column= 12 And Trim(Target)= "" Then
 
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề của mình là một số ô chứ không phải cả cột , các ô này có thể nằm liên tục hoặc rời rạc , có thể cùng 1 cột hoặc khác cột
 
Upvote 0
Vấn đề của mình là một số ô chứ không phải cả cột , các ô này có thể nằm liên tục hoặc rời rạc , có thể cùng 1 cột hoặc khác cột

Bạn xem ví dụ này có đúng ý bạn không nha:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
      On Error Resume Next
      If Not Intersect(Range("L10,L14:L16,L20"), Target) Is Nothing Then
        If Target.Value = "" Then
                MsgBox "Xin chao ban nhe!", , "Info"
        End If
      End If
  End Sub
 

File đính kèm

Upvote 0
Cũng có thể là vầy:

PHP:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim Selec As Range
 Set Selec = Union([L10], [L15:L16], [L20])
 If Not Intersect(Target, Selec) Is Nothing Then
    If Target.Value = "" Then MsgBox "GPE", , Target.Count
 End If
End Sub
 
Upvote 0
code của bạn gần đúng , nhưng chưa chính xác vần đề : khi ta chọn đúng vào ô chỉ định thì hộp thoại hiện ra (ta chưa làm gì cả) , trong khi code của bạn ta phải ấn F2 để chỉnh nội dung , nếu sau khi ấn F2 mà không nhập gì cả (rỗng) thì hộp thoại mới hiện ra
 
Upvote 0
code của bạn gần đúng , nhưng chưa chính xác vần đề : khi ta chọn đúng vào ô chỉ định thì hộp thoại hiện ra (ta chưa làm gì cả) , trong khi code của bạn ta phải ấn F2 để chỉnh nội dung , nếu sau khi ấn F2 mà không nhập gì cả (rỗng) thì hộp thoại mới hiện ra

Vậy bạn dùng code của bác ChanhTQ@ là Ok rùi. Tại mình thấy tiêu đề của bạn cứ SelectionChange và Change nhiều quá nên... mới làm vậy thui.
 
Upvote 0
PHP:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim Selec As Range
 Set Selec = Union([L10], [L15:L16], [L20])
 If Not Intersect(Target, Selec) Is Nothing Then
    If Target.Value = "" Then MsgBox "GPE", , Target.Count
 End If
End Sub

Tuyệt , cách này đơn giản mà giải quyết VĐ , xin cám ơn các bạn rất nhiều , bạn có thể giải thích giúpminhfy ý nghĩa dòng code này không : If Not Intersect(Target, Selec) Is Nothing Then , xin cám ơn
 
Upvote 0
bạn có thể giải thích giúpminhfy ý nghĩa dòng code này không : If Not Intersect(Target, Selec) Is Nothing Then

Muốn hiểu được dòng đó thì bạn nên đọc phương thức Intersect của bác SA_DQ nhé! Hay lắm đó bạn ah!
 
Upvote 0
Tuyệt , cách này đơn giản mà giải quyết VĐ , xin cám ơn các bạn rất nhiều , bạn có thể giải thích giúpminhfy ý nghĩa dòng code này không : If Not Intersect(Target, Selec) Is Nothing Then , xin cám ơn
Mình giải thích nôm na thôi nha:
Intersect(Range("rg1"), Range("rg2")): Hàm trả về kết quả là phần giao nhau của hai vùng "rg1" và "rg2"
If Not Intersect(Target, Selec) Is Nothing then ...: Nếu ô được tác động (Target) thuộc vùng Selec (đã chọn) thì ...
Giống kiểu này: Not (Not (True)) = True
 
Upvote 0
Mình giải thích nôm na thôi nha:
Intersect(Range("rg1"), Range("rg2")): Hàm trả về kết quả là phần giao nhau của hai vùng "rg1" và "rg2"
If Not Intersect(Target, Selec) Is Nothing then ...: Nếu ô được tác động (Target) thuộc vùng Selec (đã chọn) thì ...
Giống kiểu này: Not (Not (True)) = True
Trước tiên xin nói rằng:
- Intersect là 1 PHƯƠNG THỨC (Method), không phải HÀM (Function)
- Phương thức Intersect là dùng để xác định phần giao nhau giữa 2 vùng
- Phương thức Intersect luôn trả về kết quả là 1 Range (gần giống với Find Method)
Mặc khác, để xác định 1 vùng có tồn tại hay không ta có 2 phát biểu:
a) Nếu vùng Range("...gì gì đó...") là không có gì cả thì:
Mã:
If Range("...gì gì đó...") is Nothing then
b) Nếu không phải vùng Range("...gì gì đó...") là không có gì cả thì: (nếu nó có tồn tại)
Mã:
If [COLOR=red][B]Not[/B][/COLOR] Range("...gì gì đó...") is Nothing then
-------------------------------------
Vậy khi đã dùng Intersect để xác định 1 vùng mà chưa chắc vùng ấy có tồn tại hay không thì ít nhất cũng phải dùng 1 trong 2 dòng code trên
Mã:
Set Rng = Intersect(......)
If Not Rng is Nothing then(
Trong trường hợp dùng sự kiện SelectionChange, mỗi khi đặt chuột vào 1 cell là lúc ta dùng Intersect để xác định vùng giao giữa Selection với 1 vùng cho sẳn, lúc này đương nhiên ta không thể biết trước vùng mà kết quả của Intersect trả về có tồn tại hay không nên phải dùng đoạn phát biểu trên, Nếu thỏa mản điều kiện tồn tại thì ta mới làm tiếp việc khác
-------------------------------------
Nói thêm: Nhờ Mod sửa lại TIÊU ĐỀ cho phù hợp với nội dung ---> SelectionChange chứ không phải Change
 
Lần chỉnh sửa cuối:
Upvote 0
If Not Range("...gì gì đó...") is Nothing then

Xin hỏi: tôi viết câu lệnh sau

if not Range("J6:J" & [k10000].End(3).Row).SpecialCells(xlCellTypeBlanks) then
Range("J6:J" & [J10000].End(3).Row).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
end if

thì bị báo lỗi.

Mục đích là để xoá các hàng mà lẫn trong vùng J6:Jn (cuối cùng) có ô trống.

Tất nhiên dùng bẫy lỗi thì
on error resume next
Range("J6:J" & [J10000].End(3).Row).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
on error goto 0

nhưng tôi không thích bẫy. Có khắc phục được không? Cảm ơn
 
Upvote 0
Xin hỏi: tôi viết câu lệnh sau

if not Range("J6:J" & [k10000].End(3).Row).SpecialCells(xlCellTypeBlanks) then
Range("J6:J" & [J10000].End(3).Row).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
end if

thì bị báo lỗi.

Mục đích là để xoá các hàng mà lẫn trong vùng J6:Jn (cuối cùng) có ô trống.

Tất nhiên dùng bẫy lỗi thì
on error resume next
Range("J6:J" & [J10000].End(3).Row).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
on error goto 0

nhưng tôi không thích bẫy. Có khắc phục được không? Cảm ơn

Mã:
if not Range("J6:J" & [k10000].End(3).Row).SpecialCells(xlCellTypeBlanks) [COLOR=#ff0000]isnothing [/COLOR]then

tôi chưa kiểm tra, bạnt hử xem được ko
 
Upvote 0
Câu lệnh (chép trực tiếp từ Code)
If Not Range("J6:J" & [k10000].End(3).Row).SpecialCells(xlCellTypeBlanks) Is Nothing Then
MsgBox "abc"
End If

sẽ hiện Msgbox nếu vùng J6:Jn có ô trống.

Còn nếu không có thì báo lỗi. Làm sao để đón trước cái lỗi này. Cảm ơn

(khi thử nghiệm, bạn có thể chọn n trong J6:Jn là số đủ lớn, ví dụ J6:J10, và trong vùng này làm 2 khả năng: có ô trống, và không có ô trống).
 
Upvote 0
Câu lệnh (chép trực tiếp từ Code)
If Not Range("J6:J" & [k10000].End(3).Row).SpecialCells(xlCellTypeBlanks) Is Nothing Then
MsgBox "abc"
End If

sẽ hiện Msgbox nếu vùng J6:Jn có ô trống.

Còn nếu không có thì báo lỗi. Làm sao để đón trước cái lỗi này. Cảm ơn

(khi thử nghiệm, bạn có thể chọn n trong J6:Jn là số đủ lớn, ví dụ J6:J10, và trong vùng này làm 2 khả năng: có ô trống, và không có ô trống).


========
À, tôi hiểu sai ý
chắc là phải dùng bẩy lổi thôi
==========
hoặc dùng find
Mã:
Sub TEST()
Set emptycell = Range("J6:J" & [J10000].End(3).Row).Find("", , , 1)
If Not emptycell Is Nothing Then
    MsgBox "CO DONG TRONG"
Else
    MsgBox "KO CO DONG TRONG"
End If
End Sub
=========
hoặc dùng worksheet.function.countblank
 
Lần chỉnh sửa cuối:
Upvote 0
. . . nhưng tôi không thích bẫy. Có khắc phục được không? Cảm ơn

Bạn nên chọn 1 trong hai fương án sau để còn ngủ khỏe & sống lâu hơn vài ngày:
Mã:
Option Explicit
Sub gpeCàChón()
 Dim bRg As Range
 On Error Resume Next
 
1 Set bRg = Range("J6:J" & [k10000].End(3).Row).SpecialCells(xlCellTypeBlanks)
2 If Not bRg Is Nothing Then
3    MsgBox bRg.Cells.Count
4 End If
MsgBox Err, , Erl
If Err > 0 Then Err = 0
End Sub
** ** ** ** ** ** *
PHP:
Sub gpeErr()
 Dim bRg As Range
 On Error GoTo LoiCT
5 Set bRg = Range("J6:J" & [k10000].End(3).Row).SpecialCells(xlCellTypeBlanks)
6 If Not bRg Is Nothing Then
7    MsgBox bRg.Cells.Count
8 End If
Err_:   Exit Sub
LoiCT:
    If Err = 1004 Then
        Resume Err_
    End If
    MsgBox Error(), , Erl
    Resume Err_
End Sub
 
Upvote 0
Câu lệnh (chép trực tiếp từ Code)
If Not Range("J6:J" & [k10000].End(3).Row).SpecialCells(xlCellTypeBlanks) Is Nothing Then
MsgBox "abc"
End If

sẽ hiện Msgbox nếu vùng J6:Jn có ô trống.

Còn nếu không có thì báo lỗi. Làm sao để đón trước cái lỗi này. Cảm ơn

(khi thử nghiệm, bạn có thể chọn n trong J6:Jn là số đủ lớn, ví dụ J6:J10, và trong vùng này làm 2 khả năng: có ô trống, và không có ô trống).

Đối với SpecialCells(....) nó luôn luôn bị lỗi khi không tìm thấy và không có cách nào bẫy lỗi này nếu không dùng On Error Resume Next cả
Đương nhiên, cách "lòng vòng này nọ" vẫn có nhưng thà không dùng còn hơn
 
Upvote 0
Đối với SpecialCells(....) nó luôn luôn bị lỗi khi không tìm thấy và không có cách nào bẫy lỗi này nếu không dùng On Error Resume Next cả
Đương nhiên, cách "lòng vòng này nọ" vẫn có nhưng thà không dùng còn hơn

Chắc ý của anh là xác đáng. Cảm ơn.

Của mấy bạn ở trên tôi cũng đã thử, nhưng không cho kết quả hợp lý.

Ví dụ
Sub gpeCàChón()
Dim bRg As Range
On Error Resume Next

1 Set bRg = Range("J1:J11").SpecialCells(xlCellTypeBlanks)
2 If Not bRg Is Nothing Then
3 MsgBox bRg.Cells.Count
4 End If
MsgBox Err, , Erl
If Err > 0 Then Err = 0
End Sub

thì câu lệnh có nhãn 3 luôn thực hiện (và cho 11) dù vùng J1:J11 có hay không có ô trống.

Dù sao cũng cảm ơn tất cả.
 
Upvote 0
Mình đoan chắc rằng macro gpeCàChón sẽ đưa ra hai hộp thoại có nội dung khác nhau trong trường hợp
[thongbao]vùng J1:J11 có hay không có ô trống[/thongbao]

Bye, Bye!
 
Upvote 0

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

Back
Top Bottom