Tự động copy, paste dữ liệu theo điều kiện

Liên hệ QC

Hung Duong

Thành viên chính thức
Tham gia
3/7/17
Bài viết
65
Được thích
11
Giới tính
Nam
Xin chào Anh Em,

Mình đang có thử thách nan giải và rất mong anh em chỉ giáo code để tự động xử lý. Mình đính kèm file với thông tin như sau:

_ Vùng áp dụng: Z26 - BA127
_Gantt chart màu xanh biển trong vùng là thời gian xếp ca làm: dữ liệu từ cột E, F với tham chiếu Z2 - BA2
_ Ô đầu tiên trong gantt chart màu xanh biển tượng trưng cho thời gian bắt đầu làm việc, và trong ô này có dữ liệu là vị trí xếp cho nhân viên đó
Thử thách: tự động copy, paste dữ liệu từ ô đầu tiên này cho các ô tiếp theo trong ca làm việc (gantt chart màu xanh của từng nhân viên). Dòng nào không có tên nhân viên thì không áp dụng

Ví dụ 1 nhân viên: nhân viên "Bùi Ngọc Trà My", ca làm 15:00-23:00 nên các ô AK26 - AR26 màu xanh tương trưng cho ca làm. Ô AK26 có dữ liệu "RINI" và làm sao tự động copy, paste "RINI" cho các ô từ AL26 - AR26.
 

File đính kèm

  • Tự động copy,paste từ ô đầu trong ca làm.xlsx
    83.6 KB · Đọc: 27
Xin chào Anh Em,

Mình đang có thử thách nan giải và rất mong anh em chỉ giáo code để tự động xử lý. Mình đính kèm file với thông tin như sau:

_ Vùng áp dụng: Z26 - BA127
_Gantt chart màu xanh biển trong vùng là thời gian xếp ca làm: dữ liệu từ cột E, F với tham chiếu Z2 - BA2
_ Ô đầu tiên trong gantt chart màu xanh biển tượng trưng cho thời gian bắt đầu làm việc, và trong ô này có dữ liệu là vị trí xếp cho nhân viên đó
Thử thách: tự động copy, paste dữ liệu từ ô đầu tiên này cho các ô tiếp theo trong ca làm việc (gantt chart màu xanh của từng nhân viên). Dòng nào không có tên nhân viên thì không áp dụng

Ví dụ 1 nhân viên: nhân viên "Bùi Ngọc Trà My", ca làm 15:00-23:00 nên các ô AK26 - AR26 màu xanh tương trưng cho ca làm. Ô AK26 có dữ liệu "RINI" và làm sao tự động copy, paste "RINI" cho các ô từ AL26 - AR26.
Code khá đơn giản nhưng "nan giải" ở quy định khi nào "tự động xử lý", căn cứ vào đâu code chạy?
 
Upvote 0
Code khá đơn giản nhưng "nan giải" ở quy định khi nào "tự động xử lý", căn cứ vào đâu code chạy?
Để khỏi đau đầu thì cứ căn cứ vào dòng nào có giờ IN OUT thì lấy text của ô đầu tiên trong vùng màu copy cho vùng còn lại bác ạ :D
 
Upvote 0
Upvote 0
Upvote 0
Haha. Các bác bật ngửa hết. Tưởng phải sự kiện này nọ để tự động, hoá ra phải bấm mới chạy. @!>><
Cái này thiệt là không biết có thể tự động luôn á . Nếu tự động được thì như bạn @Nhattanktnn thì quá tuyệt ạ, vậy điều kiện tự động là:
1. Cột IN và OUT có dữ liệu là thời gian
2. Cột đầu tiên trong vùng màu xanh biển có dữ liệu text ạ
3. Tự động cập nhật nếu điều kiện 1 hay/và 2 thay đổi
Rất cảm ơn chỉ giáo và hổ trợ @Maika8008 , @HieuCD , @VetMini , @snow25 , @Nhattanktnn
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào các bạn @HieuCD @snow25 @Nhattanktnn@VetMini , cảm ơn các bạn đã hổ trợ, tự động thì ý của mình là tạo một nút để bấm và chạy đó ạ
Mình rút kinh nghiệm lần sau sẽ ghi rõ hơn :))
Bấm nút lệnh chạy sub main
Mã:
Sub Main()
  On Error Resume Next
  With Sheets("Sun")
    Call CapNhat(.Range("V26", .Range("V" & Rows.Count).End(xlUp)))
  End With
  On Error GoTo 0
