Hỏi về copy liên tiếp dữ liệu theo chiều ngang từ nhiều File excel

Liên hệ QC

hoahuongduong1986

Thành viên thường trực
Tham gia
14/11/18
Bài viết
346
Được thích
40
Kính gửi các Anh chị trên diễn đàn,
Em có một câu hỏi về sử dụng VBA nhờ các anh chị cho xin hướng dẫn Code với ạ. Vì em phải tổng hợp theo ngày của cả năm nên nếu phải Copy sẽ thực hiện rất mất thời gian mà còn sót và sai nữa. Nhờ các anh chị bớt chút time cho em xin Code hoặc code phù hợp với ạ. Em xin miêu tả như sau để mọi người hướng dẫn ạ.

Em nhiều File giống nhau về hình thức và giờ em muốn copy số liệu từ 100 File này vào một File tên là File Tong hop như hình (Các File e đã để trong đường dẫn như hình em chụp).
Số liệu từ D18 - D24 em muốn được Copy theo chiều ngang liên tục theo chiều ngang vào File Tong hop tu D18 - E 18- F18...đến hết toàn bộ số liệu các File trong Folder ạ. Nếu được thì ở D17, E17, F17.... sẽ lấy dược tựa đề là ngày ví dụ File F1-20181002-ST-M-01 thì lấy được 20181002 ạ hoạc không cũng không sao - sẽ điền tay phần này ạ. Kính nhờ các Anh chị và các bạn trợ giúp ạ. Cảm ơn mọi người ạ !
 

File đính kèm

Kính gửi các Anh chị trên diễn đàn,
Em có một câu hỏi về sử dụng VBA nhờ các anh chị cho xin hướng dẫn Code với ạ. Vì em phải tổng hợp theo ngày của cả năm nên nếu phải Copy sẽ thực hiện rất mất thời gian mà còn sót và sai nữa. Nhờ các anh chị bớt chút time cho em xin Code hoặc code phù hợp với ạ. Em xin miêu tả như sau để mọi người hướng dẫn ạ.

Em nhiều File giống nhau về hình thức và giờ em muốn copy số liệu từ 100 File này vào một File tên là File Tong hop như hình (Các File e đã để trong đường dẫn như hình em chụp).
Số liệu từ D18 - D24 em muốn được Copy theo chiều ngang liên tục theo chiều ngang vào File Tong hop tu D18 - E 18- F18...đến hết toàn bộ số liệu các File trong Folder ạ. Nếu được thì ở D17, E17, F17.... sẽ lấy dược tựa đề là ngày ví dụ File F1-20181002-ST-M-01 thì lấy được 20181002 ạ hoạc không cũng không sao - sẽ điền tay phần này ạ. Kính nhờ các Anh chị và các bạn trợ giúp ạ. Cảm ơn mọi người ạ !
Các file cùng thư mục
Mã:
Sub Main()
  Dim Res(), fileArr(), sArr(), cn As Object
  Dim iPath As String, sqlStr As String
  Dim i As Long, j As Byte
  iPath = ThisWorkbook.Path
  fileArr = GetFileList(iPath, ThisWorkbook.Name)
  ReDim Res(1 To UBound(fileArr), 0 To 7)
  sqlStr = "select f1 from [G023311$D18:D24]"
  Set cn = CreateObject("ADODB.Connection")
  For i = LBound(fileArr) To UBound(fileArr)
    cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & iPath & "\" & fileArr(i) & ";Extended Properties=""Excel 12.0;HDR=No""")
    sArr = cn.Execute(sqlStr).GetRows
    For j = LBound(sArr, 2) To UBound(sArr, 2)
      Res(i, j + 1) = sArr(0, j)
    Next j
    Res(i, 0) = Split(fileArr(i), "-")(1)
    cn.Close
  Next i
  Range("C18:J18").Resize(i - 1) = Res
  Set cn = Nothing
End Sub

Function GetFileList(ByVal StrFolder As String, Optional MainFile As String = "")
  Dim fso As Object, ObjFile As Object
  Dim Res(), k As Long, tmp As String
  Set fso = CreateObject("Scripting.FileSystemObject")
  With fso.GetFolder(StrFolder)
    For Each ObjFile In .Files
      If fso.GetExtensionName(ObjFile) Like "xls*" Then
        tmp = ObjFile.Name
        If tmp <> MainFile And Left(tmp, 1) <> "~" Then
          k = k + 1
          ReDim Preserve Res(1 To k)
          Res(k) = tmp
        End If
      End If
    Next
  End With
  GetFileList = Res
  Set fso = Nothing: Set ObjFile = Nothing
End Function
 

File đính kèm

Upvote 0
Em cảm ơn Anh nhiều ạ. Hay quá anh ạ. Em copy File vào được rồi ạ. Nhìn nó phức tạp thật Anh, em sẽ mò để hiểu nó chạy thế nào ạ. Cảm ơn anh nhiều ạ. Nếu có bạn nào còn cách khác thì cũng giúp em và mọi người cùng câu hỏi có thể tham khảo thêm ạ !!!
 
Upvote 0
Các file cùng thư mục
Mã:
Sub Main()
  Dim Res(), fileArr(), sArr(), cn As Object
  Dim iPath As String, sqlStr As String
  Dim i As Long, j As Byte
  iPath = ThisWorkbook.Path
  fileArr = GetFileList(iPath, ThisWorkbook.Name)
  ReDim Res(1 To UBound(fileArr), 0 To 7)
  sqlStr = "select f1 from [G023311$D18:D24]"
  Set cn = CreateObject("ADODB.Connection")
  For i = LBound(fileArr) To UBound(fileArr)
    cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & iPath & "\" & fileArr(i) & ";Extended Properties=""Excel 12.0;HDR=No""")
    sArr = cn.Execute(sqlStr).GetRows
    For j = LBound(sArr, 2) To UBound(sArr, 2)
      Res(i, j + 1) = sArr(0, j)
    Next j
    Res(i, 0) = Split(fileArr(i), "-")(1)
    cn.Close
  Next i
  Range("C18:J18").Resize(i - 1) = Res
  Set cn = Nothing
