मैंने इस साइट का काफी उपयोग किया है, लेकिन यह पहला प्रश्न है जिसे मैंने पोस्ट किया है, उम्मीद है कि मैं पर्याप्त जानकारी दे सकता हूं। मुझे कोई प्रासंगिक उत्तर नहीं मिल रहा है क्योंकि कोई फर्क नहीं पड़ता कि मैं क्या खोजता हूं, मुझे लूपिंग कोड से संबंधित विभिन्न उत्तर मिलते हैं।वर्कशीट्स के माध्यम से वीबीए अनचाहे लूप
कुछ पृष्ठभूमि: मैंने अपने कार्यस्थल में कुछ वस्तुओं को ट्रैक करने के लिए एक एक्सेल दस्तावेज़ तैयार किया है (बाद में मास्टर दस्तावेज़ के रूप में संदर्भित)। चूंकि पिछले ट्रैकर ने उपयोगकर्ताओं को किसी भी समय कुछ भी संपादित करने की अनुमति दी है, इसलिए मैंने यह सुनिश्चित करने के लिए फॉर्म का उपयोग किया है कि सभी जानकारी सही तरीके से दर्ज की गई है और सुरक्षित रूप से संग्रहीत की गई है। मास्टर दस्तावेज़ में प्रत्येक आइटम के लिए एक अलग एक्सेल कार्यपुस्तिका है (इसके बाद इसे आइटम दस्तावेज़ के रूप में संदर्भित किया जाता है)।
मास्टर दस्तावेज़ में कई चादरें हैं जो प्रत्येक बार सक्रिय होने पर कोड चलाती हैं (क्योंकि उन्हें अपडेट करने की आवश्यकता होती है)।
जैसा कि प्रत्येक दस्तावेज़ दस्तावेज़ में कुछ वीबीए कोड है जो मास्टर दस्तावेज़ के साथ डेटा समन्वयित करने में महत्वपूर्ण है, मैंने एक चेतावनी वर्कशीट जोड़ा है जो दिखाया गया है कि आइटम दस्तावेज़ मैक्रोज़ के बिना खोला गया है। इसमें कार्यपुस्तिका को खोलने से पहले, सहेजने से पहले और घटनाओं को सहेजने के बाद केवल यह सुनिश्चित किया जाता है कि केवल मैक्रोज़ के बिना चेतावनी दिखाई दे। यहाँ प्रत्येक घटना के लिए कोड (स्पष्ट रूप से ThisWorkbook मॉड्यूल में रखा)
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Auto_Open
'This is for sync (Master Document checks for text file to see if any changes have been made to Item Document)
If booChange = True Then
Dim oFile As Object
Set oFile = fso.CreateTextFile(strTextFile)
SetAttr strTextFile, vbHidden
booChange = False
End If
'Turn off Screen Updating
Application.ScreenUpdating = False
'Show warning sheet
Sheets("Warning").Visible = xlSheetVisible
'Hide all sheets but Warning sheet
For Each sh In ThisWorkbook.Worksheets
If Not sh.Name = "Warning" Then sh.Visible = xlVeryHidden
Next sh
End Sub
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
'Show all sheets
For Each sh In ThisWorkbook.Worksheets
sh.Visible = xlSheetVisible
Next sh
'Hide the warning sheet
Sheets("Warning").Visible = xlVeryHidden
'Return focus to the main page
ThisWorkbook.Worksheets(1).Activate
'Turn on Screen Updating
Application.ScreenUpdating = True
ThisWorkbook.Saved = True
End Sub
Private Sub Workbook_Open()
'Turn off Screen Updating
Application.ScreenUpdating = False
'Show all sheets
For Each sh In ThisWorkbook.Worksheets
sh.Visible = xlSheetVisible
Next sh
'Hide the warning sheet
Sheets("Warning").Visible = xlVeryHidden
'Return focus to the main page
ThisWorkbook.Worksheets(1).Activate
'Turn on Screen Updating
Application.ScreenUpdating = True
ThisWorkbook.Saved = True
End Sub
और बस संपूर्णता के लिए है, यहाँ मद दस्तावेज़
'Declarations
'Strings
Public strSourceFolder As String
Public strTextFile As String
'Other
Public fso As FileSystemObject
Public booChange As Boolean
Public wsFlow As Worksheet
'Constants
Public Const strURNSheetName = "Part 1 Plant Flow Out Summ"
Sub Auto_Open()
Set fso = CreateObject("Scripting.FileSystemObject")
Set wsFlow = ThisWorkbook.Worksheets(strURNSheetName)
strSourceFolder = fso.Getfile(ThisWorkbook.FullName).ParentFolder.Path
strTextFile = fso.BuildPath(strSourceFolder, ThisWorkbook.Worksheets(strURNSheetName).Range("W2").Value & ".txt")
End Sub
की Module1 में सभी कोड जब एक आइटम मास्टर में बनाया जाता है 'FrmNewEntry' फॉर्म का उपयोग कर दस्तावेज़ को चेक किया गया है और मास्टर दस्तावेज़ में प्रवेश किया गया है, फिर एक टेम्पलेट आइटम दस्तावेज़ खोला गया है और एक नए अद्वितीय फ़ाइल नाम से सहेजा गया है। यह तब असुरक्षित है, नई जानकारी, संरक्षित, सहेजा और बंद के साथ अद्यतन किया गया है। मास्टर दस्तावेज़ तब सहेजा जाता है।
पर्चा कोड::
Private Sub btnSave_Click()
'Values on form are verified
'Master Document sheet is unprotected, formatted and data entry occurs
'Clear Userform and close
For Each C In frmNewEntry.Controls
If TypeOf C Is MSForms.ComboBox Then
C.ListIndex = -1
ElseIf TypeOf C Is MSForms.TextBox Then
C.Text = ""
ElseIf TypeOf C Is MSForms.CheckBox Then
C.Value = False
End If
Next
frmNewEntry.Hide
'Create filepaths
Create_Filepath
'Some hyperlinks are added and the Master Document worksheet is protected again
'Create Flowout Summary
Create_Flowout_Summary
'Update Flowout Summary
Update_Flowout_Summary
'Turn on screen updating
Application.ScreenUpdating = True
'Update Activity Log
Update_Log ("New: " & strNewURN)
Debug.Print "Before Save Master"
'Save tracker
ThisWorkbook.Save
Debug.Print "After Save Master"
End Sub
Module1 कोड:
Public Sub Create_Flowout_Summary()
'Create a new flowout summary from the template
'Turn off screen updating
Application.ScreenUpdating = False
'Check if workbook is already open
If Not Is_Book_Open(strTemplate) Then
Application.Workbooks.Open (strTemplatePath)
End If
Debug.Print "Before SaveAs Create"
'Save as new flowout summary
Application.Workbooks(strTemplate).SaveAs fileName:=strFilePath
Debug.Print "After SaveAs Create"
'Close Document Information Panel
ActiveWorkbook.Application.DisplayDocumentInformationPanel = False 'Doesn't seem to work
'Turn on screen updating
Application.ScreenUpdating = True
End Sub
Public Sub Update_Flowout_Summary()
'Update the flowout summary for current call
Dim wsURN As Worksheet
Set wsURN = Workbooks(strFileName).Worksheets(strWsURNName)
'Unprotect Flowout Summary worksheet
wsURN.Unprotect "Flowout Summary"
'Write values to flowout summary
'Protect Flowout Summary worksheet
wsURN.Protect "Flowout Summary", False, True, True, True, True
Debug.Print "Before Save Update"
'Save flowout summary
Application.Workbooks(strFileName).Save
Debug.Print "After Save Update"
'Close Document Information Panel
ActiveWorkbook.Application.DisplayDocumentInformationPanel = False
'Turn on screen updating
Application.ScreenUpdating = True
End Sub
समस्या विस्तार: जब मैं एक नई प्रविष्टि बनाने यह ले जा रहा है संहिता (लंबा स्वरूपण और डेटा प्रविष्टि छोड़ संपादित) इस प्रकार बहुत लंबा समय, मैंने गलती से पाया कि मास्टर दस्तावेज़ प्रत्येक शीट सक्रिय घटना (ऊपर उल्लिखित) में कोड चला रहा है (मेरे पास एक शीट में डायग्नोस्टिक संदेश था जो रहस्यमय रूप से दिखाई देता था जब मैंने एक नई प्रविष्टि बनाई थी) मैंने इस निष्कर्ष को निष्कर्ष निकाला है कि कोड किसी भी तरह से प्रत्येक वर्कशीट को सक्रिय कर रहा है लेकिन मुझे नहीं पता कि क्यों ....
किसी भी मदद की बहुत सराहना की जाएगी, और यदि मुझे कुछ भी याद आया है जो मुझे निदान करने में मदद कर सकता है जानना।
संपादित करें: अन्य अजीब घटना यह है कि ऐसा तब नहीं होता जब मैं कोड को चरणबद्ध करने की कोशिश करता हूं ताकि सक्रिय घटनाओं को ट्रिगर किया जा सके।
संपादित करें: कार्यपत्रक में कोड घटना को सक्रिय
Private Sub Worksheet_Activate()
'Turn off Screen Updating
Application.ScreenUpdating = False
'Simply writes data to the sheet (excluded because it is lengthy)
'Turn on Screen Updating
Application.ScreenUpdating = True
wsMyCalls.Protect Password:=strPassword
Debug.Print "wsMyCalls"
MsgBox "This sheet uses your username to display any calls you own." & vbNewLine & _
"It relies on the correct CDSID being entered for owner." & vbNewLine & vbNewLine & _
"Regards" & vbNewLine & _
"Your friendly spreadsheet administrator", vbOKOnly, "Information"
End Sub
संपादित करें: मैं कोड (ऊपर) के लिए कुछ Debug.Prints जोड़ा गया है और यह मैं क्या मिल गया है।
- पहले SaveAs बनाएं
- बाद SaveAs
- बनाएं इससे पहले सहेजें अद्यतन
- के बाद सहेजें अद्यतन
- इससे पहले मास्टर सहेजें
- मास्टर सहेजें
- wsMyCalls बाद
यह दिखाता है कोड Debug.Print के बीच निष्पादित हो रहा है और एक End Sub "मास्टर को बचाने के बाद" है। वहां कोई कोड नहीं है ???
धन्यवाद
आपको अपने कोड में कार्यपुस्तिका को सहेजने से पहले ईवेंट को अक्षम करने की आवश्यकता है। – Rory
मैंने इसके बारे में सोचा लेकिन इसका मतलब यह होगा कि आइटम दस्तावेज़ को चेतावनी पत्र के बिना सहेजा गया है। मुझे घटनाओं को सक्रिय होने की आवश्यकता है। संपादित करें: यही कारण है कि मैंने आइटम दस्तावेज़ में वर्कशीट छिपाने और दिखाने के लिए लूप को यह वर्कशीट्स वर्कशीट्स जोड़ा। – Nervix
फिर आपको अन्य चादरें छिपाने/दिखाने से पहले ईवेंट को अक्षम करने के लिए अन्य कोड को बदलने की आवश्यकता होगी और फिर ईवेंट को पुन: सक्षम करें। – Rory