Xuất dữ liệu ra file text và nhập dữ liệu từ file text

  • Thread starter luongvanluyen
  • Ngày gửi
L

luongvanluyen

Thành viên sơ cấp
2/9/05
27
0
0
HCM CITY
#1
Chào các bạn,
Có đôi lúc các bạn muốn xuất dữ liệu ra file text nhằm lưu trữ hay phân phát...(Có rất nhiều lý do) thì phải làm sao?
Tôi xin giới thiệu các bạn một đọan mã đơn giản sau, nhưng các bạn chú ý rằng các bạn phải tham chiếu đến Microsoft ActiveX Data Objects x.x Library trong Reference của mình.
Giả sử trên file excel tôi dự định xuất ra có khối dữ liệu tên MaVatTu gồm:
Cột Mã, Mô tả, Đvt, Tồn ĐK, Nhập từ Nhà Cung cấp, Nhập từ Sản xuất, Xuất đi gia công, Xuất vào sản xuất, Tồn hiện tại.
Mục đích của tôi là xuất ra file "VatTuTon.txt" của cùng thư mục File excel của tôi. Và chỉ xuất ra các vật tư có số lượng tồn lớn hơn 0. Tôi có đọan mã như sau:
Sub XuatTonHienTaiRaFileText()
Dim theFileName As String
Dim FileNum
Dim bRange As Range
Dim Hang As Long, Cot As Integer, i As Long
Dim MaVatTu As String * 15, MoTa As String * 50, DVT As String * 5
Dim TonHienTai As Double
Dim bStrTonHienTai As String * 15
Dim bStrDuaVao As String
theFileName = GetLocalDirectory & "VatTuTon.txt"
FileNum = FreeFile
Set bRange = Range("MaVatTu")
Hang = bRange.Rows.Count: Cot = bRange.Columns.Count
' Mo file de dua vao
Open theFileName For Output As FileNum
'Toi dua ten cac cot vao truoc
'Voi chu y dinh dang chieu dai cua cac truong du lieu
Print [HASHTAG]#FileNum[/HASHTAG], "Ma vat tu |Mo ta |Dvt | "
For i = 1 To Hang
'Quet qua va xuat ra file
With bRange
MaVatTu = Trim(.Cells(i, 1))
MoTa = Trim(.Cells(i, 2))
DVT = Trim(.Cells(i, 3))
TonHienTai = CDbl(.Cells(i, 9))
bStrTonHienTai = CStr(TonHienTai)
bStrDuaVao = MaVatTu & "|" & MoTa & "|" & DVT & "|" & bStrTonHienTai
If MaVatTu <> "" And TonHienTai <> 0 Then
Print [HASHTAG]#FileNum[/HASHTAG], bStrDuaVao
End If
End With
Next i
Close FileNum ' Dong file lai
Set bRange = Nothing
End Sub
Function GetLocalDirectory() As String
Dim TStr
TStr = ActiveWorkbook.Path
If Right(TStr, 1) <> "\" Then TStr = TStr & "\"
GetLocalDirectory = TStr
End Function

Sau đó từ một file excel khác tôi lại viết thủ tục để tôi nhập các dữ liệu trên vào. Kỹ thuật cũng giống trên dùng ADO.
Với chú ý là file excel tôi dự định import dữ liệu vào có sheet tên "Data", và hàng dữ liệu tôi định bắt đầu đưa ra là "A2" của sheet này.

Sub GetTextFileData(ByVal strSQL As String, ByVal strFolder As String, ByVal rngTargetCell As Range)
' example: GetTextFileData "SELECT * FROM filename.txt", _
"C:\FolderName", Range("A3")
' example: GetTextFileData "SELECT * FROM filename.txt WHERE fieldname = 'criteria'", _
"C:\FolderName", Range("A3")
Dim cn As ADODB.Connection, rs As ADODB.Recordset, f As Long
Dim bDem As Long
If rngTargetCell Is Nothing Then Exit Sub
Set cn = New ADODB.Connection
On Error Resume Next
cn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=" & strFolder & ";" & _
"Extensions=asc,csv,tab,txt;"
On Error GoTo 0
If cn.State <> adStateOpen Then Exit Sub
Set rs = New ADODB.Recordset
On Error Resume Next
rs.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
On Error GoTo 0
If rs.State <> adStateOpen Then
cn.Close
Set cn = Nothing
Exit Sub
End If

'Bat dau xuat ra file
With rngTargetCell
bDem = 0

rs.MoveFirst
While Not rs.EOF
.Offset(bDem, 0).Value = Mid(rs.Fields(0).Value, 1, 15)
.Offset(bDem, 1).Value = Mid(rs.Fields(0).Value, 17, 50)
.Offset(bDem, 2).Value = Mid(rs.Fields(0).Value, 68, 5)
.Offset(bDem, 3).Value = Mid(rs.Fields(0).Value, 74, 15)
bDem = bDem + 1
rs.MoveNext
Wend

End With
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
Function GetLocalDirectory() As String
' Lay duong dan cua Active workbook
' Va bao dam rang co "\" cuoi duong dan
Dim TStr
TStr = ActiveWorkbook.Path
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If Right(TStr, 1) <> "\" Then TStr = TStr & "\"
GetLocalDirectory = TStr
End Function
Function GetLocalDirectoryWT() As String
' Lay duong dan cua Active workbook
' Va bao dam rang khong co "\" cuoi duong dan

Dim TStr
TStr = ActiveWorkbook.Path
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If Right(TStr, 1) = "\" Then TStr = Mid(TStr, 1, Len(TStr) - 1)
GetLocalDirectoryWT = TStr
End Function

Sub NhapDuLieu()
Dim bRange As Range
Dim TenThuMuc
'Xoa du lieu truoc khi dua du lieu vao
Set bRange = Range("DuLieuXoa")
bRange.Clear
TenThuMuc = GetLocalDirectoryWT
Call GetTextFileData("SELECT * FROM VatTuTon.txt", TenThuMuc, Range("A2"))
End Sub

Tại sheet "Data" tôi định dạng hàng đầu tiên như sau:
A1: Mã vật tư; B1: Mô tả; C1: Đvt; D1: Số lượng tồn hiện tại
và tôi tạo một nút lệnh gọi thủ tục NhapDuLieu như trên.
Thế là tôi đã giới thiệu sơ lược dùng ADO để xuất và lấy dữ liệu.
Tham khảo từ trang web Erlandsen Data Consulting, Vovisoft

Lương Văn Luyện
 
Sửa lần cuối:
L

luongvanluyen

Thành viên sơ cấp
2/9/05
27
0
0
HCM CITY
#2
To:All,
Trong chương trình này còn thiếu một phần quan trọng không biết có ai phát hiện không? Nếu phát hiện tôi sẽ đãi một chầu! Linh đình! Hì Hì Hì
Hình như các bạn không quan tâm vấn đề này lắm...Nhập/Xúất dữ liệu?
Lương Văn Luyện
 
P

poss_lp

Thành viên sơ cấp
6/8/05
3
0
0
33
Ha noi
#3
Hi ban! Toi thay hien nay cac phan mem ke toan deu co phan xuat khau du lieu day chu nhi.
 
W

workman

Thành viên sơ cấp
22/7/05
372
0
0
46
Ho Chi Minh
#4
luongvanluyen nói:
To:All,
Trong chương trình này còn thiếu một phần quan trọng không biết có ai phát hiện không? Nếu phát hiện tôi sẽ đãi một chầu! Linh đình! Hì Hì Hì
Hình như các bạn không quan tâm vấn đề này lắm...Nhập/Xúất dữ liệu?
Lương Văn Luyện
Thật ra tôi chỉ dốt đặc về việc này nên không dám bình luận bậy bạ, sợ bác Luyện cười cho. Tuy nhiên tôi nghĩ mãi mà chưa hiểu tại sao lại phải xuất ra text nhỉ? Hiện giờ máy nào mà chẳng có excel.

Thông thường nếu ta có nhiều database khác nhau thì thường chỉ có nhu cầu xuất ra dạng chuẩn csv là đáp ứng được gần hết. Tôi dùng hệ thống kế toán chạy trên SQL, link với mấy cái Electronic Banking đều thông qua dạng csv cả, thấy chạy ngon lắm.
 
L

luongvanluyen

Thành viên sơ cấp
2/9/05
27
0
0
HCM CITY
#5
workman nói:
Tuy nhiên tôi nghĩ mãi mà chưa hiểu tại sao lại phải xuất ra text nhỉ? Hiện giờ máy nào mà chẳng có excel.

Thông thường nếu ta có nhiều database khác nhau thì thường chỉ có nhu cầu xuất ra dạng chuẩn csv là đáp ứng được gần hết. Tôi dùng hệ thống kế toán chạy trên SQL, link với mấy cái Electronic Banking đều thông qua dạng csv cả, thấy chạy ngon lắm.
To: workman,
Vấn đề này đã có nhiều bạn đặt vấn đề rồi. Đối với bản thân tôi thì tôi gặp vấn đề như thế này. Tôi có một file theo dõi vật tư, tôi để ở chế độ share. Thì mọi người đều có thể mở để xem tồn hiện tại. Với lý do này nên tôi mới lập trình để yêu cầu cô nhân viên nhập dữ liệu xong rồi xuất dữ liệu ra file text (Thật sự ra file excel cũng được...) Rồi từ một file excel khác hay một chương trình viết bằng VB mọi người ở mọi máy đều có thể xem tồn hiện tại. Vấn đề xuất ra file text này còn có một ý nghĩa khác là tổng hợp số liệu từ các client (các nhà máy con, các phân xưởng con...) rồi gởi dữ liệu về (đỡ sợ virus) văn phòng và tại đây chúng ta có thể tổng hợp số liệu một cách dễ dàng. Đây cũng là vấn đề có một người bạn ở HN hỏi tôi. Vì anh này có nhiều chi nhánh, mỗi chi nhánh đều sử dụng file excel định dạng khác nhau. Và vấn đề tổng hợp số liệu lúc này sẽ gặp khó khăn.
Nhân tiện đây, khi dùng ADO để nhập dữ liệu vào file excel các bạn cũng phải chú ý là phải có một file Schema.ini với nội dung như sau:
[VatTuTon.txt] 'Tên file bạn muốn nhập
Format=Delimited(|) 'Các trường dữ liệu cách nhau bởi dấu |
ColNameHeader=True 'Có tên trường ở hàng đầu
MaxScanRows=0
CharacterSet=ANSI

Như vậy là bạn có thể dùng ADO để nhập dữ liệu này vào excel hay các database khác.

Các bạn có thể chia sẻ vấn đề này tại đây.

Lương Văn Luyện
 
L

levanduyet

Welcome
16/10/04
535
11
18
HCM
my.opera.com
#6
Chúng ta có thể tham khảo code của ASAP về việc import dữ liệu từ file text mà các trường dữ liệu cách nhau bởi "|". Nhưng nó sẽ không được linh động nếu bạn vừa nhập liệu vừa kiểm tra dữ liệu, lọc trước khi nhập vào.
Lê Văn Duyệt

Sub Import_InsertTextFileDelimitedBar()
Call ASAPChkProtSheet
Call ASAPChkRange
FileToOpen = Application.GetOpenFilename("Text file (*.*), *.*", , "ASAP Utilities - insert text file")
If FileToOpen <> False Then
Set SaveLoc = ActiveCell
For Each OpenWorkbook In Application.Workbooks
If OpenWorkbook.FullName = FileToOpen Then
GoTo AlOpen
Else
End If
Next OpenWorkbook
Application.ScreenUpdating = False
On Error Resume Next
Workbooks.OpenText Filename:=FileToOpen, DataType:=xlDelimited, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:=False _
, Space:=False, Other:=True, OtherChar:="|"
ActiveSheet.UsedRange.Copy Destination:=SaveLoc
Application.CutCopyMode = False
ActiveWorkbook.Close savechanges:=False
Set SaveLoc = Nothing
Else
End If
Exit Sub
 
vu thanh daat

vu thanh daat

Thành viên sơ cấp
17/3/17
1
0
1
25
#7
bác có code xuất nhập ra file .txt bằng ngôn ngữ vb.net ko
 

Thành viên trực tuyến

  • daongocnam0603
  • Tú Vưu
  • nguyenchuong1152
  • xediengiatot
  • BUI DEN
  • Duyên Hạt Tiêu

Xem nhiều