Board logo

標題: [發問] excel VBA 如何在word檔開啟狀態下順利寫入word的表格 [打印本頁]

作者: pipi1968    時間: 2017-1-2 00:40     標題: excel VBA 如何在word檔開啟狀態下順利寫入word的表格

我想利用excel VBA 作一個表單輸入資料後,要資料寫入word的表格,
我的作法是1.先檢查word檔是否開啟,如果已開啟,去執行101程序
     2.如果未開啟,則開啟word檔後去執行101程序
     3.如果是新専案,則從資料夾複製空白専案管為新専案進度表後,去執行101程序
目前2. 3.都可以順利執行
但是1.會出現錯誤如下圖,也就是當word檔開啟狀態下,無法正常執行
[attach]26276[/attach]

麻煩各位先進指導一下,如何克服這個問題
謝謝

程式碼如下:
  1. Function IsFileOpen(strFile As String) As Boolean
  2.     Dim iFile As Integer
  3.     Dim iErr As Integer
  4.    
  5.     On Error Resume Next
  6.     iFile = FreeFile()
  7.     Open strFile For Input Lock Read As #iFile  '以鎖定方式開啟,開啟指定檔案後直接關閉檔案
  8.     Close iFile
  9.    
  10.     iErr = Err  '將錯誤號碼帶入iErr變數中,然後依照數字即可得知檔案狀態
  11.     On Error GoTo 0
  12.     Select Case iErr
  13.         Case 0
  14.             IsFileOpen = False
  15.         Case 70
  16.             IsFileOpen = True
  17.         Case 53
  18.             MsgBox "找不到檔案,將建立空白進度管制表!"
  19.             IsFileOpen = False
  20.         Case 76
  21.             MsgBox "找不到路徑,請再確認!"
  22.             IsFileOpen = False
  23.     End Select
  24. End Function

  25. Sub CheckFile()
  26.     Dim strPath As String
  27.     Dim strFile As String
  28.     Dim strWordFile As String
  29.    
  30.     Set wordApp = CreateObject("Word.Application")
  31.     Set fs = CreateObject("Scripting.FileSystemObject")
  32.    
  33.     strFile = "北區1.docx"
  34.     strPath = "D:\My Documents\Temp\"
  35.     strWordFile = strPath & strFile
  36.    
  37.    
  38.     If IsFileOpen(strWordFile) Then
  39.         GoTo 101
  40.     ElseIf fs.FileExists(strWordFile) Then
  41.         Set wordDoc = wordApp.Documents.Open(strWordFile)
  42.         wordApp.Visible = True
  43.         wordDoc.Activate
  44.         GoTo 101
  45.     Else
  46.         FileCopy strPath & "空白案件進度管控表.docx", strWordFile
  47.         Set wordDoc = wordApp.Documents.Open(strWordFile)
  48.         wordApp.Visible = True
  49.         wordDoc.Activate
  50.         GoTo 101
  51.         'MsgBox ("檔案不存在!")
  52.         'Exit Sub
  53.     End If
  54.         
  55. 101:
  56.     With wordDoc.Tables(1)
  57.         .Cell(6, 2) = Replace(.Cell(6, 2), Chr(13), "") & "、這是測試"
  58.         
  59.     '取得word的日(時)數,重新計算總工作時數
  60.         If InStr(.Cell(6, 3), "日") = 0 And InStr(.Cell(6, 3), "小時") = 0 Then
  61.             WorkHours = 0
  62.             GoTo 102
  63.         Else
  64.             xString = .Cell(6, 3)
  65.             xtemp = Split(xString, "日")
  66.             hours = Val(xtemp(0)) * 8
  67.             xtemp = Split(xtemp(1), "小時")
  68.             WorkHours = hours + Val(xtemp(0))
  69.         End If
  70. 102:
  71.         '加新增時數:預計增加4.5小時
  72.         WorkHours = WorkHours + 4.5
  73.         '計算日數(每8小時為1日)
  74.         days = Int(WorkHours / 8)
  75.         '計算剩餘小時
  76.         hours = WorkHours - days * 8

  77.         '寫回word表格
  78.         .Cell(6, 3) = days & "日" & hours & "小時"

  79.     End With
  80.     'wordDoc.Close '關閉該Word文件檔
  81.     'wordApp.Quit '結束Word應用程式
  82.     'Set wordDoc = Nothing   '釋放物件變數wordDoc
  83.     'Set wordApp = Nothing   '釋放物件變數wordApp

  84. End Sub
複製代碼
word檔附件
[attach]26277[/attach]
作者: pipi1968    時間: 2017-1-5 19:32

本帖最後由 pipi1968 於 2017-1-5 19:33 編輯

已解決了
上網查了好久,終於OK了
提供給需要的人參考
  1. Function IsFileOpen(strFile As String) As Boolean
  2.     Dim iFile As Integer
  3.     Dim iErr As Integer
  4.    
  5.     On Error Resume Next
  6.     iFile = FreeFile()
  7.     Open strFile For Input Lock Read As #iFile  '以鎖定方式開啟,開啟指定檔案後直接關閉檔案
  8.     Close iFile
  9.    
  10.     iErr = Err  '將錯誤號碼帶入iErr變數中,然後依照數字即可得知檔案狀態
  11.     On Error GoTo 0
  12.     Select Case iErr
  13.         Case 0
  14.             IsFileOpen = False
  15.         Case 70
  16.             IsFileOpen = True
  17.         Case 53
  18.             MsgBox "找不到檔案,將建立空白進度管制表!"
  19.             IsFileOpen = False
  20.         Case 76
  21.             MsgBox "找不到路徑,請再確認!"
  22.             IsFileOpen = False
  23.     End Select
  24. End Function

  25. Sub CheckFile()
  26.     Dim strPath As String
  27.     Dim strFile As String
  28.     Dim strWordFile As String
  29.     Dim wordDoc As Object

  30.     Set wordApp = CreateObject("Word.Application")
  31.     Set fs = CreateObject("Scripting.FileSystemObject")
  32.      
  33.     strFile = "北區1.docx"
  34.     strPath = "D:\My Documents\Temp\"
  35.     strWordFile = strPath & strFile
  36.    
  37.    
  38.     If IsFileOpen(strWordFile) Then
  39.       Set wordDoc = GetObject(strWordFile)
  40.       Application.Visible = True
  41.       GoTo 101
  42.     ElseIf fs.FileExists(strWordFile) Then
  43.         Set wordDoc = wordApp.Documents.Open(strWordFile)
  44.         wordApp.Visible = True
  45.         wordDoc.Activate
  46.         GoTo 101
  47.     Else
  48.         FileCopy strPath & "空白案件進度管控表.docx", strWordFile
  49.         Set wordDoc = wordApp.Documents.Open(strWordFile)
  50.         wordApp.Visible = True
  51.         wordDoc.Activate
  52.         GoTo 101
  53.         'MsgBox ("檔案不存在!")
  54.         'Exit Sub
  55.     End If
  56.         
  57. 101:
  58.     With wordDoc.Tables(1)
  59.         .Cell(6, 2) = Replace(.Cell(6, 2), Chr(13), "") & "、這是測試"
  60.         
  61.     '取得word的日(時)數,重新計算總工作時數
  62.         If InStr(.Cell(6, 3), "日") = 0 And InStr(.Cell(6, 3), "小時") = 0 Then
  63.             WorkHours = 0
  64.             GoTo 102
  65.         Else
  66.             xString = .Cell(6, 3)
  67.             xtemp = Split(xString, "日")
  68.             hours = Val(xtemp(0)) * 8
  69.             xtemp = Split(xtemp(1), "小時")
  70.             WorkHours = hours + Val(xtemp(0))
  71.         End If
  72. 102:
  73.         '加新增時數:預計增加4.5小時
  74.         WorkHours = WorkHours + 4.5
  75.         '計算日數(每8小時為1日)
  76.         days = Int(WorkHours / 8)
  77.         '計算剩餘小時
  78.         hours = WorkHours - days * 8

  79.         '寫回word表格
  80.         .Cell(6, 3) = days & "日" & hours & "小時"

  81.     End With
  82.     'wordDoc.Close '關閉該Word文件檔
  83.     'wordApp.Quit '結束Word應用程式
  84.     'Set wordDoc = Nothing   '釋放物件變數wordDoc
  85.     'Set wordApp = Nothing   '釋放物件變數wordApp

  86. End Sub
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)