Giúp Code Copy data từ các sheet theo Form

  • Thread starter Thread starter letuvan
  • Ngày gửi Ngày gửi
Liên hệ QC

letuvan

Thành viên mới
Tham gia
31/12/11
Bài viết
18
Được thích
1
Nhờ các cao nhân chỉ giáo

E cần copy các dữ liệu từ các sheet 1 sheet 2, sheet 3 vào Sheet "Form"

Sheet "Form" đã cố định các cột dữ liệu cần copy từ các sheet 1,2,3. tên các tiêu đề cột các sheet 1,2,3 giống nhau nhưng sắp xếp thứ tự các cột khác nhau

Do data lớn mỗi sheet 30k dòng ( nhiều sheet) nên e dùng công thức rât nặng. Mong các bác chỉ giáo

E gửi kèm theo file đính kèm ạ

E cám ơn
 

File đính kèm

Nhờ các cao nhân chỉ giáo

E cần copy các dữ liệu từ các sheet 1 sheet 2, sheet 3 vào Sheet "Form"

Sheet "Form" đã cố định các cột dữ liệu cần copy từ các sheet 1,2,3. tên các tiêu đề cột các sheet 1,2,3 giống nhau nhưng sắp xếp thứ tự các cột khác nhau

Do data lớn mỗi sheet 30k dòng ( nhiều sheet) nên e dùng công thức rât nặng. Mong các bác chỉ giáo

E gửi kèm theo file đính kèm ạ

E cám ơn
Không phải cao nhân được không bạn.
 
Upvote 0
Thiết kế các trang tính quá ư tùy tiện như vậy thì cao nhân sẽ chào thua; Chỉ các thấp nhân mới dám giúp bạn thôi. Mà giúp bạn là hại bạn về lâu dài đó; Chả tốt lành gì đâu!

Ngay đến 3 trang tính chứa dữ liệu (cần copy) cũng không giống nhau nữa thì chả mấy chốc CSDL của bạn thành đống phân chứ không thể thành đống rác đâu!

Thân ái!
 
Upvote 0
Nhờ các cao nhân chỉ giáo

E cần copy các dữ liệu từ các sheet 1 sheet 2, sheet 3 vào Sheet "Form"

Sheet "Form" đã cố định các cột dữ liệu cần copy từ các sheet 1,2,3. tên các tiêu đề cột các sheet 1,2,3 giống nhau nhưng sắp xếp thứ tự các cột khác nhau

Do data lớn mỗi sheet 30k dòng ( nhiều sheet) nên e dùng công thức rât nặng. Mong các bác chỉ giáo

E gửi kèm theo file đính kèm ạ

E cám ơn
Góp ý cho bạn.
Muốn làm cái gì đó đối với nhiều sheet thì hãy nghĩ ngay đến cấu trúc của nó phải giống nhau về tiêu đề cột và thứ tự các cột, nó có 2 cái lợi là dễ dàng gộp sheet, nếu phát hiện ra sai sót thì dễ dàng kiểm tra lại nó sai ở sheet nào.
 
Upvote 0
Cám ơn mn góp ý.
Do dữ liệu từ 1 nguồn độc lập nên mình ko thể can thiệp để yêu cầu họ xuất theo ý mình, vai trò của mình là check chéo trên database nhận được
Về thông tin mình cũng chỉ quan trọng 5-7 trường thông tin còn lại các cột chỉ để tham khảo khi cần

Mong nhận được góp ý và giúp đỡ của mn
Mình cám ơn
 
Upvote 0
Cám ơn mn góp ý.
Do dữ liệu từ 1 nguồn độc lập nên mình ko thể can thiệp để yêu cầu họ xuất theo ý mình, vai trò của mình là check chéo trên database nhận được
Về thông tin mình cũng chỉ quan trọng 5-7 trường thông tin còn lại các cột chỉ để tham khảo khi cần

Mong nhận được góp ý và giúp đỡ của mn
Mình cám ơn
Vậy bạn chỉ cần lấy Data kết quả thôi.cái tổng hợp chỉ cần 5 đến 7 trường thông tin thôi.
 
Upvote 0
Góp ý cho bạn.
Muốn làm cái gì đó đối với nhiều sheet thì hãy nghĩ ngay đến cấu trúc của nó phải giống nhau về tiêu đề cột và thứ tự các cột, nó có 2 cái lợi là dễ dàng gộp sheet, nếu phát hiện ra sai sót thì dễ dàng kiểm tra lại nó sai ở sheet nào.
Theo kinh nghiệm của tôi thì đề xuất lãnh đạo ban hành 1 mẫu thống nhất gửi cho các bộ phận trực thuộc sử dụng.
Khi các đơn vị gửi File báo cáo về thì bỏ vào Folder và chỉ việc gộp File rồi sử dụng PivotTable là tổng hợp được kết quả cần báo cáo.
 
