- Tham gia
- 5/6/23
- Bài viết
- 106
- Được thích
- 19
Code không khó lắm, quan trọng là đề bài phải dễ.
Option Explicit
Sub zzz()
Dim i&
Dim OHienTai As Range
For i = 1 To 1000 Step 1
Set OHienTai = Range("A" & i)
If [OHienTai] = 7 Or [OHienTai] = 8 Or [OHienTai] = 9 Or [OHienTai] = 10 Then
[OHienTai].EntireRow.Delete
i = i - 1
End If
Next
End Sub
Có thể thay dòng:Code không khó lắm, quan trọng là đề bài phải dễ.
Mã:Option Explicit Sub zzz() Dim i& Dim OHienTai As Range For i = 1 To 1000 Step 1 Set OHienTai = Range("A" & i) If [OHienTai] = 7 Or [OHienTai] = 8 Or [OHienTai] = 9 Or [OHienTai] = 10 Then [OHienTai].EntireRow.Delete i = i - 1 End If Next End Sub
Tham khảo thêm một cách.Chào các anh chị GPE. Em có 1 vùng A1:A1000 em muốn cứ cách 6 dòng, xóa đi 4 dòng thì phải dùng code VBA như thế nào. Xin cảm Ơn
View attachment 298757
Bạn có lẽ không hiểu bài #4 nói gì.Tham khảo thêm một cách.
1. "Sửa, sửa nữa, sửa mãi". Chắc có lỗi nhưng nó đang chạy rẹt rẹt.Chà chà.
Cốt mà chưa tét kỹ trong phòng thí nghiệm 3 tháng mà đã đăng lên là dở rồi.
Khi xóa nhiều dòng, đi ngược từ dưới lên trên
Option Explicit
Sub zzz()
Dim i&
Dim OHienTai As Range
For i = 1000 To 1 Step -1
Set OHienTai = Range("A" & i)
If (OHienTai.Row - 1) Mod 10 + 1 > 6 Then
OHienTai.EntireRow.Delete
End If
Next
End Sub
phức tạp nhắm.Advanced Filter
Union, 1 phát ăn ngay.
7 8 9 10 có để minh họa dòng đó là dòng xóa chứ không ô đó mặc định là số 7,8,9,10Code không khó lắm, quan trọng là đề bài phải dễ.
Mã:Option Explicit Sub zzz() Dim i& Dim OHienTai As Range For i = 1 To 1000 Step 1 Set OHienTai = Range("A" & i) If [OHienTai] = 7 Or [OHienTai] = 8 Or [OHienTai] = 9 Or [OHienTai] = 10 Then [OHienTai].EntireRow.Delete i = i - 1 End If Next End Sub
7 8 9 10 có để minh họa dòng đó là dòng xóa chứ không ô đó mặc định là số 7,8,9,10Code không khó lắm, quan trọng là đề bài phải dễ.
Mã:Option Explicit Sub zzz() Dim i& Dim OHienTai As Range For i = 1 To 1000 Step 1 Set OHienTai = Range("A" & i) If [OHienTai] = 7 Or [OHienTai] = 8 Or [OHienTai] = 9 Or [OHienTai] = 10 Then [OHienTai].EntireRow.Delete i = i - 1 End If Next End Sub
7 8 9 10 có để minh họa dòng đó là dòng xóa chứ không ô đó mặc định là số 7,8,9,10Code không khó lắm, quan trọng là đề bài phải dễ.
Mã:Option Explicit Sub zzz() Dim i& Dim OHienTai As Range For i = 1 To 1000 Step 1 Set OHienTai = Range("A" & i) If [OHienTai] = 7 Or [OHienTai] = 8 Or [OHienTai] = 9 Or [OHienTai] = 10 Then [OHienTai].EntireRow.Delete i = i - 1 End If Next End Sub
số 7,8,9,10 là minh họa dòng đó là dòng xóa nên không thể đưa vào điều kiện. Ví dụ như vầy thì làm sao xóaCode không khó lắm, quan trọng là đề bài phải dễ.
Mã:Option Explicit Sub zzz() Dim i& Dim OHienTai As Range For i = 1 To 1000 Step 1 Set OHienTai = Range("A" & i) If [OHienTai] = 7 Or [OHienTai] = 8 Or [OHienTai] = 9 Or [OHienTai] = 10 Then [OHienTai].EntireRow.Delete i = i - 1 End If Next End Sub
7 8 9 10 có để minh họa dòng đó là dòng xóa chứ không ô đó mặc định là số 7,8,9,10Code không khó lắm, quan trọng là đề bài phải dễ.
Mã:Option Explicit Sub zzz() Dim i& Dim OHienTai As Range For i = 1 To 1000 Step 1 Set OHienTai = Range("A" & i) If [OHienTai] = 7 Or [OHienTai] = 8 Or [OHienTai] = 9 Or [OHienTai] = 10 Then [OHienTai].EntireRow.Delete i = i - 1 End If Next End Sub
số 7,8,9,10 là minh họa dòng đó là dòng xóa nên không thể đưa vào điều kiện. Ví dụ như vầy thì làm sao xóaCode không khó lắm, quan trọng là đề bài phải dễ.
Mã:Option Explicit Sub zzz() Dim i& Dim OHienTai As Range For i = 1 To 1000 Step 1 Set OHienTai = Range("A" & i) If [OHienTai] = 7 Or [OHienTai] = 8 Or [OHienTai] = 9 Or [OHienTai] = 10 Then [OHienTai].EntireRow.Delete i = i - 1 End If Next End Sub
Không phải quên, mà là nhét nó vô code phức tạp bác. Mà bác quên chứ, aotufilter mà.Trời. Mê VBA quá cho nên thao tác căn bản của Excel cũng quên luôn.
Cũng có mà.như vầy
Đã có 1 mũi tên bắn 2 con nhạn luôn.suy diễn sâu và rộng
Thời gian chứ đâu phải không gian. Tầm nhìn 10 năm.Tầm nhìn xa 10+ cây số ló phải khác á.
'ClearContentsByXMLPaste [A1:C60], 6, 4' |
Option Explicit
#If VBA7 = 0 Then
Public Enum LongPtr:[_]:End Enum
#End If
Private Const PtrNull As LongPtr = 0
Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_ZEROINIT = &H40
Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT) 'Use for hwnd
Private Const NAME_MAX_LENGTH = 1024
#If VBA7 Then
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As LongPtr) As Long
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As Long
Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As LongPtr) As LongPtr
Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As LongPtr) As LongPtr
Private Declare PtrSafe Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr
Private Declare PtrSafe Function wstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As LongPtr) As Long
Private Declare PtrSafe Function wstrcpy Lib "kernel32" Alias "lstrcpyW" (ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr
Private Declare PtrSafe Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As LongPtr
Private Declare PtrSafe Function EnumClipboardFormats Lib "user32" (ByVal wFormat As LongPtr) As LongPtr
Private Declare PtrSafe Function GetClipboardFormatName Lib "user32" Alias "GetClipboardFormatNameA" (ByVal wFormat As LongPtr, ByVal lpString As String, ByVal nMaxCount As Long) As LongPtr
Private Declare PtrSafe Function GlobalFree Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
#Else
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function GetClipBoardData Lib "user32" Alias "GetClipboardData" (ByVal wFormat As Long) As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function EnumClipboardFormats Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function GetClipboardFormatName Lib "user32" Alias "GetClipboardFormatNameA" (ByVal wFormat As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Private Declare Function wstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
Private Declare Function wstrcpy Lib "kernel32" Alias "lstrcpyW" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
#End If
Private Sub ClearContentsByXMLPaste_test()
Debug.Print Sheet1.[A1:C20].Value(11)
' ClearContentsByXMLPaste [A1:C60], 6, 4
End Sub
Sub ClearContentsByXMLPaste(ByVal table As Range, Optional ByVal stepRows& = 1, Optional ByVal ClearRows&)
On Error Resume Next
Dim a, i&, k&, r&, lr&, lr2&, fr&, fr2&, lc&
Dim vh$, re, ms, s1$, ri&, cr&, kr&, ss$, ss2$
lr = table.Rows.CountLarge
lc = table.Columns.CountLarge
a = table.Value
stepRows = IIf(stepRows < 1, 1, stepRows)
ClearRows = IIf(ClearRows < 1, 1, ClearRows)
cr = stepRows + ClearRows
Set re = CreateObject("VBScript.RegExp")
With re: .Global = 1: .IgnoreCase = 1: .MultiLine = 1
End With
vh = table.Value(11)
re.Pattern = "<!--(.*?)-->|\r?\n\s*\B"
If re.test(vh) Then vh = re.Replace(vh, "")
re.Pattern = "<Row( ss:Index=""(\d+)"")?([^>]*>.*?</Row>)"
Set ms = re.Execute(vh)
If ms.Count = 0 Then Exit Sub
r = 0
ss = Left$(vh, ms(0).firstIndex)
ss2 = Mid$(vh, ms(ms.Count - 1).firstIndex + ms(ms.Count - 1).Length + 1)
lr2 = ms.Count - 1
For i = 0 To lr2
s1 = ms(i).submatches(0)
If s1 <> "" Then ri = CLng(ms(i).submatches(1))
r = IIf(s1 = "", r + 1, ri)
fr2 = (r - 1) \ cr
fr = ((r - 1) Mod cr) + 1
If fr > stepRows Then
If s1 <> "" Then kr = ri
Else
If kr > 0 Then
ss = ss & "<Row ss:Index=""" & kr & """" & ms(i).submatches(2)
Else
If s1 <> "" And r > stepRows Then
ss = ss & "<Row ss:Index=""" & CStr(ri) & """" & ms(i).submatches(2)
Else
ss = ss & ms(i)
End If
End If
End If
Next
DoEvents: Application.Goto table(1, 1), False
ClipboardSetXML encodeTextXML2(ss & "<Row ss:Index=""" & CStr(lr) & """></Row>" & ss2)
DoEvents: CreateObject("WScript.Shell").SendKeys "^v", False
End Sub
Private Function encodeTextXML(ByVal Text$)
Dim L, i, x, t, m
x = 1
L:
L = Len(Text)
For i = x To L
t = Mid(Text, i, 1): m = AscW(t)
If m < 0 Then m = m + 65536
Select Case m
Case Is > 127, 60, 62, 10, 13, 34, 39
Text = Replace(Text, t, "&#" & CStr(m) & ";")
x = i + Len(m) + 2
GoTo L
End Select
Next
encodeTextXML = Text
End Function
Private Function encodeTextXML2(ByVal Text$)
Dim L, i, x, t, m
x = 1
L:
L = Len(Text)
For i = x To L
t = Mid(Text, i, 1): m = AscW(t)
If m < 0 Then m = m + 65536
Select Case m
Case Is > 127
Text = Replace(Text, t, "&#" & CStr(m) & ";")
x = i + Len(m) + 2
GoTo L
End Select
Next
encodeTextXML2 = Text
End Function
Private Sub ClipboardSetXML(ByVal xml As String)
Dim lpMemory As LongPtr
Dim hMemory As LongPtr
Dim wLen As Long
Dim RetVal As Variant
Dim memoryIsLocked As Boolean
Dim memoryIsAllocated As Boolean
Dim clipBoardIsOpen As Boolean
Dim thisClipboardFormatNumber As Long
On Error GoTo ErrorHandler
' Lâìy ðôò dài, bao gôÌm caÒ môòt phâÌn bôÒ sung cho vbNullChar õÒ cuôìi.
wLen = Len(xml) + 1
' ’ Thêm môòt giá triò rôÞng vào cuôìi
xml = xml & vbNullChar
' ’ Câìp phát môòt sôì bôò nhõì
hMemory = GlobalAlloc(GHND, wLen + 1)
If hMemory = PtrNull Then
Err.Raise vbObjectError + 1001, "vbaClipboard", "Unable To allocate memory."
Else
memoryIsAllocated = True
End If
lpMemory = GlobalLock(hMemory)
If lpMemory = PtrNull Then
' Ném môòt lôÞi
Err.Raise vbObjectError + 1001, "vbaClipboard", "Unable To lock memory."
Else
memoryIsLocked = True
End If
' Sao chép chuôÞi cuÒa chúng tôi vào bôò nhõì biò khóa.
RetVal = lstrcpy(lpMemory, xml)
' ÐýÌng gýÒi bôò nhõì biò khóa clipboard.
RetVal = GlobalUnlock(hMemory)
' Nêìu phâÌn trýõìc ðýa ra lôÞi, nó seÞ ðýõòc xýÒ lyì trong TriÌnh xýÒ lyì lôÞi
memoryIsLocked = True
If OpenClipboard(0&) = PtrNull Then
Err.Raise vbObjectError + 1, "vbaClipboard", "Unable To open Clipboard. Perhaps some other application Is using it."
Else
clipBoardIsOpen = True
End If
' Ðiònh daòng ðýõòc yêu câÌu có phaÒi là môòt trong nhýÞng ðiònh daòng ðýõòc tích hõòp sãÞn trong Windows không?
Dim i As Integer
If thisClipboardFormatNumber = 0 Then
' Không. Ðãng kyì ðiònh daòng
On Error Resume Next
thisClipboardFormatNumber = CLng(RegisterClipboardFormat("XML Spreadsheet")) 'Note: Adding this to support 64Bit
If Err.Number <> 0 Then
Err.Raise vbObjectError + 1, "vbaClipboard", "Unable To register clipboard format: " & "XML Spreadsheet" & _
". Error message: " & Err.description
End If
On Error GoTo ErrorHandler
If thisClipboardFormatNumber = 0 Then Err.Raise vbObjectError + 1, "vbaClipboard", "Unable To register clipboard format: " & "XML Spreadsheet"
End If
' Làm trôìng clipboard
If EmptyClipboard() = PtrNull Then Err.Raise vbObjectError + 1, "vbaClipboard", "Unable To Empty the clipboard."
If SetClipboardData(thisClipboardFormatNumber, hMemory) = PtrNull Then Err.Raise vbObjectError + 1, "vbaClipboard", "Unable To Set the clipboard data."
CloseClipboard
GlobalFree hMemory
Exit Sub
ErrorHandler:
Dim description As String
description = Err.description
On Error Resume Next
If memoryIsLocked Then GlobalUnlock hMemory
If memoryIsAllocated Then GlobalFree hMemory
If clipBoardIsOpen Then CloseClipboard
On Error GoTo 0
Err.Raise vbObjectError + 1, "vbaClipboard", description
End Sub
(/iết theo hướng dẫn của bài đăng tác gia HuuThang:Vòng lặp i từ (x + 7) đến 1, bước -10. Xóa 4 dòng từ dòng i.
x là số tròn chục của STT dòng dữ liệu cuối cùng.
Sub Xoa4DongCua1chuc()
Dim Rws As Long, J As Long, Dg As Integer
Dim dRng As Range
Rws = [B7].Parent.UsedRange.Rows.Count
Set dRng = Rows(Rws + 9 & ":" & Rws + 9)
Dg = Chuc(Rws)
For J = Dg To 1 Step -10
Set dRng = Union(dRng, Rows(J & ":" & J - 3))
Next J
MsgBox dRng.Address
End Sub
Function Chuc(ByVal NumR As Integer) As Integer
Chuc = NumR + Choose(1 + (NumR Mod 10), 0, 9, 8, 7, 6, 5, 4, 3, 2, 1)
End Function
Quá tối ưu về dòng, tiết kiệm rất nhiều khoảng trống.Phải nhìn nhận quý vị siêng viết code hoành tráng thật.
Tôi thì lười lắm. Code làm được việc là tốt rồi, không cần nhanh chậm.
Sub t()
For i = 1000 To 1 Step -10
Cells(i - 3, 1).Resize(4).EntireRow.Delete
Next i
End Sub
Có lẽ code ngắn quá nên không cần đưa vào thẻ.Mà bác ít code nên không biết thẻ rồi.![]()
Lệnh Delete Range, bác sử dụng quá tùy tiện. Các lỗi của cách viết mã như trên:Code không khó lắm, quan trọng là đề bài phải dễ.
Mã:Option Explicit Sub zzz() Dim i& Dim OHienTai As Range For i = 1 To 1000 Step 1 Set OHienTai = Range("A" & i) If [OHienTai] = 7 Or [OHienTai] = 8 Or [OHienTai] = 9 Or [OHienTai] = 10 Then [OHienTai].EntireRow.Delete i = i - 1 End If Next End Sub
Có lẽ code ngắn quá nên không cần đưa vào thẻ.Mà bác ít code nên không biết thẻ rồi.![]()
Lệnh Delete Range, bác sử dụng quá tùy tiện. Các lỗi của cách viết mã như trên:
1. Mỗi lần Delete là toàn bộ công thức trong trang tính sẽ tính toán lại, chứ không riêng gì các công thức liên quan đến vùng đã xóa. Vòng lặp sẽ gọi rất nhiều lần Delete.
2. Nếu dưới 1000 dòng có một vùng dữ liệu khác, vùng ô đó sẽ dịch chuyển lên.
3. Giải thuật không có.
..., tiết kiệm rất nhiều khoảng trống.![]()
![]()
Mà bác ít code nên không biết thẻ rồi.![]()
Máy tôi bị lỗi cứ gõ hai dấu cách liên tiếp là nó nổi khùng. Vì vậy tôi viết code không thụt ra thụt vào cho nó khỏe.Có lẽ code ngắn quá nên không cần đưa vào thẻ.
Cách để khắc phục nhược điểm (2) này cũng có & mình nghỉ là vầy:. . . ;.
1. . . . .
2. Nếu dưới 1000 dòng có một vùng dữ liệu khác, vùng ô đó sẽ dịch chuyển lên.
3. . . . .
cho các vùng bên dưới, ví dụ có 5 vùng cách nhau, em chưa nghĩ được cách để tìm dòng giới hạn của từng vùng.Cách để khắc phục nhược điểm (2)
Option Explicit
Sub Xoa4DongCua1chuc()
Dim x&, i&
x = Chuc(Cells(Rows.Count, "A").End(xlUp).Row)
For i = (x + 7) To 1 Step -10
Cells(i, 1).Resize(4).EntireRow.Delete
Next
End Sub
Function Chuc(NumR As Integer)
Chuc = Int(NumR / 10) * 10
End Function
Sub zzz()
Dim i&, DongDau&, DongCuoi&
Dim OHienTai As Range, OVung As Range, VVung As Range
Set OVung = Application.InputBox("Chon vung:", , , , , , , 8)
Set VVung = OVung.CurrentRegion
DongCuoi = VVung.End(xlDown).Row
DongDau = Cells(DongCuoi, "A").End(xlUp).Row
For i = DongCuoi To DongDau Step -1
Set OHienTai = Range("A" & i)
If (OHienTai.Row - (DongDau - 1) - 1) Mod 10 + 1 > 6 Then
OHienTai.EntireRow.Delete
Cells(DongCuoi + 1, "A").EntireRow.Insert
End If
Next
End Sub
Đây là cách thô nhất có thể để tìm ra dòng cuối của vùng 1 (trên nhất) có chứa dữ liệu:cho các vùng bên dưới, ví dụ có 5 vùng cách nhau, em chưa nghĩ được cách để tìm dòng giới hạn của từng vùng.
Sub TimDongCuoiCuaVung1()
Dim fRw As Integer, lRw As Long
If [A1].Value <> Space(0) Then
fRw = 1
Else
fRw = [A1].End(xlDown).Row
End If
lRw = Cells(fRw, "A").End(xlDown).Row
MsgBox lRw
End Sub
Bạn dùng AI chưa, tôi hỏi nó trả lời code chính xác = ))))Chào các anh chị GPE. Em có 1 vùng A1:A1000 em muốn cứ cách 6 dòng, xóa đi 4 dòng thì phải dùng code VBA như thế nào. Xin cảm Ơn
View attachment 298757
Private Sub ClearStepRows_test()
ClearStepRows [A1:C60], 6, 4
End Sub
Sub ClearStepRows(ByVal table As Range, Optional ByVal stepRows& = 1, Optional ByVal ClearRows& = 1)
Dim d$: d = table.Address(0, 0, , 1)
Static t!, a, s$:
If table Is Nothing Then a = Empty: t = 0: s = Empty: Exit Sub
If t > 0 And (Timer - t < 0) Then
If d = s Then table = a: t = 0: Exit Sub
End If
Dim k&, r&, lr&, fr&, lc&, c&, z
a = table.Value
lr = UBound(a): lc = UBound(a, 2)
stepRows = IIf(stepRows < 1, 1, stepRows)
ClearRows = IIf(ClearRows < 1, 1, ClearRows)
ReDim z(1 To lr, 1 To lc)
While r < lr
r = r + 1
For c = 1 To lc
z(r - k, c) = a(r, c)
Next c
fr = ((r - 1) Mod cr) + 1
If fr >= stepRows Then r = r + ClearRows: k = k + ClearRows
Wend
table = z
t = Timer + 7: s = d
Application.OnTime Now + TimeSerial(0, 0, 7), "'" & ThisWorkbook.Name & "'!ClearStepRows_FreeMemory"
End Sub
Sub ClearStepRows_FreeMemory()
ClearStepRows Nothing
End Sub
Private Sub DeleteStepRows_test()
DeleteStepRows [A1:C60], 6, 4
End Sub
Sub DeleteStepRows(ByVal table As Range, Optional ByVal stepRows& = 1, Optional ByVal ClearRows& = 1)
Dim k&, r&, lr&, lc&, cr&, rg As Range
stepRows = IIf(stepRows < 1, 1, stepRows)
ClearRows = IIf(ClearRows < 1, 1, ClearRows)
cr = stepRows + ClearRows
If MsgBox("Xóa vùng ô " & table.Address(0, 0) & ":" & vbLf & _
" Cách " & stepRows & " xóa " & ClearRows & " dong" & vbLf & _
" (Hanh dong nay không the hoan tac)" & vbLf & _
" Tiêp tuc?", _
vbYesNo, Title:="Rows Delete") <> vbYes Then Exit Sub
lr = table.rows.CountLarge:
lc = table.columns.CountLarge:
While r < lr
r = r + stepRows
If Not rg Is Nothing Then
Set rg = Union(rg, table(r + 1, 1).Resize(ClearRows, lc))
Else
Set rg = table(r + 1, 1).Resize(ClearRows, lc)
End If
r = r + ClearRows
Wend
If Not rg Is Nothing Then rg.Delete xlShiftUp
End Sub
Do với cách làm đó thì không thể làm cho phần dữ liệu bên dưới đẩy lên theo được. Nhưng thay vì nói rõ nhược điểm đó tác giả lại cố tình nói việc đẩy dữ liệu lên như bình thường là nhược điểm để bạn ngầm hiểu không đẩy dữ liệu lên là ưu điểm.Code bạn bi hay chỗ Undo được. Còn xóa mà không đẩy lên thì em cũng thấy hơi lạ, cần phải có ứng dụng điển hình mới được.
Mình xin đăng lại (gần đúng) bài hỏi của mình, để ai đó khỏi lăn tăn:@SA_DQ Theo em thì cách giải bài của bác
1. Sử dụng XML API
2. Giải thuật bước nhảy
3. Dùng vòng lặp
Em đang hoàn thành mã, giải thuật khó quá, nên hơi lâu
----------------------------------------------------
. . . . .
Nếu muốn như vậy thì xóa bao nhiêu dòng thì chèn lại bấy nhiêu dòng sau dòng cuối cùng là được mà.Mình xin đăng lại (gần đúng) bài hỏi của mình, để ai đó khỏi lăn tăn:
Giả sử phía dưới vùng DL (dữ liệu) thứ nhất có vài ba dòng trắng & sau đó là vùng DL thứ 2 ở bên dưới;
Vậy làm sao ta có thể xóa các dòng thứ 7 đến dòng 10 trong từng chục dòng của vùng DL thứ nhất, sao cho yên vị (không đôn) vùng DL thứ 2 lên trên.
Cách của bác giống bạn HeSanbi. Code bạn ấy có Ctrl+V.Mình mới nghỉ ra cách này & tự cho là đơn giản đối với mình:
a./ Xác định dòng cuối (lRws) có DL (dữ liệu) của vùng trên cùng (là vùng cần xóa 4 cho mỗi 1 chục dòng);
b./ Khai báo 1 mảng có chỉ số dòng bằng với trị đã xác đinh trên.
c./ Tạo vòng lặp duyệt từ 1 đến lRws;
Dòng nào không thỏa điều kiện xóa thì ghi vô mảng
d./ Chuyển DL trong mảng lên trang tính
PC: Nếu DL vùng I này không bình thường thì sẽ bổ sung chuyện xử lý sau, . . . .
Sub Xoa_Dong()
Dim sArr(), dArr(), k As Long, i As Long, ii As Long
sArr = Range("A1", Range("A" & Rows.Count).End(3)).Resize(, 2).Value
ReDim dArr(1 To UBound(sArr), 1 To UBound(sArr, 2))
For i = 1 To UBound(sArr) - 4 Step 10
For ii = 0 To 5
k = k + 1
dArr(k, 1) = sArr(i + ii, 1)
dArr(k, 2) = sArr(i + ii, 2)
Next
Next
Range("E1").Resize(k, UBound(dArr, 2)) = dArr
End Sub
À, theo cách hiểu không bài bản của em thì cứ gắn mảng xuống bảng tính thì nó cũng giống giống control v.Cách của bác Sa làm gì có copy paste mà có Ctrl V?
Sub zzz2()
Dim OVung As Range, VVung As Range
Dim ArrVung, ArrKQ
Dim i&, j&, k&, l&, m&, DongDau&, DongCuoi&
Set OVung = Application.InputBox("Chon vung:", , , , , , , 8)
' Set OVung = [A6]
Set VVung = OVung.CurrentRegion
DongCuoi = VVung.End(xlDown).Row
DongDau = Cells(DongCuoi, "A").End(xlUp).Row
ArrVung = VVung.Formula
ReDim ArrKQ(6 * (Int(UBound(ArrVung, 1) / 10)) + Application.Min(UBound(ArrVung, 1) Mod 10, 6), UBound(ArrVung, 2))
For i = LBound(ArrVung, 1) To Int(UBound(ArrVung, 1) / 10)
For k = 1 To 6 Step 1
l = 10 * (i - 1) + k
m = 6 * (i - 1) + k
For j = LBound(ArrVung, 2) To UBound(ArrVung, 2)
ArrKQ(m, j) = ArrVung(l, j)
Next
Next
Next
VVung.Clear
Cells(DongDau, 1).Resize(UBound(ArrKQ, 1), UBound(ArrKQ, 2)) = ArrKQ
End Sub
Ông bạn siêu nhẩy, diễn đàn max 1tr, cứ cho nhớ được 1% là cũng bá đạo rồi. Chia sẻ cách nhớ nhở???Bằng cách có khả năng ghi nhớ quá khứ (các bài của thớt), có khả năng tìm về quá khứ và phán đoán các vấn đề liên quan.
Hàm là code đã có sẵn. Dùng hàm đại khái như dùng code đã có sẵn....
Code lụi em thấy giống chơi dao quá.
Vậy: nếu em muốn dùng VBA thì bảng phải cấm dùng công thức phải không các bác?
Cứ nhiều mảng cho dễ nhìn bác, với lại đây là 2 chiều, redim chỉ được phần đuôi.Kết luận: chỉ cần một mảng, đầu ra ghi chồng lên đầu vào.
Bạn bị tật chủ quan, không chịu tìm hiểu người ta nói gì.Cứ nhiều mảng cho dễ nhìn bác, với lại đây là 2 chiều, redim chỉ được phần đuôi.
Cần lắm 1 code mẫu để hiểu mảng chồng mảng bác ạ?
Tại hắn không hiểu dùng biến k để làm gì. Mà có khi chẳng biết trước bao nhiêu dòng/ cột thì redim bao nhiêu cho vừa.Bạn bị tật chủ quan, không chịu tìm hiểu người ta nói gì.
Bài toán đạt 3 điểm như đã dẫn thì redim làm cái gì?
lúc chưa sửa thì khó hiểu, sau khi sửa em đã vắt trán suy nghĩ và hiểu sơ.
Toàn các kiểu càng học càng dốt, và càng nghe lão ct mắng.Hehe, còn cách học râu ông cằm bà hay lắm bác ạ.
Đen tô đậm: Có vài lần tôi phê bình cách đặt biến đếm dòng là k. Nhưng bà con cứ theo người khởi xướng ban đầu.Tại hắn không hiểu dùng biến k để làm gì. Mà có khi chẳng biết trước bao nhiêu dòng/ cột thì redim bao nhiêu cho vừa.
Lại còn nhầm lẫn redim với redim preserve nữa chứ. Chả hiểu cách học ra sao nữa.
...
Hehe, mỗi người có 1 cách mà. Bác nào code giúp cho mọi người được thì đó là giúp người, còn mình thì thử giúp người để giúp mình.![]()
![]()
![]()
Bạn ơi.Code không khó lắm, quan trọng là đề bài phải dễ.
Mã:Option Explicit Sub zzz() Dim i& Dim OHienTai As Range For i = 1 To 1000 Step 1 Set OHienTai = Range("A" & i) If [OHienTai] = 7 Or [OHienTai] = 8 Or [OHienTai] = 9 Or [OHienTai] = 10 Then [OHienTai].EntireRow.Delete i = i - 1 End If Next End Sub
Đây là kỹ thuật cao bác ạ, lấy mỗi nơi 1 tí, rồi sửa, cứ vài lần lỗi là sẽ được. Cái hay là không cần bẫy lỗi. Cứ chạy cứ ngon, gặp lỗi lại mò tiếp.Mệnh đề mình cho là hay nhất trong các bài đăng trong chủ đề này!
Chúc bạn có ngày làm việc hôm nay hiệu quả!
BS: Ghép code là sao ta, chưa hiểu!
Hãy đi theo lối riêng của mình. Ai cũng xóa từ dưới lên thì lấy ai xóa từ trên xuống.Bạn ơi.
Xóa từ dưới lên trên chớ hỳ
Trên diễn đàn cũng đã có chỉ ra vài cách 'xóa' từ trên, như. . . . Hãy đi theo lối riêng của mình. Ai cũng xóa từ dưới lên thì lấy ai xóa từ trên xuống.
Con cua thì suốt đời bò ngang.Hãy đi theo lối riêng của mình. Ai cũng xóa từ dưới lên thì lấy ai xóa từ trên xuống.
Code dưới cũng là loại cấy ghép.Đây là kỹ thuật cao bác ạ, lấy mỗi nơi 1 tí, rồi sửa, cứ vài lần lỗi là sẽ được. Cái hay là không cần bẫy lỗi. Cứ chạy cứ ngon, gặp lỗi lại mò tiếp.
Hãy đi theo lối riêng của mình. Ai cũng xóa từ dưới lên thì lấy ai xóa từ trên xuống.
Option Explicit
Public dN As Boolean
Sub xxx()
Dim sTT() As Integer
Dim rws
Dim i, k
If dN = True Then Exit Sub
dN = True
With Sheet1
If .AutoFilterMode Then .AutoFilterMode = False
rws = .Range("A" & Rows.Count).End(xlUp).Row
End With
ReDim sTT(1 To rws, 1 To 1)
For i = 7 To rws Step 10
For k = i To i + 3
sTT(k, 1) = 1
Next k
Next i
With Sheet1
.Range("D1").Resize(rws, 1) = sTT
.Range("D1").CurrentRegion.AutoFilter 1, 1
.Range("D2", .Range("D2").End(xlDown)).EntireRow.SpecialCells(xlCellTypeVisible).Delete
.AutoFilterMode = False
.Range("D1").CurrentRegion.Clear
End With
End Sub
Bác vẫn còn đam mê món này à? Hôm qua em ghép code chưa chuẩn nên vẫn lỗi.Trên diễn đàn cũng đã có chỉ ra vài cách 'xóa' từ trên, như
1./ Những dòng nào không cần xóa thì cho vô mảng
2./ Những dòng nào cần xóa thì cho vô Rng - tham biến Range (khai báo từ trước)
3./ . . . . (?)
Nếu dùng filter thì oánh từ trung lộ ra biên rồi.Làm từ dưới lên hay trên xuống cũng không rõ nữa
Khổ ở chỗ bạn không bao giờ nghĩ đến "lực bất tòng tâm"Hehe, mỗi người có 1 cách mà. Bác nào code giúp cho mọi người được thì đó là giúp người, còn mình thì thử giúp người để giúp mình.![]()
![]()
...
Nghe lời bác, không tham gia code kiếc, hàm hiếc gì nữa. Tập trung tham gia chuyên mục Thư giãn. Muối mặt, muối tiêu, muối tổng hợp.Khổ ở chỗ bạn không bao giờ nghĩ đến "lực bất tòng tâm"
Trước khi "giúp người" thì cũng cần phải biết có giúp được không. Bạn gặp một người tai nạn nằm giữa đường, bạn nhới lại xem phim thấy người ta hô hấp nhân tạo rần rần, thế là bạn ttrowrnajn nhơn (đâu có biết thế nào là thế nằm đúng), đè ngực:
Rắc, gãy xương sườn. Bât giờ chỉ là phước chủ may thầy, cái xương ấy có bị bạn đè đâm lủng phổi hay không thôi.
Cái xương sườn ấy có thể ví như câu "On error" của bạn. Bạn không quan sát, cứ đè ngực tiếp thì khả năng nó đâm phổi càng tăng cao.
Tôi nghĩ là bạn ham học cho nên tôi mới nặng tay. Trước đây cũng có 2 cô tôi nghĩ vậy, và dù là nữ tôi vẫn nặng lời. Một cô thì tôi lầm. Cô kia thì tôi không nghĩ là mình lầm.Nghe lời bác, không tham gia code kiếc, hàm hiếc gì nữa. Tập trung tham gia chuyên mục Thư giãn. Muối mặt, muối tiêu, muối tổng hợp.
Em không ham học, em chỉ đam mê, thực sự là đam mê. Đam mê nghĩa là lúc mê lúc không, khác với mọi người là đam mê thật.Tôi nghĩ là bạn ham học cho nên tôi mới nặng tay. Trước đây cũng có 2 cô tôi nghĩ vậy, và dù là nữ tôi vẫn nặng lời. Một cô thì tôi lầm. Cô kia thì tôi không nghĩ là mình lầm.
Nếu bạn thuộc lại cực đoan, để cho cục tự ái nó đè lên niềm khát vọng thì cứ xác định. Tôi sẽ chừa bạn ra.
Được. Tôi xin lỗi bạn.Em không ham học, em chỉ đam mê, thực sự là đam mê. Đam mê nghĩa là lúc mê lúc không, khác với mọi người là đam mê thật.
Còn tự ái thì ai chả có. Trên này nhiều người chọc vào tự ái lắm, nhưng ý của bác cực bực, nó gây ức chế cục bộ.
Mà thôi, giờ em chỉ tập trung chuyên mục giải trí thôi.![]()
![]()
![]()
Em không dám nhận đâu. Nhưng kể ra bác cũng dễ thương, dùng kỹ thuật vừa đấm vừa xoa.Được. Tôi xin lỗi bạn.
Bạn không cần phải tránh mấy thớt lập trình, vì tôi cam kết sẽ không đụng chạm gì đến bạn nữa.
GPT dành cho những hỏi đơn giảnBài 1 của chủ đề này ấy ... họ không biết code két nên mới hỏi . .. thay vì viết thuần VBA cho họ có cơ hội học với như mấy bài trước thì tầm trên 10 dòng code là nhiều và code đơn giản họ có thể hiểu và học vvv...............
Nếu giõi hơn thay vì họ viết 10 dòng để xử lý tốt cùng một vấn đề thì mình chỉ viết 9 dòng hay 5 dòng thôi thì đó mới là giỏi
thay vì 9 dòng hay 5 dòng thì bê một mớ code rác cả vài trăm dòng code vào cùng xử lý một vấn đề và chủ thớt học được gì từ mớ rác đó
nếu viết 5 to 9 dòng code thì siêu thật còn đâu đó viết vài trăm dòng code cũng chỉ xử lý một vấn đề như khoãng 10 dòng code thì nó trở thành siêu sọt rác mất rồi còn gì nữa ...không biết não gì ấy
À, đã lâu rồi & nhân Tết nhất rãnh rỗi đá vài câu cho vui chăng?GPT dành cho những hỏi đơn giản
View attachment 299040
Đơn giản hay không chả biết.GPT dành cho những hỏi đơn giản
...
AI là vậy. Nguyên tắc của nó là đi từ sai đến gần đúng, rồi (hy vọng) đúng....
Bác cứ yên tâm thằng GPT nay lâu lâu nó cũng sai chứ không đúng hoàn toàn, em test còn kỷ lắm mùng 1 đến mùng 6 mới xong đoạn code này
Nhìn sơ qua đã thấy sai rồi.View attachment 299046
Bác cứ yên tâm thằng GPT nay lâu lâu nó cũng sai chứ không đúng hoàn toàn, em test còn kỷ lắm mùng 1 đến mùng 6 mới xong đoạn code này