Xóa dữ liệu ở sheet chính và sheet có liên quan

Liên hệ QC

tamhoncuada10313

Thành viên thường trực
Tham gia
7/4/08
Bài viết
221
Được thích
65
Em có một bài toán thế này: giả sử có 2 sheet: sheet1 gồm: mã phòng,tên phòng. Sheet2 có: tên máy, tên phòng sử dụng (lấy từ sheet1). Giờ em muốn nếu xóa tên 1 phòng nào đó ở sheet1 đi thì ở sheet2 cũng sẽ tự động xóa những máy do phòng đó dùng đi.
Mong các bác giúp em
 
Bạn xem thêm trong file đính kèm

PHP:
Option Explicit
Sub DeleteAll()
 Dim MaDV As String:            Dim Rng As Range
 Dim lRow As Long, Wz As Long
 
 MaDV = Range("B" & (5 + [D5]))
 lRow = Sheets("BaoTri").[a65432].End(xlUp).Row
 For Wz = 6 To lRow
    With Sheets("BaoTri")
        If .Cells(Wz, 1) = MaDV Then
            If Rng Is Nothing Then
                Set Rng = .Cells(Wz, 1).Resize(1, 7)
            Else
                Set Rng = Union(Rng, .Cells(Wz, 1).Resize(1, 7))
        End If:         End If
    End With
 Next Wz
 Rng.Delete Shift:=xlUp
 
End Sub


Mã:
Sub ColorIn()
 Range("B6:B22").Interior.ColorIndex = 2
 Range("B" & (5 + [D5])).Interior.ColorIndex = 35
End Sub
 

File đính kèm

Upvote 0
Bác Sa ơi! Lỗi debug ở dòng này
Rng.Delete Shift:=xlUp
trong hàm deleteall
 
Upvote 0
Báo lỗi là do chạy lần thứ 2, không còn vùng nào để nó xóa cả;
Đổi dùm mình dòng lệnh đó lại là:
Mã:
    If Not Rng Is Nothing then Rng.Delete Shift:=xlUp
'Diễn nôm là, nếu tồn tại vùng Rng thì xóa nó đi; Xin lỗi bạn nha; Lần sau chú í hơn!
 
Upvote 0
Bác Sa ơi! Em jờ chỉ muốn làm đơn giản thôi, đó là nhập vào mã phòng cần xóa. Khi xóa thì sẽ hỏi lại lần nữa có muốn xóa ko? và nếu đồng ý xóa thì những máy do phòng bị xóa sử dụng ở bên DMthietbi sẽ tự điền vào ô ghi chú là: Phòng này đã không còn tồn tại nữa
Mong bác giúp em lần nữa.
 
Upvote 0
Các bác sửa giùm em đoạn code này
Private Sub Xoa_Click()
Dim last As Long, i As Long, last1 As Long, j As Long, tmp As String
'tmp = "= upper(sheet6.cells(5,6))"
last1 = Sheet1.Range("B4").End(xlDown).Row
last = Sheet6.Range("B6").End(xlDown).Row
For i = 6 To last

If Sheet6.Cells(i, 2) = Sheet6.Cells(5, 6) Then
If MsgBox(" Ban co that su muon xoa?", vbQuestion + vbYesNo) = vbYes Then
Sheet6.Rows(i).Select
Selection.Delete shift:=xlUp
For j = 4 To last1
If Sheet1.Cells(j, 5) = Sheet6.Cells(i, 2) Then
Sheet1.Cells(j - 1, 7) = " Phong nay da thay doi"
End If
Next j
End If
If i = last Then
Exit Sub
Else
Sheet6.Range("A" & i - 1).Select
Selection.AutoFill Destination:=Range("A" & i - 1 & ":A" & i), Type:=xlFillDefault
Sheet6.Range("A" & i - 1 & ":A" & i).Select
End If
Exit Sub
End If

Next i
If i > last Then MsgBox "Ten phong ban nhap vao khong ton tai", , "Thong bao:"
End Sub