Upvote 0
Vậy bạn chỉ cần lấy Data kết quả thôi.cái tổng hợp chỉ cần 5 đến 7 trường thông tin thôi.
Thực tế đúng là báo cáo của mình chỉ cần 5-7 trường thông tin, nhưng mình mong muốn có thể dự phòng được các thông tin khi cần, để khi hỏi thì mình có thể xoay được ngay
Bài đã được tự động gộp:

Theo kinh nghiệm của tôi thì đề xuất lãnh đạo ban hành 1 mẫu thống nhất gửi cho các bộ phận trực thuộc sử dụng.
Khi các đơn vị gửi File báo cáo về thì bỏ vào Folder và chỉ việc gộp File rồi sử dụng PivotTable là tổng hợp được kết quả cần báo cáo.
Cám ơn bạn, do CTTV mình cũng chưa nắm quyền chi phối nên cũng khó trong trường hợp này, hơn nữa mình lại gộp từ nhiều CTTV khác nhau, việc này hiện tại chưa làm được
 
Upvote 0
Thực tế đúng là báo cáo của mình chỉ cần 5-7 trường thông tin, nhưng mình mong muốn có thể dự phòng được các thông tin khi cần, để khi hỏi thì mình có thể xoay được ngay.
Cám ơn bạn, do CTTV mình cũng chưa nắm quyền chi phối nên cũng khó trong trường hợp này, hơn nữa mình lại gộp từ nhiều CTTV khác nhau, việc này hiện tại chưa làm được
Vậy thì bạn chỉ còn cách tự sắp xếp tiêu đề các sheet cho giống nhau (là cách đơn giản nhất) rồi gộp sheet, sau đó copy sang sheet mới rồi xóa những cột không cần thiết hoặc có thể thực hiện ngay trong sheet TH.
 
Upvote 0
Bài đã được tự động gộp:

Có A/e nào giúp mình ko ạ
Đây bạn xem code nhé.
Mã:
Sub tonghop()
Dim arr, arr1, arr2, dic As Object, lr As Long, i As Long, j As Integer, dk As String, sh As Worksheet, b As Integer, a As Long
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("TH")
         For i = 1 To 34
             dic.Item(.Cells(1, i).Value) = i
         Next i
    End With
    ReDim arr1(1 To 10000, 1 To 34)
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name <> "TH" Then
           lr = sh.Range("C" & Rows.Count).End(xlUp).Row
           If lr > 6 Then
              arr = sh.Range("A8:AH" & lr).Value
              ReDim arr2(1 To 34): b = 0
              For i = 1 To 36
                  If dic.exists(sh.Cells(6, i).Value) Then
                     b = b + 1
                     arr2(b) = dic.Item(sh.Cells(6, i).Value)
                  End If
              Next i
              For i = 1 To UBound(arr, 1)
                  a = a + 1
                  For j = 1 To b
                      arr1(a, arr2(j)) = arr(i, j)
                  Next j
              Next i
         End If
     End If
  Next
  With Sheets("TH")
   lr = .Range("A" & Rows.Count).End(xlUp).Row
   If lr > 1 Then .Range("A2:AH" & lr).ClearContents
    If a Then .Range("A2").Resize(a, 34).Value = arr1
  End With
End Sub
 

File đính kèm

Upvote 0
Đây bạn xem code nhé.
Mã:
Sub tonghop()
Dim arr, arr1, arr2, dic As Object, lr As Long, i As Long, j As Integer, dk As String, sh As Worksheet, b As Integer, a As Long
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("TH")
         For i = 1 To 34
             dic.Item(.Cells(1, i).Value) = i
         Next i
    End With
    ReDim arr1(1 To 10000, 1 To 34)
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name <> "TH" Then
           lr = sh.Range("C" & Rows.Count).End(xlUp).Row
           If lr > 6 Then
              arr = sh.Range("A8:AH" & lr).Value
              ReDim arr2(1 To 34): b = 0
              For i = 1 To 36
                  If dic.exists(sh.Cells(6, i).Value) Then
                     b = b + 1
                     arr2(b) = dic.Item(sh.Cells(6, i).Value)
                  End If
              Next i
              For i = 1 To UBound(arr, 1)
                  a = a + 1
                  For j = 1 To b
                      arr1(a, arr2(j)) = arr(i, j)
                  Next j
              Next i
         End If
     End If
  Next
  With Sheets("TH")
   lr = .Range("A" & Rows.Count).End(xlUp).Row
   If lr > 1 Then .Range("A2:AH" & lr).ClearContents
    If a Then .Range("A2").Resize(a, 34).Value = arr1
  End With
End Sub
Cám ơn bạn nhiều nhé,
Mình muốn thêm cột trong form là "tên sheet" để kiểm soát số dòng dữ liệu các sheet khi copy được ko bạn, ngoài ra mình có rất nhiều sheet tên khác nhau và mỗi sheet số lượng dòng khá lớn, bạn xem giúp mình với nhé, mình gửi file đính kèm để bạn xem lỗi khi chạy nhé
 

File đính kèm

  • Untitled.png
    Untitled.png
    105.3 KB · Đọc: 5
Upvote 0
Cám ơn bạn nhiều nhé,
Mình muốn thêm cột trong form là "tên sheet" để kiểm soát số dòng dữ liệu các sheet khi copy được ko bạn, ngoài ra mình có rất nhiều sheet tên khác nhau và mỗi sheet số lượng dòng khá lớn, bạn xem giúp mình với nhé, mình gửi file đính kèm để bạn xem lỗi khi chạy nhé
Bạn gửi file lên chứ ảnh mình xem không biết lỗi ở chỗ nào.
 
Upvote 0
Bạn gửi file lên chứ ảnh mình xem không biết lỗi ở chỗ nào.
Sorry bạn nhé, mình up lên file nặng nên bị lỗi

Mình có khoảng 15 sheet, mỗi sheet khoảng 10-30k dòng để copy lại nên bạn xem giúp mình code để có thể mở rộng phạm vi copy nhé,

Có thể bổ sung giúp mình tên sheet ở Form để quản lý số dòng copy thì càng tốt ạ

Cám ơn bạn nhiều nhé
 

File đính kèm

Upvote 0
Sorry bạn nhé, mình up lên file nặng nên bị lỗi

Mình có khoảng 15 sheet, mỗi sheet khoảng 10-30k dòng để copy lại nên bạn xem giúp mình code để có thể mở rộng phạm vi copy nhé,

Có thể bổ sung giúp mình tên sheet ở Form để quản lý số dòng copy thì càng tốt ạ

Cám ơn bạn nhiều nhé
Bạn chạy code này xem nhé.
Mã:
Sub tonghop()
Dim arr, arr1, arr2, dic As Object, lr As Long, i As Long, j As Integer, dk As String, sh As Worksheet, b As Integer, a As Long, tong As Worksheet
    Set dic = CreateObject("scripting.dictionary")
    Set tong = Sheets("TH")
    With Sheets("TH")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr > 1 Then .Range("A2:AH" & lr).ClearContents
         For i = 2 To 35
             dic.Item(.Cells(1, i).Value) = i
         Next i
    End With
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name <> "TH" Then
           lr = sh.Range("A8").End(xlDown).Row
           If lr > 8 Then
              arr = sh.Range("A8:AH" & lr).Value
              ReDim arr2(1 To 34): b = 0
              ReDim arr1(1 To UBound(arr, 1), 1 To 35): a = 0
              For i = 1 To 36
                  If dic.exists(sh.Cells(6, i).Value) Then
                     b = b + 1
                     arr2(b) = dic.Item(sh.Cells(6, i).Value)
                  End If
              Next i
              For i = 1 To UBound(arr, 1)
                  a = a + 1
                  arr1(a, 1) = sh.Name
                  For j = 1 To b
                      arr1(a, arr2(j)) = arr(i, j)
                  Next j
              Next i
              lr = tong.Range("A" & Rows.Count).End(xlUp).Row + 1
              If a Then tong.Range("A" & lr).Resize(a, 34).Value = arr1
         End If
     End If
  Next
End Sub
 

File đính kèm

Upvote 0
Bạn chạy code này xem nhé.
Mã:
Sub tonghop()
Dim arr, arr1, arr2, dic As Object, lr As Long, i As Long, j As Integer, dk As String, sh As Worksheet, b As Integer, a As Long, tong As Worksheet
    Set dic = CreateObject("scripting.dictionary")
    Set tong = Sheets("TH")
    With Sheets("TH")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr > 1 Then .Range("A2:AH" & lr).ClearContents
         For i = 2 To 35
             dic.Item(.Cells(1, i).Value) = i
         Next i
    End With
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name <> "TH" Then
           lr = sh.Range("A8").End(xlDown).Row
           If lr > 8 Then
              arr = sh.Range("A8:AH" & lr).Value
              ReDim arr2(1 To 34): b = 0
              ReDim arr1(1 To UBound(arr, 1), 1 To 35): a = 0
              For i = 1 To 36
                  If dic.exists(sh.Cells(6, i).Value) Then
                     b = b + 1
                     arr2(b) = dic.Item(sh.Cells(6, i).Value)
                  End If
              Next i
              For i = 1 To UBound(arr, 1)
                  a = a + 1
                  arr1(a, 1) = sh.Name
                  For j = 1 To b
                      arr1(a, arr2(j)) = arr(i, j)
                  Next j
              Next i
              lr = tong.Range("A" & Rows.Count).End(xlUp).Row + 1
              If a Then tong.Range("A" & lr).Resize(a, 34).Value = arr1
         End If
     End If
  Next
