2009-07-24 72 views
5

Tôi hàng tháng nhận được hơn 100 bảng tính excel mà tôi có phạm vi cố định và dán vào bảng tính khác để tạo báo cáo.Trích xuất dữ liệu với Excel

Tôi đang cố gắng viết tập lệnh vba để lặp lại các tệp excel của mình và sao chép phạm vi trong một bảng tính, nhưng tôi đã không thể thực hiện được.

Có cách nào dễ dàng để thực hiện việc này không?

+3

Qusetions: 1) Bạn có những gì cho đến nay? 2) làm thế nào để biết những tập tin để mở?và 3) Vấn đề bạn đang gặp phải là gì? – RBarryYoung

Trả lời

3

Tôi đã viết cách đây nhiều năm, nhưng có thể nó sẽ giúp bạn. Tôi đã thêm phần mở rộng cho phiên bản Excel mới nhất (xlsx). Dường như làm việc.

Sub MergeExcelDocs() 
    Dim lastRow As Integer 
    Dim docPath As String 
    Dim baseCell As Excel.range 
    Dim sysObj As Variant, folderObj As Variant, fileObj As Variant 
    Application.ScreenUpdating = False 
    docPath = Application.GetOpenFilename(FileFilter:="Text Files (*.txt),*.txt,Excel Files (*.xls),*.xls,Excel 2007 Files (*.xlsx),*.xlsx", FilterIndex:=2, Title:="Choose any file") 
    Workbooks.Add 
    Set baseCell = range("A1") 
    Set sysObj = CreateObject("scripting.filesystemobject") 
    Set fileObj = sysObj.getFile(docPath) 
    Set folderObj = fileObj.ParentFolder 
    For Each fileObj In folderObj.Files 
     Workbooks.Open Filename:=fileObj.path 
     range(range("A1"), ActiveCell.SpecialCells(xlLastCell)).Copy 
     lastRow = baseCell.SpecialCells(xlLastCell).row 
     baseCell.Offset(lastRow, 0).PasteSpecial (xlPasteValues) 
     baseCell.Copy 
     ActiveWindow.Close SaveChanges:=False 
    Next 
End Sub 

EDIT:

tôi nên đề cập đến cách thức hoạt động. Khi bạn bắt đầu macro, nó sẽ trả về một hộp thoại Open File. Bấm đúp vào tệp đầu tiên trong danh sách (hoặc bất kỳ tệp nào cho vấn đề đó). Nó sẽ tạo một sổ làm việc mới rồi lặp qua tất cả các tệp trong thư mục. Đối với mỗi tệp, nó sao chép tất cả nội dung từ trang tính đầu tiên và dán nó vào cuối sổ làm việc mới. Đó là khá nhiều tất cả để có nó.

+0

Làm việc như một sự quyến rũ! Tôi vừa thêm: Phạm vi ("H14: N14"). Sao chép Để phù hợp với nhu cầu của tôi; Tuy nhiên xuống đường, Ill cố gắng đi theo con đường ADO để linh hoạt hơn. Cảm ơn bạn rất nhiều! im một người nông dân tủ bếp hạnh phúc! – Rodrigo

+0

Rất vui được! – devuxer

1

Bạn có thử

Tools->Macro->Record New Macro 

để tạo MACO để làm điều tương tự

+0

Tôi đã làm để có được một cảm giác như thế nào vba hiện mọi thứ, nhưng tôi cần phải lặp lại để làm điều tương tự với một số tập tin. – Rodrigo

+0

Đây là điểm bắt đầu của tất cả các macro của tôi. – Kieveli

+0

Bạn có thể có một bảng tính mục tiêu trống với macro trong đó. Làm cho nó lặp qua các tệp, mở từng tệp một, sau đó sao chép mọi thứ ra. Hãy thử ghi lại một macro trong khi bạn thực hiện nó với một vài tệp. – Kieveli

2

Một giải pháp khác là phải có roll-up truy cập bảng tính của bạn các bảng tính khác bằng tên tập tin và lấy các dữ liệu riêng của mình.

Để làm điều đó, bạn cần phải mở tất cả các bảng tính cùng một lúc để có thể cập nhật liên kết nhưng vẫn có thể nhanh hơn mở và sao chép/dán từng liên kết, ngay cả với macro . Mỗi bảng tính sẽ cần phải có một tên tệp duy nhất.

Nếu tên của bảng tính không được biết cho đến khi bạn nhận hoặc chúng thay đổi thường xuyên, hãy tạo cột trong bảng cuộn lên để lưu tên tệp của trang tính, sau đó xây dựng địa chỉ bạn cần bằng thao tác chuỗi và lấy dữ liệu bằng cách sử dụng hàm INDIRECT().

Ví dụ để lấy một tế bào của dữ liệu từ một tập tin cụ thể:

=INDIRECT("'[C:\path\workbook.xls]MyWorksheet'!$A$2") 

Rửa và lặp lại trên cho từng tế bào của mỗi bảng tính bạn muốn nhận được.

Bạn nên thông minh về cách để chuỗi được chuyển đến INDIRECT(). Xây dựng nó dưới dạng công thức để bạn có thể sử dụng công thức giống hệt nhau cho mọi ô bạn cần truy xuất.

Ví dụ:

= INDIRECT("'[" & $A2 & "]MyWorksheet'!$" & ADDRESS(3, COL())) 

Công thức trên sẽ đi vào bảng tính có tên tệp là trong $ A2 (lưu ý sự thiếu $ trước khi "2", do đó bạn có thể dán cùng một công thức để hàng khác cho các tập tin khác) và nhận giá trị của ô trên bảng MyWorksheet trên hàng ba và cột hiện tại (vì vậy, nếu đây là B2 trên cuộn lên của bạn, nó sẽ nhận được B3 từ tệp khác).

Điều chỉnh chức năng ADDRESS để thêm bù đắp cho hàng và cột cần thiết.

Lợi thế của giải pháp ở trên là công thức giống nhau có thể được sao chép và dán trên các hàng và cột bạn cần điền và Excel sẽ điều chỉnh $ A2 và COL() nếu cần. Rất bảo trì.

Chỉnh sửa khi tôi có tình huống tương tự và tôi không thể tải tất cả các bảng tính cùng một lúc (hơn 200). Tôi nghĩ rằng tôi đã kết thúc bằng văn bản VBA vì vậy nó đã làm không thực sự mở và đọc các tập tin Excel. Thay vào đó, tôi đã lặp lại thông qua tên tệp, mở một kết nối ODBC cho mỗi tên và sử dụng ADO để đọc các giá trị tôi cần từ một phạm vi được chỉ định (được hiển thị dưới dạng "bảng" trong ODBC - các bảng tính cũng xuất hiện dưới dạng "bảng "nhưng có quy tắc về tên được phép). Điều này nhanh hơn nhiều so với việc mở và đóng các tệp Excel, và có thêm lợi thế là không bị lỗi Excel.

+0

Tôi sắp xếp làm điều đó ngay bây giờ, sử dụng công thức để gọi giá trị từ bảng tính; tuy nhiên, giải pháp được ưu tiên sẽ là một tập lệnh vba từ excel. – Rodrigo

1

Rodrigo,

Tôi đoán bạn có nghĩa là 100 workbook mà bạn cần phải cá nhân mở và sao chép và dán vào một? Nghe có vẻ thú vị :)

Nếu bạn có thể đặt tất cả trong một thư mục, mở từng tệp một cách hợp lý dễ dàng, trước tiên hãy tìm kiếm. (@Mark Biek đã đăng một ví dụ tốt cho bạn)

Khi bạn mở một tệp, tôi sẽ sao chép dữ liệu vào một bản ghi ADO mà bạn sẽ thêm vào. Tôi có posted some code để làm điều gì đó rất giống với việc kết hợp nhiều trang tính trong một sổ làm việc.

Nó không chính xác những gì bạn cần, nhưng nó sẽ giúp đỡ. Nếu không, đăng bao xa bạn nhận được và tôi sẽ có một cái nhìn khác trong tuần.

6

Dưới đây là một số mã VBA đó chứng tỏ iterating qua một loạt các file Excel trong một thư mục và mở mỗi một:

Dim sourcePath As String 
Dim curFile As String 
Dim curWB As Excel.Workbook 
Dim destWB As Excel.Workbook 

Set destWB = ActiveWorkbook 
sourcePath = "C:\files" 

curFile = Dir(sourcePath & "\*.xls") 
While curFile <> "" 
    Set curWB = Workbooks.Open(sourcePath & "\" & curFile) 

    curWB.Close 
    curFile = Dir() 
Wend 

Hy vọng rằng sẽ có đủ điểm khởi đầu tốt để bạn có thể làm việc mã vĩ mô hiện tại của bạn .

+0

Đó là, cảm ơn bạn rất nhiều Mark. Các rắc rối thực sự đối với tôi, đã nhận được lựa chọn: sao chép: thay đổi bảng tính: dán trình tự rigth. – Rodrigo

0

Trong quá khứ, tôi đã sử dụng VBA để tạo tham chiếu bên ngoài (liên kết).

tôi đăng về nó ở đây (xem ví dụ 2):

Best short examples of the need for Excel VBA

Nó tương tự như sử dụng KHÔNG TRỰC TIẾP, nhưng mà không cần phải có sách bài tập excel mở.

Điểm bất lợi duy nhất là máy tính cũ hoặc phiên bản cũ của excel, không chắc chắn, có thể làm cho quá trình này chậm. Tôi tin rằng đó là bởi vì mỗi khi một tham chiếu bên ngoài mới được thêm vào, tất cả các tài liệu tham khảo bên ngoài khác được cập nhật. Để làm cho nó đi nhanh hơn, tôi đặt Tính toán thành Thủ công, thêm các tham chiếu bên ngoài và đặt Tính toán thành Tự động để cập nhật chúng.

Sau đó, nếu bạn chỉ muốn các giá trị, bạn có thể sử dụng Liên kết Break hoặc Sao chép và dán các giá trị đặc biệt.

Các vấn đề liên quan