在Workbook中工作。在VBA中打开Bug

我试图从一个独特的工作簿传输数据到另一个独特的工作簿(即,文件名是静态的)。 我发现了一些示例代码,它创build了两个variablestypes的工作簿(每个代表一个示例工作簿),然后将这些variables设置为Workbooks.Open(“Filename”)。 我试着实现这只是为了发现我的代码在第一个workbook.open(“filename”)variables定义之后立即停止执行。 在search这个答案后,我意识到这是一个VBA中的一个错误,由错误检测到Shift键的产生。 微软支持网站上有一些代码,如果按下shift键基本不会让你的代码运行。 我实现了这个代码,当然实际上没有,Shift键被检测为物理性的压抑。 这似乎是迄今为止唯一可以find的关于这个话题的“帮助”。 我似乎无法找出workbooks.open的替代scheme来设置我的工作簿variables等于唯一的文件path。 首先,是否有这个bug的解决方法,使Shift键不被检测为被压下? 或者,第二,是否有另一种方法来设置我的工作簿variables等于特定的文件path,而不使用workbooks.openfunction?

在此先感谢您的帮助。

'Declare API Declare Function GetKeyState Lib "User32" (ByVal vKey As Integer) As Integer Const SHIFT_KEY = 16 Function ShiftPressed() As Boolean 'Returns True if shift key is pressed ShiftPressed = GetKeyState(SHIFT_KEY) < 0 End Function Public Sub Initialization() Do While ShiftPressed() Application.ScreenUpdating = False DoEvents 'Public Variable Definition 'Set Tracking = Workbooks.Open("\\Server2013\NETWORK_SHARED\QC SHARED\P&Q Tracking New Template.xls") Set Tracking = Workbooks.Open("\\Qc\shareddocs\P&Q Tracking New Template.xls") 'Set Data = Workbooks.Open("\\Server2013\NETWORK_SHARED\QC SHARED\Production & Quality Raw Data.xls") Set Data = Workbooks.Open("\\Qc\shareddocs\Production & Quality Raw Data.xls") DataLastRow = Data.Sheets("P&Q Raw Data").UsedRange.Rows.Count WS_Count = Tracking.Worksheets.Count Day_Array() = Array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday") Name_Array() = Array("Angel", "Tony", "Bandy", "Jorge", "Ray") 'Unprotect Sheets For WS_Iter = 1 To WS_Count With Tracking.Worksheets(WS_Iter) .Activate .Unprotect End With 'Tracking.Worksheets(WS_Iter).Activate 'Tracking.Worksheets(WS_Iter).Unprotect 'ActiveSheet.Unprotect Next WS_Iter 'Clear Contents Sheets("P&Q Weekly Summary").Activate For WL_Row_Num = 24 To 72 Step 12 Sheets("P&Q Weekly Summary").Range(Cells(WL_Row_Num, 3), Cells(WL_Row_Num + 4, 6)).ClearContents Sheets("P&Q Weekly Summary").Range(Cells(WL_Row_Num, 10), Cells(WL_Row_Num + 4, 10)).ClearContents Next WL_Row_Num 'Reprotect Sheet 1 Sheets("P&Q Weekly Summary").Protect UserInterfaceOnly:=True 'Variable Initialization WL_Row_Num = 0 WS_Num = 0 SBName_Row_Num = 12 Name_Row_Num = 20 Weekly_Score_Row = 24 'Userform Input Vacation_Options_Form.Show Loop End Sub 

我做了一些改变我的代码,发现一个有趣的观察。 以下是我精简的代码片段:

 Public Sub Initialization() Application.EnableEvents = True Application.ScreenUpdating = False Set Data = Workbooks.Open("\\Qc\shareddocs\Production & Quality Raw Data.xls") MsgBox "The Data Workbook Is Now Open." Set Tracking = Workbooks.Open("\\Qc\shareddocs\P&Q Tracking New Template.xls") MsgBox "The Tracking Workbook Is Now Open." DataLastRow = Data.Sheets("P&Q Raw Data").UsedRange.Rows.Count WS_Count = Tracking.Worksheets.Count Day_Array() = Array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday") Name_Array() = Array("Angel", "Tony", "Bandy", "Jorge", "Ray") 

经过进一步的实验,我意识到,如果我注释掉跟踪工作簿定义,但是如果我没有对此进行注释,则不会超出跟踪工作簿声明执行,否则代码将超出数据工作簿声明执行。 跟踪工作簿是我最初打开的,如果这有所作为。 我已经隔离了这个问题。 如果您尝试打开的工作簿已经打开并且是执行代码的主要工作簿,Workbooks.Open命令似乎不起作用。 这看起来正确吗? 这是错误吗? 我所要做的就是正式宣布我的工作簿为唯一variables。 除了Workbooks.Open,还有其他的方法吗? 请帮忙。 谢谢。

我最终通过不使用Workbooks.Openfunction来解决这个问题。 我只是将我的基本工作簿称为ThisWorkbook,并完全避免了这个问题。 我试图避免使用预定义的variables,如ThisWorkbook所需的工作簿,但最终这似乎是唯一可用,或至less是最好的select。