Code xóa dữ liệu không chạy.

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

LuuAnh980

Thành viên tiêu biểu
Tham gia
28/9/22
Bài viết
452
Được thích
104
Giới tính
Nữ
Em dùng đoạn code này để xóa dữ liệu cột D3 đến E, và cột J, và cột L của sheet Beginning.20231202_145401.jpg
Mà chạy code không thấy chạy ạ.
Mong các anh chỉ giúp em sai chổ nào ạ. Thông cảm em dùng điện thoại, nên chỉ chụp hình.
 
{F5} cho con macro này xem kết quả ra sao rồi tính tiếp
PHP:
Sub Sub_HupChao()
 Dim Sh As Worksheet
 Dim Rws As Long
 
 For Each Sh In ThisWorkbook.Worksheets
    Rws = 9 + Sh.UsedRange.Rows.Count
    MsgBox Range("D3:E" & Rws).Address, ,Sh.Name
    MsgBox [J3].Resize(Rws).Address
    MsgBox [L3].Resize(Rws).Address
 Next Sh
End Sub
 
Upvote 0
Mong bác @SA_DQ chỉ giúp, em chỉ định là sheet"Beginning" , code của Bác không chỉ định sheet, ưm có thử không chạy được.
 
Upvote 0
nó cách quãng anh @huhumalu ơi.
Bài đã được tự động gộp:

File đây ạ.
Mong các anh giúp.
 

File đính kèm

  • HoiGPE.xlsx
    91.4 KB · Đọc: 15
Lần chỉnh sửa cuối:
Upvote 0
Chả biết học đâu có cặp dấu { }. Xóa đi thử xem
{ } là mảng. [ ] là evaluate. Code của thớt sẽ tạo ra mảng 1 dòng 1 cột.

Ủa nếu biết chính xác thì
PHP:
With Sheets("Beginning")
    Xóa gì thì xóa ?
End with
Code ai đó viết cho thớt, dự bị là nhiều sheets (xem giải thích về mảng ở trên).
Tay này viết hơi non. Gặp tôi thì là:
For Each sh In WorkSheets(Array( "SheetX", "SheetY", ...))
' code xóa ở đây
Next sh
Tuy nhiên bài này hơi bị lộn xộn cho nên thớt phải select sheet để mặc định sheet cho range
Nếu tôi code thì tôi dùng sh.range - gõ có 3 ký tự mà cũng lười biếng.
 
Upvote 0
{ } là mảng. [ ] là evaluate. Code của thớt sẽ tạo ra mảng 1 dòng 1 cột.
Tôi biết. Ý tôi là ai chỉ/ dạy/ làm mẫu cách này (GPE 10 năm nay không thấy).
Coi hình thì chỉ đoán lung tung vậy, xem tới file thì không xóa gì là phải, vì lr = 3

Tính dòng cuối mà lại dựa vào 1 cột không chuẩn, cột đó lại còn giấu kỹ.
 
Upvote 0
nó cách quãng
File đây ạ.
Thử tham khảo xem sao.
Mã:
Sub XoaDuLieu()
Dim sh As Worksheet, lr As Long, i As Long, arr
Set sh = ThisWorkbook.Sheets("Beginning")
arr = Array(4, 5, 10, 12)
lr = sh.Cells(Rows.Count, 4).End(xlUp).Row
    With sh
        For i = 0 To UBound(arr)
            .Range(.Cells(3, arr(i)), .Cells(lr, arr(i))).ClearContents
        Next i
    End With
End Sub
 
Upvote 0
Tôi biết. Ý tôi là ai chỉ/ dạy/ làm mẫu cách này (GPE 10 năm nay không thấy).
...
GPE chỉ thích dùng [ ] như là viết tắt của Evaluate. Và thường chỉ dùng cho Range.
Dùng với { } để lập mảng thì có lẽ chỉ mình tôi dùng. Có hai lý do:
1. Lười gõ Array
2. Code ngắn, đây là cách giản dị nhất để array bắt đầu bằng 1, thay vì 0 nếu dùng hàm Array.

Chú thích cho bạn nào chưa am tường về [ { ... } ]:
[ ] là cách viết tắt của Evaluate. Điểm khác nhau là Evaluate nhận một chuỗi, [ ] nhận trị trực tiếp
{ } là cách khai báo mảng trong bảng tính. Hàm Evaluate và [ ] làm việc theo bảng tính. Vì vậy muốn tạo một mảng thì ta cứ khai báo nó theo { }, và dùng [ ] để tạo thành mảng.
Array là hàm của VBA. LBound mặc định là 0, trừ phi được bảo khác đi.
{ } là hàm bảng tính (worksheet). Mảng của worksheet có LBound mặc định là 1.
 
Upvote 0
Em có bắt chước theo Bác @VetMini chỉnh code:
Mã:
Option Explicit

Sub XoaIssue()
Dim Sh As Variant, lr As Long
Application.ScreenUpdating = False
    For Each Sh In Worksheets(Array("Beginning"))
'        Sheets(Sh).Select
        lr = Sheets("Beginning").Cells(Rows.Count, 4).End(xlUp).Row
        Sh.Range("D3:E" & lr + 1).Clear 'Contents
        Sh.Range("J3" & lr + 1).Clear
        Sh.Range("L3" & lr + 1).Clear
    Next Sh
Application.ScreenUpdating = True
End Sub
Sao code chỉ xóa cột D : E thôi, còn cột J và L không xóa ạ.
 
Upvote 0
Mã:
Option Explicit

Sub XoaIssue()
Dim Sh As Variant, lr As Long
Application.ScreenUpdating = False
    For Each Sh In Worksheets(Array("Beginning"))
'        Sheets(Sh).Select
        lr = Sheets("Beginning").Cells(Rows.Count, 4).End(xlUp).Row
        Sh.Range("D3:D" & lr + 1).Clear 'Contents
        Sh.Range("E3:E" & lr + 1).Clear 'Contents
        Sh.Range("J3:J" & lr + 1).Clear
        Sh.Range("L3:L" & lr + 1).Clear
    Next Sh
Application.ScreenUpdating = True
End Sub
Vậy phải chỉnh lại từng cột hả bạn @hhoang_56 .
 
Upvote 0
Vậy phải chỉnh lại từng cột hả bạn @hhoang_56 .
Câu gợi ý bài 12 không hợp lý. Gợi ý phải là "so sánh câu lệnh xóa cột J và cột L ở bài 11 so với bài 1 khác nhau cái gì".
Lý thuyết căn bản là Range trong VBA phải chứa địa chỉ 1 vùng dữ liệu. Vùng dữ liệu có thể là 1 ô, có thể là 1 dòng. 1 cột, hoặc 1 bảng nhiều dòng nhiều cột.
Thí dụ "A1:A100", "A1:C200", "C10", "B2:E2"
Nếu chỉ số dòng là 1 biến (thí dụ lr) thì phải nối vào chỉ số cột thành địa chỉ đầy đủ.

Thế thì "J3" & lr = "J3" & 200 = "J3200". Kết quả ra sao thì đã rõ.
 
Upvote 0
Thấy bạn cũng biết chỉnh lại đoạn code thì nhờ các anh trên đây bàn thêm bàn để bạn hiểu trước, sau thì áp dụng chỉnh sửa sẽ hiểu thêm.
Trong file bạn đang mở (file hiện hành, file có chứa code đang thực thi, ...) định nghĩa là ThisWorkbook
Ta dùng
PHP:
    Dim WB As Workbook 'Định nghĩa biến WB
    Dim WS As Worksheet 'Định nghĩa biến WS
Việc khai báo biến đầy đủ thì khi bạn gõ "." ngay sau biến đã khai báo cho phép bạn nhìn thấy list thuộc tính của biến đó.

Chỉ định WB là file bạn đang mở
PHP:
    Set WB = ThisWorkbook

Trong file đang mở có rất nhiều thuộc tính để khai thác, tạm thời mình quan tâm đến các sheet của nó ".Worksheets"
PHP:
    For Each WS In WB.Worksheets
        'Quét qua tất cả các sheet đang có.
    Next

Trong thuộc tính của từng sheets
+ Có ".Name" trả về tên của sheet.
+ Có ".Range" cho phép bạn lựa chọn "Range" hay Vùng dữ liệu. Sau khi chọn vùng dữ liệu thì bạn có thể điều chỉnh các thông tin của vùng đó.
PHP:
        Debug.Print WS.Name
        WS.Range("A1:C10").Value = "Hello"
        WS.Range("B1:B5").ClearContents

Giống như việc tìm sách trong thư viện. Tìm các cuốn sách có tên "ABC" , "CDF" thì vào trang 10, dòng số 8, chữ thứ 5 từ trái qua và xóa nó đi chẳng hạn.
Tương tự vậy, bạn định hình một mảng có tên các sheets cần tìm kiếm sau đó, bạn quét qua các sheet, lấy tên sheets so sánh với tên được chọn. Vào mảng chỉ định của sheets đó, sửa xóa thêm bớt gì đó.
 
Lần chỉnh sửa cuối:
Upvote 0
Em cám ơn Thầy Mỹ và anh @huhumalu đã hướng dẫn, em chả biết căn bản VBA gì hết, chỉ lên DD nhờ giúp, rồi học mót thôi à.
Thấy code nào giống thì cứ copy vào file thôi.
Chân thành cám ơn các anh chị trên DD nhiều. các anh @HieuCD , @Hoàng Tuấn 868 , @SA_DQ đã giúp đỡ em rất nhiều!!!!
Bài đã được tự động gộp:

Thầy Mỹ cho em hỏi tý, như code này
Mã:
                    sd.Range("A" & lrd + 1).Resize(r, 16) = md
                    sd.Range("A" & lrd + 1).Resize(r, 16).Borders.LineStyle = True
sao chỉ lấy cột A và last row thôi, không cần chỉ định rỏ đia chỉ ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
sd.Range("A" & lrd + 1).Resize(r, 16) = md

sao chỉ lấy cột A và last row thôi, không cần chỉ định rỏ đia chỉ ạ.
A & Last row = "A" & lrd + 1 = "A" & 100 + 1 = "A101", đó là địa chỉ (1 ô) chứ còn gì nữa?
Ngoài ra lại còn resize r dòng 16 cột tức là 1 vùng to lớn bự rồi.
 
Upvote 0
PHP:
                    sd.Range("A" & lrd + 1).Resize(r, 16) = md
Máy tính chọn ra ô có thứ tự dòng "lrd+1" của cột A. Ví dụ dòng "A11" sau đó nhờ việc ".Resize(r, 16)" tăng kích thước, nghĩa là từ ô A11 làm mảng này to ra "r" dòng, và "16" cột;
bạn dùng
PHP:
sd.Range("A" & lrd + 1).Resize(r, 16).select
để hiểu
 
Upvote 0
tới anh @Hoàng Tuấn 868 , sao code của anh em chạy lần đầu thấy đúng rồi (đã xóa đúng các cột)
Nhưng em lỡ tay chạy lần 2, thì code lại xóa luôn dòng tiêu đề của em luôn. (D3: E3), J3, L3.
Em có thử chạy tiếp thì lại xóa tiếp D2:E2,J2,L2. Chạy tiếp thì xóa tới D1:E1, J1, L1. Hết mới thôi.
Có cách nào hạn chế việc này không ạ.
Như là D4:E4 có dữ liệu thì mới xóa.
Em có làm như sau:
Mã:
Sub XoaDuLieu()
Dim sh As Worksheet, lr As Long, i As Long, arr
Set sh = ThisWorkbook.Sheets("Beginning")
arr = Array(4, 5, 10, 12)
lr = sh.Cells(Rows.Count, 4).End(xlUp).Row
If Range("D4").Value <> "" Then 'them vào
    With sh
        For i = 0 To UBound(arr)
            .Range(.Cells(3, arr(i)), .Cells(lr, arr(i))).ClearContents
        Next i
    End With
    End If ' them vào
End Sub
Thấy chạy đúng ý của em rồi, mà không biết về sau có sự cố gì không ạ.
 
Upvote 0
..... lỡ tay chạy lần 2, thì code lại xóa luôn dòng tiêu đề của em luôn. (D3: E3), J3, L3.
Em có thử chạy tiếp thì lại xóa tiếp D2:E2,J2,L2. Chạy tiếp thì xóa tới D1:E1, J1, L1. Hết mới thôi.
Có cách nào hạn chế việc này không ạ.
Như là D4:E4 có dữ liệu thì mới xóa.
Góp vui: Để đạt được ý bạn như trên có thể tham khảo code sau:
Mã:
Sub XoaDuLieu()
Dim sh As Worksheet, lr As Long, i As Long, arr
Dim Rng as Range
Set sh = ThisWorkbook.Sheets("Beginning")

arr = Array(4, 5, 10, 12)
   
With sh
        For i = 0 To UBound(arr)
            lr = sh.Cells(Rows.Count, i).End(xlUp).Row  ' tìm dong cuôi cua côt đinh xóa
            If lr=4 then  ' Kiêm tra xem cột định xóa có dư liêu không? nếu có thì gom lại
                  If Rng is nothing then
                           Set Rng =Range(.Cells(3, arr(i)), .Cells(lr, arr(i)))
                 else
                          Set Rng=Union(Rng, Range(.Cells(3, arr(i)), .Cells(lr, arr(i)))
                 end if
           end if
        Next i
    End With
Rng .ClearContents
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom