Code copy và paste dữ liệu cùng 1 vùng

Liên hệ QC

mhung12005

Thành viên chậm chạm
Tham gia
20/7/11
Bài viết
1,598
Được thích
1,261
Nghề nghiệp
Đâu có việc thì làm
Chào các anh chị,

Em muốn viết 1 đoạn code với yêu cầu, như trong file đính kèm, mong các anh chị giúp đỡ. Em làm hoài mà chẳng được +-+-+-+.

Cảm ơn các anh chị nhiều.
 
Bạn thử ngay hôm nay với đoạn mã ni xem sao:

PHP:
Private Sub Worksheet_Activate()
 Dim Dat As Date, Rng As Range, sRng As Range, Rg0 As Range
 Dim StrC As String, MyAdd As String
 
 If Day(Date) = 8 And [iA1].Value <> "R" Then       '<=|'
2   StrC = Choose(Month(Date), "C", "K", "D", "E", "L", "Y", "S", "T", "J", "U", "M", "P")
    StrC = StrC & "R0"
    Set Rng = Range([C4], [C65500].End(xlUp))
    Set sRng = Rng.Find(StrC, , xlValues, xlPart)
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            If Rg0 Is Nothing Then
                Set Rg0 = Cells(sRng.Row, "a")
            Else
                Set Rg0 = Union(Rg0, Cells(sRng.Row, "A"))
            End If
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
    MsgBox Rg0.Address
'    [iA1].Value = "R"'
 ElseIf Day(Date) <> 8 Then
 
    [uA1].Value = "GPE"                '<=|'
 End If
End Sub

Chú ý dòng lệnh số 1 đó cái nha.

 
Upvote 0
PHP:
Private Sub Worksheet_Activate()
 Dim Dat As Date, Rng As Range, sRng As Range, Rg0 As Range
 Dim StrC As String, MyAdd As String
 
 If Day(Date) = 8 And [iA1].Value <> "R" Then       '<=|'
2   StrC = Choose(Month(Date), "C", "K", "D", "E", "L", "Y", "S", "T", "J", "U", "M", "P")
    StrC = StrC & "R0"
    Set Rng = Range([C4], [C65500].End(xlUp))
    Set sRng = Rng.Find(StrC, , xlValues, xlPart)
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            If Rg0 Is Nothing Then
                Set Rg0 = Cells(sRng.Row, "a")
            Else
                Set Rg0 = Union(Rg0, Cells(sRng.Row, "A"))
            End If
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
    MsgBox Rg0.Address
'    [iA1].Value = "R"'
 ElseIf Day(Date) <> 8 Then
 
    [uA1].Value = "GPE"                '<=|'
 End If
End Sub

Chú ý dòng lệnh số 1 đó cái nha.


Cảm ơn bác. Nhưng bác có thể hướng dẫn em chi tiết hơn không. Cái món VBA này em yếu quá. Hihi
Một lần nữa xin cảm ơn bác nhiều.
 
Upvote 0
Macro trên sẽ chỉ làm việc ngày 8 các tháng

Muốn nó làm ngay ngày đầu tháng sau thì sửa lại dòng lệnh chứa số 8 thành số 1

Vì đây là macro sự kiện, nên ngày 1 hàng tháng bạn cần fải kích hoạt trang tính để nó chuyển số liệu tháng trước đang ở dạng công thức của tháng đó trở thành số liệu;

Lúc đó cũng còn cần chỉnh tham biến StrC chút nữa. . . .

Nhưng theo mình,hôm nay thì bạn thêm vài dòng số liệu liên quan đến tháng 11, chép macro vô trang tính & mở nó lên thử kết quả đúng chưa đã.

Chúc thành công.
 
Upvote 0
Muốn nó làm ngay ngày đầu tháng sau thì sửa lại dòng lệnh chứa số 8 thành số 1

Vì đây là macro sự kiện, nên ngày 1 hàng tháng bạn cần fải kích hoạt trang tính để nó chuyển số liệu tháng trước đang ở dạng công thức của tháng đó trở thành số liệu;

Lúc đó cũng còn cần chỉnh tham biến StrC chút nữa. . . .

