Code xóa dữ liệu không chạy. (1 người xem)

Liên hệ QC

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

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
463
Được thích
106
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

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
Upvote 0
Em không ngồi máy anh ơi, chiều em thử ạ.
 
Upvote 0
Chịu khó đọc cho kỹ, tôi sẽ chỉ ra từng chỗ sai cho bạn:

Mã:
...
    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
...
Bên trong cái vòng lặp For...Each thì Sh chính là Sheets(Beginning). Chỗ Sheets("Beginning") bạn chỉ cần dùng Sh

Mã:
...
        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
Vậy phải chỉnh lại từng cột hả bạn @hhoang_56 .
lr = Sheets("Beginning").Cells(Rows.Count, 4).End(xlUp).Row
Cột 4 tức là cột D. Code trên lầ dòng cuối của cột D. Ví dụ dòng ấy là 1234.
Sh.Range("D3: D" & lr + 1) = Sh.Range("D3: D1235")
Sh.Range("E3:E" & lr + 1) = Sh.Range("D3: D1235")
Hai range trên nằm sát nhau và có cùng số dòng cho nên bạn có thể gom lại thành 1
Sh.Range("D3:E" & lr + 1) = Sh.Range("D3:E1235")
Tuy nhiên, trường hợp bài này thì nên để chúng riêng 2 cột dễ debug hơn.

Em có bắt chước theo Bác @VetMini chỉnh code:
Mã:
        Sh.Range("D3:E" & lr + 1).Clear 'Contents
        Sh.Range("J3" & lr + 1).Clear
        Sh.Range("L3" & lr + 1).Clear
    Next Sh
Sao code chỉ xóa cột D : E thôi, còn cột J và L không xóa ạ.
Trong code này, bạn hấp tấp nên gõ sót:
Nếu lr là 1234
Sh.Range("J3" & lr + 1) = Sh.Range("J31235") : một ô
Nếu gõ đúng
Sh.Range("J3:J" & lr + 1) = Sh.Range("J3:J1235") : một vùng gồm 1233 ô

tới anh @Hoàng Tuấn 868 ,...
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 ạ.
Code này viết theo trường phái thịnh hành ở GPE, code không sai nhưng trường phái của tôi quan niệm khác:
1. ở đây chỉ có 4 cột, lập cái array chuyển tên cột thành số làm cho code khó đọc. Lúc dựng array lại không chú thích nó dùng làm gì - nếu có chú thích, người đọc có thể tự tính ra 4 là cột D, 10 là cột J,...

2. With chỉ định đối tượng tiền tố cho dấu chấm "." trong block
Người ta chỉ dùng With khi cái tên nó dài, gõ cực và dễ bị nhầm ký tự. Ở đây cái tên Sh chỉ có 2 ký tự, không nên dùng With.
Cái bất lợi của With là nếu thiếu dấu "." thì VBA sẽ hiểu là dùng đối tượng mặc định. Với Sheet thì VBA sẽ mặc định là ActiveSheet.
Vì vậy, nên tránh dùng With với WorkSheet. Trừ phi chỉ muốn nhắc đến sheet 1 lần
With WorkSheets("abcdef")
...
End With
Dùng như thế này tránh được phải khai báo biến và set cho sheet.

Cám ơn anh @HUONGHCKT nhiều, "union" dùng để làm gì đó anh?
Union theo Toán Đại Số là phép hội, gộp nhiều nhóm lại với nhau.
Lý thuyết:
Có 2 nhóm A và B. A hội B là một nhóm gồm tất cả các phần tử của A và tất cả các phần tử của B; nếu A và B chia sẻ nhau một số phần tử thì nhóm hội này chỉ chứa các phần tử chung ấy 1 lần (không phải 2 lần)

Union trong VBA và Excel là phép hội nhiều ranges lại thành một nhóm range.
Bình thường người ta dùng Union khi cần sử lý một nhóm ranges bằng một lệnh chung.
Ví dụ tôi muốn gán 1 vào ô A1, B2:C3, và E5:E10
union(range("a1"), range("b2:c3"), range("e5:e10")) = 1 ' lười gõ 3 dòng
 
Lần chỉnh sửa cuối:
Upvote 0
Sao code anh @HUONGHCKT em chạy lỗi này
loi124.png
nhấn Debug hiện màu vàng chổ này ạ:
loi125.png
mong các anh xem giúp.
 
Upvote 0
Code câu lệnh đó sai. Khi có vòng lặp i:
for i = 0 to UBound(arr)

Khi i = 0, Cells(Rows.Count, i) = Cells(Rows.Count, 0) sinh ra lỗi không có cột số 0
Bạn này viết code mà không test trước khi gởi bài.

Câu lệnh đúng là

lr = sh.Cells(Rows.Count, arr(i)).End(xlUp).Row
 
Upvote 0
Em chỉnh lại như Thầy Mỹ, thì lỗi "91" ạ:
loi126.png
nhấn Debug thì màu vàng :
loi127.png
Mong Thầy Mỹ xem giúp.
 
Upvote 0
Em chỉnh lại như Thầy Mỹ, thì lỗi "91" ạ:
Kiểm tra xem lúc đang lỗi thì lr bằng bao nhiêu, hoặc tốt nhất là mỗi lần tính lại lr thì lr có giá trị bao nhiêu. Đối chiếu với điều kiện If lr = 4
Do lr luôn lớn hơn 4 nên Rng = nothing và không thể sử dụng method Clear

Đến là mệt với code viết không test
 
Upvote 0
Em kiểm tra thì thấy lr = 86 Thầy Mỹ, vậy chỉnh code sao Thầy. À em chỉnh lại là lr>= 4 thì được rồi ạ.
loi128.png
 
Upvote 0
Em sửa thành If lr>=4 thì code chạy rồi Thầy.
 
Upvote 0
Em sửa thành If lr>=4 thì code chạy rồi Thầy.
Lý thuyết bổ sung:
Khai báo biến, gán giá trị cho biến, còn phải kiểm soát biến:
- Kiểm soát kiểu biến. Biến kiểu Long mà gắn Text là tiêu. Biến kiểu String, hoặc biến kiểu Sheet, biến kiểu Range, phải gắn giá trị phù hợp.
- Kiểm soát giá trị biến. Tại từng thời điểm biến có giá trị bao nhiêu. Giá trị đó được sử dụng ở đâu, có tương thích hay không.

Như code của @Hoàng Tuấn 868 mà bạn than phiền là chạy lần 2, lần 3 nó xóa dần lên tiêu đề và lên cả dòng 1. Nếu kiểm soát giá trị biến thì biết rằng sau lần xóa thứ nhất, lr = 2, sau lần xóa thứ 2, lr = 1. Lẽ ra phải có điều kiện như vừa rồi.
 
Upvote 0
À như code của anh @HUONGHCKT khi em chỉnh lr>=4, thì code chạy, nhưng khi xóa xong mà lỡ chạy tiếp lần 2 thì báo lỗi, vậy mình có thể bẫy lỗi được không Thầy Mỹ, như em tính thêm:
If lr <4 then Exit Sub
nhưng không biết để chổ nào cho phù hợp.
 
Upvote 0
À như code của anh @HUONGHCKT khi em chỉnh lr>=4, thì code chạy, nhưng khi xóa xong mà lỡ chạy tiếp lần 2 thì báo lỗi, vậy mình có thể bẫy lỗi được không Thầy Mỹ, như em tính thêm:
If lr <4 then Exit Sub
nhưng không biết để chổ nào cho phù hợp.
Trường hợp này Rng là Union 4 range con, nên chỉ khi cả 4 lần lr < 4 thì mới sinh ra lỗi.
Do đó bắt lỗi ngay tại chỗ lỗi:
Mã:
If Not Rng Is Nothing Then Rng.ClearContents

Không cần Else ... Exit Sub
 
Upvote 0
Kiểm tra xem lúc đang lỗi thì lr bằng bao nhiêu, hoặc tốt nhất là mỗi lần tính lại lr thì lr có giá trị bao nhiêu. Đối chiếu với điều kiện If lr = 4
Do lr luôn lớn hơn 4 nên Rng = nothing và không thể sử dụng method Clear

Đến là mệt với code viết không test
Cảm ơn Anh đã nhắc nhở. Đúng là tôi có sửa lại code của bạn ấy và do không có file nên cũng không test lại
Do không test lại nên nhâm chỗ Lr= 4 mà đúng ra phải là Lr>= 4 thì mới đúng.
 
Upvote 0
Chủ bài đăng mới học cấp 1 về VBA, mà hai bác viết cho những Code có chứa những dòng lệnh của cấp 2 hay cấp III thì tẩu hỏa nhập ma là cái chắc!
Để chọn 4 cột không theo 1 trật tự thì ta xài hàm CHOOSE() (Lý do là trong excel chủ bài đăng cũng đã tiếp cận với nó)

PHP:
Dim J as Integer, Col as Integer, Rws as long
For J = 1 to 4
  Col = Choose( J , 4 , 5, 10, 12, 19)
  Rws = Cells(9999,Col).End(xlup).row +9 'Dòng cuối có dữ liệu của cột đang xét'
 'Thêm dòng lệnh kiểm tra Rws >=4  '
   Dòng lệnh xóa dữ liệu của cột đang xét 
Next J
 
Upvote 0
Mong Thầy Mỹ chỉ cho em chổ thêm luôn ạ.
Bài đã được tự động gộp:

Trong code của Bác @SA_DQ các số 19, 9 là gì, mong Bác @SA_DQ giải thích dùm ạ.
 
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.
Bạn chạy thử code này
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 lr < 3 then lr = 3
    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
Mã:
Sub XoaDuLieu()
    Dim sH As Worksheet, lR As Long, i As Long, aColDele
    Set sH = ThisWorkbook.Sheets("Beginning")
    
    
    lR = sH.Cells(sH.Rows.Count, 4).End(xlUp).Row
    If lR <= 2 Then Exit Sub ' dong so 2 la header: no data
    aColDele = Array("D", "E", "J", "L")
    For i = LBound(aColDele) To UBound(aColDele)
        sH.Range(aColDele(i) & 3).Resize(lR - 3 + 1).ClearContents
    Next i
      
End Sub

Thử code này xem
 
Upvote 0
Mã:
Sub XoaDuLieu()
    Dim sH As Worksheet, lR As Long, i As Long, aColDele
    Set sH = ThisWorkbook.Sheets("Beginning")
   
   
    lR = sH.Cells(sH.Rows.Count, 4).End(xlUp).Row
    If lR <= 2 Then Exit Sub ' dong so 2 la header: no data
    aColDele = Array("D", "E", "J", "L")
    For i = LBound(aColDele) To UBound(aColDele)
        sH.Range(aColDele(i) & 3).Resize(lR - 3 + 1).ClearContents
    Next i
     
End Sub

Thử code này xem
Người ta đã xác nhận có code chạy được rồi. Thêm nữa mà chi.
Chỗ Array còn luộm thuộm lắm. Viết gọn hơn:
Dim colTxt
For Each colTxt In Array("D", "E", "J", "L")
' hoặc ... In [ {"D", "E", "J", "L"} ]
' hoặc ... In Split("D, E, J, L", ", ")
' đằng nào cũng ra colTxt là một ký tự (chuỗi)

sH.Range(colTxt & 3 & ":" & colTxt & lR).ClearContents
Next colTxt
 
Upvote 0
Người ta đã xác nhận có code chạy được rồi. Thêm nữa mà chi.
Chỗ Array còn luộm thuộm lắm. Viết gọn hơn:
Dim colTxt
For Each colTxt In Array("D", "E", "J", "L")
' hoặc ... In [ {"D", "E", "J", "L"} ]
' hoặc ... In Split("D, E, J, L", ", ")
' đằng nào cũng ra colTxt là một ký tự (chuỗi)

sH.Range(colTxt & 3 & ":" & colTxt & lR).ClearContents
Next colTxt
Đúng rồi bác. Dùng cái split cho nó được nhiều
 
Upvote 0
@LuuAnh980 Bạn có thể sử dụng thủ tục tổng quát như sau:

Chỉ cần tạo một nút gán macro: 'RangeClears [D3:E3],[J3],[L3]'
Xóa tại trang khác: 'RangeClears [D3:E3],[J3],refCell("Trang tính 1",[D3:E3],[J3],[L3])'
Giới hạn vùng để không xóa dữ liệu phía dưới: [D3:E2000]

1701760501444.png


Sao chép dán thủ tục dưới vào một Module mã:
JavaScript:
Sub RangeClears(ParamArray cells())
  On Error Resume Next
  Dim i, lr&, a
  For Each a In cells
    Select Case TypeName(a)
    Case "Range":
      For Each i In a.Areas
        lr = i.rows.Count
        lr = IIf(lr > 1, lr + 2, i.parent.rows.Count - i.row)
        lr = i(lr, 1).End(xlUp).row - i.row + 1
        If lr > 0 Then i.Resize(lr).ClearContents
      Next
    End Select
  Next
End Sub

Function refCell(Sheetname$, ParamArray cells()) As Range
  On Error Resume Next
  Dim o As Object, i, r As Range
  Set o = ActiveWorkbook.Worksheets(Sheetname)
  If Err <> 0 Or o Is Nothing Then
    For Each o In ActiveWorkbook.Worksheets
      If o.CodeName = Sheetname Then Exit For
    Next
  End If
  For Each i In cells
    Select Case TypeName(i)
    Case "Range":
      If r Is Nothing Then
        Set r = o.Range(i.Address)
      Else
        Set r = Union(r, o.Range(i.Address))
      End If
    End Select
  Next
  Set refCell = r
End Function
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom