Ghi dữ liệu vào file excel đang đóng

Liên hệ QC

hanhpptc

Thành viên tiêu biểu
Tham gia
16/5/08
Bài viết
459
Được thích
320
Mình muốn có một macro ghi dữ liệu từ một file excel này (đang mở) sang một file excel khác đang đóng. Bạn nào biết xin hướng dẫn dùm cú pháp, cám ơn
 
Em nghĩ như thế này nếu đổi tên sheet như chú TrungChinhs vi dụ A.xls với sheet Data_A, B.xls với sheet Data_B thì code để ghi từ file B.xls sang file A.xls thì code như sau:
[GPECODE=vb]
Sub GhiDL_HLMT()
Dim cn As Object
Set cn = CreateObject("ADODB.Connection")
With cn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
"data source=" & ThisWorkbook.Path & _
"\A.xls;extended properties=""excel 8.0;HDR=Yes;"";"
.Open
.Execute "INSERT INTO [Data_A$] SELECT STT,TEN,SL FROM [excel 8.0;database=" & _
ThisWorkbook.FullName & ";HDR=Yes].[Data_B$A1:C16]"
End With
cn.Close: Set cn = Nothing
End Sub


[/GPECODE]
 
Upvote 0
Nghĩa là đối với việc này ADO nó không cho phép phải không ạnh.
 
Upvote 0
Nghĩa là đối với việc này ADO nó không cho phép phải không ạnh.

Đúng vậy. Chính vì thế nên nhiều người mới dùng đến cách làm "ngầm" tức là mở file đích lên, dán vào vị trí tùy ý (như mong muốn của bạn) rồi đóng lại.
 
Upvote 0
Bạn muốn chèn dữ liệu vào File B Tại vùng B8:D8 trở xuống thì tại B8:D8 tại file B bạn đặt tiêu đề STT,TEN,SL. Sau đó chạy Code anh HLMT.
Cảm ơn anh, đúng là làm như vậy là sẽ xử lý được vấn đề của em rồi. Cho em hỏi thêm một câu nữa, Các tiêu đề STT, TEN,SL mình có set gì không? Hay là cứ đặt STT, TEN, SL là được. Nếu trong file đích có nhiều hơn 1 ký tự STT thì câu lệnh sẽ xử lý thế nào anh nhỉ.
 
Upvote 0
Cảm ơn anh, đúng là làm như vậy là sẽ xử lý được vấn đề của em rồi. Cho em hỏi thêm một câu nữa, Các tiêu đề STT, TEN,SL mình có set gì không? Hay là cứ đặt STT, TEN, SL là được. Nếu trong file đích có nhiều hơn 1 ký tự STT thì câu lệnh sẽ xử lý thế nào anh nhỉ.

Tốt nhất là nên tiếng Việt không dâu nếu lỡ có dùng TV có dấu thì nên insert thêm dòng rồi đánh TV không dấu để kết nối A.xls, B.xls thì trường 2 bên giống nhau tức là tiêu đề giống nhau và là duy nhất không trùng, nếu giống nhau và lỡ thích sài tiêu đề TV có dấu thì nên cho HDR=No dùng để dùng tên trường F1,F2,F3 .....
 
Upvote 0
Cảm ơn anh, đúng là làm như vậy là sẽ xử lý được vấn đề của em rồi. Cho em hỏi thêm một câu nữa, Các tiêu đề STT, TEN,SL mình có set gì không? Hay là cứ đặt STT, TEN, SL là được. Nếu trong file đích có nhiều hơn 1 ký tự STT thì câu lệnh sẽ xử lý thế nào anh nhỉ.
Để biết cách xử lý cho các trường hợp phát sinh bạn cần tìm hiểu ADO thì mới có thể tuỳ biến nhiều được.
Với câu hỏi của bạn mình dựa theo CODE anh HLMT trả lời như sau

Đoạn truy vấn
Mã:
        .Execute "INSERT INTO [Data_B$] SELECT [B]STT,TEN,SL [/B]FROM [excel 8.0;database=" & _
                    ThisWorkbook.FullName & ";[B]HDR=Yes[/B]].[Data_A$B8:D23]"

Đoạn in đậm có nghĩa là file A của bạn có tiêu đề gồm STT, TEN, SL. Dữ liệu được chèn vào file B dự theo cái tiêu đề này (HDR=Yes). => Như vậy để chèn vào File B thì bắt buộc tiêu đề file B phải giống hoàn toàn file A. Bạn cứ thử theo hướng này sẽ cho kết quả.
 
Upvote 0
Cảm ơn anh. Cái gì cũng phải có nguyên tắc của nó đúng không anh, nếu cứ bám theo hướng đó là xử lý được, không nên đặt ra những truờng hợp khó xử lý. ^^
Cảm ơn mọi người nhiều lắm.
 
Upvote 0
Cảm ơn anh. Cái gì cũng phải có nguyên tắc của nó đúng không anh, nếu cứ bám theo hướng đó là xử lý được, không nên đặt ra những truờng hợp khó xử lý. ^^
Cảm ơn mọi người nhiều lắm.
Tôt nhất bạn nên tìm hiểu các đề tài của anh HaiLuaMienTay có hướng dẫn và giải thích rất rõ ràng nếu chưa biết gì ADO chúc bạn thành công
 
Upvote 0
Cảm ơn bạn nrnhung49.
Mình tìm trong thớt học ADO của anh HLMT nhưng vẫn chưa tìm được cách để sửa câu truy vấn sao cho mỗi lần ghi là nó cập nhật lại dữ liệu thay cho dữ liệu cũ chứ không phải ghi bổ sung thêm. Trong trường hợp ví dụ của anh HLMT thì mỗi khi mình bấm ghi là nó ghi nối tiếp theo, dữ liệu cũ thì vẫn còn, dữ liệu mới ở bênh dưới dữ liệu cũ. Hay là phải dùng code để xoá dữ liệu trước đó, rồi sau đó mới ghi lại.
Mong bạn giải đáp giúp trường hợp hợp này nhé, cảm ơn bạn nhiều.
 
Upvote 0
Ah vậy là câu lệnh khác rồi bạn tìm hiểu lệnh update từ bài 101 nhen Bài tập về ADO căn bản.
Hihi. Kiểu này chắc em phải đọc lại từ bài 1 trong thớt của thầy HLMT quá. Thầy đưa ra có một yêu cầu, mà anh Viet Hoai đã xử luôn rồi, không ai hỏi tiếp về chủ đề update nữa. Bài tiếp theo là sắp xếp và xoá trong cơ sở dữ liệu. ^^
Do đọc nữa chừng cũng hơi khó để hiểu và theo kịp mọi người trong thớt. (ADO Căn bản mà cũng khó quá, vậy mới thấy được thầy HLMT và các anh chị trong diễn đàn mình giỏi quá).
 
Upvote 0
Trong hướng dẫn của thầy HLMT có nói cú pháp của lệnh Update:
1./ Cú pháp:

[GPECODE=sql]UPDATE [Tên Bảng] SET [Cột 1]=GiaTri_1, [Cột 2]=GiaTri_2, ...,[Cột n]=GiaTri_n
WHERE [Tên_Cột_Và_Điều_Kiện_Update][/GPECODE]
Trong trường hợp của em, em muốn update toàn bộ các giá trị như ví dụ của thấy HLMT, em set theo cú pháp hướng dẫn của thầy có phải là như vầy không anh nmhung49:
[GPECODE=sql]
Sub UDATE()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
"data source=" & ThisWorkbook.Path & _
"\B.xls;extended properties=""excel 8.0;HDR=Yes;"";"
.Open
End With
lsSQL = "UPDATE [Data$] " & _
"SET [TEN], [SL] " & _
"WHERE [STT]"
lrs.Open lsSQL, cnn, 3, 1
Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]
Em không hiểu đoạn
Mã:
    lrs.Open lsSQL, cnn, 3, 1
trong bài gửi tại #105 của anh Viet Hoai ý nghĩa là gì anh nhỉ.
Mong nhận hồi đáp của anh và mọi người.
 
Lần chỉnh sửa cuối:
Upvote 0
Có thể do bài viết không đưa lên được các bài trong này nên chắc mọi người không để ý.
Nhờ các anh chị tư vấn giúp em thêm về trường hợp này nhé.
Cảm ơn anh chị nhiều.
 
Upvote 0
Có thể do bài viết không đưa lên được các bài trong này nên chắc mọi người không để ý.
Nhờ các anh chị tư vấn giúp em thêm về trường hợp này nhé.
Cảm ơn anh chị nhiều.

- Dùng update thì ít nhất file B phải có cái gì đó để làm điều kiện update chứ bạn.
- Các câu lệnh Update, Insert, Delete... Nói chung là những câu lệnh không trả về dòng nào thì ta không cần khởi tạo Recordset.
 
Lần chỉnh sửa cuối:
Upvote 0
- Dùng update thì ít nhất file B phải có cái gì đó để làm điều kiện update chứ bạn.
- Các câu lệnh Update, Insert, Delete... Nói chung là những câu lệnh không trả về dòng nào thì ta không cần khởi tạo Recordset.
Cảm ơn anh.
Như trong trường hợp của em, chỉ đơn giản là cập nhật dữ liệu, thay thế dữ liệu cũ, vị trí thì giống như vị trí cũ thì mình phải đặt điều kiện gì anh nhỉ?
Cảm ơn anh
 
Upvote 0
Thầy ơi, cũng là vd này nhưng chỉ ghi dòng mới nào có đặt nút "GHI DL SANG FILE B" thì nội dung của dòng đó trên file A được ghi vào file B thôi được không thầy.
Vì e muốn ứng dụng vào mỗi lần em nhập nội dung xuất kho cho NV KD tên A thì cuối dòng e để tên A và khi click vào tên A đó nội dung xuất kho được nhập vào công nợ cho NVKD A ( file công nợ của A này đang là file B trong VD của Thầy) .
Xin cảm ơn Thầy nhiều lắm a.
--------------------------------------------------------
Thử ví dụ như sau:

[GPECODE=sql]Sub GhiDL_HLMT()
Dim cn As Object
Set cn = CreateObject("ADODB.Connection")
With cn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
"data source=" & ThisWorkbook.Path & _
"\B.xls;extended properties=""excel 8.0;HDR=Yes;"";"
.Open
.Execute "INSERT INTO [Data$] SELECT STT,TEN,SL FROM [excel 8.0;database=" & _
ThisWorkbook.FullName & ";HDR=Yes].[Sheet1$B8:D23]"
End With
cn.Close: Set cn = Nothing
End Sub

[/GPECODE]
---------------------------------------------------------------------------------------
 
Upvote 0
Thầy ơi, cũng là vd này nhưng chỉ ghi dòng mới nào có đặt nút "GHI DL SANG FILE B" thì nội dung của dòng đó trên file A được ghi vào file B thôi được không thầy.
Vì e muốn ứng dụng vào mỗi lần em nhập nội dung xuất kho cho NV KD tên A thì cuối dòng e để tên A và khi click vào tên A đó nội dung xuất kho được nhập vào công nợ cho NVKD A ( file công nợ của A này đang là file B trong VD của Thầy) .
Xin cảm ơn Thầy nhiều lắm a.
--------------------------------------------------------

---------------------------------------------------------------------------------------
Bạn chịu khó gửi ví dụ xem sao nhé.
 
Upvote 0
Gởi thầy Fiile đính kèm. Thầy giúp dùm em nha. Cảm ơn thầy nhiều.
Bạn dùng code sau nhé.

Mã:
Sub GhiDL()
    Dim cn, rst As Object
    Dim arrNV As Variant
    Dim strFile As String
    Set cn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0"
    rst.Open "select distinct NVKD from [XUAT KHO T#10$A3:M]", cn, 1
    arrNV = rst.GetRows()
    For i = 0 To rst.RecordCount - 1
       strFile = ThisWorkbook.Path & "\CONGNO-" & arrNV(0, i) & ".xlsx"
       cn.Close
       cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile & ";Extended Properties=Excel 12.0")
       cn.Execute ("Insert Into [A:K] select TT,NgayCT,SoCT,KhachHang,MaHang,MatHang,DVT,SoLuong,DonGia,ThanhTien,GhiChu from [Excel 12.0;Database=" & ThisWorkbook.FullName & "].[XUAT KHO T#10$A3:M] where DaGhiDL is null and NVKD='" & arrNV(0, i) & "'")
    Next
    Sheet1.Range("M4:M" & Sheet1.Range("J65000").End(xlUp).Row) = "x"
End Sub
Lưu ý là Tên Sheet, Tiêu đề cột, tên file cần ghi phải theo mẫu đính kèm nhé.
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom