Sử dụng macro VBA để sao chép và dán vào một trang tính khác với 2 hàng tiêu đề


0

Tôi đã tham gia một vài lớp lập trình ở trường đại học nhưng là một người mới hoàn thành tại excel (đây là chương trình excel đầu tiên của tôi). Sếp của tôi yêu cầu tôi tạo ra một chương trình excel để theo dõi các đơn đặt hàng bánh.

Bảng đầu tiên dành cho mục nhập trong đó tất cả thông tin cho đơn hàng được nhập và bạn đặt "x" vào cột trong ngày khách hàng muốn nhận đơn đặt hàng. Khi "x" được nhập, hàng sẽ được sao chép vào bảng ngày tương ứng cũng như bảng chính và sau đó bị xóa khỏi bảng nhập. Khi hàng được sao chép sang các trang tính khác, tất cả các hàng được sắp xếp theo tên cuối cùng (cột b). Tất cả điều đó hoạt động tốt.

Vấn đề là tôi cần phải có 2 hàng tiêu đề cho các trang tính mà hàng được sao chép vào. Hàng đầu tiên chứa tên của những chiếc bánh và thông tin thích hợp khác về ý nghĩa của cột đó đối với đơn hàng. Hàng thứ hai cần phải là tổng số sẽ tự cập nhật số lượng từng chiếc bánh riêng lẻ. Chỉ với 1 hàng tiêu đề, nó hoạt động tốt nhưng sau khi thêm vào hàng thứ hai đó, tôi dường như không thể nhận được excel để không sắp xếp hàng tiêu đề thứ hai của mình khi trang tính được điền.

Các kicker là tôi đã làm việc này 2 năm trước và ông chủ của tôi đã xóa nó. Vì vậy, tôi biết điều đó là có thể nhưng tôi chỉ không thể tìm ra nó trong khoảng thời gian này cho dù tôi có tìm kiếm bao nhiêu về vấn đề này. Bất kỳ trợ giúp / ý tưởng sẽ được đánh giá rất cao!

Ảnh chụp màn hình của tờ nhập cảnh:

http://imgur.com/BsnOsZ0

Ảnh chụp màn hình thứ ba (một tờ đích):

http://imgur.com/nIkfqoQ Mã macro trên bảng nhập:

Private Sub Worksheet_Change(ByVal Target As Range)


Application.EnableEvents = False
 If Target.Column = 21 Then
    If Target.Value = "x" Then
        Target.EntireRow.Copy Destination:=Sheets("Tuesday"). _
        Range("A" & Rows.Count).End(xlUp).Offset(1)
        Target.EntireRow.Copy Destination:=Sheets("Master"). _
        Range("A" & Rows.Count).End(xlUp).Offset(1)
        Target.EntireRow.Delete
    End If
 ElseIf Target.Column = 22 Then
     If Target.Value = "x" Then
        Target.EntireRow.Copy Destination:=Sheets("Wednesday"). _
        Range("A" & Rows.Count).End(xlUp).Offset(1)
        Target.EntireRow.Copy Destination:=Sheets("Master"). _
        Range("A" & Rows.Count).End(xlUp).Offset(1)
        Target.EntireRow.Delete
    End If
  ElseIf Target.Column = 23 Then
     If Target.Value = "x" Then
        Target.EntireRow.Copy Destination:=Sheets("Thursday"). _
        Range("A" & Rows.Count).End(xlUp).Offset(1)
        Target.EntireRow.Copy Destination:=Sheets("Master"). _
        Range("A" & Rows.Count).End(xlUp).Offset(1)
        Target.EntireRow.Delete
    End If
 End If
 Application.EnableEvents = True

 With Sheets("Tuesday")
.Columns("A:W").Sort Key1:=.Range("B1"), Order1:=xlAscending, Header:=xlYes
End With

With Sheets("Wednesday")
.Columns("A:W").Sort Key1:=.Range("B1"), Order1:=xlAscending, Header:=xlYes
End With

With Sheets("Thursday")
.Columns("A:W").Sort Key1:=.Range("B1"), Order1:=xlAscending, Header:=xlYes
End With

With Sheets("Master")
.Columns("A:W").Sort Key1:=.Range("B1"), Order1:=xlAscending, Header:=xlYes
End With



End Sub

Bạn đã thay đổi phạm vi khóa sắp xếp của bạn thành "B2"?
Scott Holtzman

Bạn có thể tìm ra hàng cuối cùng trong bảng có chứa dữ liệu không? Hãy thử thay đổi Columns("A:W").Sortđể Range("A3:W999").Sort, và để Headermặc định xlNo.
Scott

Câu trả lời:


0

Như Scott đã nói, không sử dụng A:W. Hãy thử nó như thế này:

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Long, sht As Variant
  sht = Array("Master", "Tuesday", "Wednesday", "Thursday")

  If Target.Column > 20 And Target.Column < 24 Then
    If Target.Value = "x" Then

      Application.EnableEvents = False

      Target.EntireRow.Copy Sheets(sht(Target.Column - 20)).Range("A" & Rows.Count).End(xlUp).Offset(1)
      Target.EntireRow.Copy Sheets(sht(0)).Range("A" & Rows.Count).End(xlUp).Offset(1)

      Application.EnableEvents = True

      For i = 0 To 4
        With Sheets(sht(i))
          .Range("A3:W" & .Cells(Rows.Count, 2).End(xlUp).Row).Sort .Cells(2, 1), 1
        End With
      Next
    End If
  End If
End Sub

Cảm ơn bạn rất nhiều Scott và Dirk vì sự giúp đỡ của bạn! Tôi thực sự đã làm cho nó hoạt động bằng cách sử dụng một cách giải quyết. Để giữ hàng tiêu đề thứ hai của tôi, tất cả những gì tôi cần là một khoảng trống trong cột được sắp xếp, không trống mà là một khoảng trắng. Tuy nhiên, nó chỉ hoạt động nếu tôi không cần bất cứ thứ gì trong tiêu đề cột đó. Như tôi đã đề cập trong bài viết gốc của mình, đây là nỗ lực đầu tiên của tôi đối với các vba macro và đã ghép nhiều phần của nó lại với nhau từ việc quét mã trên các diễn đàn khác nhau và thay đổi nó để "làm cho nó hoạt động".
Sebler19

Tôi rất vui khi thử các đề xuất và mã của bạn để tôi có thể tạo ra các chương trình tốt hơn trong tương lai nơi tôi có thể cần một cái gì đó trong cột hàng tiêu đề thứ hai mà tôi sắp xếp theo. Một lần nữa cảm ơn bạn rất nhiều vì đã giúp đỡ người mới!
Sebler19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.