End Sub

Sub CapNhat(ByVal Rng As Range)
  Dim aGio(), Res(), sh As Worksheet, tmp$
  Dim sRow&, sCol&, tIn, tOut, fTime&, i&, r&
 
  Set sh = Rng.Parent
  aGio = sh.Range("Z2:BA2").Value
  sCol = UBound(aGio, 2)
  For j = 1 To sCol
    aGio(1, j) = Round(aGio(1, j) * 24, 0)
  Next j
  fTime = aGio(1, 1)
 
  sRow = Rng.Rows.Count
  ReDim Res(1 To sRow, 1 To sCol)
  For i = 1 To sRow
    r = Rng.Rows(i).Row
    tIn = sh.Range("V" & r).Value: tOut = sh.Range("W" & r).Value
    If tIn <> Empty And tOut <> Empty Then
      If IsNumeric(tIn) And IsNumeric(tOut) Then
        tIn = CLng(Mid(tIn, 1, 2))
        tmp = sh.Range("Z" & r).Offset(, tIn - fTime).Value
        If tmp <> Empty Then
          If CLng(Mid(tOut, 3, 2)) = 0 Then
            tOut = CLng(Mid(tOut, 1, 2)) - 1
          Else
            tOut = CLng(Mid(tOut, 1, 2))
          End If
          If tOut < tIn Then tOut = tOut + 24
          For j = 1 To sCol
            If aGio(1, j) >= tIn And aGio(1, j) <= tOut Then
              Res(i, j) = tmp
            End If
          Next j
        End If
      End If
    End If
  Next i
  sh.Range("Z" & Rng.Row).Resize(sRow, sCol) = Res
End Sub
 

File đính kèm

  • Tự động copy,paste từ ô đầu trong ca làm.xlsm
    116.3 KB · Đọc: 23
Upvote 0
Cái này thiệt là không biết có thể tự động luôn á . Nếu tự động được thì như bạn @Nhattanktnn thì quá tuyệt ạ, vậy điều kiện tự động là:
1. Cột IN và OUT có dữ liệu là thời gian
2. Cột đầu tiên trong vùng màu xanh biển có dữ liệu text ạ
3. Tự động cập nhật nếu điều kiện 1 hay/và 2 thay đổi
Rất cảm ơn chỉ giáo và hổ trợ @Maika8008 , @HieuCD , @VetMini , @snow25 , @Nhattanktnn
Bấm nút lệnh chạy sub main
Mã:
Sub Main()
  On Error Resume Next
  With Sheets("Sun")
    Call CapNhat(.Range("V26", .Range("V" & Rows.Count).End(xlUp)))
  End With
  On Error GoTo 0
End Sub

