Board logo

標題: [發問] 求助幫檢查VBA那兒有問題 [打印本頁]

作者: RCRG    時間: 2016-2-12 14:14     標題: 求助幫檢查VBA那兒有問題

下面Workbook原本有3個VBA,自從加入了第4個VBA後,第2個VBA的效果開始有了點問題(EXCEL2000版),
是甚麼地方邏輯或排列有問題嗎?
可是如果把第4個拿掉,就又正常;
我先把VBA貼上來這,這各位大大幫我看看哪有問題,若這樣無找出問題,我再另附檔案上來,先謝謝各位了!


Private Sub Workbook_Open()

Call 檢測資料檔: If xMsg = "" Then GoTo 999 '第1個VBA

MsgBox xMsg & Chr(10) & Chr(10) & _
       "彈出視窗顯示文字" & Chr(10) & Chr(10) & _
       "彈出視窗顯示文字2"
      
Application.DisplayAlerts = False
If Workbooks.Count = 1 Then
   Application.Quit
Else
   ThisWorkbook.Close 0
End If
Application.DisplayAlerts = True
Exit Sub
999:
If Info2 <> "" Then MsgBox Info2


              Worksheets("sheet1").Protect Password:="123", userInterFaceonly:=True   '第2個VBA

              Worksheets("sheet1").EnableAutoFilter = True
              
              
Dim Str, GetValue   '第3個VBA
On Error Resume Next
Str = "'" & "C:\Users\Desktop\[TEST.xls]TEST'!R1C1" '路徑檔名自行修改
GetValue = Application.ExecuteExcel4Macro(Str)
If Sheet4.[A1] <> GetValue Then MsgBox "WORD!", 48



Dim MyB As Workbook, xB As Workbook, xFile$ '第4個VBA
Set MyB = ThisWorkbook
xFile = "C:\Users\Desktop\TEST1.xls"  '路徑檔名自行修改
Application.ScreenUpdating = False
Set xB = Workbooks.Open(xFile, ReadOnly:=True)

xB.Sheets("TEST1").Protect "123"
With MyB.Sheets("TEST2")
    .Unprotect "123"
    xB.Sheets("TEST3").[B1:BA500].Copy .[B1]
    .Protect "123"
End With



xB.Close 0


         End Sub
作者: luhpro    時間: 2016-2-14 22:27

本帖最後由 luhpro 於 2016-2-14 22:32 編輯
下面Workbook原本有3個VBA,自從加入了第4個VBA後,第2個VBA的效果開始有了點問題(EXCEL2000版),
是甚麼地 ...
RCRG 發表於 2016-2-12 14:14

沒檔案可以試, 未實測純推測,你可以套用看看 (PS. 測試前請記得先備份).

有可能是:
Set xB = Workbooks.Open(xFile, ReadOnly:=True)
這一行又去呼叫 Workbook_Open 程序,
而它又會去執行到 第2個VBA,
以致產生非預期的結果.

一般要避免此類情形我會考慮用以下兩種方式之一:

1. 執行程序前,先把觸發行為開關關掉,執行完再打開:
Application.EnableEvents = False
Set xB = Workbooks.Open(xFile, ReadOnly:=True)
Application.EnableEvents = True


2. 設置旗標控制(旗標一般須為全域變數)是否要觸發:
Module-

Public bOpen As Boolean



Workbook_Open-
Private Sub Workbook_Open()
If bOpen Then Exit Sub
Call 檢測資料檔: If xMsg = "" Then GoTo 999 '第1個VBA
.
.
.
bOpen = True
Set xB = Workbooks.Open(xFile, ReadOnly:=True)
bOpen = False
.
.
.
作者: RCRG    時間: 2016-2-17 15:45

回復 2# luhpro


    試著在Set xB = Workbooks.Open(xFile, ReadOnly:=True) 前後加上

Application.EnableEvents = False         bOpen = True
                                                              與
Application.EnableEvents = True          bOpen = False

同樣問題似乎也是存在!QQ
沒關係我再找看有沒它法好了,也謝謝uhpro提供的方法讓我參考喔
作者: luhpro    時間: 2016-2-19 22:39

本帖最後由 luhpro 於 2016-2-19 22:46 編輯

回復 3# RCRG
你試試把那行:
On Error Resume Next
改成:
On Error Goto 0
跑跑看是否會有錯誤發生? 若有則看看發生在哪一行? 看看是否能排除問題點.
因為 Resume Next 指令直接忽略錯誤, 而會動到Excel外部的指令(如 : Open 檔案), 用這個指令有可能會出現無法預期的結果.

另一個方法是 :
左鍵點一下 底下這 兩 行 左邊的灰色區域 - 讓這兩行變成棕色底 (即設成執行中斷點)
1)     Call 檢測資料檔   的下一行, 當 xMsg <> ""  時從這行開始跑 :
MsgBox xMsg & Chr(10) & Chr(10) & _
         "彈出視窗顯示文字" & Chr(10) & Chr(10) & _
        "彈出視窗顯示文字2"


2)     999:   的下一行, 當 xMsg = ""  時從這行開始跑 :
If Info2 <> "" Then MsgBox Info2

執行動作等程式暫停在這兩行之一時,
逐行 按 F8 按鍵 啟動 單步執行,
追蹤程式流程是否正確.
作者: RCRG    時間: 2018-9-17 15:59

回復 4# luhpro

請問一下大師
Set xB = Workbooks.Open(xFile, ReadOnly:=True)
這段是甚麼功能呢? 有存在必要嗎?




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