c++ - मैं एक सरणी वापस करने के लिए अपना एक्सेल ऐड-इन नहीं चाहता हूं(इसके बजाय मुझे अन्य कक्षों को बदलने के लिए यूडीएफ की ज़रूरत है)
arrays excel (1)
मैंने एक एक्सेल ऐड-इन बनाया है, और इस ऐड-इन के कार्यों में से एक है, यह कहता है कि वर्तमान में 2 साल में नए साल का समय लगता है और प्रत्येक नए साल के दिन एक्सेल में एक सरणी के रूप में उन 2 वर्षों के दौरान आउटपुट करता है। इसलिए New_Years(2000,2002)
1 जनवरी 2000, 1 जनवरी 2001, और 1 जनवरी 200 9 को अंतिम सेल में वापस आएंगे।
समस्या यह है कि मुझे यह जानना होगा कि उस समय 3 तिथियां होने जा रही हैं, 3 कोशिकाओं का चयन करें, शीर्ष कक्ष में अपना सूत्र दर्ज करें, और फिर सरणी को भरने के लिए Ctrl + Shift + Enter
।
मैं अपने सी + + कोड को .xll फ़ाइल में कनवर्ट करने के लिए XLW संस्करण 5 का उपयोग करता हूं। मैं वास्तव में इसे पसंद करूँगा यदि कोई तरीका था तो मैं अपने सूत्र के साथ एक वर्ग को भर सकता था, और Excel नीचे दिए गए वर्गों को उचित तिथियों के साथ जरूरी कर देगा। किसी को पता है कि यह संभव है या नहीं? या असंभव?
बहुत धन्यवाद!
यह वास्तव में जटिल हालांकि यद्यपि संभव है मैं केविन जोन्स उर्फ ज़ोरवेक से जादू के इस टुकड़े को दोबारा पोस्ट कर रहा हूं क्योंकि यह ईई पैवल के पीछे बैठता है।
जबकि एक्सेल कड़ाई से यूडीएफ को किसी भी सेल, वर्कशीट, या कार्यपुस्तिका गुणों को बदलने से रोकता है, ऐसे में ऐसे परिवर्तनों को प्रभावित करने का एक तरीका है जब एक यूडीएफ को विंडोज टाइमर और एक एप्लिकेशन का उपयोग करते हुए कहा जाता है .ऑनटाइम टाइमर क्रम में विंडोज टाइमर यूडीएफ के भीतर इस्तेमाल किया जाना है क्योंकि एक्सेल किसी भी अनुप्रयोग की अनदेखी करता है। एक यूडीएफ के अंदर समय कॉल। लेकिन, क्योंकि विंडोज टाइमर की सीमाएं हैं (एक्सेल तुरंत से बाहर निकलेगा यदि कोई विंडोज टाइमर वीबीए कोड को चलाने की कोशिश करता है अगर कोई कक्ष संपादित किया जा रहा है या कोई डायलॉग खुले है), इसका उपयोग केवल एक एप्लिकेशन को शेड्यूल करने के लिए किया जाता है .ऑनटाइम टाइमर, एक सुरक्षित टाइमर जो एक्सेल को केवल तभी निकाल दिया जाता है जब सेल को संपादित नहीं किया जाता है और कोई संवाद खुले नहीं हैं
नीचे दिए गए उदाहरण के कोड में यूडीएफ के अंदर से एक विंडोज टाइमर कैसे शुरू किया गया, यह बताता है कि एक आवेदन शुरू करने के लिए उस टाइमर रूटिन का इस्तेमाल कैसे किया जाता है। समय-समय पर टाइमर और आगामी टाइमर-निष्पादित रूटीन को यूडीएफ के लिए जाना जाने वाली जानकारी को कैसे पारित किया जाए। नीचे दिए गए कोड को नियमित मॉड्यूल में रखा जाना चाहिए।
Private Declare Function SetTimer Lib "user32" ( _
ByVal HWnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long _
) As Long
Private Declare Function KillTimer Lib "user32" ( _
ByVal HWnd As Long, _
ByVal nIDEvent As Long _
) As Long
Private mCalculatedCells As Collection
Private mWindowsTimerID As Long
Private mApplicationTimerTime As Date
Public Function AddTwoNumbers( _
ByVal Value1 As Double, _
ByVal Value2 As Double _
) As Double
' This is a UDF that returns the sum of two numbers and starts a windows timer
' that starts a second Appliction.OnTime timer that performs activities not
' allowed in a UDF. Do not make this UDF volatile, pass any volatile functions
' to it, or pass any cells containing volatile formulas/functions or
' uncontrolled looping will start.
AddTwoNumbers = Value1 + Value2
' Cache the caller's reference so it can be dealt with in a non-UDF routine
If mCalculatedCells Is Nothing Then Set mCalculatedCells = New Collection
On Error Resume Next
mCalculatedCells.Add Application.Caller, Application.Caller.Address
On Error GoTo 0
' Setting/resetting the timer should be the last action taken in the UDF
If mWindowsTimerID <> 0 Then KillTimer 0&, mWindowsTimerID
mWindowsTimerID = SetTimer(0&, 0&, 1, AddressOf AfterUDFRoutine1)
End Function
Public Sub AfterUDFRoutine1()
' This is the first of two timer routines. This one is called by the Windows
' timer. Since a Windows timer cannot run code if a cell is being edited or a
' dialog is open this routine schedules a second safe timer using
' Application.OnTime which is ignored in a UDF.
' Stop the Windows timer
On Error Resume Next
KillTimer 0&, mWindowsTimerID
On Error GoTo 0
mWindowsTimerID = 0
' Cancel any previous OnTime timers
If mApplicationTimerTime <> 0 Then
On Error Resume Next
Application.OnTime mApplicationTimerTime, "AfterUDFRoutine2", , False
On Error GoTo 0
End If
' Schedule timer
mApplicationTimerTime = Now
Application.OnTime mApplicationTimerTime, "AfterUDFRoutine2"
End Sub
Public Sub AfterUDFRoutine2()
' This is the second of two timer routines. Because this timer routine is
' triggered by Application.OnTime it is safe, i.e., Excel will not allow the
' timer to fire unless the environment is safe (no open model dialogs or cell
' being edited).
Dim Cell As Range
' Do tasks not allowed in a UDF...
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Do While mCalculatedCells.Count > 0
Set Cell = mCalculatedCells(1)
mCalculatedCells.Remove 1
Cell.Offset(0, 1).Value = Cell.Value
Loop
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub