Code xử lý dữ liệu

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ả nhà !

Em muốn nhờ mọi người viết hộ em đoạn code xử lý dữ liệu, em yếu môn này quá, mong mọi người giúp đỡ. Các yêu cầu em đã ghi trong file đính kèm. Cảm ơn cả nhà nhiều.
 
Chào cả nhà !

Em muốn nhờ mọi người viết hộ em đoạn code xử lý dữ liệu, em yếu môn này quá, mong mọi người giúp đỡ. Các yêu cầu em đã ghi trong file đính kèm. Cảm ơn cả nhà nhiều.
Theo như bạn trình bày trong file thì
1. Dữ liệu dòng 79 và 80 các sheet bị lỗi #REF
2. Số cột dòng màu đỏ 31 trong khi đó số cột còn lại sheet 20. Vậy bạn copy thủ công sang 1 trường hợp để mọi người dể hiểu
 
Upvote 0
Đoạn code của bạn đây

PHP:
Option Explicit
Sub GPE()
 Dim Sh As Worksheet, dRng As Range, sRng As Range
 Dim Col As Byte, Dg As Integer
 
 Sheets("capability").Select
 For Each Sh In ThisWorkbook.Worksheets
   If Sh.Name <> "capability" Then
      Set sRng = Sh.[A79].End(xlToRight)
      Col = sRng.CurrentRegion.Columns.Count
      Set dRng = Range("iu7").End(xlToLeft).Offset(, 1)
      sRng.Offset(, 1).Resize(2, Col).Copy
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
   End If
 Next Sh
 Application.CutCopyMode = False
End Sub

/-)ể có được nó, mình fải:

(1) Thay toàn bộ dữ liệu đang sai thành dữ liệu giả lập khác ở cả 5 trang tính

(2) Xóa bớt những dòng dưới dòng 80 để nhẹ bớt gách nặng cho máy của mình;

Đán ra việc này là việc của bạn, như

(*) Không nên đưa trang tính còn công thức lỗi lên diễn đàn, nếu không fải nhờ sửa công thức lại cho đúng.

(*) Chỉ nên đưa dữ liệu giả lập vừa đủ lên thôi (GPE không muốn làm bạn ỉ lại nó đâu đó nhe!)
 
Upvote 0
Theo như bạn trình bày trong file thì
1. Dữ liệu dòng 79 và 80 các sheet bị lỗi #REF
2. Số cột dòng màu đỏ 31 trong khi đó số cột còn lại sheet 20. Vậy bạn copy thủ công sang 1 trường hợp để mọi người dể hiểu

1.Dữ liệu dòng 79 và 80 không bị lỗi đâu bạn vì trong file đó có Sub lấy dữ liệu từ các file khác (file đang active) nên khi không mở các file đó thì nó không cập nhật dữ liệu đó.
2. Số cột dòng màu đỏ là 32*5 vậy là 160 cell mà bên sheet capability có 159 dòng tương ứng. Sorry bạn insert họ mình thêm 1 dòng nữa vậy.

Thanks.
 
Upvote 0
PHP:
Option Explicit
Sub GPE()
 Dim Sh As Worksheet, dRng As Range, sRng As Range
 Dim Col As Byte, Dg As Integer
 
 Sheets("capability").Select
 For Each Sh In ThisWorkbook.Worksheets
   If Sh.Name <> "capability" Then
      Set sRng = Sh.[A79].End(xlToRight)
      Col = sRng.CurrentRegion.Columns.Count
      Set dRng = Range("iu7").End(xlToLeft).Offset(, 1)
      sRng.Offset(, 1).Resize(2, Col).Copy
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
   End If
 Next Sh
 Application.CutCopyMode = False
End Sub

/-)ể có được nó, mình fải:

(1) Thay toàn bộ dữ liệu đang sai thành dữ liệu giả lập khác ở cả 5 trang tính

(2) Xóa bớt những dòng dưới dòng 80 để nhẹ bớt gách nặng cho máy của mình;

Đán ra việc này là việc của bạn, như

(*) Không nên đưa trang tính còn công thức lỗi lên diễn đàn, nếu không fải nhờ sửa công thức lại cho đúng.

(*) Chỉ nên đưa dữ liệu giả lập vừa đủ lên thôi (GPE không muốn làm bạn ỉ lại nó đâu đó nhe!)

Thanks bạn nhiều mình sẽ rút kinh nghiệm lần sau.
 
Upvote 0
PHP:
Option Explicit
Sub GPE()
 Dim Sh As Worksheet, dRng As Range, sRng As Range
 Dim Col As Byte, Dg As Integer
 
 Sheets("capability").Select
 For Each Sh In ThisWorkbook.Worksheets
   If Sh.Name <> "capability" Then
      Set sRng = Sh.[A79].End(xlToRight)
      Col = sRng.CurrentRegion.Columns.Count
      Set dRng = Range("iu7").End(xlToLeft).Offset(, 1)
      sRng.Offset(, 1).Resize(2, Col).Copy
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
   End If
 Next Sh
 Application.CutCopyMode = False
End Sub

/-)ể có được nó, mình fải:

(1) Thay toàn bộ dữ liệu đang sai thành dữ liệu giả lập khác ở cả 5 trang tính

(2) Xóa bớt những dòng dưới dòng 80 để nhẹ bớt gách nặng cho máy của mình;

Đán ra việc này là việc của bạn, như

(*) Không nên đưa trang tính còn công thức lỗi lên diễn đàn, nếu không fải nhờ sửa công thức lại cho đúng.

(*) Chỉ nên đưa dữ liệu giả lập vừa đủ lên thôi (GPE không muốn làm bạn ỉ lại nó đâu đó nhe!)

Chào bạn !

Cái code của bạn mình đã dùng thử nhưng chưa đúng ý mình lắm. Mong bạn xem lại file đính kèm này, trong đó mình đã giải thích rõ ràng hơn và cũng có dữ liệu giả lập cùng kết quả mong muốn. Cảm ơn bạn nhiều.
 
Upvote 0
Chào bạn !

Cái code của bạn mình đã dùng thử nhưng chưa đúng ý mình lắm. Mong bạn xem lại file đính kèm này, trong đó mình đã giải thích rõ ràng hơn và cũng có dữ liệu giả lập cùng kết quả mong muốn. Cảm ơn bạn nhiều.
Vậy có phải như thế này không
 

File đính kèm

Upvote 0
Chào bạn ! (1) Cái code của bạn mình đã dùng thử nhưng chưa đúng ý mình lắm.
(2) Mong bạn xem lại file đính kèm này, trong đó mình đã giải thích rõ ràng hơn và cũng có dữ liệu giả lập cùng kết quả mong muốn. Cảm ơn bạn nhiều.

Ý của bạn ở bài đầu topic ư, nó đây:
"Yêu cầu:
Em muốn copy dữ liệu ở 2 dòng 79 và 80 (vùng có màu đỏ) của các sheet Front boy1, Roof, Side1, Side2, Side3 và lần lượt paste special từ trên xuống bắt đầu từ dòng 7 các cột của sheet capability.

Với điều kiện ví dụ: Nếu ở 2 cột I và J chưa có dữ liệu thì sẽ điền dữ liệu được copy vào 2 cột I và J. Nếu 2 cột I và J có dữ liệu rồi thì sẽ điền dữ liệu copy được và 2 cột K và L

Nếu 2 cột K và L có dữ liệu rồi thì sẽ điền dữ liệu copy được và 2 cột M và N. Cứ như vậy đến cột AE và AF.

Như trong bảng bên cạnh thì dữ liệu copy tiếp tục được paste special vào 2 cột M và N.

Vậy em muốn nhờ các anh chị viết giúp em 1 đoạn code để thực hiện viêc này"

Mình nghĩ là macro đã thỏa iêu cầu này của bạn.

Bạn hãy khẳng định lại 1 lần nữa xem macro đã đúng với iêu cầu này của bạn chưa vậy?

Từ việc khẳng định của bạn mới sẽ có (2)
 
Upvote 0
Ý của bạn ở bài đầu topic ư, nó đây:
"Yêu cầu:
Em muốn copy dữ liệu ở 2 dòng 79 và 80 (vùng có màu đỏ) của các sheet Front boy1, Roof, Side1, Side2, Side3 và lần lượt paste special từ trên xuống bắt đầu từ dòng 7 các cột của sheet capability.

Với điều kiện ví dụ: Nếu ở 2 cột I và J chưa có dữ liệu thì sẽ điền dữ liệu được copy vào 2 cột I và J. Nếu 2 cột I và J có dữ liệu rồi thì sẽ điền dữ liệu copy được và 2 cột K và L

Nếu 2 cột K và L có dữ liệu rồi thì sẽ điền dữ liệu copy được và 2 cột M và N. Cứ như vậy đến cột AE và AF.

Như trong bảng bên cạnh thì dữ liệu copy tiếp tục được paste special vào 2 cột M và N.

Vậy em muốn nhờ các anh chị viết giúp em 1 đoạn code để thực hiện viêc này"

Mình nghĩ là macro đã thỏa iêu cầu này của bạn.

Bạn hãy khẳng định lại 1 lần nữa xem macro đã đúng với iêu cầu này của bạn chưa vậy?

Từ việc khẳng định của bạn mới sẽ có (2)

Macro của bạn HYen17 chưa đúng với những yêu cầu của mình (yêu cầu 1). Trong yêu cầu 2 mình sợ mọi người không hiểu và cũng theo yêu cầu của bạn HYen17, mình đã giải thích rõ ràng hơn với những ví dụ và dữ liệu giả lập. Nếu Macro hoạt động đúng như yêu cầu 2 là đúng ý mình. Thanks các bạn nhiều.
 
Upvote 0
Mọi người ơi giúp em với. Em đang cần lắm+-+-+-+.
 
Upvote 0
Vậy có phải như thế này không

Bạn ơi, bạn có thể chỉnh sửa cái code này hộ mình được không ? Cảm ơn bạn.

Có mấy vấn đề như sau khi chạy code:

1. Nó copy dữ liệu ở tất cả các sheet có cùng cấu trúc và có dữ liệu nhưng mình lại chỉ muốn lấy dữ liệu ở 5 sheet có tên là Fontbody1, Roof, Side1, Side2, Side3 thôi.
2. Các dữ liệu copy được paste ra thành nhiều cột mà mình muốn khi click nút comman lần 1 thì cả tất cả dữ liệu được paste vào 1 cột. Nghĩa là dữ liệu copy được ở Frontbody1 được paste từ cột I7:J38, dữ liệu copy được ở Roof được paste từ cột I9:J70, dữ liệu copy được ở Side1 được paste từ cột I71:J102 ... cứ nối như vậy đến hết sheet Side3. Ấn nút comman lần 2 thì dữ liệu copy được ở Frontbody1 được paste từ cột K7:L38, dữ liệu copy được ở Roof được paste từ cột K9:L70, dữ liệu copy được ở Side1 được paste từ cột K71:L102 ... cứ nối như vậy đến hết sheet Side3. Cứ như vậy nếu click 12 lần nút comman thì dữ liệu sẽ được paste đến cột AE và AF.
Mong tin bạn sớm.%#^#$
 
Upvote 0
Bạn ơi, bạn có thể chỉnh sửa cái code này hộ mình được không ? Cảm ơn bạn.

Có mấy vấn đề như sau khi chạy code:

1. Nó copy dữ liệu ở tất cả các sheet có cùng cấu trúc và có dữ liệu nhưng mình lại chỉ muốn lấy dữ liệu ở 5 sheet có tên là Fontbody1, Roof, Side1, Side2, Side3 thôi.
2. Các dữ liệu copy được paste ra thành nhiều cột mà mình muốn khi click nút comman lần 1 thì cả tất cả dữ liệu được paste vào 1 cột. Nghĩa là dữ liệu copy được ở Frontbody1 được paste từ cột I7:J38, dữ liệu copy được ở Roof được paste từ cột I9:J70, dữ liệu copy được ở Side1 được paste từ cột I71:J102 ... cứ nối như vậy đến hết sheet Side3. Ấn nút comman lần 2 thì dữ liệu copy được ở Frontbody1 được paste từ cột K7:L38, dữ liệu copy được ở Roof được paste từ cột K9:L70, dữ liệu copy được ở Side1 được paste từ cột K71:L102 ... cứ nối như vậy đến hết sheet Side3. Cứ như vậy nếu click 12 lần nút comman thì dữ liệu sẽ được paste đến cột AE và AF.
Mong tin bạn sớm.%#^#$
5 Sheet dữ liệu có 32*5=160 hàng trong khi đó Sheet capability có 159 hàng bạn tính sao đây?
 

File đính kèm

Upvote 0
5 Sheet dữ liệu có 32*5=160 hàng trong khi đó Sheet capability có 159 hàng bạn tính sao đây?

Cảm ơn bạn, code này về cơ bản là ok rồi. Nhưng vẫn còn 1 chút vấn đề nữa cần chỉnh sửa. Bạn xem hoàn thiện nốt giúp mình nhé (làm phiền bạn quá&&&%$R).

1. Nếu để đúng như file bạn up lên thì mình chạy code ok. Mình thêm 4 sheet nữa vào file, sau đó chạy code lần 1 xong thì nó báo lỗi (bạn thử sẽ thấy ngay). Mình lại chạy code lần 2 thì dữ liệu cũng sai luôn cả vị trí.
2. Còn về số dòng 159<>160 thì mình đã insert thêm nhưng mình muốn nếu dữ liệu ở 5 sheet kia là lỗi #NA thì để trống. Bạn xem file đính kèm mình đã chú thích rõ ràng rồi. Một lần nữa xin cảm ơn bạn.
 
Upvote 0
Cảm ơn bạn, code này về cơ bản là ok rồi. Nhưng vẫn còn 1 chút vấn đề nữa cần chỉnh sửa. Bạn xem hoàn thiện nốt giúp mình nhé (làm phiền bạn quá&&&%$R).

1. Nếu để đúng như file bạn up lên thì mình chạy code ok. Mình thêm 4 sheet nữa vào file, sau đó chạy code lần 1 xong thì nó báo lỗi (bạn thử sẽ thấy ngay). Mình lại chạy code lần 2 thì dữ liệu cũng sai luôn cả vị trí.
2. Còn về số dòng 159<>160 thì mình đã insert thêm nhưng mình muốn nếu dữ liệu ở 5 sheet kia là lỗi #NA thì để trống. Bạn xem file đính kèm mình đã chú thích rõ ràng rồi. Một lần nữa xin cảm ơn bạn.
1. File bạn gửi khác gì file của mình đâu?
2. Bạn chạy lần đầu bị lỗi là do bạn chưa chèn thêm 1 hàng nữa (thiếu 1 hàng) như tôi đã nói ở trên, bạn chèn thêm và chạy lại xem
3. Dữ liệu bị lỗi để trống?
Sao khi bạn lập công thức trên các sheet đó bạn không bẩy lỗi luôn? Tự làm khó mình chi vậy?
 
Upvote 0
1. File bạn gửi khác gì file của mình đâu?
2. Bạn chạy lần đầu bị lỗi là do bạn chưa chèn thêm 1 hàng nữa (thiếu 1 hàng) như tôi đã nói ở trên, bạn chèn thêm và chạy lại xem
3. Dữ liệu bị lỗi để trống?
Sao khi bạn lập công thức trên các sheet đó bạn không bẩy lỗi luôn? Tự làm khó mình chi vậy?

Bạn ơi mình đã insert thêm dòng và chạy thử lại rồi vẫn bị lỗi bạn ah. Bạn thử lấy file xuống, xóa hết số liệu cũ đi và chạy lại từ đầu là bạn sẽ thấy ngay mà. Mong tin bạn.
 
Upvote 0
1. File bạn gửi khác gì file của mình đâu?
2. Bạn chạy lần đầu bị lỗi là do bạn chưa chèn thêm 1 hàng nữa (thiếu 1 hàng) như tôi đã nói ở trên, bạn chèn thêm và chạy lại xem
3. Dữ liệu bị lỗi để trống?
Sao khi bạn lập công thức trên các sheet đó bạn không bẩy lỗi luôn? Tự làm khó mình chi vậy?


Mình sửa lại cái code của bạn thành thế này

Mã:
Sub COPY()
 Dim Sh As Worksheet, dRng As Range, sRng As Range
 Dim Col As Byte, Dg As Integer, Cot As Double
Application.ScreenUpdating = False
 Set dRng = Sheet2.Range("iu7").End(xlToLeft).Offset(, 1)
 Cot = dRng.Column
 For Each Sh In ThisWorkbook.Worksheets
   If Sh.Name = "Front body1" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
    If Sh.Name = "Roof" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
    If Sh.Name = "Side1" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
    If Sh.Name = "Side2" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
    If Sh.Name = "Side3" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
 Next Sh
 Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub
Nó chạy đúng ý mình nhưng hình như hơi dài. Bạn có cách nào rút gọn lại nó được không. Mình mới học VBA (chỉ đọc sách của anh Phan Tự Hướng) nên vẫn còn yếu lắm, mong mọi người chỉ giúp.
 
Upvote 0
Bạn thử chạy macro sau xem sao:

PHP:
Option Explicit
Sub gpeCOPY()
 Dim Sh As Worksheet, dRng As Range, sRng As Range
 Dim Col As Byte, Dg As Integer, Cot As Double
 Dim MyName As String
 
Application.ScreenUpdating = False
 MyName = "Front body1RoofSide1Side2Side3"
 Set dRng = Sheet2.Range("iu7").End(xlToLeft).Offset(, 1)
 Cot = dRng.Column
 For Each Sh In ThisWorkbook.Worksheets
   If InStr(MyName, Sh.Name) Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
1   GoTo GPE
    If Sh.Name = "Roof" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
    If Sh.Name = "Side1" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
    If Sh.Name = "Side2" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
    If Sh.Name = "Side3" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
9 GPE:
 Next Sh
 Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

Sau khi chạy mà kết quả vẫn đúng thì bạn bỏ các dòng lệnh từ số 1 đến dòng mang số 9
 
Upvote 0
PHP:
Option Explicit
Sub gpeCOPY()
 Dim Sh As Worksheet, dRng As Range, sRng As Range
 Dim Col As Byte, Dg As Integer, Cot As Double
 Dim MyName As String
 
Application.ScreenUpdating = False
 MyName = "Front body1RoofSide1Side2Side3"
 Set dRng = Sheet2.Range("iu7").End(xlToLeft).Offset(, 1)
 Cot = dRng.Column
 For Each Sh In ThisWorkbook.Worksheets
   If InStr(MyName, Sh.Name) Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
1   GoTo GPE
    If Sh.Name = "Roof" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
    If Sh.Name = "Side1" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
    If Sh.Name = "Side2" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
    If Sh.Name = "Side3" Then
      Sh.Range("BX79:DC80").COPY
      dRng.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
      Set dRng = Sheet2.Cells(165, Cot).End(xlUp).Offset(1)
   End If
9 GPE:
 Next Sh
 Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

Sau khi chạy mà kết quả vẫn đúng thì bạn bỏ các dòng lệnh từ số 1 đến dòng mang số 9

Em bỏ các dòng lệnh và chạy thử, kết quả ok, cho em hỏi thêm câu này nhé (hơi gà chút--=0): Em muốn thay đổi chữ CommanButton1 thành COPY thì làm cách nào vậy ?&&&%$R Cảm ơn bác nhiều.
 
Upvote 0
Web KT

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

Back
Top Bottom