Chức năng của nó là khi xóa tên phòng ở DM fòng thì sẽ tìm tên phòng đó bên DM thietbi và ghi vào cột ghi chú là "Phòng này đã thay đổi". Nhưng khi em xóa thì bên DMthietbi không có hiện tượng gì xảy ra cả
 
Upvote 0
Nên gửi file ah, vì đoạn code trên lập gắn với DL

nhìn qua đoạn này
PHP:
         If Sheet6.Cells(i, 2) = Sheet6.Cells(5, 6) Then
           If MsgBox(" Ban co that su muon xoa?", vbQuestion + vbYesNo) = vbYes Then
            Sheet6.Rows(i).Select
            Selection.Delete shift:=xlUp
.......
sửa thành như sau cho ngắn gọn
PHP:
         If Sheet6.Cells(i, 2) = Sheet6.Cells(5, 6) Then
           If MsgBox(" Ban co that su muon xoa?", vbQuestion + vbYesNo) = vbNo Then Exit Sub  'bo End If ở dưới đi
            Sheet6.Rows(i).Select
            Selection.Delete shift:=xlUp
.......
 
Upvote 0
Em đưa file lên rồi đây ạ. Đoạn code này em viết cho sheet DM fong.Các bác sửa giùm
 

File đính kèm

Upvote 0
Các bác sửa giùm em đoạn code này
Chức năng của nó là khi xóa tên phòng ở DM fòng thì sẽ tìm tên phòng đó bên DM thietbi và ghi vào cột ghi chú là "Phòng này đã thay đổi". Nhưng khi em xóa thì bên DMthietbi không có hiện tượng gì xảy ra cả

PHP:
Private Sub Xoa_Click()
' Khai báo các biến sẽ sử dụng:'
 Dim last As Long, i As Long, last1 As Long, j As Long, tmp As String
'tmp = "= upper(sheet6.cells(5,6))" '
' Dòng cuối có dữ liệu thuộc cột 'B' bắt đầu từ 'B4' của sheet1 gán vô biến Last1:'
 last1 = Sheet1.Range("B4").End(xlDown).Row
' Dòng cuối có dữ liệu thuộc cột 'B' bắt đầu từ 'B6' của sheêt gán vô biến Last:'
last = Sheet6.Range("B6").End(xlDown).Row
'Tạo vòng lặp từ 6 cho đến giá trị trong biến Last:'
    For i = 6 To last
'Nếu dữ liệu trong ô có tọa độ dòng 5, cột 6 = ô thuộc dòng 9i) cột 2 thì:'   
        If Sheet6.Cells(i, 2) = Sheet6.Cells(5, 6) Then
' Nếu hộp thoại Xóa được khẵng định, thì:'
          If MsgBox(" Ban co that su muon xoa?", vbQuestion + vbYesNo) = vbYes Then
'Chọn dòng thứ (i) của Sheet6:'
            Sheet6.Rows(i).Select
'Xóa dòng được chọn & đôn lên:'
1           Selection.Delete shift:=xlUp
'Tạo vòng lặp theo j từ 4 cho đến giá trị trong biến Last1:'
              For j = 4 To last1
' Nếu dữ liệu trong sheet6 thuộc dòng (i) cột 2 = dữ liệu trong sheet1 _
             thuộc dòng (j), côt5, thì: '
2               If Sheet1.Cells(j, 5) = Sheet6.Cells(i, 2) Then
' Chuỗi "Phòng này đã thay đỗi" đem gán vô ô thuộc dòng (j), cột 7 của sheet1:' 
                Sheet1.Cells(j - 1, 7) = " Phong nay da thay doi"
3                End If
'Thoát vòng lặp theo j:'
             Next j
            End If

            If i = last Then
                   Exit Sub
            Else
                  Sheet6.Range("A" & i - 1).Select
                  Selection.AutoFill Destination:=Range("A" & i - 1 & ":A" & i), _
                             Type:=xlFillDefault
                  Sheet6.Range("A" & i - 1 & ":A" & i).Select
            End If
                Exit Sub
        End If
        
    Next i
    If i > last Then MsgBox "Ten phong ban nhap vao khong ton tai", , "Thong bao:"
End Sub
1*/ Nó không làm gì bên sheet1 là may rồi, nếu không nó sẽ điền tầm bậy thì mệt hơn!
Dòng lệnh mà mình quính số 1 đó đã thực thi thì cái cũ đã xóa, cái mới từ dưới dồn lên;
Sao bạn không thay câu lệnh số 2 bằng câu:
Mã:
If Sheet1.Cells(j, 5) = Sheet6.Cells(5, 6)
2*/ Để trách sót trong những trường hợp xài phương thức xóa, ta nên duyệt từ dười lên trong vòng lặp với Step = -1
3*/ Để tiết kiệm thời gian, bạn nên gán giá trị trong Cells(5, 6) vô 1 biến ngay từ đầu & 1 lần duy nhất, để excel khỏi truy xuất nó hoài hoài, nó mệt mà chẵng thở than cùng ai, tội nghiệp nó!

Vui nha!
 
Upvote 0
Bác ơi jờ em không muốn hiện lên thông báo nữa mà xóa những dòng đó đi thì làm thế nào hả bác? EM làm nó báo lỗi 1044. Em chả hiểu nó là lỗi gì?

Bác SA ơi! từ file em gửi, bác có thể sửa lại giùm em là xóa đi thay vì ghi chữ "phòng này đã thay đổi được không?"
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Bác ơi jờ em không muốn hiện lên thông báo nữa mà xóa những dòng đó đi thì làm thế nào hả bác? EM làm nó báo lỗi 1044. Em chả hiểu nó là lỗi gì?
Lỗi 1044: Application-defined or object-defined error
Một khi cột 'A' gán công thức như của bạn, mà xóa đi 1 dòng thì tức thì ra lỗi;
Để khắc phục lỗi này mình đề xuất tại cột 'A', bắt đầu từ 'A4' - có dữ liệu về máy ta nhập công thức:
=ROW()-3 & dùng FillHand kéo xuống; Với công thức này, bạn sẽ thấy dùng được trong VBA luôn; như macro dưới đây:
Macro làm 2 nhiệm vụ, khi nó duyệt từ record cuối đến record đầu
* Ở đây mình cho là bạn chỉ có 1 record để xóa; Nếu trong CSDL có 2 records trùng trở lên cần xóa, thì bạn bỏ dòng exit sub đi;
Nhiệm vụ thứ hai kèm theo, đó là trong khi duyệt như vậy, thấy ô tương ứng bên cột 'A' chưa có đánh số TT thì nó sẽ giúp bạn làm việc này, không hề đòi thêm thù lao!

PHP:
Public Sub Xoa()
 Dim last_row As Long, i As Long
 Dim tmp
 tmp = InputBox("Nhap ma can tim:")
 last_row = Sheet1.[B4].End(xlDown).Row
 
 For i = last_row To 4 Step -1
    With Sheet1.Cells(i, 2)
    If .Value = tmp Then
       Sheet1.Rows(i).Delete shift:=xlUp
       Exit Sub
    End If
    If .Offset(, -1) = "" Then
       .Offset(, -1).Formula = "=ROW()-3"
    End If
    End With
  Next i
  
  If i < 4 Then MsgBox "Khong tim thay ma can xoa", , "Thong bao:"
  
End Sub
Còn tại sao phải duyệt từ dưới lên, thì đã không ít lần mình đề cập: Tránh sót những record đáng xóa mà bỏ qua (Chuyện này chỉ khi xóa records mà thôi). Tuy nhiên sẽ thành thói quen tốt, một khi phải xóa record thì cũng cứ áp dụng như xóa records.

Thân ái & sức khỏe.
 
Upvote 0
Bác SA ơi! em muốn xóa cả bên DM fong lẫn bên DMthietbi nữa cơ.Bác giúp em với.
(Em làm được rồi bác ạ ^ ^)
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom