Chào các anh/chị.
Em có một dãy số nguyên, cần xoá một số và giảm các số lớn hơn nó xuống 1 đơn vị. Có cách nào không dùng vòng lặp không? Ví dụ cụ thể trong file đính kèm.
Sub Delete()
Dim Num As Double, Cll As Range
Num = InputBox("Cho biet so can xoa", "NNCB")
MsgBox "Xoa so " & Num & " va giam tat ca cac so lon hon " & Num & " xuong 1 don vi"
For Each Cll In Range("A1", [A65536].End(xlUp))
If Cll = Num Then
Cll.ClearContents
ElseIf Cll > Num Then Cll = Cll - 1
End If
Next Cll
End Sub
Option Explicit
Sub delete()
On Error Resume Next
Dim Num As Long, mNum As Long, jJ As Long
Num = InputBox("Cho biet so can xoa", "NNCB")
Dim MyAdd As String, Rng As Range, sRng As Range
Set Rng = Range("A1:A" & [A65500].End(xlUp).Row)
mNum = Application.WorksheetFunction.Max(Rng)
If mNum < Num Then
MsgBox "Khong Co So Do!", , "From GPE.COM: Exit Now"
Exit Sub
Else
For jJ = Num To mNum
Set sRng = Rng.Find(jJ, , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
With sRng
.Value = Switch(jJ = Num, "", jJ > Num, .Value - 1)
.Interior.ColorIndex = Switch(jJ = Num, 3, jJ > Num, 34 + (jJ Mod 6))
End With
Set sRng = Rng.FindNext(sRng)
Loop While Not sRng Is Nothing And MyAdd <> sRng.Address
End If
Next jJ
End If
End Sub
Tôi làm như vầy:Chào các anh/chị.
Em có một dãy số nguyên, cần xoá một số và giảm các số lớn hơn nó xuống 1 đơn vị. Có cách nào không dùng vòng lặp không? Ví dụ cụ thể trong file đính kèm.
Sub DeleteNum()
Dim Num As Long, i As Long, Rng As Range
On Error GoTo Thoat
Set Rng = Application.InputBox("Chon vung", Type:=8)
Num = InputBox("Cho biet so can xoa", "NNCB")
If Num > WorksheetFunction.Max(Rng) Then
MsgBox "So khong hop le": Exit Sub
End If
With Rng
.AutoFilter 1, Num
.Offset(1).SpecialCells(12).ClearContents
.AutoFilter 1, ">" & Num
With Intersect(.Offset(1), .Cells).SpecialCells(12)
For i = 1 To .Areas.Count
.Areas(i).Value = Evaluate(.Areas(i).Address & "-1")
Next i
End With
.AutoFilter
End With
Thoat:
ActiveSheet.AutoFilterMode = False
End Sub
Có thể dùng AutoFilter hoặc công thứcChào các anh/chị.
Em có một dãy số nguyên, cần xoá một số và giảm các số lớn hơn nó xuống 1 đơn vị. Có cách nào không dùng vòng lặp không? Ví dụ cụ thể trong file đính kèm.
Sub Delete()
Dim Num As Integer
Num = InputBox("Cho biet so can xoa", "NNCB")
MsgBox "Xoa so " & Num & " va giam tat ca cac so lon hon " & Num & " xuong 1 don vi"
With Range([A1], [A65536].End(xlUp))
.Offset(, 1).FormulaR1C1 = "=IF(RC[-1]=" & Num & ","""",IF(RC[-1]>" & Num & ",RC[-1]-1,RC[-1]))"
.Value = .Offset(, 1).Value
.Offset(, 1).ClearContents
End With
End Sub
Dữ liệu của em không phải sort, các số cùng giá trị không nằm rải rác. Cụ thể trong file đính kèm- Bài này nếu muốn không dùng đến vòng lập, bắt buộc phải sort dử liệu trước ---> Nếu bạn đồng ý tôi sẽ làm theo hướng này (không vòng lập)
Ý tôi muốn nói rằng: Nếu tôi sort lại dử liệu của bạn thì có vấn đề gì không? Nếu OK thì tôi làm thế này:Cảm ơn các bác đã quan tâm
Dữ liệu của em không phải sort, các số cùng giá trị không nằm rải rác. Cụ thể trong file đính kèm
Sub DeleteNum()
Dim Num As Long
On Error GoTo Thoat
With Application.InputBox("Chon vung", Type:=8)
Num = InputBox("Cho biet so can xoa", "NNCB")
If Num > WorksheetFunction.Max(.Cells) Then
MsgBox "So khong hop le": Exit Sub
End If
.Sort .Cells(1, 1), 1, Header:=xlYes
.AutoFilter 1, Num
.Offset(1).SpecialCells(12).ClearContents
.AutoFilter 1, ">" & Num
With Intersect(.Offset(1), .Cells).SpecialCells(12)
.Value = Evaluate(.Address & "-1")
End With
End With
Thoat:
ActiveSheet.AutoFilterMode = False
End Sub