End Sub
Cám ơn bạn rất nhiều nhé,
Mình chạy thấy ok rồi,
Cho mình hỏi thêm nếu chạy hơn 15 sheet có được ko bạn, mình thử file trên 15 sheet thì thấy từ sheet thứ 16 là ko copy thêm
 
Upvote 0
Cám ơn bạn rất nhiều nhé,
Mình chạy thấy ok rồi,
Cho mình hỏi thêm nếu chạy hơn 15 sheet có được ko bạn, mình thử file trên 15 sheet thì thấy từ sheet thứ 16 là ko copy thêm
Nó vẫn chạy hết mà.Bạn gửi file lên mình xem nhé.
 
Upvote 0

File đính kèm

  • FORM_V2.xlsm
    FORM_V2.xlsm
    101.1 KB · Đọc: 1
  • Untitled.png
    Untitled.png
    103 KB · Đọc: 3
Upvote 0
Bạn xem giúp mình file này nhé, Data nặng nên mình tạm xóa cho nhẹ, mình chạy thấy báo lỗi như hình,

Bạn xem giúp mình với nhé,
Cám ơn bạn nhiều
Đây bạn xem nhé.
Mã:
Sub tonghop()
Dim arr, arr1, arr2, dic As Object, lr As Long, i As Long, j As Integer, dk As String, sh As Worksheet, b As Integer, a As Long, tong As Worksheet
  Application.ScreenUpdating = False
    Set dic = CreateObject("scripting.dictionary")
    Set tong = Sheets("TH")
    With Sheets("TH")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr > 1 Then .Range("A2:AH" & lr).ClearContents
         For i = 2 To 35
             dic.Item(.Cells(1, i).Value) = i
         Next i
    End With
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name <> "TH" Then
           lr = sh.Range("A8").End(xlDown).Row
           If lr = Rows.Count Then lr = 8
           If sh.Range("a8").Value <> Empty Then
              arr = sh.Range("A8:AH" & lr).Value
              ReDim arr2(1 To 34): b = 0
              ReDim arr1(1 To UBound(arr, 1), 1 To 35): a = 0
              For i = 1 To 36
                  If dic.exists(sh.Cells(6, i).Value) Then
                     b = b + 1
                     arr2(b) = dic.Item(sh.Cells(6, i).Value)
                  End If
              Next i
              For i = 1 To UBound(arr, 1)
                  a = a + 1
                  arr1(a, 1) = sh.Name
                  For j = 1 To b
                      arr1(a, arr2(j)) = arr(i, j)
                  Next j
              Next i
              lr = tong.Range("A" & Rows.Count).End(xlUp).Row + 1
              If a Then tong.Range("A" & lr).Resize(a, 34).Value = arr1
         End If
     End If
  Next
  Application.ScreenUpdating = True
End Sub
 

File đính kèm

Upvote 0
Đây bạn xem nhé.
Mã:
Sub tonghop()
Dim arr, arr1, arr2, dic As Object, lr As Long, i As Long, j As Integer, dk As String, sh As Worksheet, b As Integer, a As Long, tong As Worksheet
  Application.ScreenUpdating = False
    Set dic = CreateObject("scripting.dictionary")
    Set tong = Sheets("TH")
    With Sheets("TH")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr > 1 Then .Range("A2:AH" & lr).ClearContents
         For i = 2 To 35
             dic.Item(.Cells(1, i).Value) = i
         Next i
    End With
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name <> "TH" Then
           lr = sh.Range("A8").End(xlDown).Row
           If lr = Rows.Count Then lr = 8
           If sh.Range("a8").Value <> Empty Then
              arr = sh.Range("A8:AH" & lr).Value
              ReDim arr2(1 To 34): b = 0
              ReDim arr1(1 To UBound(arr, 1), 1 To 35): a = 0
              For i = 1 To 36
                  If dic.exists(sh.Cells(6, i).Value) Then
                     b = b + 1
                     arr2(b) = dic.Item(sh.Cells(6, i).Value)
                  End If
              Next i
              For i = 1 To UBound(arr, 1)
                  a = a + 1
                  arr1(a, 1) = sh.Name
                  For j = 1 To b
                      arr1(a, arr2(j)) = arr(i, j)
                  Next j
              Next i
              lr = tong.Range("A" & Rows.Count).End(xlUp).Row + 1
              If a Then tong.Range("A" & lr).Resize(a, 34).Value = arr1
         End If
     End If
  Next
  Application.ScreenUpdating = True
End Sub
Cám ơn bạn rất nhiều, mình đã chạy thử và thành công
Chúc bạn sức khỏe và nhiều niềm vui
 
Upvote 0
Web KT

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

Back
Top Bottom