Page 1 of 1

Tổng Quát về Các Lệnh Mở File

Posted: Wed 30/04/2008 10:10 am
by truongphu
Thủ thuật: Tổng Quát về Các Lệnh Mở File
Tác giả: truongphu
Mô tả: Tổng Quát về Các Lệnh Mở File. Mong được các bạn giúp đở thêm bài viết vì chữ Tổng Quát "to' quá


A- Lệnh gọi thi hành
A- 1) Lệnh Shell: tham khảo VBLib

* Gọi trình WinWord, Phải có path của WINWORD.EXE. Theo thói quen, có thể bỏ phần ".exe" Ví dụ:

Code: Select all

  1. aaa = Shell("D:\Office\Microsoft Office\Office10\WINWORD", 1)


* Gọi trình WinWord và mở file doc nào đó:

Code: Select all

  1. aaa = Shell("D:\Office\Microsoft Office\Office10\WINWORD  C:\MùaThu~1.doc", 1)


Lưu ý: tên file không được có space, ví dụ sau sẽ không chạy được:

Code: Select all

  1. NotRun = Shell("D:\Office\Microsoft Office\Office10\WINWORD.EXE" "C:\Mùa Thu Lá bay", 1)


* Ta có thể dùng trình văn bản để mở một file bất kỳ, đọc thấy toàn mã máy:

Code: Select all

  1. aaa = Shell("C:\Program Files\Windows NT\Accessories\wordpad  c:\windows\system32\calc.exe", 1)


* Khi Shell gọi một trình của MS Windows (ví dụ calc.exe) trong các thư mục gốc hay hệ thống (windows\ hay windows\system32), do khi khởi động, biến môi trường đã nộp vào bộ nhớ nên ta có thể bỏ qua đường dẫn, bất kể trên máy nào đó có cài winXP ở đâu!

Code: Select all

  1. aaa = Shell ("calc")


hoặc gọn hơn nữa

Code: Select all

  1. Shell "calc"


nguyên tắc gọn nầy cũng dùng với các trình khác:

Code: Select all

  1. Shell "D:\Office\Microsoft Office\Office10\WINWORD"
  2. Shell "D:\Office\Microsoft Office\Office10\WINWORD  C:\MùaThu~1.doc"


A- 2) Lệnh ShellExecute:
ShellExecute là tự chạy một yêu cầu, có thể là một file, hay một câu lệnh, VỚI ĐIỀU KIỆN LÀ FILE ĐÓ, HAY CÂU LỆNH ĐÓ ĐÃ ĐƯỢC KHAI BÁO TRONG WINDOWS LÀ MỞ VỚI TRÌNH NÀO
Vậy thì một file hay một câu lệnh chưa đăng ký "Open With" thì ShellExecute cũng vô tác dụng!

Vì lý do trên, ta nên cân nhắc khi gọi ShellExecute, ví dụ muốn xem nội dung một file không có đuôi mở rộng, ta chỉ cần gọi Shell để chạy Notepad hay Wordpad load file cần xem, tránh khai báo rườm rà không cần thiết.

Khai báo hàm API:

Code: Select all

  1. Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile
  2.  
  3. As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
  4. Private Sub Form_Load()
  5. ShellExecute Me.hwnd, vbNullString, "C:\Mùa Thu Lá Bay.doc", vbNullString, "C:\", 1
  6. End Sub

Nhận xét: Tên file tự do

A- 3) VBScript
* Gọi một ứng dụng
Các dòng lệnh sau tương đương với các dòng lệnh của Shell:
Set objShell = CreateObject("Wscript.Shell")

Code: Select all

  1. objShell.Run "calc"
  2. objShell.Run ("ping 10.0.0.2")
  3. objShell.Run "WINWORD"
  4. objShell.Run "EXCEL"

Nhận xét: Tốn một câu khai báo: "Set objShell =...", nhưng khi chạy các ứng dụng đã đăng ký, ví dụ WinWord thì khỏi khai path, khác với Shell
* Mở một file văn bản

Code: Select all

  1. Set objword = CreateObject("Word.Application").Documents.Open("C:\Mùa Thu Lá Bay.Doc", 1)


B- Lệnh mở và thao tác trên file với thao tác cơ bản là Đọc, Ghi. Trong bài viết nầy chỉ minh họa thao tác Đọc
B- 1) Lệnh Open: tham khảo VBLib

a- Chuyên mở file TXT
trích VBLib:

Code: Select all

  1. Private Sub Form_Load()
  2. Dim TextLine
  3.     Open "TESTFILE" For Input As #1' Mo file Ðê Ðoc.
  4.         Do While Not EOF(1)
  5.             Line Input #1, TextLine' Ðoc tung dòng gán vào biên TextLine
  6.             Debug.Print TextLine' In ra màn hình
  7.         Loop
  8.     Close #1' Ðóng file.
  9. End Sub


b- Đọc text Unicode
trích VBLib: (trong VBLib phần nầy còn sót vài thành phần. Code sau đây hoàn chỉnh hơn)

Code: Select all

  1. Private Sub Form_Load()
  2. Dim fNum As Long, B() As Byte, fp
  3.     fp = "C:\Mùa Thu Lá Bay.txt"
  4.     fNum = FreeFile()
  5.     Open fp For Binary Access Read As #fNum
  6.         ReDim B(LOF(fNum))
  7.     Get #fNum, , B
  8.     Close #fNum
  9.  
  10.     Dim arr, i As Integer, s As String
  11.     arr = Split(B, vbCrLf)
  12.      For i = 0 To UBound(arr)
  13.             s = s & arr(i) & vbCrLf
  14.      Next i
  15. TextBox1 = s
  16. End Sub


B- 2) VBScript cho TXT: Tham khảo thêm Mục Tip VB
Đọc bất kể mã unicode! quá gọn

Code: Select all

  1. Private Function ReadFileUni(FileName As String) As String
  2. Dim FSO
  3.    Set FSO = CreateObject("Scripting.FileSystemObject").OpenTextFile(FileName, 1, , -2)
  4.    ReadFileUni = FSO.Readall
  5.    Set FSO = Nothing
  6. End Function
  7.  
  8. Private Sub Form_Load()
  9. TextBox1 = ReadFileUni("C:\Mùa Thu Lá Bay.txt")
  10. End Sub


B- 3) VBScript cho Doc (hoặc dưới nó như RTF, TXT): Tham khảo thêm Mục Tip VB

Code: Select all

  1. Private Sub Form_Load()
  2. Set objWord = CreateObject("Word.Application")
  3. objWord.ChangeFileOpenDirectory ("C:\")
  4. objWord.FileDialog(1).Title = "Select the files"
  5.  
  6. If objWord.FileDialog(1).Show = -1 Then
  7.     For Each objFile In objWord.FileDialog(1).SelectedItems
  8.         Set objDoc = objWord.Documents.Open(objFile)
  9.         objDoc.Range.Copy
  10.     Next
  11. End If
  12.  
  13. TextBox1.Paste
  14. objWord.Quit
  15. End Sub

Sáng 30/4/08 rảnh, chiều có thể nghỉ bù! :D

Bổ sung: Đọc file txt từng dòng

Code: Select all

  1. Private Function ReadLineText(FileName As String) As String
  2. Const ForReading = 1, ForWriting = 2, TriStateTrue = -2
  3. Dim FSO:    Set FSO = CreateObject("Scripting.FileSystemObject").OpenTextFile(FileName, 1, False, -2)
  4.    Do Until FSO.AtEndOfStream
  5.     ReadLineText = ReadLineText & FSO.ReadLine & vbCrLf
  6.    Loop
  7.    Set FSO = Nothing
  8. End Function
  9.  
  10. Private Sub Form_Load()
  11. MsgBox ReadLineText("C:\Mùa Thu Lá Bay.txt")
  12. End Sub

Re: Tổng Quát về Các Lệnh Mở File

Posted: Thu 01/05/2008 2:12 pm
by vinhphuoc91
woa, cảm ơn pác truongphu, bài này nên đưa vào Các bài viết hướng dẫn, mà lần sau pác nhớ lồng thẻ code vào nhé :)

Re: Tổng Quát về Các Lệnh Mở File

Posted: Thu 01/05/2008 2:27 pm
by ngaymaikhongtan
Xin bác giới thiệu về phần đọc file txt rỏ hơn tí àh, phần đọc từng chuổi của nó trên từng dòng, không phải là truy xuất cả dòng, em đang viết bên vb.net!

Re: Tổng Quát về Các Lệnh Mở File

Posted: Thu 01/05/2008 3:41 pm
by truongphu
ngaymaikhongtan wrote:Xin bác giới thiệu về phần đọc file txt rỏ hơn tí àh, phần đọc từng chuổi của nó trên từng dòng, không phải là truy xuất cả dòng,

Lệnh FSO.Readall sẽ thành lệnh FSO.ReadLine
Thêm Do Until FSO.AtEndOfStream
...
Loop để duyệt từng dòng
Các code khác như cũ. Tôi đã bổ sung ở trên, phần cuối bài

Re: Tổng Quát về Các Lệnh Mở File

Posted: Mon 12/10/2009 8:25 am
by truongphu
Dùng lệnh Shell gọi Word ra để mở một file doc nguyên tắc là OK
Tuy nhiên khi thực hành bằng code, rất nhiều bạn thất bại, lý do:

1- Khai báo code chưa đúng
2- Đường dẫn WinWord dài bao nhiêu cũng được, nhưng đường dẫn file doc TUYỆT ĐỐI PHẢI 8.3
3- chưa hổ trợ tên file (hay đường dẫn) có tiếng Việt

Để đơn giản hóa vấn đề, tôi viết một Project: Dùng CommonDialog (khai bằng code) gọi lần lượt WinWord và File Doc, giao cho SHELL xử lý

Code: Select all

  1. Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal lBuffer As Long) As Long
  2.  
  3. Private Sub Command1_Click()
  4. Dim WordPath$
  5. MsgBox "Tìm WinWord o' Ðâu ?"
  6. WordPath = CDL(3, "D:\Office\Microsoft Office\OFFICE11")
  7. If WordPath = "" Then Exit Sub
  8. MsgBox "Tìm thâ'y Word.EXE o':" & vbCrLf & WordPath & vbCrLf & "Mo' File Word o' Ðâu ?" & vbCrLf & "(KHÔNG HÔ TRO' FILENAME TIÊ'NG VIÊT)"
  9. Shell WordPath & " " & ShortPath(CDL(, "D:\MY DOCUMENTS")), vbNormalFocus
  10. End Sub
  11.  
  12. Private Function ShortPath(ByVal FileName As String) As String
  13.     Dim lngRes As Long, strPath As String
  14.     'Create a buffer
  15.     strPath = String$(165, 0)
  16.     'retrieve the short pathname
  17.     lngRes = GetShortPathName(FileName, strPath, 164)
  18.     'remove all unnecessary chr$(0)'s
  19.     ShortPath = Left$(strPath, lngRes)
  20. End Function
  21.  
  22. Private Function CDL(Optional ByVal FilterNum As Integer = 1, Optional ByVal FirstDir As String = "D:\") As String
  23. Set Dialog = CreateObject("UserAccounts.CommonDialog")
  24. Dialog.Filter = "Word Document|*.Doc|Text File|*.txt|All Files|*.*"  '<-- các file cân loc
  25. Dialog.filterIndex = FilterNum '<- 1 là doc, 2 là text nhu' o' trên Ðã khai
  26. Dialog.InitialDir = FirstDir  '<-- Thay Ðôi thu' muc mac Ðinh
  27. Dialog.ShowOpen
  28. CDL = Dialog.FileName
  29. End Function


các bạn có thể dùng ngay Project nhẹ hều:

Re: Tổng Quát về Các Lệnh Mở File

Posted: Wed 20/07/2011 12:49 am
by LearningVBnet
Bạn truongphu, tôi thấy các bài và câu trả lời của bạn rất hữu ích, chứng tỏ bạn có kiến thức khá rộng về VB và VB.net. Trước tôi có biết chút ít về VB và đang tự học VB.net. bạn có thể cho tôi biết địa chỉ email để liên lạc với bạn k0 vì tôi có vài câu hỏi muốn hỏi bạn nhờ bạn trả lời. tôi đề nghị như vậy vì không muốn bị coi là gửi spam, khi làm được rồi tôi sẽ post bài lên forum để mọi người cùng trao đổi kinh nghiệm. Cảm ơn truongphu!
Email của tôi: vutienphong.cdt1b@gmail.com
-----------------------
Xin lỗi! để học hỏi chứ không có ý định spam.

Re: Tổng Quát về Các Lệnh Mở File

Posted: Fri 25/11/2011 10:47 pm
by nguyentrinhthu
công nhận bác truongphu siêu quá. Ai có tài chính đề nghị đóng góp cho diễn đàn để động viên các thành viên

Re: Tổng Quát về Các Lệnh Mở File

Posted: Sun 11/12/2011 1:32 pm
by Qsoft
Cảm ơn bác truongphu, tôi thấy nó gắn gọn và rất hữu ích. Hy vọng bác sẽ có nhiều bài viết hay nữa.

Re: Tổng Quát về Các Lệnh Mở File

Posted: Thu 21/06/2012 5:55 pm
by khoaakt
Bác Truongphu siêu ghê! Nhưng nếu ta dùng lệnh shell thì khi mở file exe thì cửa sổ lại để dạng Minimize?
Ai có cách khắc phục?

Re: Tổng Quát về Các Lệnh Mở File

Posted: Fri 22/06/2012 10:19 am
by truongphu
khoaakt wrote:khi mở file exe thì cửa sổ lại để dạng Minimize?

Code: Select all

Shell "PathName", vbNormalFocus

Re: Tổng Quát về Các Lệnh Mở File

Posted: Wed 09/01/2013 4:56 pm
by vanthithuy91
Bác truongphu, em đang học cách giải một số bài toán trên vb. Em có một số thắc mắc muốn hỏi vì vậy em muốn xin địa chỉ email của bác không biết có được không? Nếu được bác gửi lại giúp em vào địa chỉ: bienxanhcuoi91@gmail.com mới ạ. Thanks!

Re: Tổng Quát về Các Lệnh Mở File

Posted: Mon 16/07/2018 11:00 am
by tigerhn
Bác TruongPhu cho em hỏi chút:
Em đang lập 1 số dự toán công trình (có mẫu giống nhau), trước đây em lập 1 file mẫu trên Excel, sau đó em viết 1 tool nhỏ bằng VB6 để mở file mẫu, copy và paste dữ liệu vào file mẫu
Hiện tại do yêu cầu của Chủ đầu tư yêu cầu phải lập trên G8, mà dịnh dạng file kết quả của G8 là *.hce.

Bác có cách nào để mở file *.hce và paste số liệu vào đó không?
Cảm ơn bác nhiều!