PDA

View Full Version : Cách lấy dữ liệu vào 1 file dữ liệu thô



tackenui
08-08-07, 10:40 AM
Mình thấy trên diễn đàn có chỉ nhiều cách lấy dữ liệu từ 1 file khác. Nhưng hình như chỉ là lấy nguyên file này đổ vào file kia thôi. Ko biết mình thấy đúng hay ko? :)
Bi giờ giả sử tôi có 1 file dữ liệu thô và 1 file được thiết kế sẵn layout. (Cột trên file thô ko tương ứng với file được thiết kế layout)
Nếu tôi dùng VBA để copy dữ liệu từ file thô vào file layout thì phải làm như thế nào? Xin mọi người chỉ giúp
VD: tôi có 1 file sổ quỹ (layout), phía dưới có các phần như Chữ ký giám đốc... Khi tôi đổ từ file thô sang thì chương trình sẽ chèn thêm dòng vô phần detail và đẩy từ từ phần chữ ký xuống phía dưới để ko ảnh hưởng phần layout ở dưới.

Xin nói thêm là khi mình mở file layout thì chương trình sẽ tự động lấy dữ liệu từ file thô bỏ vào cột tương ứng.

Lam_A0
08-08-07, 11:02 AM
Làm được anh ạ! Em gửi anh hàm GetValue(path, file, sheet, ref), nó có các tham số là đường dẫn path, tên file, tên sheet, và giá trị tham chiếu. Anh muốn copy cái gì thì cứ thay đổi cái ref là được.



Function Getvalue(path, file, sheet, ref)
'Retrieve a value from a closed workbook
Dim arg As String
'Make sure the file exists
If Right(path, 1) <> "\" Then path = path & "\"
If Dir(path & file) = "" Then
Getvalue = "File not found!"
Exit Function
End If
'Create the argument
arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)
'Execute an XLM macro
Getvalue = ExecuteExcel4Macro(arg)
End Function


Xin nói thêm là khi mình mở file layout thì tự nó sẽ lấy dữ liệu từ file thô bỏ vào theo đúng thứ tự column.
Vậy thì anh nên gửi file lên forum. Thân!

Mr Okebab
08-08-07, 11:08 AM
Mình thấy trên diễn đàn có chỉ nhiều cách lấy dữ liệu từ 1 file khác. Nhưng hình như chỉ là lấy nguyên file này đổ vào file kia thôi. Ko biết mình thấy đúng hay ko? :)
Bi giờ giả sử tôi có 1 file dữ liệu thô và 1 file được thiết kế sẵn layout. (Cột trên file thô ko tương ứng với file được thiết kế layout)
Nếu tôi dùng VBA để copy dữ liệu từ file thô vào file layout thì phải làm như thế nào? Xin mọi người chỉ giúp
VD: tôi có 1 file sổ quỹ (layout), phía dưới có các phần như Chữ ký giám đốc... Khi tôi đổ từ file thô sang thì chương trình sẽ chèn thêm dòng vô phần detail và đẩy từ từ phần chữ ký xuống phía dưới để ko ảnh hưởng phần layout ở dưới.

Có 2 cách làm :
C1 :
- Bạn làm sẵn dòng những cuối ở đâu đó. Sau đó khi đã lấy hết dữ liệu vào file mẫu của bạn (không có phần footer) thì bạn sẽ copy phần này vào (phần ở đâu đó), bắt đầu từ dòng cuối cùng. Tất nhiên là để VBA làm rồi.

C2 :
- Bạn dự tính Layout của bạn tối đa là 5.000 dòng (VD như vậy),header là 10 dòng, footer 5 dòng. Vậy thì bạn thiết kế sẵn một layout có 5015 dòng.
Trước khi đỏ dữ liệu vào thì bạn phải xóa hết dữ liệu cũ (không cần phải nhắc phải không), sau đó bạn chép dự liệu vào layout của bạn.

VD khi đó dữ liệu của bạn có 1000 dòng (từ dòng 11 đến 1010), sau đó bạn cho ẩn đi từ dòng 1011 đến 5010. Và cứ vậy mà in ra thôi

Tất nhiên điều này phải thực hiện bằng VBA thì mới thấy hiệu quả.

Thân!

tackenui
08-08-07, 11:16 AM
Cám ơn các bạn. Mình gởi lên 2 file mẫu. Bạn chỉ mình cách làm nhé. Tất nhiên là bằng VBA
Ý của mình là. File "So.xls" là file layout. File "Sheet1.xls" là file thô
Khi mình mở file "So.xls" lên thì nó sẽ lấy dòng tương ứng bên file "Sheet.xls" qua (tương ứng với từng cột, có thể cột bên file này khác thứ tự cột bên file kia.
Giúp mình nhé. Thanks :)

anhtuan1066
08-08-07, 11:21 AM
Tự nhiên làm cho nhọc công... Chử ký GD là phần ko thay đỗi, sao ko cho lên phía trên? Tôi thấy các cty hay làm như thế! Nghĩa là khi thiết kế Form người ta viết bên dưới là cái gì mặc kệ, miễn phía trên có 4 khung (cho 4 người ký chẳng hạn)... Thế thì phía dưới bạn muốn "đổ" bao nhiêu dử liệu vào cũng đâu có gặp rắc rối...
ANH TUẤN

Lam_A0
08-08-07, 01:45 PM
Em làm tạm file này xem có hợp ý anh không. Nó mới chỉ thực hiện việc cơ bản là copy dữ liệu từ file sheet1.xls sang so.xls, chưa xử lý khi dữ liệu tăng lên vượt quá khung trong file so.xls. Đúng theo lời anhtuan1066 nói, nếu anh để phần chữ ký lên trên thì mọi chuyện sẽ nhẹ nhàng hơn nhiều. Anh chú ý thay đổi phần đường dẫn file trong code nhé! Thân!

anhphuong
08-08-07, 01:58 PM
Nếu dữ liệu chỉ là giản đơn như vậy thì đâu cần VBA, bạn có thể làm như sau :
1/ Chuyển dữ liệu thô về các cột cho đúng với layout
2/ Chọn các dữ liệu cần chuyển từ file dữ liệu thô vào, dùng lệnh copy và InsertCopyCell là được ngay mà .
Chúc thành công
Thân

tackenui
08-08-07, 03:08 PM
Cám ơn các bạn rất nhiều, nhất là bạn Lam A0

trungnt
08-08-07, 03:15 PM
Tôi cũng đồng quan điểm với anhphuong, bạn nên định dạng file dữ liệu thô giống với file thiết kế để khi copy sang khỏi phải bận tâm. Tôi vd 1 câu lệnh: Copy vùng dữ liệu A1:D16 của sheet1 sang sheet2 đặt tại vùng B1:E16 như sau:
Sheet1.Range("A1:D16").Copy Destination:=Sheet2.Range("B1:E16")

dmtdmtbb
08-08-07, 03:51 PM
Em làm tạm file này xem có hợp ý anh không. Nó mới chỉ thực hiện việc cơ bản là copy dữ liệu từ file sheet1.xls sang so.xls, chưa xử lý khi dữ liệu tăng lên vượt quá khung trong file so.xls. Đúng theo lời anhtuan1066 nói, nếu anh để phần chữ ký lên trên thì mọi chuyện sẽ nhẹ nhàng hơn nhiều. Anh chú ý thay đổi phần đường dẫn file trong code nhé! Thân!

Sub copy_data()
Dim p, f As String
Dim i, j As Long
........p = "C:\Documents and Settings\ntlam\Desktop"
........f = "sheet1.xls"
........s = "sheet1"
............For i = 7 To 8
............... For j = 1 To 6
................... a = Cells(i, j).Address
................... Cells(i, j) = Getvalue(p, f, s, a)
................ Next j
.............Next i
End Sub

- Bạn nên cho p = "" thì hay hơn khỏi phải mắc công sửa đường dẫn chỉ cần chép 2 file cùng thư mục là ok.

Lam_A0
08-08-07, 04:03 PM
- Bạn nên cho p = "" thì hay hơn khỏi phải mắc công sửa đường dẫn chỉ cần chép 2 file cùng thư mục là ok.

Vấn đề là ở chỗ, khi em sử dụng hàm này thì không bao giờ em để 2 file này ở cùng một thư mục cả. Em có 1 file dữ liệu, trong đó có rất nhiều thứ mà không muốn cho người sử dụng xem. Người dùng không cần mở file dữ liệu ra, cũng không cần biết nó nằm ở đâu (code này em đặt pass), họ chỉ cần update thông tin mà họ cần.

vietnam123
04-09-07, 11:04 PM
Function Getvalue(path, file, sheet, ref)
'Retrieve a value from a closed workbook
Dim arg As String
'Make sure the file exists
'If Right(path, 1) <> "\" Then path = path & "\"
'If Dir(path & file) = "" Then
'Getvalue = "File not found!"
'Exit Function
'End If
'Create the argument
arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)
'Execute an XLM macro
Getvalue = ExecuteExcel4Macro(arg)
End Function

Sub copy_data()
Dim p, f As String
Dim i, j As Long
p = ""
f = Application.InputBox(prompt:= _
"Enter the source filename", Title:="Source file", _
Default:="Sheet1.xls")

'f = InputBox("Enter the source filename" & Chr(10) & "(with complete path):", "Source file")

'f = "Sheet1.xls"
s = "sheet1"
For i = 1 To 18
For j = 1 To 10
a = Cells(i, j).Address
Cells(i, j) = Getvalue(p, f, s, a)
Next j
Next i
End Sub


Em chỉnh sửa lại chút xíu.

anktdn
18-06-09, 10:58 PM
Trong trường hợp này em muốn lấy du liệu từ sheet1 từ A6 : F8, sang file cần rút từ sheet1 vào là từ dòng H7:M9, code không đồng nhất về hàng và cột trong trường hợp này, mong anh chị giúp đỡ. thanks

longnh
19-06-09, 05:28 AM
Sao không nghĩ nguợc lại là áp layout vào số liệu.

anktdn
19-06-09, 12:20 PM
Trường hợp em nêu ở trên nhờ anh chị giúp đỡ theo ví dụ của bạn tackenui.thanks