Hỏi cách xóa Sheet và đếm hàng

Liên hệ QC

XuanThanh

Thành viên thường trực
Tham gia
20/3/07
Bài viết
278
Được thích
373
Chào các bạn. Cho mình hỏi một vấn đề này nha:
1/ Làm cách nào có thể nhận biết được một Sheet có tồn tại trong Workbook hiện hành không? Nếu xđ là có thì hãy xóa Sheet này đi
2 Làm càch nào có thể đếm được số hàng có chứa dữ liệu của một bảng tính
(Có thể dùng hàm hoặc VBA). Rất mong các bạn giúp đỡ. Cám ơn
 
1. Xoá sheet
Mã:
'Thu tuc xoa sheet
Public Sub Xoa_sheet()
On Error Resume Next
With Application
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .DisplayAlerts = False
End With
Dim shtName As String
shtName = InputBox("Ban hay nhap ten sheet muon xoa!")
Sheets(shtName).Delete
With Application
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .DisplayAlerts = True
End With
End Sub
2. Đếm số dòng trống
Mã:
'Thu tuc dem dong trong
Sub Demdong_trong()
Dim i As Long, dem As Long, row_max As Long
row_max = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1
With Application
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
End With
For i = 1 To row_max
    If WorksheetFunction.CountA(Rows(i)) = 0 Then
        dem = dem + 1
    End If
Next i
MsgBox "So dong trong la: " & dem
With Application
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
End With
End Sub
 
Upvote 0
Cám ơn anh Sơn

Rất cám ơn anh về đoạn code trên . Nhưng ý tôi muốn hỏi là làm sao có thể xác định được một Sheet (VD sheet có tên là "DMHH") có tồn tại trong Workbook hiện hành không, nếu có thì mới ra lệnh xóa nó còn không tồn tại thì thôi .
Hai là có cách nào xác định được trong Sheet có bao nhiêu dòng chứa dữ liệu tức là tổng số hàng chứa dữ liệu ấy . Rất mong anh giúp đỡ . Cám ơn
 
Upvote 0
Hãy Tham khảo ở đây kỹ chút, nha!

2 Là có cách nào xác định được trong Sheet có bao nhiêu dòng chứa dữ liệu tức là tổng số hàng chứa dữ liệu ấy . Rất mong anh giúp đỡ . Cám ơn
http://giaiphapexcel.com/forum/showthread.php?t=1641 #10
Mã:
[color="Blue"]
Below are three methods that will find the "LastRow", "LastColumn" and the "LastCell" 
Find the last used Row on a Worksheet: [/color]
[b]Sub FindLastRow()[/b]
Dim LastRow As Long
	If WorksheetFunction.CountA(Cells) > 0 Then
		'Search for any entry, by searching backwards by Rows.
		LastRow = Cells.Find(What:="*", After:=[A1], _
			  SearchOrder:=xlByRows, _
			  SearchDirection:=xlPrevious).Row
			  MsgBox LastRow
	End If
[b]End Sub[/b][color="Blue"]
--------------------------------------------------------------------------------
Find the last used Column on a Worksheet: [/color]
[b]Sub FindLastColumn()[/b]
Dim LastColumn As Integer
	If WorksheetFunction.CountA(Cells) > 0 Then
		'Search for any entry, by searching backwards by Columns.
		LastColumn = Cells.Find(What:="*", After:=[A1], _
        		           SearchOrder:=xlByColumns, _
        			   SearchDirection:=xlPrevious).Column
				   MsgBox LastColumn
	End If 
[b]End Sub[/b][color="Blue"]
--------------------------------------------------------------------------------
Find the last used Cell on a Worksheet: [/color]
[b]Sub FindLastCell()[/b]
Dim LastColumn As Integer
Dim LastRow As Long
Dim LastCell As Range
	If WorksheetFunction.CountA(Cells) > 0 Then
		'Search for any entry, by searching backwards by Rows.
		LastRow = Cells.Find(What:="*", After:=[A1], _
        			SearchOrder:=xlByRows, _
        			SearchDirection:=xlPrevious).Row
		'Search for any entry, by searching backwards by Columns.
				LastColumn = Cells.Find(What:="*", After:=[A1], _
        			SearchOrder:=xlByColumns, _
        			SearchDirection:=xlPrevious).Column
				MsgBox Cells(LastRow, LastColumn).Address
	End If 
[b]End Sub[/b]
 
Lần chỉnh sửa cuối:
Upvote 0
1. Xác định được một Sheet (VD sheet có tên là "DMHH") có tồn tại trong Workbook hiện hành không, nếu có thì mới ra lệnh xóa nó còn không tồn tại thì thôi .
[/QUOTE]
Với Macro Xoa_sheet, mình viết
Mã:
On Error Resume Next
....
Sheets(shtName).Delete
tức là nếu sheet có tên là shtName tồn tại thì sẽ xoá bị xoá ngay lập tức, còn nếu không tồn tại thì sẽ phát sinh ra lỗi (Run-time error 9: Subscript out of range) và thực hiện lệnh tiếp theo. Hoàn toàn đúng ý bạn đấy chứ!!!
Nếu bạn muốn có câu thông báo thì thêm câu lệnh sau vào dưới câu lệnh xoá sheet.
Mã:
If Err.Number <> 0 Then MsgBox "Co loi, sheet " & shtName & " khong ton tai"
2. Xác định trong Sheet có bao nhiêu dòng chứa dữ liệu
Oh, mình quên lại đi xác đinh dòng trống
Bạn chỉ cần thêm thay đổi câu lệnh
Mã:
MsgBox "So dong trong la: " & dem
bằng câu lệnh:
Mã:
MsgBox "So dong chua du lieu la: " & [B]row_max - dem[/B]
Dĩ nhiên lúc này bạn thay đổi lại tên Macro cho phù hợp hơn
Mã:
Option Explicit
'Thu tuc xoa sheet
Public Sub Xoa_sheet()
On Error Resume Next
With Application
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .DisplayAlerts = False
End With
Dim shtName As String
shtName = InputBox("Ban hay nhap ten sheet muon xoa!")
Sheets(shtName).Delete
If Err.Number <> 0 Then MsgBox "Co loi, sheet " & shtName & " khong ton tai"
With Application
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .DisplayAlerts = True
End With
End Sub
'Thu tuc dem dong chua du lieu
Sub Demdong()
Dim i As Long, dem As Long, row_max As Long
row_max = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1
With Application
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
End With
For i = 1 To row_max
    If WorksheetFunction.CountA(Rows(i)) = 0 Then
        dem = dem + 1
    End If
Next i
MsgBox "So dong chua du lieu la: " & row_max - dem
With Application
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
End With
End Sub
 
Upvote 0
Việc xác định dòng cuối như của bạn SA_DQ rất hay và nhanh,

Việc xác định ô cuối cùng không cần thêm 1 hàm nữa đâu SA_DQ à, bạn dùng ngày hai hàm bạn vừa tạo bên trên để lấy được dòng cuối và cột cuối =>OK ngay thôi, thực ra trong hàm thứ 3 cũng là kết hợp của 2 hàm trên.

To nvson: chúng ta hãy dùng cách của SA_DQ để có dòng max nhanh nhất, sau đó dùng hàm tạo sẵn của excell: CountBlank trong vùng (a1-max) để xác định dòng trống => rất nhanh @$@!^%,
Trước kia mình cũng dùng việc duyệt qua các dòng như nvson nhưng lâu lắm.
 
Lần chỉnh sửa cuối:
Upvote 0
aThuan đã viết:
To nvson: chúng ta hãy dùng cách của SA_DQ để có dòng max nhanh nhất, sau đó dùng hàm tạo sẵn của excell: CountBlank trong vùng (a1-max) để xác định dòng trống => rất nhanh @$@!^%,
Trước kia mình cũng dùng việc duyệt qua các dòng như nvson nhưng lâu lắm.
Với việc xác định dòng cuối cùng trong sheet thì mình chỉ dùng 1 câu lệnh này thôi:
Mã:
row_max = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1
Bạn đếm CountBlank trong vùng A1-Max thì chỉ xác định được số ô trống trong cột A thôi, vậy các cột khác thì sao, các ô ở các cột khác vẫn có thể trống chứ (mặc dù cột A vẫn có số liệu)....
 
Upvote 0
nvson đã viết:
Bạn đếm CountBlank trong vùng A1-Max thì chỉ xác định được số ô trống trong cột A thôi, vậy các cột khác thì sao, các ô ở các cột khác vẫn có thể trống chứ (mặc dù cột A vẫn có số liệu)....
Do mình không diễn đạt hết ý:
Việc xác định ô cuối cùng là OK rồi=> ta duyệt các dòng trồng thì a? phải trống => nếu a? trống thì mới xét countblank(B?:?max) có trống hay không=> số lượng duyệt các dòng sẽ giảm đi rất nhiều, công việc phải làm là làm sao để xác định a? trống 1 cách nhanh nhất mà không phải dùng cách quét qua hết dữ liệu
 
Upvote 0
Theo tôi muốn đếm hàng trống hay có DL thì lập thêm 1 cột phụ cho lẹ nếu trống là 1 không là 0, sum cột phụ là OK. Dùng VBA cho mệt.
Tôi thấy 1 hàm trên mạng cũng hay về tìm dòng trống hay DL
Option Explicit

Function CountEmptyRows(RngIn As range) As Long
Dim LngRowCount As Long
Dim LngColCount As Long
Dim R As Long
Dim C As Long
Dim EmptyFlag As Boolean
LngRowCount = RngIn.Rows.Count
LngColCount = RngIn.Columns.Count

For R = 1 To LngRowCount
For C = 1 To LngColCount
If IsEmpty(RngIn.Cells(R, C)) Then
EmptyFlag = True
Else
EmptyFlag = False
Exit For
End If
Next C
If EmptyFlag Then CountEmptyRows = CountEmptyRows + 1
Next R
End Function
Các bạn tham khảo, còn nhanh hay chậm thì không biết vì nếu tôi thì tôi không làm
 
Upvote 0
Web KT
Back
Top Bottom