[Giúp đỡ] Lấy dữ liệu từ 2 Sheet vào Sheet

Liên hệ QC

quyenpv

Thu nhặt kiến thức
Tham gia
5/1/13
Bài viết
719
Được thích
97
Giới tính
Nam
Nghề nghiệp
Decode cuộc đời!
Em chào anh chị em đang cần lấy dữ liệu từ 2 Sheet PLHD_XL và PLHD_TV sang Sheet Import, em đang dùng 2 mảng và 2 vòng lặp For để lấy kết quả thì tạm được, mong anh chị sửa giúp, tối ưu Code giúp em
Do chắp vá nên không hiểu được bản chất và cách làm lắm ạ
Em cám ơn

Dữ liệu Sheet PLHD_XL

1606558416929.png

Dữ liệu Sheet PLHD_TV

1606558433549.png
Kết quả

1606558450680.png

Mã:
Sub Input_CV()

    Dim I, k, ktv, ar, ketqua
    Dim LastRow As Long
    Dim Nguon, Dong
    
    Sheets("A_Import_CV").Select
    Sheets("A_Import_CV").Range("A2:K" & Range("B" & Rows.Count).End(3).Row + 1).Clear

    With Sheets("PLHD_XL")                                                     'Lay thong tin tai Sheet PLHD_XL
        Dong = .Range("B12").End(xlDown).Row
        Nguon = .Range("B12", "G" & Dong)                          'Cot cuoi cung tai Sheet Input_TB
        Dong = UBound(Nguon)
    End With

    ReDim ketqua(1 To Dong, 1 To 10)

    For I = 1 To Dong
        If Nguon(I, 4) > 0 Then
            k = k + 1
            ketqua(k, 1) = k                                                'STT
            ketqua(k, 2) = "Chi phí xây l" & ChrW(7855) & "p"               'Hang muc CP
            ketqua(k, 3) = "HM1"                                            'Ma HM"
            ketqua(k, 4) = "TEN HM"                                         'Ten HM
            ketqua(k, 5) = Nguon(I, 1)                                      'Ma CV
            ketqua(k, 6) = Nguon(I, 2)                                      'Ten CV
            ketqua(k, 7) = Nguon(I, 3)                                      'DVT
            ketqua(k, 8) = Nguon(I, 4)                                      'KLuong
            ketqua(k, 9) = Nguon(I, 5) / 1.1                                'Don Gia
            ketqua(k, 10) = ketqua(k, 8) * ketqua(k, 9) * 0.1
        '    ketqua(k, 11) = ketqua(k, 8) * ketqua(k, 9) + ketqua(k, 10)

        End If

    Next I
    

        
    Sheets("A_Import_CV").Range("A2").Resize(k, 10) = ketqua
    LastRow = Sheets("A_Import_CV").Cells(Rows.Count, "b").End(xlUp).Row
    With Sheets("PLHD_TV")                                                     'Lay thong tin tai Sheet PLHD_XL
        Dong = .Range("B12").End(xlDown).Row
        Nguon = .Range("B12", "G" & Dong)                          'Cot cuoi cung tai Sheet Input_TB
        Dong = UBound(Nguon)
    End With

    ReDim ketqua(1 To Dong, 1 To 10)
    
    For I = 1 To Dong
 
        If Nguon(I, 4) > 0 Then
            ktv = ktv + 1
            ketqua(ktv, 1) = ktv                                                'STT
            ketqua(ktv, 2) = "Chi phí TV"               'Hang muc CP
            ketqua(ktv, 3) = "HM2"                                            'Ma HM"
            ketqua(ktv, 4) = "TEN HM"                                         'Ten HM
            ketqua(ktv, 5) = Nguon(I, 1)                                      'Ma CV
            ketqua(ktv, 6) = Nguon(I, 2)                                      'Ten CV
            ketqua(ktv, 7) = Nguon(I, 3)                                      'DVT
            ketqua(ktv, 8) = Nguon(I, 4)                                      'KLuong
            ketqua(ktv, 9) = Nguon(I, 5) / 1.1                                'Don Gia
            ketqua(ktv, 10) = ketqua(ktv, 8) * ketqua(ktv, 9) * 0.1
        '    ketqua(k, 11) = ketqua(k, 8) * ketqua(k, 9) + ketqua(k, 10)

        End If

    Next I
    Sheets("A_Import_CV").Range("A" & k).Resize(ktv, 10) = ketqua
    
    Sheets("A_Import_CV").Range("A2").Resize(k, 10).Borders.LineStyle = 1
    Columns("H:K").NumberFormat = "#,##0.00"
    Columns("E:G").WrapText = True
    With Sheets("A_Import_CV").Range("A2").Resize(k, 10).Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
'        .VerticalAlignment = xlCenter
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlHairline
    End With
End Sub
 

File đính kèm

  • Help_For_Next.xlsm
    53.2 KB · Đọc: 13
Anh chị ơi coi giúp em với
 
Upvote 0
Em chào anh chị em đang cần lấy dữ liệu từ 2 Sheet PLHD_XL và PLHD_TV sang Sheet Import, em đang dùng 2 mảng và 2 vòng lặp For để lấy kết quả thì tạm được, mong anh chị sửa giúp, tối ưu Code giúp em

Cách khác là áp dụng ADO Recordset như bạn HLMT có mấy bài gần đây.
Dùng Union Query. Bên dưới là câu lệnh SQL, còn các phần râu ria như mở Connection, Recordset ...thì bạn xem trong bài của bạn HLMT nhé.

Mã:
 s = "Select F1,'Chi phí xây l" & ChrW(7855) & "p' As LoaiHangMuc,'HM1' As MaHM,'Tên HM' As TenHM,F2,F3,F4,F5,[F6]/1.1 AS DG,[F5]*[F6]/1.1 AS TT from [PLHD_XL$A12:H24] " & _
        "Union All Select F1,'Chi phí TV' As LoaiHangMuc,'HM2' As MaHM,'Tên HM' As TenHM,F2,F3,F4,F5,[F6]/1.1 AS DG,[F5]*[F6]/1.1 AS TT from [PLHD_TV$A12:H16]"

With rs
        .Open s, cn, adOpenKeyset, adLockOptimistic
        Sheets("A_Import_CV").Range("A2").CopyFromRecordset rs
End With
 
Upvote 0
Cách khác là áp dụng ADO Recordset như bạn HLMT có mấy bài gần đây.
Dùng Union Query. Bên dưới là câu lệnh SQL, còn các phần râu ria như mở Connection, Recordset ...thì bạn xem trong bài của bạn HLMT nhé.

Mã:
 s = "Select F1,'Chi phí xây l" & ChrW(7855) & "p' As LoaiHangMuc,'HM1' As MaHM,'Tên HM' As TenHM,F2,F3,F4,F5,[F6]/1.1 AS DG,[F5]*[F6]/1.1 AS TT from [PLHD_XL$A12:H24] " & _
        "Union All Select F1,'Chi phí TV' As LoaiHangMuc,'HM2' As MaHM,'Tên HM' As TenHM,F2,F3,F4,F5,[F6]/1.1 AS DG,[F5]*[F6]/1.1 AS TT from [PLHD_TV$A12:H16]"

With rs
        .Open s, cn, adOpenKeyset, adLockOptimistic
        Sheets("A_Import_CV").Range("A2").CopyFromRecordset rs
End With
Dạ cám ơn anh đã phản hồi. Do dữ liệu từ 2 Sheet PLHD_XL, PLHD_TV là dữ liệu được lấy từ các Sheet khác sẽ thay đổi theo mỗi công trình nên dùng ADO theo cách trên thì phía sau câu lệnh FROM kia sẽ như thế nào ạ
Anh giúp em với nhé
 
Upvote 0
Do dữ liệu từ 2 Sheet PLHD_XL, PLHD_TV là dữ liệu được lấy từ các Sheet khác sẽ thay đổi theo mỗi công trình nên dùng ADO theo cách trên thì phía sau câu lệnh FROM kia sẽ như thế nào ạ

Dùng Union query quan trọng là thứ tự các cột giống nhau ở tất cả các Table (Sheet) dùng để Union All.
Tên Sheet và Range lấy dữ liệu thì bạn dùng các code của Excel VBA mà bạn thường dùng (lastRow, lastColumn,...) tổng hợp lại rồi truyền như tham số cho câu lệnh SQL.
 
Upvote 0
Dùng Union query quan trọng là thứ tự các cột giống nhau ở tất cả các Table (Sheet) dùng để Union All.
Tên Sheet và Range lấy dữ liệu thì bạn dùng các code của Excel VBA mà bạn thường dùng (lastRow, lastColumn,...) tổng hợp lại rồi truyền như tham số cho câu lệnh SQL.
Khó quá
Dear anh nếu như code của em có cách nào sửa chỉ dùng 1 vòng lặp for được không anh
 
Upvote 0
Em chào anh chị em đang cần lấy dữ liệu từ 2 Sheet PLHD_XL và PLHD_TV sang Sheet Import, em đang dùng 2 mảng và 2 vòng lặp For để lấy kết quả thì tạm được, mong anh chị sửa giúp, tối ưu Code giúp em
Do chắp vá nên không hiểu được bản chất và cách làm lắm ạ
Em cám ơn

Dữ liệu Sheet PLHD_XL

View attachment 250207

Dữ liệu Sheet PLHD_TV

View attachment 250208
Kết quả

View attachment 250209

Mã:
Sub Input_CV()

    Dim I, k, ktv, ar, ketqua
    Dim LastRow As Long
    Dim Nguon, Dong
   
    Sheets("A_Import_CV").Select
    Sheets("A_Import_CV").Range("A2:K" & Range("B" & Rows.Count).End(3).Row + 1).Clear

    With Sheets("PLHD_XL")                                                     'Lay thong tin tai Sheet PLHD_XL
        Dong = .Range("B12").End(xlDown).Row
        Nguon = .Range("B12", "G" & Dong)                          'Cot cuoi cung tai Sheet Input_TB
        Dong = UBound(Nguon)
    End With

    ReDim ketqua(1 To Dong, 1 To 10)

    For I = 1 To Dong
        If Nguon(I, 4) > 0 Then
            k = k + 1
            ketqua(k, 1) = k                                                'STT
            ketqua(k, 2) = "Chi phí xây l" & ChrW(7855) & "p"               'Hang muc CP
            ketqua(k, 3) = "HM1"                                            'Ma HM"
            ketqua(k, 4) = "TEN HM"                                         'Ten HM
            ketqua(k, 5) = Nguon(I, 1)                                      'Ma CV
            ketqua(k, 6) = Nguon(I, 2)                                      'Ten CV
            ketqua(k, 7) = Nguon(I, 3)                                      'DVT
            ketqua(k, 8) = Nguon(I, 4)                                      'KLuong
            ketqua(k, 9) = Nguon(I, 5) / 1.1                                'Don Gia
            ketqua(k, 10) = ketqua(k, 8) * ketqua(k, 9) * 0.1
        '    ketqua(k, 11) = ketqua(k, 8) * ketqua(k, 9) + ketqua(k, 10)

        End If

    Next I
   

       
    Sheets("A_Import_CV").Range("A2").Resize(k, 10) = ketqua
    LastRow = Sheets("A_Import_CV").Cells(Rows.Count, "b").End(xlUp).Row
    With Sheets("PLHD_TV")                                                     'Lay thong tin tai Sheet PLHD_XL
        Dong = .Range("B12").End(xlDown).Row
        Nguon = .Range("B12", "G" & Dong)                          'Cot cuoi cung tai Sheet Input_TB
        Dong = UBound(Nguon)
    End With

    ReDim ketqua(1 To Dong, 1 To 10)
   
    For I = 1 To Dong

        If Nguon(I, 4) > 0 Then
            ktv = ktv + 1
            ketqua(ktv, 1) = ktv                                                'STT
            ketqua(ktv, 2) = "Chi phí TV"               'Hang muc CP
            ketqua(ktv, 3) = "HM2"                                            'Ma HM"
            ketqua(ktv, 4) = "TEN HM"                                         'Ten HM
            ketqua(ktv, 5) = Nguon(I, 1)                                      'Ma CV
            ketqua(ktv, 6) = Nguon(I, 2)                                      'Ten CV
            ketqua(ktv, 7) = Nguon(I, 3)                                      'DVT
            ketqua(ktv, 8) = Nguon(I, 4)                                      'KLuong
            ketqua(ktv, 9) = Nguon(I, 5) / 1.1                                'Don Gia
            ketqua(ktv, 10) = ketqua(ktv, 8) * ketqua(ktv, 9) * 0.1
        '    ketqua(k, 11) = ketqua(k, 8) * ketqua(k, 9) + ketqua(k, 10)

        End If

    Next I
    Sheets("A_Import_CV").Range("A" & k).Resize(ktv, 10) = ketqua
   
    Sheets("A_Import_CV").Range("A2").Resize(k, 10).Borders.LineStyle = 1
    Columns("H:K").NumberFormat = "#,##0.00"
    Columns("E:G").WrapText = True
    With Sheets("A_Import_CV").Range("A2").Resize(k, 10).Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
'        .VerticalAlignment = xlCenter
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .Weight = xlHairline
    End With
End Sub
Bạn bấm phím chức năng F8 chạy từng dòng lệnh, tự tìm hiểu cách vận hành code sau đó tự viết lại code mới
Mã:
Sub ABC()
  Dim sArr(), Res(), shArr, sh As Worksheet
  Dim i&, n&, stt&, k&, eRow&, sRow&
    
  Application.ScreenUpdating = False
  Set sh = Sheets("A_Import_CV")
  eRow = sh.Range("B" & Rows.Count).End(3).Row
  If eRow > 1 Then sh.Range("A2:K" & eRow).Clear
 
  shArr = Array("PLHD_XL", "PLHD_TV")
  For n = 0 To 1
    k = 0
    With Sheets(shArr(n))
      eRow = .Range("E" & Rows.Count).End(xlUp).Row
      If eRow > 11 Then
        sArr = .Range("B12", "G" & eRow).Value
        sRow = UBound(sArr)
        ReDim Res(1 To sRow, 1 To 10)
        For i = 1 To sRow
          If sArr(i, 4) > 0 Then
            k = k + 1: stt = stt + 1
            Res(k, 1) = stt                                                'STT
            If n = 0 Then
              Res(k, 2) = "Chi phí xây l" & ChrW(7855) & "p"               'Hang muc CP
              Res(k, 3) = "HM1"                                            'Ma HM"
            Else
              Res(k, 2) = "Chi phí TV"               'Hang muc CP
              Res(k, 3) = "HM2"
            End If
            Res(k, 4) = "TEN HM"                                         'Ten HM
            Res(k, 5) = sArr(i, 1)                                      'Ma CV
            Res(k, 6) = sArr(i, 2)                                      'Ten CV
            Res(k, 7) = sArr(i, 3)                                      'DVT
            Res(k, 8) = sArr(i, 4)                                      'KLuong
            Res(k, 9) = sArr(i, 5) / 1.1                                'Don Gia
            Res(k, 10) = Res(k, 8) * Res(k, 9) * 0.1
            'Res(k, 11) = Res(k, 8) * Res(k, 9) + Res(k, 10)
          End If
        Next i
        If k Then sh.Range("A" & sh.Range("A" & Rows.Count).End(xlUp).Row + 1).Resize(k, 10) = Res
      End If
    End With
  Next n
 
  sh.Range("A2").Resize(stt, 10).Borders.LineStyle = 1
  sh.Range("H2:J2").Resize(stt).NumberFormat = "#,##0.00"
  sh.Range("E2:G2").Resize(stt).WrapText = True
  With sh.Range("A2").Resize(stt, 10).Borders(xlInsideHorizontal)
    .LineStyle = xlContinuous
    .ColorIndex = xlAutomatic
    .TintAndShade = 0
    .Weight = xlHairline
  End With
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
Bạn bấm phím chức năng F8 chạy từng dòng lệnh, tự tìm hiểu cách vận hành code sau đó tự viết lại code mới
Dạ em cám ơn anh!
Đúng là ko biết chức năng của các phím F8 này, bấm mỏi tay code chạy vòng lặp hơn 200 lần để check điều kiện.
Một lần nữa cám ơn ah
 
Upvote 0
Em chào anh chị em đang cần lấy dữ liệu từ 2 Sheet PLHD_XL và PLHD_TV sang Sheet Import, em đang dùng 2 mảng và 2 vòng lặp For để lấy kết quả thì tạm được, mong anh chị sửa giúp, tối ưu Code giúp em
Do chắp vá nên không hiểu được bản chất và cách làm lắm ạ
Em cám ơn
Em dùng thử File sau, lưu ý:
1/ Để cho code ngắn gọn anh sửa tiều đề sheet Data lại một tí.
2/ Nên gán Mã hạng mục vào cột ghi chú của sheet Chi phí_XL, Chi phí_TV trước khi nhấn nút.
3/ Cột A (Loại hạng mục chi phí) lấy tên sheet gán vào. Em có thể thêm bao nhiêu sheet là tùy ý.
4/ File cũ quên tô viềng, anh mới bổ sung thêm code tô viềng.
 

File đính kèm

  • Gộp và gán tên sheet.xlsm
    116.8 KB · Đọc: 7
Lần chỉnh sửa cuối:
Upvote 0
Em dùng thử File sau, lưu ý:
1/ Để cho code ngắn gọn anh sửa tiều đề sheet Data lại một tí.
2/ Nên gán Mã hạng mục vào cột ghi chú của sheet Chi phí_XL, Chi phí_TV trước khi nhấn nút.
3/ Cột A (Loại hạng mục chi phí) lấy tên sheet gán vào. Em có thể thêm bao nhiêu sheet là tùy ý.
4/ File cũ quên tô viềng, anh mới bổ sung thêm code tô viềng.
Dạ em cám ơn anh, code anh HieuCD chạy đúng theo mong muốn của em rồi ạ
 
Upvote 0
Web KT

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

Back
Top Bottom