2014-10-28 13 views
6

मैं एक्सेल शीट पर काम कर रहा हूं जिसमें प्रत्येक पंक्ति को अंतिम बार इंगित करने की आवश्यकता है कि उस पंक्ति के भीतर कोई भी सेल बदल गया है। सरलतम विधि मैं यह कर पाया है तो जैसे, वर्कशीट कोड में VBA के कुछ छोटी राशि डाल करने के लिए है:एक्सेल वीबीए: SendKeys कुछ कंप्यूटरों पर विफल रहता है

Private Sub Worksheet_Change(ByVal Target As Range) 
    Application.EnableEvents = False 
    If (Target.Row > 2) And (Cells(Target.Row, "A") <> "") Then 
     Cells(Target.Row, "N").Value = Date 
    End If 
    Application.EnableEvents = True 
End Sub 

यह प्रभावी रूप से "एन" कॉलम में तारीख बदल जाएगा जब भी में किसी भी अन्य आइटम वह पंक्ति संपादित की गई है। महान! हल, छोड़कर ...

क्योंकि मैं कोड में सेल मान बदल रहा हूं, पूर्ववत स्टैक तुरंत खो गया है, और निश्चित रूप से इसका मतलब है कि इस वर्कशीट में कोई भी काम पूर्ववत नहीं किया जा सकता है।

तो, इसका एक विकल्प यह सोचने में उत्कृष्टता है कि मैंने सेल संपादित नहीं किया है। तारीख बदलने में इस कोड को पूर्ववत ढेर को बरकरार रखता है:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim cursorLocation As Range 
    Application.EnableEvents = False 
    If Target.Row > 2 And Cells(Target.Row, "A") <> "" Then 
     Set cursorLocation = ActiveCell 
     Cells(Target.Row, "N").Select 
     SendKeys "^;~", True 
     cursorLocation.Select 
    End If 
    Application.EnableEvents = True 
End Sub 

इस मामले में, हम सेल, नकली संपादन करने के लिए उपयोग SendKeys सेल का चयन करें, और उसके मूल स्थान पर कर्सर को बहाल। "^; ~" एक्सेल के "Ctrl +;" का उपयोग कर रहा है तिथि इनपुट करने के लिए शॉर्टकट। महान! हल, छोड़कर ...

यह कोड मेरी मशीन (विन 7, एक्सेल 2010) पर ठीक काम करता है लेकिन सह-कार्यकर्ता की मशीन (Win8, Excel 2010, शायद थोड़ा तेज़) पर विफल रहता है। Win8 मशीन पर (कोई विचार नहीं है कि यह समस्या है, बीटीडब्ल्यू), क्या होता है कि जब भी कोई सेल बदल जाता है, तो उस सेल के नीचे तुरंत हर सेल वर्तमान तारीख बन जाता है, और निश्चित रूप से पूर्ववत इतिहास को संरक्षित करना अर्थहीन है क्योंकि निष्पादन एक पूर्ववत तुरंत वर्कशीट कोड को पुनः सक्रिय करता है और सबकुछ फिर से तिथियों में बदल देता है।

मुझे पता चला कि मेरी मशीन पर वही बात होगी यदि मैं SendKeys कमांड में निहित "प्रतीक्षा" को हटा देता हूं। यही कारण है, अगर मैं लाइन का उपयोग करें:

SendKeys "^;~", False 

तो, मेरा अनुमान है कि यह है कि जो भी कारण के लिए, तब भी जब एक्सेल का एक ही संस्करण का उपयोग कर, अपने कंप्यूटर SendKeys के लिए समाप्त करने के लिए आदेश इंतज़ार कर रहा है है, लेकिन मेरे सहकर्मी का कंप्यूटर नहीं है। कोई विचार?

+1

किसी के लाभ के लिए और ने इस कोशिश कर रहा है, मैं बदल मेरी "अगर" आप मैन्युअल रूप से तिथि वापस बदलने के लिए अनुमति देने के लिए: 'अगर Target.Row> 2 और कोशिकाओं (Target.Row, 'ए') <> "" और लक्ष्य। कॉलम <> 14' –

उत्तर

5

आप सही हैं। यह एक्सेल 2010/Win8 में समस्या देता है।

इसे आजमाएं। मैंने लिखा कस्टम Wait कोड का उपयोग करें।

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim cursorLocation As Range 
    Application.EnableEvents = False 
    If Target.Row > 2 And Cells(Target.Row, "A") <> "" Then 
     Set cursorLocation = ActiveCell 
     Cells(Target.Row, "N").Select 
     SendKeys "^;~" 
     Wait 1 '<~~ Wait for 1 Second 
     cursorLocation.Select 
    End If 
    Application.EnableEvents = True 
End Sub 

Private Sub Wait(ByVal nSec As Long) 
    nSec = nSec + Timer 
    While nSec > Timer 
     DoEvents 
    Wend 
End Sub 

enter image description here

वैकल्पिक

Doevents भी वांछित प्रभाव है का उपयोग करना (Excel 2010/Win8 में परीक्षण किया गया)।

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim cursorLocation As Range 
    Application.EnableEvents = False 
    If Target.Row > 2 And Cells(Target.Row, "A") <> "" Then 
     Set cursorLocation = ActiveCell 
     Cells(Target.Row, "N").Select 
     SendKeys "^;~" 
     DoEvents 
     cursorLocation.Select 
    End If 
    Application.EnableEvents = True 
End Sub 
+0

अच्छा, यह निश्चित रूप से काम करता है, लेकिन 1 सेकंड कंप्यूटिंग शर्तों में प्रतीक्षा करने के लिए एक बहुत लंबा समय लगता है। क्या मैं एक तेज टाइमर का उपयोग कर सकता हूं? –

+0

मैंने जो 'वैकल्पिक' दिया है उसे देखें :) आपको पृष्ठ को रीफ्रेश करना पड़ सकता है। –

+0

कोई बात नहीं, DoEvents देरी को कम करने लगता है। –

संबंधित मुद्दे