Hoàng Nhật Phương
Thành viên gắn bó



- Tham gia
- 5/11/15
- Bài viết
- 1,895
- Được thích
- 1,219
Sub ImportData()
Dim Master As Worksheet, Sh As Worksheet, wk As Workbook
Dim strFolderPath As String, strFileName As String
Dim Arr As Variant , v As Integer , cll, Rng As Range, DK As Boolean
Dim Er As Long, Ep As Long, Tenfile
Application.ScreenUpdating = False
Set Master = ActiveWorkbook.Sheets("Sheet1")
Master.Range("C5:AH" & Master.Range("C65535").End(3).Row+1).ClearContents
On Error GoTo Thoat
Arr = Application.GetOpenFilename( _
filefilter:="Excel Files (*.xls*),*.xlsx*", MultiSelect:=True)
For v = LBound(Arr) To UBound(Arr)
strFileName = Arr(v)
Set wk = Workbooks.Open(strFileName)
For Each Sh In wk.Sheets
If Sh.Name Like "Sheet*" Then
With Sh
DK = False
Er = .Range("E65535").End(3).Row
If Er > 5 Then
Set Rng = .Range("E" & Er & ":AF" & Er)
Ep = Master.Range("C65535").End(3).Row + 1
For Each cll In Rng
If cll <> Empty And IsNumeric(cll) = True Then
DK = True
Exit For
End If
Next
If DK = True Then
With Master
Tenfile = Split(Mid(strFileName, InStrRev(strFileName, "\") + 1), ".")
.Range("C" & Ep) = Tenfile(0)
.Range("D" & Ep) = Sh.Name
.Range("E" & Ep) = Sh.Range("E3"): .Range("F" & Ep) = Sh.Range("E4")
.Range("G" & Ep).Resize(, 28) = Rng.Value
End With
End If
End If
End With
End If
Next Sh
wk.Close False
Next
MsgBox "Qua trinh lay du lieu hoan thanh "
Thoat:
Exit Sub
Application.ScreenUpdating = True
End Sub
ADO chắc phải nhờ bạn #2 hoặc các thành viên khác còn tôi thì mù tịch ADO (chưa được đào tạo về cơ sở dữ liệu nên việc tổ chức thông tin sẽ không ổn đâu, vã lại tôi thấy cái file của bạn tổ chức thông tin như vậy mà sử dụng ADO hơi bị khó à, mà không chừng tại trình độ của tôi chưa đủ để giải quyết vấn đề của bạn).
Xin chào giaiphap,Cái vụ tên đặt có dấu thì tôi thua rồi bạn, bạn cho một lý tại sao phải đặt tên file có dấu, vã lại nếu đặt tên có dấu sẽ gặp rắc rối sau này vì có một số phần mềm hoặc ứng dụng sẽ bị lỗi nếu đọc file có dấu tiếng việt.
Hình như Macro4 vướng với đường dẫn là chữ có dấu, còn FSO thì không vấn đề gì.Cái vụ tên đặt có dấu thì tôi thua rồi bạn, bạn cho một lý tại sao phải đặt tên file có dấu, vã lại nếu đặt tên có dấu sẽ gặp rắc rối sau này vì có một số phần mềm hoặc ứng dụng sẽ bị lỗi nếu đọc file có dấu tiếng việt.
Do "tác giả" lấy code từ chỗ khác nên không biết sửaXin chào giaiphap,
Cảm ơn bạn đã thông tin, hic tôi cũng không biết nữa có lẽ việc đặt dấu tên file để phân biệt tập tin cùng chủng loại mặt hàng. Nhưng vì có quá nhiều mặt hàng lên mới chia làm nhiều tập tin như vậy.
Còn lý do nào nữa tôi không biết được. Rất xin lỗi bạn.
Còn chuyện đổi tên tập tin thì là một chuyện rất đơn giản nhưng không thể đổi được nữa bạn ạ, vì hệ thống có rất nhiều tập tin khác cũng liên kết đến các tập tin con này.
Nếu thay đổi thì sẽ rất rắc rối.(
Bạn sửa code của mình lại thế này (nhưng không khuyến cáo bạn đặt tên file có chứa unicode.Xin chào giaiphap,
Cảm ơn bạn đã thông tin, hic tôi cũng không biết nữa có lẽ việc đặt dấu tên file để phân biệt tập tin cùng chủng loại mặt hàng. Nhưng vì có quá nhiều mặt hàng lên mới chia làm nhiều tập tin như vậy.
Còn lý do nào nữa tôi không biết được. Rất xin lỗi bạn.
Còn chuyện đổi tên tập tin thì là một chuyện rất đơn giản nhưng không thể đổi được nữa bạn ạ, vì hệ thống có rất nhiều tập tin khác cũng liên kết đến các tập tin con này.
Nếu thay đổi thì sẽ rất rắc rối.(
Sub GPE()
Dim fso As Object, ObjFile As Object
Dim path As String, I As Long, Arr(), dArr(), k As Long
Dim sFile As String, sSheet As String, sAddr As String, wb As Workbook
ReDim Arr(1 To 70, 1 To 2)
ReDim dArr(1 To 2, 1 To 1)
Application.DisplayAlerts = True
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
sAddr = "E102:AF102"
path = ThisWorkbook.path
Set fso = CreateObject("Scripting.FileSystemObject")
With fso.GetFolder(path)
For Each ObjFile In .Files
If fso.GetExtensionName(ObjFile) = "xlsx" And Left(ObjFile.Name, 2) <> "~$" And ObjFile.Name <> ThisWorkbook.Name Then
sFile = ThisWorkbook.path & "\" & ObjFile.Name
Set wb = Workbooks.Open(sFile)
Arr = wb.Sheets("Tonghop").Range("C5:D74").Value
For I = 1 To 70
If Arr(I, 2) <> 0 Then
sSheet = Arr(I, 1)
k = Sheet1.Range("C65000").End(xlUp).Row + 1
Sheet1.Range("C" & k) = Left(ObjFile.Name, Len(ObjFile.Name) - 5)
Sheet1.Range("D" & k) = sSheet
dArr = wb.Sheets(sSheet).Range("E3:E4").Value
Sheet1.Range("E" & k).Resize(, 2) = Application.Transpose(dArr)
Sheet1.Range("G" & k).Resize(, 28) = wb.Sheets(sSheet).Range(sAddr).Value
End If
Next I
wb.Close
Set wb = Nothing
End If
Next
End With
Application.DisplayAlerts = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Tôi chỉ sửa lại code trong file bạn đưa lên chứ không phải code của tôi nhé. Thấy ngứa mắt nên sửa chứ nếu tôi viết tôi sẽ viết khác.Xin cảm ơn các bạn: befaint, huuthang_bd, giaiphap đã hỗ trợ & và giúp đỡ.
Tôi đã chạy thử code trong tập tin ở bài #12 của bạn huuthang_bd kết quả còn một chút vấn đề nữa nhờ bạn xem giúp huuthang_bd , cụ thể là code không lấy dữ liệu từ ô E4 của các tập tin con để đưa vào cột F trong tập tin Tonghop. Mà code lấy dữ liệu từ ô E3 ...
Code của bài #13 của bạn giaiphap tuy tốc độ có phần chậm hơn code ở bài #12 một chút nhưng kết quả rất OK, xin cảm ơn bạn đã cố gắng tìm cách hỗ trợ cho tôi.
---------
Ngoài ra còn một vấn đề nữa là trong thư mục có rất nhiều tập tin có những tập tin không không có ý định muốn cập nhật dữ liệu vào cùng nên rất mong 2 bạn huuthang_bd và giaiphap sửa lại code làm sao để liệt kê các tập tin con cần lấy dữ liệu.
Code ở #2 rất OK có thể mở hộp chọn lên chọn tùy ý các tập tin muốn lấy (Application.GetOpenFilename)
, nhưng trong trường hợp này do đường dẫn cũng khá dài mỗi lần cập nhật phải tìm kiếm đường dẫn nên cũng hơi bất tiện.
Nhờ các bạn bạn xem giúp ạ.
Ý bạn muốn giúp gì nửa mới được chứ. Liệt kê danh sách file lên form để bạn chọn hay sao? hay là cho chọn thư mục? hay chọn từng tệp tin?...Ngoài ra còn một vấn đề nữa là trong thư mục có rất nhiều tập tin có những tập tin không không có ý định muốn cập nhật dữ liệu vào cùng nên rất mong 2 bạn huuthang_bd và giaiphap sửa lại code làm sao để liệt kê các tập tin con cần lấy dữ liệu.
Ý bạn muốn giúp gì nửa mới được chứ. Liệt kê danh sách file lên form để bạn chọn hay sao? hay là cho chọn thư mục? hay chọn từng tệp tin?...
Mình thực hiện theo trường hợp 1 của bạn, bạn có thể sửa lại thành trường hợp 3.Xin chào giaiphap,
Cảm ơn bạn đã giúp đỡ ạ,
Rất xin lỗi vì tôi chưa giải thích rõ,đúng rồi bạn ạ:
1.Trường hợp Liệt kê danh sách file lên form để chọn:
Với cách này rất hay nếu không mất nhiều thời gian mong bạn giúp đỡ về vấn đề liệt kê toàn bộ các tập tin xls,xlsx,xlsb,xlsm trong cùng thư mục chứa tập tin Tonghop này lên form xong đó chọn các tập tin cần lấy dữ liệu ạ.
2.Hoặc trường hợp viết thẳng vào code tập tin muốn lấy, ví dụ đính kèm gửi lên các tập tin nguồn là A.xlsx
B.xlsx
C.xlsx
..
E.xls
F.xlsb
Với cách này khi có tập tin mới cũng hơi bất tiện cho người dùng sửa lại code.
3.Hiện Oanh Thơ có 1 ý tưởng là trong tập tin Tonghop mở thêm 1 sheet mới có tên là filelink.
Trong sheet filelink này ta sẽ:
Nhập lượt tên các tập tin bắt đầu từ ô E5:
E5=A.xlsx
E6=B.xlsx
E7=C.xlsx
E8=E.xls
E9=F.xlsb
...
En=...
3 trường hợp trên mong các bạn góp ý và giúp đỡ ạ.
Mình thực hiện theo trường hợp 1 của bạn, bạn có thể sửa lại thành trường hợp 3.