Import số liệu từ nhiều sheet (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

tuan.1985

Thành viên chính thức
Tham gia
25/3/13
Bài viết
77
Được thích
2
Em có code import số liệu từ nhiều file vào file tổng hợp như bên dưới
Vấn đề e gặp phải là phải khai báo tất cả các cột ở các file cần phải import vào file tổng, vì file em rất nhiều trường nên việc khai báo này mất rất nhiều time, nên post lên đây nhờ các anh chị giúp em có cách nào đơn giản hơn ah

Em cám ơn

Mã:
Option Explicit



Sub import_data()
    
    Dim DVKH As Worksheet, sh As Worksheet
    Dim wk As Workbook
    Dim strFolderPath As String
    Dim selectedFiles As Variant
    Dim iFileNum As Integer, iLastRowReport As Integer, iNumberOfRowsToPaste As Integer
    Dim strFileName As String
    Dim rDomain As Range, rInside As Range
    Dim iCurrentLastRow As Integer, iRowStartToPaste As Integer
    Dim startTime As Double
    Dim rep
     
    rep = MsgBox("Ban co muon lam moi du lieu khong?", vbYesNo)
    If rep = vbYes Then Sheet1.Range("A2:AH1000000").ClearContents
 
    getSpeed (True)
    Set DVKH = ActiveWorkbook.Sheets("PU")
    
    strFolderPath = ActiveWorkbook.Path
    
    ChDrive strFolderPath
    ChDir strFolderPath
    
    On Error GoTo NoFileSelected
    selectedFiles = Application.GetOpenFilename( _
                    filefilter:="Excel Files (*.xls*),*.xlsx*", MultiSelect:=True)
                    
    startTime = Timer
    
    For iFileNum = LBound(selectedFiles) To UBound(selectedFiles)
        strFileName = selectedFiles(iFileNum)
        
        
        Set wk = Workbooks.Open(strFileName)
        For Each sh In wk.Sheets
            If sh.Name Like "PU" Then
                With sh
                    iLastRowReport = .Range("A" & Rows.Count).End(xlUp).Row
                    iNumberOfRowsToPaste = iLastRowReport - 2 + 1
                    
                    Set rDomain = .Range("A2:A" & iLastRowReport)
                    Set rInside = .Range("B2:C" & iLastRowReport)
              
                    
                    With DVKH
                            iCurrentLastRow = .Range("A" & Rows.Count).End(xlUp).Row
                            iRowStartToPaste = iCurrentLastRow + 1
                        
                        .Range("A" & iRowStartToPaste).Resize(iNumberOfRowsToPaste, 1) = rDomain.Value2
                        .Range("C" & iRowStartToPaste).Resize(iNumberOfRowsToPaste, 1) = rInside.Value2
                    End With
                    
                End With
            End If
        Next sh
        wk.Close
    Next
    
    MsgBox "Done in " & Int(Timer - startTime) & " s."
    getSpeed (False)
NoFileSelected:
    MsgBox "Chua co file nao duoc chon!"
End Sub


Function getSpeed(doIt As Boolean)
    Application.ScreenUpdating = Not (doIt)
    Application.EnableEvents = Not (doIt)
    Application.Calculation = IIf(doIt, xlCalculationManual, xlCalculationAutomatic)
End Function
 
mất nhiều time là mất cái gì vậy bạn ?
bạn không đưa file thì ai biết bạn muốn làm cái gì đây ?
chỉ dựa vào code thì ai có thể giải quyết cho bạn ? thí dụ tại sao
Mã:
Set rInside = .Range("B2:[COLOR=#ff0000][SIZE=4][B]C[/B][/SIZE][/COLOR]" & iLastRowReport)

mà ở dưới lại là

Mã:
.Range("C" & iRowStartToPaste).Resize(iNumberOfRowsToPaste, [COLOR=#ff0000][SIZE=4][B]1[/B][/SIZE][/COLOR]) = rInside.Value2
 
Upvote 0
mất nhiều time là mất cái gì vậy bạn ?
...

Từ "time" tiếng Anh có 2 nghĩa
1. thời gian -> mất nhiều thời gian là mất nhiều thì giờ
2. lượt -> mất nhiều lượt là phải lặp đi lặp lại nhiều lần

Gặp dân tây bồi thì bố ai biết nổi họ muốn nói gì. Lắm khi còn có nghĩa thứ 3.
 
Upvote 0
Em xin gửi file ah

File Data là file số liệu gốc từ các team đỗ về cần import vào file RP

Như file em gửi thì em khai báo import cho 2 cột Domain và Inside vào file RP, giờ em muốn import tất cả các cột trong file Data vào file RP của tất cả các thành viên
 
Upvote 0
Em xin gửi file ah

File Data là file số liệu gốc từ các team đỗ về cần import vào file RP

Như file em gửi thì em khai báo import cho 2 cột Domain và Inside vào file RP, giờ em muốn import tất cả các cột trong file Data vào file RP của tất cả các thành viên

vùng dữ liệu cần lấy bao nhiêu cột thì cứ khai báo hết 1 lần , chẳng hạn như
Mã:
Set rDomain = .Range("A2:[COLOR=#ff0000][SIZE=4][B]I[/B][/SIZE][/COLOR]" & iLastRowReport)

rồi gán trở lại
Mã:
.Range("A" & iRowStartToPaste).Resize(iNumberOfRowsToPaste,[SIZE=4][COLOR=#ff0000][B] 9[/B][/COLOR][/SIZE]) = rDomain.Value

rồi dẹp bỏ cái rInside luôn
nếu cả như tôi thì tôi không dùng lệnh workbooks.open . Nhưng đây là code của bạn , tôi chỉ dựa theo mà sửa thôi
 
Upvote 0
Rất cám ơn bạn
Mình đã sửa code như bạn và như ý (y)
tuy nhiên gặp vấn đều ví dụ trong file gốc (file data) của mình có cột nào để trống kg có thông tin thì import nó tự động cho số liệu cột khác vào file tổng hợp chứ không tương ứng như file gốc :(
 
Lần chỉnh sửa cuối:
Upvote 0
không biết code mình dán vậy đúng chưa mình xin gửi lại đây cho bạn xem

Mã:
        With sh                    iLastRowReport = .Range("A" & Rows.Count).End(xlUp).Row
                    iNumberOfRowsToPaste = iLastRowReport - 2 + 1
                    
                    Set rDomain = .Range("A2:A" & iLastRowReport)
                    Set rInside = .Range("B2:C" & iLastRowReport)
              
                    
                    With DVKH
                            iCurrentLastRow = .Range("A" & Rows.Count).End(xlUp).Row
                            iRowStartToPaste = iCurrentLastRow + 1
                        
[COLOR=#ff8c00]                        .Range("A" & iRowStartToPaste).Resize(iNumberOfRowsToPaste, 9) = rDomain.Value2[/COLOR]
                        
                    End With
 
Upvote 0
không biết code mình dán vậy đúng chưa mình xin gửi lại đây cho bạn xem

Mã:
        With sh                    iLastRowReport = .Range("A" & Rows.Count).End(xlUp).Row
                    iNumberOfRowsToPaste = iLastRowReport - 2 + 1
                    
                    Set rDomain = .Range("A2:[COLOR=#ff0000][SIZE=5][B]A[/B][/SIZE][/COLOR]" & iLastRowReport)
                    Set rInside = .Range("B2:C" & iLastRowReport)
              
                    
                    With DVKH
                            iCurrentLastRow = .Range("A" & Rows.Count).End(xlUp).Row
                            iRowStartToPaste = iCurrentLastRow + 1
                        
[COLOR=#ff8c00]                        .Range("A" & iRowStartToPaste).Resize(iNumberOfRowsToPaste, 9) = rDomain.Value2[/COLOR]
                        
                    End With

ờ . cũng sắp đúng rồi
 
Upvote 0
Cám ơn Bạn
Mình đã biết cái sai và sửa được rồi (y)
 
Lần chỉnh sửa cuối:
Upvote 0
Các anh chị ơi sau thời gian chạy kiểu này, hằng ngày phải chọn import từ rất nhiều file data vào file tổng hợp thế này thật là bất tiện, em đang thử tìm cách cho nó tự động lấy dữ liệu từ những file mình khai báo sẵn mỗi khi mình click vào icon import, bỏ qua bước chọn file như hiện tại.

Lay hoay bữa giờ chưa được, nhờ anh chị giúp em với ah

Em cám ơn
 
Upvote 0
Các anh chị ơi sau thời gian chạy kiểu này, hằng ngày phải chọn import từ rất nhiều file data vào file tổng hợp thế này thật là bất tiện, em đang thử tìm cách cho nó tự động lấy dữ liệu từ những file mình khai báo sẵn mỗi khi mình click vào icon import, bỏ qua bước chọn file như hiện tại.

Lay hoay bữa giờ chưa được, nhờ anh chị giúp em với ah

Em cám ơn

khai báo sẵn chỉ có ích khi Import từ các file cố định không bao giờ thay đổi đường dẫn
để làm điều này thì trong file TỔNG HỢP bạn lựa ra 1 sheet trống , Ghi tên đường dẫn các file đó vào cột A , rồi khi chạy code đọc dữ liệu của cột A lấy ra các đường dẫn mà xài
 
Upvote 0
VBA em mới đụng tới cách đây 2 tuần nên code cũng chưa rành lắm sao cho nó đọc giữ liệu của cột A như anh nói
Phiền anh hướng dẫn giúp em đoạn code này với ah
 
Upvote 0
thật sự thì e không biết nguyên lý/ngôn ngữ của VBA, mấy nay em cũng chỉ google để biết và làm theo nó để phục vụ công việc thôi thôi hok hiểu bên trong nó chạy ntn

giờ anh doveanhrose chỉ em đọc dữ liệu đường dẫn của file từ sheet khác thì e hiểu là mình nói để VBA làm thay mình bước chọn file theo yêu cầu của mình ở sheet kế tiếp nhưng em không biết là sao để VBA hiểu ý này của em, vì em không biết ngôn ngữ của VBA

Em cũng đã tìm google mới biết đến các anh chị em ở đây nhưng chưa giải quyết được thì sẽ google tiếp là điều đương nhiên
 
Upvote 0
2 file code đó em cũng đã post trong topic này rồi ah
Em xin dán lại bên dưới
 
Lần chỉnh sửa cuối:
Upvote 0
Em đã làm theo hướng dẫn

Copy code mới của a, và dán đường dẫn sheet cần import vào cột K2 trở đi nhưng khi chạy thì bị báo lỗi ở dòng:

Mã:
Set Wb = Application.Workbooks.Open(fName)

Em gửi ở ở file đính kèm ah, nhờ anh hỗ trợ giúp em với ah
 

File đính kèm

Upvote 0
Tôi chẳng sửa code trong file của bạn, Vì code có việc copy value thôi mà đặt biến gì dài thòn lòn.........nhìn rối quá không muốn sửa.
Tôi viết code khác gọn hơn....

Với yêu cầu của bạn là không cần chọn file khi chạy code. Thì bắt buộc bạn phải liệt kê tên File cần tổng hợp lại ở 1 nơi nào đó trên sheet.
Ở đây tôi làm như sau.

Lấy file DVKH_RP làm file tổng hợp
1. Bạn liệt kê tên File con cần tổng hợp lại vào Cột K, cụ thể từ K2 trở đi.....K3, ...Kn (có bao nhiêu cần liệt kê cho đúng vào)
Lưu ý là điền tên vào thì bỏ cái đuôi .xxxx ra nha (vì cái đuôi tôi khai trong code rồi). Ví dụ bên trên thì tại K2 bạn gõ là DVKH - Data
..................................
"Lưu ý": File con phải cùng một đuôi. Theo ví dụ ở trên thì file con là đuôi ".xlsm"
Và tất nhiên là các file con & file tổng hợp cần đặt chung 1 folder

Cái này dùng FileDialogue sẽ linh hoạt hơn bạn nhỉ?
 
Upvote 0
P/s: code cũ trên file của bạn ấy có hết các tính năng là tự Select file, tự nhận dạng đuôi file và thực hiện copy Value về file tổng. Ấy thế mà hok chịu....đòi cái kiểu thủ công ấy!


Không phải hok chịu nhưng ngày nào cũng vào chọn 20 file để làm báo cáo rất bất tiện, nên mình mới nhờ đến anh chị em có giải pháp nào tối ưu đỡ phải thao tác chọn 20 lần như vậy.

Code mới của anh hpkhuong thì em đã sửa lại tên file và chạy như ý, nhưng gặp phải vấn đề là e share dropbox 20 bạn tương ứng 20 folder nên phải cần đường dẫn chứ không thể gán 20 file vào 1 folder được vì phải bảo mật thông tin giữa 20 bạn nữa ah
 
Upvote 0
Vâng folder em tạo và share qua dropbox cho các member để làm việc nhập liệu trên đó, vs code củ của em thì vẫn import được bình thường khi chọn từng file ah
 
Upvote 0
Web KT

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

Back
Top Bottom