giúp e với![]()
Sub test1()
r = 5
c = 2
For k = 1 To 55188
For i = 1 To 8
check = Workbooks("copy.xlsm").Sheets(2).Cells(r, c)
If check = "" Then
For j = 5 To 19
Workbooks("copy.xlsm").Sheets(2).Cells(r, c) = Workbooks("copy.xlsm").Sheets(1).Cells(j, 2)
Workbooks("copy.xlsm").Sheets(2).Cells(r, c + 1) = Workbooks("copy.xlsm").Sheets(1).Cells(j, 3)
r = r + 1
Next j
Exit Sub
Else
r = r
c = c + 3
End If
Next i
r = r + 18
c = 2
Next k
End Sub
Workbooks("copy.xlsm")
cám ơn đã góp ý ạVì làm việc trên 1 WorkBook, nên tôi nghĩ có thể bỏ cụm từ:
PHP:Workbooks("copy.xlsm")
Cảm ơn ban. vi minh hay lam viec tren nhieu wb nen viet thanh thoi quen thoi
thành thật xin lỗi vì sự bất tiện này, do laptop trong cơ quan bị lỗi hay font lỗi mà mình không thể sử dụng unikey như bình thường.Bạn nên viết bài với tiếng Việt có dấu đầy đủ, bạn đọc lại nội quy tại khoản 1, mục II. Hình thức của bài viết, ở Link sau:
https://www.giaiphapexcel.com/diendan/threads/nội-quy-diễn-đàn-cập-nhật.76052/[/php]
mình sẽ ghi nhớNếu dùng Option Explicit thì sẽ phát sinh lỗi. Vì vậy, phải thêm biến sau vào.
Mã:Dim r, c, k, i, check, j As Long
ổn rồi bác ạ. e cảm ơn bác nhiều .ban tham khao attachment xem dung y ban chua ?
code nay minh viet van co nhieu cho han che, neu cao thu nao tim ra loi thi xin gop y chu dung trach minh nhe.
Mã:Sub test1() r = 5 c = 2 For k = 1 To 55188 For i = 1 To 8 check = Workbooks("copy.xlsm").Sheets(2).Cells(r, c) If check = "" Then For j = 5 To 19 Workbooks("copy.xlsm").Sheets(2).Cells(r, c) = Workbooks("copy.xlsm").Sheets(1).Cells(j, 2) Workbooks("copy.xlsm").Sheets(2).Cells(r, c + 1) = Workbooks("copy.xlsm").Sheets(1).Cells(j, 3) r = r + 1 Next j Exit Sub Else r = r c = c + 3 End If Next i r = r + 18 c = 2 Next k End Sub
đó là dòng cuối cùng chia cho 19, sấp sỉ số đó.ổn rồi bác ạ. e cảm ơn bác nhiều .
mà tiện bác cho e hỏi biến k là để làm gì vậy và số 55188 là số gì vậy ạ
cho e hỏi chút là. e thấy trong code của bác viết thì nó duyệt từ dòng thứ 5 trở đi ở mỗi lần code chạy. nên e muốn hỏi bác là có cách nào cho nó duyệt từ dòng cuối ở lần ghi số liệu tiếp theo ko ạ. tức là nó sẽ duyệt ở dòng có dữ liệu cuối cùng để ghi ấy ạ. e nghĩ là như thế nó sẽ nhanh hơn khi CSDL tăng dần theo thời gian, khi dòng lên hàng trăm nghìn thì khả năng sợ code sẽ chạy chậmđó là dòng cuối cùng chia cho 19, sấp sỉ số đó.
biến k là nếu đến cột X của dòng đầu tiên vẫn còn ký tự thì nó sẽ tự động xuống dòng tiếp theo
Bạn xem thử file này:cho e hỏi chút là. e thấy trong code của bác viết thì nó duyệt từ dòng thứ 5 trở đi ở mỗi lần code chạy. nên e muốn hỏi bác là có cách nào cho nó duyệt từ dòng cuối ở lần ghi số liệu tiếp theo ko ạ. tức là nó sẽ duyệt ở dòng có dữ liệu cuối cùng để ghi ấy ạ. e nghĩ là như thế nó sẽ nhanh hơn khi CSDL tăng dần theo thời gian, khi dòng lên hàng trăm nghìn thì khả năng sợ code sẽ chạy chậm
Bạn tham khảo thêm cách này xem saocách của a rất hay nhưng nó bị phụ thuộc vào biến N ạ. nếu N bị thay đổi sẽ khiến vị trí ở lần copy tiếp theo rất dễ bị lẫn
và nó bị cái khung khung gì ấy ạ. e nhìn nó cứ thế nào ấy T_T cụ thể như dưới a ạ
e cảm ơn a đã trợ giúp
View attachment 200571
Sub Thu_ty()
Dim Rng As Range, I As Long, R As Long, Col As Long, Ip As Long
Set Rng = Sheet1.Range("B5:C19")
With Sheet2
R = .Range("B" & Rows.Count).End(xlUp).Row
Col = .Cells(R, Columns.Count).End(xlToLeft).Column
If Col = 24 Then Col = 1
If Col = 1 Then
Handle:
I = IIf(R < 5, 5, IIf(Col = 1, R + 4, R - Rng.Rows.Count + 1))
With .Range("A1").Validation
.Delete: .Add Type:=xlValidateInputOnly: .InputMessage = I
End With
End If
On Error GoTo Handle
Ip = .Range("A1").Validation.InputMessage
If Col = 1 Then
.Cells(Ip, Col).Offset(, 1).Resize(Rng.Rows.Count, Rng.Columns.Count).Value = Rng.Value
Else
.Cells(Ip, Col).Offset(, 2).Resize(Rng.Rows.Count, Rng.Columns.Count).Value = Rng.Value
End If
End With
End Sub
Bạn tham khảo thêm cách này xem sao
PHP:Sub Thu_ty() Dim Rng As Range, I As Long, R As Long, Col As Long, Ip As Long Set Rng = Sheet1.Range("B5:C19") With Sheet2 R = .Range("B" & Rows.Count).End(xlUp).Row Col = .Cells(R, Columns.Count).End(xlToLeft).Column If Col = 1 Then Handle: If R < 5 Then I = 5 Else I = IIf(Col = 24, R + 4, R - Rng.Rows.Count + 1) End If If Col = 24 Then Col = 1 With .Range("A1").Validation .Delete: .Add Type:=xlValidateInputOnly: .InputMessage = I End With End If On Error GoTo Handle Ip = .Range("A1").Validation.InputMessage If Col = 1 Then .Cells(Ip, Col).Offset(, 1).Resize(Rng.Rows.Count, Rng.Columns.Count).Value = Rng.Value Else .Cells(Ip, Col).Offset(, 2).Resize(Rng.Rows.Count, Rng.Columns.Count).Value = Rng.Value End If End With End Sub
e cảm ơn 2 bác đã giúp đỡ ạ.@ Chủ thớt:
Kịch bản của chương trình:
- InputBox yêu cầu chọn vùng cần copy.
- InputBox yêu cầu chọn ô [cell] đầu tiên của vùng cần gán kết quả.
- Nhập số dãy, số cột kết quả, số kết quả cần gán, số columns trống giữa các cột kết quả, số rows trống giữa các dãy kết quả.
- Click ok. Xong.
????