Sub CapNhat(ByVal Rng As Range)
  Dim aGio(), Res(), sh As Worksheet, tmp$
  Dim sRow&, sCol&, tIn, tOut, fTime&, i&, r&

  Set sh = Rng.Parent
  aGio = sh.Range("Z2:BA2").Value
  sCol = UBound(aGio, 2)
  For j = 1 To sCol
    aGio(1, j) = Round(aGio(1, j) * 24, 0)
  Next j
  fTime = aGio(1, 1)

  sRow = Rng.Rows.Count
  ReDim Res(1 To sRow, 1 To sCol)
  For i = 1 To sRow
    r = Rng.Rows(i).Row
    tIn = sh.Range("V" & r).Value: tOut = sh.Range("W" & r).Value
    If tIn <> Empty And tOut <> Empty Then
      If IsNumeric(tIn) And IsNumeric(tOut) Then
        tIn = CLng(Mid(tIn, 1, 2))
        tmp = sh.Range("Z" & r).Offset(, tIn - fTime).Value
        If tmp <> Empty Then
          If CLng(Mid(tOut, 3, 2)) = 0 Then
            tOut = CLng(Mid(tOut, 1, 2)) - 1
          Else
            tOut = CLng(Mid(tOut, 1, 2))
          End If
          If tOut < tIn Then tOut = tOut + 24
          For j = 1 To sCol
            If aGio(1, j) >= tIn And aGio(1, j) <= tOut Then
              Res(i, j) = tmp
            End If
          Next j
        End If
      End If
    End If
  Next i
  sh.Range("Z" & Rng.Row).Resize(sRow, sCol) = Res
End S
[/QUOTE]
Cái này thiệt là không biết có thể tự động luôn á . Nếu tự động được thì như bạn @Nhattanktnn thì quá tuyệt ạ, vậy điều kiện tự động là:
1. Cột IN và OUT có dữ liệu là thời gian
2. Cột đầu tiên trong vùng màu xanh biển có dữ liệu text ạ
3. Tự động cập nhật nếu điều kiện 1 hay/và 2 thay đổi
Rất cảm ơn chỉ giáo và hổ trợ @Maika8008 , @HieuCD , @VetMini , @snow25 , @Nhattanktnn
Rất cảm ơn bạn @HieuCD đã hổ trợ mình, mình rất biết ơn nếu bạn có thể cập nhật thêm code để tự động
Bấm nút lệnh chạy sub main
Mã:
Sub Main()
  On Error Resume Next
  With Sheets("Sun")
    Call CapNhat(.Range("V26", .Range("V" & Rows.Count).End(xlUp)))
  End With
  On Error GoTo 0
End Sub

Sub CapNhat(ByVal Rng As Range)
  Dim aGio(), Res(), sh As Worksheet, tmp$
  Dim sRow&, sCol&, tIn, tOut, fTime&, i&, r&

  Set sh = Rng.Parent
  aGio = sh.Range("Z2:BA2").Value
  sCol = UBound(aGio, 2)
  For j = 1 To sCol
    aGio(1, j) = Round(aGio(1, j) * 24, 0)
  Next j
  fTime = aGio(1, 1)

  sRow = Rng.Rows.Count
  ReDim Res(1 To sRow, 1 To sCol)
  For i = 1 To sRow
    r = Rng.Rows(i).Row
    tIn = sh.Range("V" & r).Value: tOut = sh.Range("W" & r).Value
    If tIn <> Empty And tOut <> Empty Then
      If IsNumeric(tIn) And IsNumeric(tOut) Then
        tIn = CLng(Mid(tIn, 1, 2))
        tmp = sh.Range("Z" & r).Offset(, tIn - fTime).Value
        If tmp <> Empty Then
          If CLng(Mid(tOut, 3, 2)) = 0 Then
            tOut = CLng(Mid(tOut, 1, 2)) - 1
          Else
            tOut = CLng(Mid(tOut, 1, 2))
          End If
          If tOut < tIn Then tOut = tOut + 24
          For j = 1 To sCol
            If aGio(1, j) >= tIn And aGio(1, j) <= tOut Then
              Res(i, j) = tmp
            End If
          Next j
        End If
      End If
    End If
  Next i
  sh.Range("Z" & Rng.Row).Resize(sRow, sCol) = Res
End Sub
Rất cảm ơn bạn @HieuCD đã giúp đỡ mình rất nhiều, bạn có thể chỉnh lại code để tự động theo 3 điều kiện không ạ?
1. Khi cột IN & cột OUT có dữ liệu thời gian
2. Khi cột đầu tiền của gantt chart màu xanh biển có dữ liệu text
3 Khi cột IN & OUT hay/và dữ liệu text cột đầu tiên thay đổi thì thay đổi theo