Nhưng theo mình,hôm nay thì bạn thêm vài dòng số liệu liên quan đến tháng 11, chép macro vô trang tính & mở nó lên thử kết quả đúng chưa đã.

Chúc thành công.

Sao em chép Macro vào trang tính nhưng không chạy được. Nó báo lỗi Run-time error '424', object requied. Bác giúp em test nó được không. Thanks bác nhiều.
 
Upvote 0
Có ai giúp em test cái code này với, em đang rất cần mà lại mù tịt VBA. Hic
 
Upvote 0
Bạn thử ngay xem sao

Kích hoạt lần lượt từng trang tính, sẽ hiện trong hộp thoại địa chỉ các hàng thuộc cột 'A' cần chuyển thành dữ liệu từ công thức
 

File đính kèm

  • gpeThuThuat.rar
    42.9 KB · Đọc: 37
Upvote 0
Kích hoạt lần lượt từng trang tính, sẽ hiện trong hộp thoại địa chỉ các hàng thuộc cột 'A' cần chuyển thành dữ liệu từ công thức

Mình đã làm như bạn hướng dẫn nhưng chỉ thấy hiện lên hộp thoại $A7$:$A$46. Mà các công thức hiển thị dữ liệu vẫn không chuyển đổi thành dữ liệu dạng Value. Vậy mình phải làm gì ở bước tiếp theo. Bạn hướng dẫn thêm cho mình nhé.
 
Upvote 0
Chào các anh chị,

Em muốn viết 1 đoạn code có chức năng: Cứ mối khi đến ngày cuối cùng của tháng thì nó tự động copy vùng có dữ liệu (<>"") và paste vào đúng vùng đó ở dạng Value (giữ nguyên định dạng). Còn các vùng có công thức vẫn được giữ nguyên.
mong các anh chị giúp đỡ. Em làm hoài mà chẳng được +-+-+-+.

Cảm ơn các anh chị nhiều.

Bạn chỉnh lịch trên máy đến ngày cuối tháng để test nha
Mã:
Private Sub Worksheet_Activate()
    Application.ScreenUpdating = False
    If Day(Date + 1) = 1 Then
        Range([a5], [a65000].End(3).Resize(, 17)).Copy
        [a5].PasteSpecial 3
        Application.CutCopyMode = False
        [a65000].End(3).Select
    End If
End Sub
 

File đính kèm

  • NgayCuoiThang.rar
    50.3 KB · Đọc: 56
Upvote 0
Mình đã làm như bạn hướng dẫn nhưng chỉ thấy hiện lên hộp thoại $A7$:$A$46. Mà các công thức hiển thị dữ liệu vẫn không chuyển đổi thành dữ liệu dạng Value. Vậy mình phải làm gì ở bước tiếp theo. Bạn hướng dẫn thêm cho mình nhé.

Hộp thoại cho ta biết các dòng thuộc vùng cần chuyển đổi từ công thức sang dữ liệu;

Vậy bước tiếp theo bạn thử ghi lại macro để copy vùng có các hàng đó & paste Special - Value
Sau đó bạn hoặc nhờ ai đó (bằng cách đưa nội dung macro vừa thu được lên diễn đàn) sửa lại cho thích hợp & kiều diễm hơn.

(húc thành công!
 
Upvote 0
Bạn chỉnh lịch trên máy đến ngày cuối tháng để test nha
Mã:
Private Sub Worksheet_Activate()
    Application.ScreenUpdating = False
    If Day(Date + 1) = 1 Then
        Range([a5], [a65000].End(3).Resize(, 17)).Copy
        [a5].PasteSpecial 3
        Application.CutCopyMode = False
        [a65000].End(3).Select
    End If
End Sub

Chào anh,
Anh cho em hỏi chút ah:
Cái code này không chạy tự động được ah ? Anh có thể giúp em chỉnh cho nó chạy tự động được không. Nghĩa là cứ đến ngày cuối tháng là nó tự động thực hiện chức năng của nó. Cảm ơn anh nhiều.
 
Upvote 0
Bạn chỉnh lịch trên máy đến ngày cuối tháng để test nha
Mã:
Private Sub Worksheet_Activate()
    Application.ScreenUpdating = False
    If Day(Date + 1) = 1 Then
        Range([a5], [a65000].End(3).Resize(, 17)).Copy
        [a5].PasteSpecial 3
        Application.CutCopyMode = False
        [a65000].End(3).Select
    End If
End Sub
Thay vì copy paste sao anh không dùng chiêu .Value = .Value cho nó sướng
Ẹc.. Ẹc..
 
Upvote 0
Thay vì copy paste sao anh không dùng chiêu .Value = .Value cho nó sướng
Ẹc.. Ẹc..

@ Ndu: Cảm ơn ndu nhiều nha! đúng là cái này phải nhớ để đời. Hôm qua chỉ loay hoay tìm ngày cuối tháng nên không nghĩ ra sử dụng .Value thay cho copy .PasteSpecial 3

Xin sửa lại code trên như sau:
Mã:
Private Sub Worksheet_Activate()
    Application.ScreenUpdating = False
    With Range([a5], [a65000].End(3).Resize(, 17))
        If Day(Date + 1) = 1 Then .Value = .Value
    End With
End Sub

Chào anh,
Anh cho em hỏi chút ah:
Cái code này không chạy tự động được ah ? Anh có thể giúp em chỉnh cho nó chạy tự động được không. Nghĩa là cứ đến ngày cuối tháng là nó tự động thực hiện chức năng của nó. Cảm ơn anh nhiều.

Code này tự động chạy với sự kiện Worksheet_Activate mà bạn. Trong file đính kèm code ở sheet "gốc" tôi đã vô hiệu hóa để bảo toàn dữ liệu gốc vì vậy sau khi bạn Copy Sheet xong thì xoá tất cả các dấu nháy (') trong code để cho nó hoạt động,
 
Lần chỉnh sửa cuối:
Upvote 0
@ Ndu: Cảm ơn ndu nhiều nha! đúng là cái này phải nhớ để đời. Hôm qua chỉ loay hoay tìm ngày cuối tháng nên không nghĩ ra sử dụng .Value thay cho copy .PasteSpecial 3

Xin sửa lại code trên như sau:
Mã:
Private Sub Worksheet_Activate()
    Application.ScreenUpdating = False
    With Range([a5], [a65000].End(3).Resize(, 17))
        If Day(Date + 1) = 1 Then .Value = .Value
    End With
End Sub



Code này tự động chạy với sự kiện Worksheet_Activate mà bạn. Trong file đính kèm code ở sheet "gốc" tôi đã vô hiệu hóa để bảo toàn dữ liệu gốc vì vậy sau khi bạn Copy Sheet xong thì xoá tất cả các dấu nháy (') trong code để cho nó hoạt động,

Em chân thành cảm ơn anh và các thành viên trong diễn đàn GPE.
Em cũng là thành viên mới nhưng em thấy diễn đàn thật bổ ích. Mong diễn đàn ngày một mạnh hơn,
và là nơi mọi người giao lưu, học hỏi cũng như giúp đỡ nhau trong cuộc sống và công việc (cả online cũng như offline).
Chúc mọi người luôn vui vẻ và thành đạt.
 
Upvote 0
@ Ndu: Cảm ơn ndu nhiều nha! đúng là cái này phải nhớ để đời. Hôm qua chỉ loay hoay tìm ngày cuối tháng nên không nghĩ ra sử dụng .Value thay cho copy .PasteSpecial 3

Xin sửa lại code trên như sau:
Mã:
Private Sub Worksheet_Activate()
    Application.ScreenUpdating = False
    With Range([a5], [a65000].End(3).Resize(, 17))
        If Day(Date + 1) = 1 Then .Value = .Value
    End With
End Sub



Code này tự động chạy với sự kiện Worksheet_Activate mà bạn. Trong file đính kèm code ở sheet "gốc" tôi đã vô hiệu hóa để bảo toàn dữ liệu gốc vì vậy sau khi bạn Copy Sheet xong thì xoá tất cả các dấu nháy (') trong code để cho nó hoạt động,

Dear các anh,

Cái code này em đang dùng mà cũng chạy rất tốt. Chỉ có điều em muốn thay đổi điều kiện chạy của nó (mà mù tịt) mong các anh giúp em hoàn chỉnh nó nhé. Em xin cảm ơn.

PS: Điều kiện thay đổi em đã Comment trong file đính kèm.
 
Upvote 0
Các anh ơi giúp em hoàn thiện nốt đoạn code này với. Em bí quá, Thanks.
 
Upvote 0
Tôi chưa hiểu tại sao bạn lại muốn dùng công thức đó và trong công thức đó bạn muốn lấy gì làm điều kiện ?
 
Upvote 0
Tôi chưa hiểu tại sao bạn lại muốn dùng công thức đó và trong công thức đó bạn muốn lấy gì làm điều kiện ?

Cảm ơn thầy đã quan tâm, em xin giải thích như sau:

Khi em thay thế hàm today() vào $B$50 thì công thức đó có tác dụng đếm để lấy ngày trong các trường hợp: Ví dụ:
Nếu hôm nay là 12/12 (ngày này xuất hiện ở N4) thì công thức sẽ trả về 19/12 (ngày này xuất hiện ở U4) dựa vào dòng 44 để tìm đến giá trị >0 đầu tiên là 35 (xuất hiện ở dòng U44 và tìm ra dòng 4 cột U. Nếu hôm nay là 13,14,15...17/12 cũng vậy công thức cũng sẽ trả về là ngày 19/12.
Nhưng nếu hôm nay là 18/12 thì công thức sẽ trả về là ngày 20/12 vì ngày này xuất hiên ở ô T4 dóng xuống dòng T44 thì giá trị đứng cạnh T44 (về phía tay phải) không phải là giá trị 0 nên sẽ cách 1 ô và lấy ô V44 dóng lên hàng 4 tại V4 là ngày 20/12. Nếu hôm nay là 19/12 thì trả về 21/12. Nếu hôm nay là 20/12 thì trả về 22/12.
Nhưng nếu hôm nay là 22/12 thì sẽ trả về 26/12 vì ngày 24,25/12 có 2 giá trị 0 ở dòng 44 nên bỏ qua và tìm đến giá trị >0 đầu tiên là ô AB44 và dóng lên dòng 4 và trả về giá trị ở AB4.

Nói chung em giải thích hơi dài dòng và thậm chí khó hiểu.
Nếu thầy thử thay các giá trị ngày khác nhau vào ô B50 thì thầy sẽ thấy nó trả về các giá trị khác nhau như thế nào ở ô B51.

Bước tiếp theo em dùng kết quả công thức trả về để làm điều kiện thay đổi 1 số ký tự trong các sheet bên cạnh. Các ký tự này thay đổi phụ thuộc vào tháng và năm theo lịch của máy tính.

Lý do em muốn thay đổi điều kiện của code này là vì công thức trong các sheet thay đổi theo điều kiện này còn code thì cứ đến ngày cuối tháng hoặc một ngày cố định nào đó mới hoạt động chứ không theo điều kiện này nên không khớp.

Ví dụ: Nếu hôm nay là ngày 29/12/2011 thì công thức sẽ thay đổi các ký tự vì điều kiện của nó trả về là ngày 03/01/2012. Con code thì đến ngày 31/12/2011 mới hoạt động vậy là các ký tự đã thay đổi sang tháng 1/2012 rồi. Mà em lại muốn code hoạt động cùng thời điểm công thức thay đổi nên mới lấy theo điều kiện của công thức. Mong thầy giúp đỡ em với ạ. Em xin trân trọng cảm ơn.
 
Upvote 0
Qủa thực tôi đã đọc 3 lần nhưng vẫn không hiểu. Bạn gửi file và giải thích tại chỗ để tôi xem nó thế nào.
 
Upvote 0
Chỉ cho phép pase speacial

Nhân chủ đề này em xin hỏi luôn:
Khi coppy một vùng dữ liệu nào đó Có code nào ngăn chặn Pase thông thường mà chỉ cho phép Pase speacial không ạ!
Thanks!
 
Upvote 0
Web KT
Back
Top Bottom