Hỏi về code VBA copy

Liên hệ QC

feelingyes

Thành viên tiêu biểu
Tham gia
24/9/07
Bài viết
459
Được thích
395
Nghề nghiệp
Economic
Em viết đoạn code sau để copy từ sheet2 sang sheet 1 (copy số cuối kỳ theo tháng từ sheet 2 vào đúng tháng tương tứng tại sheet 1 nhưng ko được
Sub copy_paste()

Range("D4:D8").Select
Selection.Copy
Sheets("Sheet1").Select
Offset(Range("A3"), "=MONTH(Sheet2!R[-10]C[-4])").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub

Máy báo lỗi tại dòng bôi đỏ
Xin được sự chỉ giáo từ các Huynh
 

File đính kèm

Chạy thữ code sau coi đúng ý bạn không?

Mã:
Sub copy_paste()
m = Month(Sheets(2).Range("B2"))
With Sheets(1)
.Cells(3, m + 1) = Sheets(2).Range("D4")
.Cells(4, m + 1) = Sheets(2).Range("D5")
.Cells(5, m + 1) = Sheets(2).Range("D6")
.Cells(6, m + 1) = Sheets(2).Range("D7")
.Cells(7, m + 1) = Sheets(2).Range("D8")
End With
End Sub

Mến
 
Upvote 0
cám ơn Anh "cánh thép"
Code chạy rất đúng, nhưng em cảm thấy chưa tối ưu. chẳng nhẽ mình ko copy range , offset, và pastespecial sao
Ví dụ trong dạnh mục tài khoản có dến 100 tài khoản con thì em sẽ làm như thể 100 lần
Anh xem lại giúp em với
 
Upvote 0
Bạn thử dùng câu lệnh này:
PHP:
    Sheet1.Range("D4:D8").Copy Destination:=Sheet2.[a3].Offset(, Month(Sheet1.[b2]))

Thật ra bạn hay ai đó đã đổi tên cúng cơm của các sheet cho nhau; nên dòng lệnh ngắn quá đễ lỗi
Thay vì nên viết đủ là:

Sheets("Sheet2").Range("D4:D8").Copy Destination:=Sheets("Sheet1").[a3].Offset(, Month(Sheets("Sheet2").[b2]))
 
Upvote 0
Yen đã viết:
Sheet1.Range("D4:D8").Copy Destination:=Sheet2.[a3].Offset(, Month(Sheet1.[b2]))


Về mặt lý thuyết thấy rất đúng và chay được nhưng kết quả sai bạn ơi
Ko hiểu tại sao nữa
 
Lần chỉnh sửa cuối:
Upvote 0
Digita đã viết:
Sub copy_paste()
m = Month(Sheets(2).Range("B2"))
With Sheets(1)
.Cells(3, m + 1) = Sheets(2).Range("D4")
.Cells(4, m + 1) = Sheets(2).Range("D5")
.Cells(5, m + 1) = Sheets(2).Range("D6")
.Cells(6, m + 1) = Sheets(2).Range("D7")
.Cells(7, m + 1) = Sheets(2).Range("D8")
End With
Anh ơi nếu liệu code có thể dạnh như này ko?
Sub copy_past2()
Dim i As Integer
i = Month(Sheets("sheet2").Range("b2"))
For i = 1 To 5
If i Then
.Cells(3, i + 1) = Sheets(2).Range("D" & i)

End If

Next
End Sub
End Sub
 
Upvote 0
Lủng củng quá! Bạn gán giá trị cho i rồi lại cho nó chạy từ 1 đến 5 thì... Sửa lại thế này nhé:
PHP:
Sub copy_paste2()
Dim i As Integer
m = Month(Sheets("sheet2").Range("b2"))
Sheets(1).Select
For i = 1 To 5
 Cells(i + 2, m + 1) = Sheets(2).Range("D" & i + 3)
Next
End Sub
 
Upvote 0
Trong lúc chờ các anh giúp em cũng loay hoay ......và thấy code chạy ngon
Range("D4:D8").Select
Selection.Copy
Sheets("Sheet1").Select
Sheet2.[a3].Offset(, Month(Sheet1.[b2])).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các anh chị
Vì đang tập tành VBA nên em hỏi rất nhiều câu -mong các bác chiếu cố
-Vẫn là bài tập trên nhưng em đang thử vận dụng sang vòng lặp Do while....loop
Ở ví dụ trên tại sheet2 ta có dữ liệu cần copy từ (D4:D8) <=> là 5
Em đã tập tành với For ...next (với i =5)
Lam_A0 đã viết:
Sub copy_paste2()
Dim i As Integer
m
= Month(Sheets("sheet2").Range("b2"))
Sheets(1).Select
For i = 1 To 5
Cells
(i + 2, m + 1) = Sheets(2).Range("D" & i + 3)
Next
End Sub
Nhưng trong trường hợp Dữ liệu cần copy ở cột D hay thay đổi-- em sẽ chuyển sang dùng Do while ...loop và vòng lặp sẽ thoát cho tới khi nó gặp một ô trắng
Em thử viết đoạn code sau
Sub copy_paste4()
m = Month(Sheet1.[b2])
Sheet2.Select
Do While Sheet1.Range("D" & i + 3).Value <> ""

Cells(2 + i, m + 1) = Sheet1.Range("D" & i + 3)

i = i + 1
Loop


End Sub
Mong các anh chỉ giúp xem còn gì không đúng
 
Upvote 0
Nguyên văn bởi feelingyes
Em đang thắc mắc là nếu em thêm set vào trước m thì code chạy bị lỗi
Tại sao các anh nhỉ?
Set chỉ dùng để gán giá trị cho biến đối tượng.
Mã:
Sub copy_paste4()
    m = Month(Sheet1.[b2])
    Sheet2.Select
            Do While Sheet1.Range("D" & i + 3).Value <> ""
                 Cells(2 + i, m + 1) = Sheet1.Range("D" & i + 3)
                   i = i + 1
           Loop
End Sub
Bạn cần gán cho biến i giá trị ban đầu. Nếu không, mặc định i = 0.
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Trong đoạn code trên, bạn cần gán giá trị ban đầu i = 1. Nếu không, vòng lặp chạy sớm 1 dòng, chữ " Cuối kỳ" sẽ bị copy qua sheet1.
Mã:
Sub copy_paste4()
   Dim i as integer, m as integer
     i = 1 
     m = Month(Sheet1.[b2])
    Sheet2.Select
            Do While Sheet1.Range("D" & i + 3).Value <> ""
                 Cells(2 + i, m + 1) = Sheet1.Range("D" & i + 3)
                   i = i + 1
           Loop
End Sub
 
Upvote 0
cám ơn Anh "cánh thép"
Code chạy rất đúng, nhưng em cảm thấy chưa tối ưu. chẳng nhẽ mình ko copy range , offset, và pastespecial sao
Ví dụ trong dạnh mục tài khoản có dến 100 tài khoản con thì em sẽ làm như thể 100 lần
Anh xem lại giúp em với

Nếu số tài khoản ở cột A trong 2 sheet giống nhau, thì không cần đặc vòng lặp vì chỉ làm chậm thao tác mà thôi.

Bạn lấy cái file này rồi chạy thữ nhé. Có thể ghi lại vài trăm ngàn dòng dữ liệu trong tíc tắc.

Mến
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom