Chuyển dữ liệu sang file khác theo điều kiện

Liên hệ QC

YenNhi195

Thành viên mới
Tham gia
28/2/22
Bài viết
21
Được thích
4
Dạ em chào anh chị ạ,
- em có 2 file như này, em muốn lấy dữ liệu từ file 2 sang file 1 bằng VBA thì như thế nào ạ, Công thức thì e làm được rồi nhưng VBA thì em muốn xem làm như thế nào ạ
- Điều kiện để lấy dữ liệu là theo mã BP và ngày tháng ạ.. Mong anh chị giúp đỡ hỗ trợ em ạ, em cảm ơn
 

File đính kèm

  • FILE 2.xlsb
    13.8 KB · Đọc: 12
  • FILE 1.xlsb
    13.3 KB · Đọc: 6
Dạ em chào anh chị ạ,
- em có 2 file như này, em muốn lấy dữ liệu từ file 2 sang file 1 bằng VBA thì như thế nào ạ, Công thức thì e làm được rồi nhưng VBA thì em muốn xem làm như thế nào ạ
- Điều kiện để lấy dữ liệu là theo mã BP và ngày tháng ạ.. Mong anh chị giúp đỡ hỗ trợ em ạ, em cảm ơn
Thu file này coi. Có nhiều bài viết như thế này. Chịu khó tìm là ra à
 

File đính kèm

  • FILE 1.xlsb
    27 KB · Đọc: 6
Upvote 0
Thu file này coi. Có nhiều bài viết như thế này. Chịu khó tìm là ra à
- Yêu cầu của em ở đây là: Mã BP và ngày tháng cố định chứ không phải copy từ file 2 sang.
- khi chạy lệnh VBA thì có thể mở ra một cửa sổ để chọn file và chọn sheet cần lấy dữ liệu.
=>Mã BP và Ngày tháng có thể thay đổi thứ tự lộn xộn nên em mới nêu yêu cầu là "Điều kiện để lấy dữ liệu là theo mã BP và ngày tháng" ạ.
Em cảm ơn
 
Upvote 0
- Yêu cầu của em ở đây là: Mã BP và ngày tháng cố định chứ không phải copy từ file 2 sang.
- khi chạy lệnh VBA thì có thể mở ra một cửa sổ để chọn file và chọn sheet cần lấy dữ liệu.
=>Mã BP và Ngày tháng có thể thay đổi thứ tự lộn xộn nên em mới nêu yêu cầu là "Điều kiện để lấy dữ liệu là theo mã BP và ngày tháng" ạ.
Em cảm ơn
Xin lỗi vì đã làm không đúng ý bạn.
Vậy chờ thành viên khác vào giúp bạn vậy.
 
Upvote 0
Mã:
Sub GetData(CellKQ As Range, sSQL As String)
    Dim Cnn As New ADODB.Connection
    Dim Rs As New ADODB.Recordset
    Dim strConnect As String, Path As String

    Path = Application.GetOpenFilename
    strConnect = "Provider=Microsoft.ACE.OLEDB.12.0; " _
               & "Data Source = MY_FULL_NAME_FILEDATA; " _
               & "Extended Properties='Excel 12.0; HDR=No; IMEX=1';  "
    strConnect = Replace(strConnect, "MY_FULL_NAME_FILEDATA", Path)
    
    Cnn.ConnectionString = strConnect
    Cnn.Open
    Rs.Open sSQL, Cnn, 3, 1
    CellKQ.CopyFromRecordset Rs
    Rs.Close
    Cnn.Close
End Sub
Sub ImportFile()
    Application.Calculation = xlCalculationManual
    Dim sSQL As String
    Dim CellKQ As Range
    
    Set CellKQ = ActiveSheet.Range("B3")
    With Sheet7
        .AutoFilterMode = False
        .Range("B3").Resize(.Range("B300000").End(xlUp).Row, 1000).ClearContents
    End With
    
    sSQL = "SELECT * FROM [DATA$B3:F]"
    Call GetData(CellKQ, sSQL)
    Application.Calculation = xlCalculationAutomatic
End Sub
Em có viết như này, nhưng tới câu lệnh sSQL = "SELECT * FROM [DATA$B3:F]" thì không biết gắn WHERE như thế nào để lấy mã BP và ngày tháng
 

File đính kèm

  • FILE 1.xlsb
    22.9 KB · Đọc: 8
Upvote 0
Bạn nên lấy ví dụ thì 2 file nó có sự khác biệt 1 chút. chứ ví dụ 2 file data cấu trúc y chang nhau thế.
 
Upvote 0
Bạn nên lấy ví dụ thì 2 file nó có sự khác biệt 1 chút. chứ ví dụ 2 file data cấu trúc y chang nhau thế.
tại vì dữ liệu là bên bộ phận khác gửi, mình nhập vào file báo cáo của mình gồm nhiều phần khác nên phần này là phải lấy y chang so với file dữ liệu đó.
 
Upvote 0
Thử code này xem, hy vọng đúng được 70-80 % yêu cầu.
Hãy nhấn nút chạy code và xem kết quả.
Tôi để Code tự tìm file nguồn,( có thể không đúng ý bạn) .
Đường dẫn tìm file nguồn của bạn có thế khác.
Bạn thử thay đổi vị trí cột của file gốc, và vị trí sắp xếp các ID ở cá file nguồn và file gốc (trật tự thay đổi) và chạy code, kiểm tra kết quả xem thế nào
 

File đính kèm

  • FILE 1.xlsb
    28.9 KB · Đọc: 12
Upvote 0
Thử code này xem, hy vọng đúng được 70-80 % yêu cầu.
Hãy nhấn nút chạy code và xem kết quả.
Tôi để Code tự tìm file nguồn,( có thể không đúng ý bạn) .
Đường dẫn tìm file nguồn của bạn có thế khác.
Bạn thử thay đổi vị trí cột của file gốc, và vị trí sắp xếp các ID ở cá file nguồn và file gốc (trật tự thay đổi) và chạy code, kiểm tra kết quả xem thế nào
anh ơi, sau khi em bấm mở file thì bị lỗi này 1646035161883.png
 
Upvote 0
Thử code này xem, hy vọng đúng được 70-80 % yêu cầu.
Hãy nhấn nút chạy code và xem kết quả.
Tôi để Code tự tìm file nguồn,( có thể không đúng ý bạn) .
Đường dẫn tìm file nguồn của bạn có thế khác.
Bạn thử thay đổi vị trí cột của file gốc, và vị trí sắp xếp các ID ở cá file nguồn và file gốc (trật tự thay đổi) và chạy code, kiểm tra kết quả xem thế nào
Em có code này trên GPE gần giống yêu cầu của chủ thớt. code tự tìm file nguồn, sheet nguồn trong một Folder. khác với yêu cầu của chủ thớt là Openfile theo đường dẫn khác. Anh có thể sửa lại đúng yêu cầu của chủ thớt giúp em.
 

File đính kèm

  • FILE 1.xlsb
    28.4 KB · Đọc: 16
Upvote 0
Thử code này xem, hy vọng đúng được 70-80 % yêu cầu.
Hãy nhấn nút chạy code và xem kết quả.
Tôi để Code tự tìm file nguồn,( có thể không đúng ý bạn) .
Đường dẫn tìm file nguồn của bạn có thế khác.
Bạn thử thay đổi vị trí cột của file gốc, và vị trí sắp xếp các ID ở cá file nguồn và file gốc (trật tự thay đổi) và chạy code, kiểm tra kết quả xem thế nào
Chào anh, code chạy đúng thật, nếu mà được chọn file và chọn sheet nữa thì tuyệt vời.
 
Upvote 0
Chào anh, code chạy đúng thật, nếu mà được chọn file và chọn sheet nữa thì tuyệt vời.
Nếu tổng hợp phải thực hiện tính toán (+;-;*;/) từ 2 file nguồn và >2 sh thì mới cần phải chọn File, duyệt qua các Sh. Chứ bài của bạn chỉ yêu cầu là lấy dữ liệu sang cho đúng dòng đúng cột -như vậy code đã đỡ cho bạn công đoạn tự mình phải đi tìm file,.....chứ có yêu cầu phải tính toán gì đâu mà phải có đoạn code chọn file, chon sheet.
 
Upvote 0
Nếu tổng hợp phải thực hiện tính toán (+;-;*;/) từ 2 file nguồn và >2 sh thì mới cần phải chọn File, duyệt qua các Sh. Chứ bài của bạn chỉ yêu cầu là lấy dữ liệu sang cho đúng dòng đúng cột -như vậy code đã đỡ cho bạn công đoạn tự mình phải đi tìm file,.....chứ có yêu cầu phải tính toán gì đâu mà phải có đoạn code chọn file, chon sheet.
cảm ơn anh rất nhiều
 
Upvote 0
Em có code này trên GPE gần giống yêu cầu của chủ thớt. code tự tìm file nguồn, sheet nguồn trong một Folder. khác với yêu cầu của chủ thớt là Openfile theo đường dẫn khác. Anh có thể sửa lại đúng yêu cầu của chủ thớt giúp em.
Theo tôi có lễ không cần là Phải mở 1 hộp thoại để chọn file nguồn, sheet cần lấy dữ liệu (như chủ thớt yêu cầu) mà để tiện cho việc sau này lấy dữ liệu không phải là "\FILE 2.xlsb" mà là một tên file khác (VD: Thang 3-2022.xlsb chẳng hạn) ta không phải sửa lại trong Code. ta dùng 1 ô ở ngay sh ĐÍCH (Data) để ghi tên file nguồn ấy _ví dụ là ô K1)
Code sẽ là
Mã:
Sub loc()
Dim curr_row As Long, curr_col As Long, r As Long, c As Long, data(), result(), dic As Object, sh As Worksheet, wb As Workbook
Dim FileNguon
Set sh = ThisWorkbook.Worksheets("DATA")
'    xet tap tin File 1
    With sh
    FileNguon = .Range("K1")
.............
    Set wb = Workbooks.Open(ThisWorkbook.Path & FileNguon) ' "\FILE 2.xlsb")
    With wb.Worksheets("DATA")
......
[\code]
ta chỉ cần thay K1= \Thang3-2022 và chay code
Bài đã được tự động gộp:

Đã sửa lại code so với bài cho đúng với bài #8. chủ thớt nên thay code cũ bằng code này
Mã:
Option Explicit

Sub TONGHOPC2()
Dim Lr&, i&, j&, t&, K&, R&, C&, LrD&, Rd&, Cc&, Col&, cot&, N&, TONG
Dim Ws As Worksheet, Sh As Worksheet
Dim Arr(), ArrD(), KQCuoi()
Dim Key, Temp, eTmp, Tmp, Dic As Object, DicN As Object
    Dim fnameList As Variant         '  Tap hop cac file can lay du lieu
    Dim fnameCurFile As Variant      ' File duoc chon mo trong tap hop fnameList
    Dim wbkCurBook As Workbook       ' workbook duoc mo
    Dim wbkSrcBook As Workbook
    Dim wksCurSheet As Worksheet

'1: Lua chon cac file can ghep va tien hanh mo file = boi den va nhan nut open

    fnameList = Application.GetOpenFilename(FileFilter:="Microsoft Excel Workbooks (*.xls;*.xlsx;*.xlsm;*.xlsb),*.xls;*.xlsx;*.xlsm;*.xlsb", Title:="Choose Excel files to merge", MultiSelect:=True)
 
If (vbBoolean <> VarType(fnameList)) Then
    If (UBound(fnameList) > 0) Then
 
'=======KHOA MAN HINH=================
            Application.DisplayAlerts = False
            Application.ScreenUpdating = False
            Application.Calculation = xlCalculationManual
           
'2. Mo file trong tap hop file can lay du lieu
Set Dic = CreateObject("Scripting.Dictionary")
Set DicN = CreateObject("Scripting.Dictionary")
        Set wbkCurBook = ActiveWorkbook         ' Gán bien cho Workbook dươc mơ
        For Each fnameCurFile In fnameList   ' quet tung file trong tap hop
                Set wbkSrcBook = Workbooks.Open(Filename:=fnameCurFile)          'mo file
                    For Each Ws In wbkSrcBook.Sheets
                        Lr = Ws.Cells(Rows.Count, 1).End(xlUp).Row
                        Arr = Ws.Range("A2:F" & Lr).Value
                        R = UBound(Arr, 1): C = UBound(Arr, 2)
                       ' ReDim KQ(1 To R, 1 To 6)
                        For Col = 1 To C
                            If IsDate(Arr(1, Col)) Then
                                Tmp = CDate(Arr(1, Col))
                            If Not DicN.Exists(Tmp) Then K = K + 1: DicN.Add (Tmp), K
                            End If
                        Next Col
                        For i = 1 To R
                          Temp = Trim(Arr(i, 1))
                            If Not Dic.Exists(Temp) Then
                                t = t + 1
                                Dic.Add (Temp), t
                            End If
                        Next i
                    Next Ws
                wbkSrcBook.Close
        Next fnameCurFile
 Set Sh = Sheets("Data")
        LrD = Sh.Cells(Rows.Count, 1).End(xlUp).Row
        cot = Sh.Cells(2, Columns.Count).End(xlToLeft).Column
        ArrD = Sh.Range(Cells(2, 1), Cells(Lr, cot)).Value
        Rd = UBound(ArrD, 1): Cc = UBound(ArrD, 2)
        ReDim KQua(1 To Rd, 1 To Cc)
For i = 2 To Rd
      Key = Trim(ArrD(i, 1)): TONG = 0
      If Dic.Exists(Key) Then
        For j = 1 To Cc
        If IsDate(ArrD(1, j)) Then
        N = N + 1
            eTmp = CDate(ArrD(1, j))
            If DicN.Exists(eTmp) Then
                KQua(i - 1, j - 1) = Arr(Dic.Item(Key), DicN.Item(eTmp) + 1)
                TONG = TONG + Arr(Dic.Item(Key), DicN.Item(eTmp) + 1)
            End If
        End If
        Next j
      End If
                KQua(i - 1, Cc - 1) = TONG / N '(Cc - 2)
Next i
Sh.Range("B3").Resize(Rd, Cc) = KQua
    End If
End If
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
        MsgBox "OK", vbInformation, "THÔNG BÁO"
End Sub
[\code]
 
Lần chỉnh sửa cuối:
Upvote 0
Theo tôi có lễ không cần là Phải mở 1 hộp thoại để chọn file nguồn, sheet cần lấy dữ liệu (như chủ thớt yêu cầu) mà để tiện cho việc sau này lấy dữ liệu không phải là "\FILE 2.xlsb" mà là một tên file khác (VD: Thang 3-2022.xlsb chẳng hạn) ta không phải sửa lại trong Code. ta dùng 1 ô ở ngay sh ĐÍCH (Data) để ghi tên file nguồn ấy _ví dụ là ô K1)
Code sẽ là
Mã:
Sub loc()
Dim curr_row As Long, curr_col As Long, r As Long, c As Long, data(), result(), dic As Object, sh As Worksheet, wb As Workbook
Dim FileNguon
Set sh = ThisWorkbook.Worksheets("DATA")
'    xet tap tin File 1
    With sh
    FileNguon = .Range("K1")
.............
    Set wb = Workbooks.Open(ThisWorkbook.Path & FileNguon) ' "\FILE 2.xlsb")
    With wb.Worksheets("DATA")
......
[\code]
ta chỉ cần thay K1= \Thang3-2022 và chay code
Bài đã được tự động gộp:


Đã sửa lại code so với bài cho đúng với bài #8. chủ thớt nên thay code cũ bằng code này
Mã:
Option Explicit

Sub TONGHOPC2()
Dim Lr&, i&, j&, t&, K&, R&, C&, LrD&, Rd&, Cc&, Col&, cot&, N&, TONG
Dim Ws As Worksheet, Sh As Worksheet
Dim Arr(), ArrD(), KQCuoi()
Dim Key, Temp, eTmp, Tmp, Dic As Object, DicN As Object
    Dim fnameList As Variant         '  Tap hop cac file can lay du lieu
    Dim fnameCurFile As Variant      ' File duoc chon mo trong tap hop fnameList
    Dim wbkCurBook As Workbook       ' workbook duoc mo
    Dim wbkSrcBook As Workbook
    Dim wksCurSheet As Worksheet

'1: Lua chon cac file can ghep va tien hanh mo file = boi den va nhan nut open

    fnameList = Application.GetOpenFilename(FileFilter:="Microsoft Excel Workbooks (*.xls;*.xlsx;*.xlsm;*.xlsb),*.xls;*.xlsx;*.xlsm;*.xlsb", Title:="Choose Excel files to merge", MultiSelect:=True)
 
If (vbBoolean <> VarType(fnameList)) Then
    If (UBound(fnameList) > 0) Then
 
'=======KHOA MAN HINH=================
            Application.DisplayAlerts = False
            Application.ScreenUpdating = False
            Application.Calculation = xlCalculationManual
          
'2. Mo file trong tap hop file can lay du lieu
Set Dic = CreateObject("Scripting.Dictionary")
Set DicN = CreateObject("Scripting.Dictionary")
        Set wbkCurBook = ActiveWorkbook         ' Gán bien cho Workbook dươc mơ
        For Each fnameCurFile In fnameList   ' quet tung file trong tap hop
                Set wbkSrcBook = Workbooks.Open(Filename:=fnameCurFile)          'mo file
                    For Each Ws In wbkSrcBook.Sheets
                        Lr = Ws.Cells(Rows.Count, 1).End(xlUp).Row
                        Arr = Ws.Range("A2:F" & Lr).Value
                        R = UBound(Arr, 1): C = UBound(Arr, 2)
                       ' ReDim KQ(1 To R, 1 To 6)
                        For Col = 1 To C
                            If IsDate(Arr(1, Col)) Then
                                Tmp = CDate(Arr(1, Col))
                            If Not DicN.Exists(Tmp) Then K = K + 1: DicN.Add (Tmp), K
                            End If
                        Next Col
                        For i = 1 To R
                          Temp = Trim(Arr(i, 1))
                            If Not Dic.Exists(Temp) Then
                                t = t + 1
                                Dic.Add (Temp), t
                            End If
                        Next i
                    Next Ws
                wbkSrcBook.Close
        Next fnameCurFile
 Set Sh = Sheets("Data")
        LrD = Sh.Cells(Rows.Count, 1).End(xlUp).Row
        cot = Sh.Cells(2, Columns.Count).End(xlToLeft).Column
        ArrD = Sh.Range(Cells(2, 1), Cells(Lr, cot)).Value
        Rd = UBound(ArrD, 1): Cc = UBound(ArrD, 2)
        ReDim KQua(1 To Rd, 1 To Cc)
For i = 2 To Rd
      Key = Trim(ArrD(i, 1)): TONG = 0
      If Dic.Exists(Key) Then
        For j = 1 To Cc
        If IsDate(ArrD(1, j)) Then
        N = N + 1
            eTmp = CDate(ArrD(1, j))
            If DicN.Exists(eTmp) Then
                KQua(i - 1, j - 1) = Arr(Dic.Item(Key), DicN.Item(eTmp) + 1)
                TONG = TONG + Arr(Dic.Item(Key), DicN.Item(eTmp) + 1)
            End If
        End If
        Next j
      End If
                KQua(i - 1, Cc - 1) = TONG / N '(Cc - 2)
Next i
Sh.Range("B3").Resize(Rd, Cc) = KQua
    End If
End If
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
        MsgBox "OK", vbInformation, "THÔNG BÁO"
End Sub
[\code]
chào anh, tại cột tính trung bình cho ra kết quả bị sai, em sửa /N thành /(Cc-2) thì kết quả ra đúng nhưng không biết là có sai code hay không vậy anh?
1646180545849.png
 
Upvote 0
chào anh, tại cột tính trung bình cho ra kết quả bị sai, em sửa /N thành /(Cc-2) thì kết quả ra đúng nhưng không biết là có sai code hay không vậy anh?
View attachment 272607
Bạn cứ làm theo cách nào nếu bạn thấy đó là kết quả mong đợi.
Giải thích thêm một chút cho bạn hiểu
Ở dòng lệnh:
If IsDate(ArrD(1, j)) Then là kiểm tra xem ô 1, 2, 3... có phải là dữ liệu kiểu ngày tháng không? nếu là ngày tháng thì N = N + 1; tức là đếm số là ngày tháng ở dòng tiêu đề (việc này phục vụ cho việc chia bình quân sau này =TONG/N; Ví dụ: số Ô tiêu đề của Sh Nguon là 4, số ô tiêu đề Sh Đich là 5, vậy thì TONG(được cộng từ Sh Nguon) sẽ chia 4 hay chia 5 để lấy số bình quân?).
Còn Cc-2) là tổng số cột của mảng Đich(ArrD)-2 cột(cột mã ID, và cột bình quân)
(giải thích thế có lẽ thừa bởi bạn thừa hiểu-nhưng chót đánh vào rồi nên không buồn xóa)
 
Upvote 0
Web KT

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

Back
Top Bottom