Bạn không chỉ giúp mình lần này còn một số lần trước nữa, không biết lấy gì cảm ơn. Có một số món quà từ Đà Lạt muốn gửi bạn, mong bạn đừng từ chối
 
Upvote 0
Rất cảm ơn bạn @HieuCD đã hổ trợ mình, mình rất biết ơn nếu bạn có thể cập nhật thêm code để tự động

Rất cảm ơn bạn @HieuCD đã giúp đỡ mình rất nhiều, bạn có thể chỉnh lại code để tự động theo 3 điều kiện không ạ?
1. Khi cột IN & cột OUT có dữ liệu thời gian
2. Khi cột đầu tiền của gantt chart màu xanh biển có dữ liệu text
3 Khi cột IN & OUT hay/và dữ liệu text cột đầu tiên thay đổi thì thay đổi theo

Bạn không chỉ giúp mình lần này còn một số lần trước nữa, không biết lấy gì cảm ơn. Có một số món quà từ Đà Lạt muốn gửi bạn, mong bạn đừng từ chối
Sub CapNhat mình đã viết tương đối hoàn chỉnh, chỉ cần xác định các điều kiện xử lý tự động là gọi thực thi
Bạn phải lường trước tất cả các thao tác có thể thực hiện trên bảng tính và yêu cầu code sẽ tự động xử lý như thế nào thật cụ thể và đầy đủ mới viết code được
Ví dụ theo file mình gởi, có 1 số thao tác bạn phải nói rỏ code sẽ làm gì?
Làm theo và đưa yêu cầu xử lý
1/ ô V26:
_ Xóa dữ liệu: code sẽ làm gì?
_ Sau đó Nhập "1300": code sẽ làm gì?
2/ ô AF27:
_ Xóa dữ liệu ô AF27 ...,
_ nhập "GEL" vào ô AF27 ...
_ nhập "RCHA" vào ô AP28 ...
3/ Nhập "RCHA" vào ô AP28 ...
 

File đính kèm

  • Tự động copy,paste từ ô đầu trong ca làm.xlsm
    115.3 KB · Đọc: 12
Upvote 0
1. Khi cột IN & cột OUT có dữ liệu thời gian
2. Khi cột đầu tiền của gantt chart màu xanh biển có dữ liệu text
3 Khi cột IN & OUT hay/và dữ liệu text cột đầu tiên thay đổi thì thay đổi theo
Thay đổi điều kiện 2: Khi cột Z có dữ liệu.
Điều kiện 3: Bấm nút GPE
 

File đính kèm

  • Gpe_.xlsb
    38.9 KB · Đọc: 17
Upvote 0
Sub CapNhat mình đã viết tương đối hoàn chỉnh, chỉ cần xác định các điều kiện xử lý tự động là gọi thực thi
Bạn phải lường trước tất cả các thao tác có thể thực hiện trên bảng tính và yêu cầu code sẽ tự động xử lý như thế nào thật cụ thể và đầy đủ mới viết code được
Ví dụ theo file mình gởi, có 1 số thao tác bạn phải nói rỏ code sẽ làm gì?
Làm theo và đưa yêu cầu xử lý
1/ ô V26:
_ Xóa dữ liệu: code sẽ làm gì?
_ Sau đó Nhập "1300": code sẽ làm gì?
2/ ô AF27:
_ Xóa dữ liệu ô AF27 ...,
_ nhập "GEL" vào ô AF27 ...
_ nhập "RCHA" vào ô AP28 ...
3/ Nhập "RCHA" vào ô AP28 ...
Mình đã cơ bản hoàn thành mục tiêu, về phần điều kiện để tự động khác phức tạp và để xác định thì cần thời gian chạy thử nghiệm để từ đó nâng cấp. Khi xác định được, mình sẽ liên hệ để hổ trợ

Rất cảm ơn @HieuCD@Ba Tê . Chúc năm mới, sức khỏe và thành công
 
Upvote 0
Web KT

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

Back
Top Bottom