End Sub

Function GetFileList(ByVal StrFolder As String, Optional MainFile As String = "")
  Dim fso As Object, ObjFile As Object
  Dim Res(), k As Long, tmp As String
  Set fso = CreateObject("Scripting.FileSystemObject")
  With fso.GetFolder(StrFolder)
    For Each ObjFile In .Files
      If fso.GetExtensionName(ObjFile) Like "xls*" Then
        tmp = ObjFile.Name
        If tmp <> MainFile And Left(tmp, 1) <> "~" Then
          k = k + 1
          ReDim Preserve Res(1 To k)
          Res(k) = tmp
        End If
      End If
    Next
  End With
  GetFileList = Res
  Set fso = Nothing: Set ObjFile = Nothing
End Function


ANh ơi em xem code anh cho em hỏi chút được không ạ.
+ Nếu các File của em sheet có dữ liệu không đặt tên là G023311 mà theo nhiều tên khác nhau thì đoạn code đó như thế nào ạ.
+ Đọc Code e không hiểu đoạn nào để nó lấy cái ngày ở tên File ạ (20181002) ?

Em học lỏm mò cho một số công việc nên chỉ muốn hiểu hoạt động của Code mong anh chỉ dùm ạ. Thanks anh ạ.
 
Upvote 0
ANh ơi em xem code anh cho em hỏi chút được không ạ.
+ Nếu các File của em sheet có dữ liệu không đặt tên là G023311 mà theo nhiều tên khác nhau thì đoạn code đó như thế nào ạ.
+ Đọc Code e không hiểu đoạn nào để nó lấy cái ngày ở tên File ạ (20181002) ?

Em học lỏm mò cho một số công việc nên chỉ muốn hiểu hoạt động của Code mong anh chỉ dùm ạ. Cảm ơn anh ạ.
Mã:
Sub Main()
  Dim Res(), fileArr(), sArr(), S, cn As Object, Wb As Workbook
  Dim iPath As String, sqlStr As String
  Dim i As Long, j As Byte
  iPath = ThisWorkbook.Path
  fileArr = GetFileList(iPath, ThisWorkbook.Name)
  ReDim Res(1 To UBound(fileArr), 0 To 7)
  sqlStr = "select f1 from [G023311$D18:D24]"
  Set cn = CreateObject("ADODB.Connection")
  Application.ScreenUpdating = False
 
  For i = LBound(fileArr) To UBound(fileArr)
    If InStr(1, fileArr(i), "-") Then Res(i, 0) = Split(fileArr(i), "-")(1) 'Nam thang ngay
    On Error Resume Next
    cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & iPath & "\" & fileArr(i) & ";Extended Properties=""Excel 12.0;HDR=No""")
    sArr = cn.Execute(sqlStr).GetRows
    cn.Close
    If Err.Number = 0 Then
      For j = LBound(sArr, 2) To UBound(sArr, 2)
        Res(i, j + 1) = sArr(0, j)
      Next j
    Else
      On Error GoTo 0
      Set Wb = Workbooks.Open(iPath & "\" & fileArr(i))
      sArr = Range("D18:D24").Value
      For j = 1 To UBound(sArr)
        Res(i, j) = sArr(j, 1)
      Next j
      Wb.Close False
    End If
  Next i
  Range("C18:J18").Resize(i - 1) = Res
  Set cn = Nothing
  Application.ScreenUpdating = True
End Sub

Function GetFileList(ByVal StrFolder As String, Optional MainFile As String = "")
  Dim Fso As Object, ObjFile As Object
  Dim Res(), k As Long, tmp As String
  Set Fso = CreateObject("Scripting.FileSystemObject")
  With Fso.GetFolder(StrFolder)
    For Each ObjFile In .Files
      If Fso.GetExtensionName(ObjFile) Like "xls*" Then
        tmp = ObjFile.Name
        If tmp <> MainFile And Left(tmp, 1) <> "~" Then
          k = k + 1
          ReDim Preserve Res(1 To k)
          Res(k) = tmp
        End If
      End If
    Next
  End With
  GetFileList = Res
  Set Fso = Nothing: Set ObjFile = Nothing
End Function
 
Upvote 0
Mã:
Sub Main()
  Dim Res(), fileArr(), sArr(), S, cn As Object, Wb As Workbook
  Dim iPath As String, sqlStr As String
  Dim i As Long, j As Byte
  iPath = ThisWorkbook.Path
  fileArr = GetFileList(iPath, ThisWorkbook.Name)
  ReDim Res(1 To UBound(fileArr), 0 To 7)
  sqlStr = "select f1 from [G023311$D18:D24]"
  Set cn = CreateObject("ADODB.Connection")
  Application.ScreenUpdating = False

  For i = LBound(fileArr) To UBound(fileArr)
    If InStr(1, fileArr(i), "-") Then Res(i, 0) = Split(fileArr(i), "-")(1) 'Nam thang ngay
    On Error Resume Next
    cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & iPath & "\" & fileArr(i) & ";Extended Properties=""Excel 12.0;HDR=No""")
    sArr = cn.Execute(sqlStr).GetRows
    cn.Close
    If Err.Number = 0 Then
      For j = LBound(sArr, 2) To UBound(sArr, 2)
        Res(i, j + 1) = sArr(0, j)
      Next j
    Else
      On Error GoTo 0
      Set Wb = Workbooks.Open(iPath & "\" & fileArr(i))
      sArr = Range("D18:D24").Value
      For j = 1 To UBound(sArr)
        Res(i, j) = sArr(j, 1)
      Next j
      Wb.Close False
    End If
  Next i
  Range("C18:J18").Resize(i - 1) = Res
  Set cn = Nothing
  Application.ScreenUpdating = True
End Sub

Function GetFileList(ByVal StrFolder As String, Optional MainFile As String = "")
  Dim Fso As Object, ObjFile As Object
  Dim Res(), k As Long, tmp As String
  Set Fso = CreateObject("Scripting.FileSystemObject")
  With Fso.GetFolder(StrFolder)
    For Each ObjFile In .Files
      If Fso.GetExtensionName(ObjFile) Like "xls*" Then
        tmp = ObjFile.Name
        If tmp <> MainFile And Left(tmp, 1) <> "~" Then
          k = k + 1
          ReDim Preserve Res(1 To k)
          Res(k) = tmp
        End If
      End If
    Next
  End With
  GetFileList = Res
  Set Fso = Nothing: Set ObjFile = Nothing
End Function
Em cảm ơn Anh nhiều ạ ! Code rất hay ạ !!!
 
Upvote 0
Em cảm ơn Anh nhiều ạ ! Code rất hay ạ !!!
Em cảm ơn Anh nhiều ạ ! Code rất hay ạ !!!
Các file cùng thư mục
Mã:
Sub Main()
  Dim Res(), fileArr(), sArr(), cn As Object
  Dim iPath As String, sqlStr As String
  Dim i As Long, j As Byte
  iPath = ThisWorkbook.Path
  fileArr = GetFileList(iPath, ThisWorkbook.Name)
  ReDim Res(1 To UBound(fileArr), 0 To 7)
  sqlStr = "select f1 from [G023311$D18:D24]"
  Set cn = CreateObject("ADODB.Connection")
  For i = LBound(fileArr) To UBound(fileArr)
    cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & iPath & "\" & fileArr(i) & ";Extended Properties=""Excel 12.0;HDR=No""")
    sArr = cn.Execute(sqlStr).GetRows
    For j = LBound(sArr, 2) To UBound(sArr, 2)
      Res(i, j + 1) = sArr(0, j)
    Next j
    Res(i, 0) = Split(fileArr(i), "-")(1)
    cn.Close
  Next i
  Range("C18:J18").Resize(i - 1) = Res
  Set cn = Nothing
End Sub

Function GetFileList(ByVal StrFolder As String, Optional MainFile As String = "")
  Dim fso As Object, ObjFile As Object
  Dim Res(), k As Long, tmp As String
  Set fso = CreateObject("Scripting.FileSystemObject")
  With fso.GetFolder(StrFolder)
    For Each ObjFile In .Files
      If fso.GetExtensionName(ObjFile) Like "xls*" Then
        tmp = ObjFile.Name
        If tmp <> MainFile And Left(tmp, 1) <> "~" Then
          k = k + 1
          ReDim Preserve Res(1 To k)
          Res(k) = tmp
        End If
      End If
    Next
  End With
  GetFileList = Res
  Set fso = Nothing: Set ObjFile = Nothing
End Function


Dear Anh,
Em lại làm phiền anh chút được không ạ. Hôm qua a trợ giúp em Copy được rồi nhưng nay làm việc lại có mẫu mới mà số liệu nó lại mà một mảng nhiều cột chứ không phải một cột như hôm qua ạ. Em có sửa code của anh nhưng do em chưa hiểu nên sửa nó không chạy được ạ. Anh có thể giúp em thêm cái Copy theo mảng được không ạ. Em gửi mẫu biểu anh giúp em với ạ. Em cảm ơn anh nhiều !
 

File đính kèm

Upvote 0
Dear Anh,
Em lại làm phiền anh chút được không ạ. Hôm qua a trợ giúp em Copy được rồi nhưng nay làm việc lại có mẫu mới mà số liệu nó lại mà một mảng nhiều cột chứ không phải một cột như hôm qua ạ. Em có sửa code của anh nhưng do em chưa hiểu nên sửa nó không chạy được ạ. Anh có thể giúp em thêm cái Copy theo mảng được không ạ. Em gửi mẫu biểu anh giúp em với ạ. Em cảm ơn anh nhiều !
Chỉnh Sub Main
Mã:
Sub Main()
  Dim Res(), fileArr(), sArr(), cn As Object
  Dim iPath As String, sqlStr As String
  Dim n As Long, i As Long, j As Byte, Ngay
  Const dR As Byte = 11 'So dong file du lieu
 
  iPath = ThisWorkbook.Path
  fileArr = GetFileList(iPath, ThisWorkbook.Name)
  ReDim Res(1 To UBound(fileArr) * dR, 0 To 7)
 
  ' THay doi thong so vi tri dong cot ten
  sqlStr = "select * from [G023211$C19:I29]"
  Set cn = CreateObject("ADODB.Connection")
 
  For n = LBound(fileArr) To UBound(fileArr)
    ' so 3 là the hien lay tu dau - thu 3
    Ngay = Split(fileArr(n), "-")(3)
    cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & iPath & "\" & fileArr(n) & ";Extended Properties=""Excel 12.0;HDR=No""")
    sArr = cn.Execute(sqlStr).GetRows
    
    For j = LBound(sArr, 2) To UBound(sArr, 2)
      k = k + 1 'Dòng ket qua
      Res(k, 0) = Ngay
      For i = LBound(sArr, 1) To UBound(sArr, 1)
        Res(k, i + 1) = sArr(i, j)
      Next i
    Next j
    cn.Close
  Next n
 
  ' Vi tri chon de copy past
  Range("C18:J18").Resize(k) = Res
  Set cn = Nothing
End Sub
 
Upvote 0
Chỉnh Sub Main
Mã:
Sub Main()
  Dim Res(), fileArr(), sArr(), cn As Object
  Dim iPath As String, sqlStr As String
  Dim n As Long, i As Long, j As Byte, Ngay
  Const dR As Byte = 11 'So dong file du lieu

  iPath = ThisWorkbook.Path
  fileArr = GetFileList(iPath, ThisWorkbook.Name)
  ReDim Res(1 To UBound(fileArr) * dR, 0 To 7)

  ' THay doi thong so vi tri dong cot ten
  sqlStr = "select * from [G023211$C19:I29]"
  Set cn = CreateObject("ADODB.Connection")

  For n = LBound(fileArr) To UBound(fileArr)
    ' so 3 là the hien lay tu dau - thu 3
    Ngay = Split(fileArr(n), "-")(3)
    cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & iPath & "\" & fileArr(n) & ";Extended Properties=""Excel 12.0;HDR=No""")
    sArr = cn.Execute(sqlStr).GetRows
   
    For j = LBound(sArr, 2) To UBound(sArr, 2)
      k = k + 1 'Dòng ket qua
      Res(k, 0) = Ngay
      For i = LBound(sArr, 1) To UBound(sArr, 1)
        Res(k, i + 1) = sArr(i, j)
      Next i
    Next j
    cn.Close
  Next n

  ' Vi tri chon de copy past
  Range("C18:J18").Resize(k) = Res
  Set cn = Nothing
End Sub


Vô cùng biết ơn anh và các anh chị trên diễn đàn về sự giúp đỡ ạ. Chúc Anh chị tháng mới nhiều may mắn và hạnh phúc ạ !!!!!
 
Upvote 0
Web KT

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

Back
Top Bottom