নির্দিষ্ট সময়ের জন্য কীভাবে বিরতি রাখবেন? (সীমা অতিক্রম করা / VBA)


103

আমার কাছে একটি এক্সেল ওয়ার্কশিট রয়েছে যাতে নিম্নলিখিত ম্যাক্রো রয়েছে। আমি প্রতি সেকেন্ডে এটি লুপ করতে চাইছি তবে এটির জন্য যদি ফাংশনটি খুঁজে পাই তবে ঝুঁকিপূর্ণ। এটা কি সম্ভব না?

Sub Macro1()
'
' Macro1 Macro
'
Do
    Calculate
    'Here I want to wait for one second

Loop
End Sub

উত্তর:


129

অপেক্ষা করুন পদ্ধতিটি ব্যবহার করুন :

Application.Wait Now + #0:00:01#

বা (এক্সেল 2010 এবং তার পরে):

Application.Wait Now + #12:00:01 AM#

আপনি এর দ্বারা কী বোঝাতে চেয়েছেন তা আমি ঠিক নিশ্চিত নই, তবে আমি অনুমান করি যে আপনি DoEventsএখানে ডেমোডড ডেইসফয়েসেক্সেলস
রায়ান শ্যানন

3
@ বেনোইট এবং @ কেনেগ, আপনি পাঠ্য তারিখে রূপান্তর করতে এড়িয়ে সরাসরি 1 সেকেন্ড রাখতে পারেন। আমার জন্য আরও পরিষ্কার: Application.Wait(Now + #0:00:01#)চিয়ার্স!
সোমারহ

29
এই ফর্ম্যাটটি এক্সেল 2010 তে কাজ করছে না This এটি যদিও কাজ করে:Application.Wait (Now + TimeValue("0:00:01"))
ZX9

1
ডেটএড ("এস", 1, এখন) সঠিক জিনিসটি করে। এবং যেকোন দীর্ঘ সংখ্যক সেকেন্ডের জন্য সাধারণীকরণ করা যেতে পারে: সময়কে আক্ষরিক ব্যবহার না করেই তারিখ অ্যাড ("গুলি", এনসেক, এখন)। 1 সেকেন্ডেরও কম ঘুমানোর জন্য কার্নেল
অ্যান্ড্রু ডেনিসন

1
@ জেডএক্স 9 সময় মূল্য ("00:00:01") = 0.0000115740 ... সুতরাং অ্যাপ্লিকেশন.উইট (এখন + 0.00001) প্রায় এক সেকেন্ডের। আমি Application.wait(now + 1e-5)এক সেকেন্ডের Application.wait(now + 0.5e-5)জন্য, অর্ধেক সেকেন্ডের জন্য ইত্যাদি ব্যবহার করতে চাই
সোম_গুই

61

এটি আপনার মডিউলে যুক্ত করুন

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

বা, 64-বিট সিস্টেমগুলির জন্য ব্যবহার করুন:

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

আপনার ম্যাক্রোতে এটির মতো কল করুন:

Sub Macro1()
'
' Macro1 Macro
'
Do
    Calculate
    Sleep (1000) ' delay 1 second

Loop
End Sub

1
কার্নেল 32.dll ব্যবহার না করে এটি করার জন্য ভিবিএ পদ্ধতিটি ব্যবহার করবেন না কেন?
বেন এস

10
অ্যাক্সেসের মতো বিভিন্ন অফিস পণ্যগুলির মধ্যে এটি পোর্টেবল এবং এক্সেল নির্দিষ্ট নয় বলে আমি এই পদ্ধতিটি ব্যবহার করেছি।
বুগাবিল

আরও একটি ভিবিএ অ্যাপ্লিকেশন (ইআরএস) রয়েছে যা আমি ব্যবহার করি যা ভাষার খুব সীমিত উপসেট রয়েছে।
বুগাবিল

18
+1, কারণ Sleep()আপনাকে 1 সেকেন্ডেরও কম সময়ের অপেক্ষা করার সময় নির্দিষ্ট করতে দেয়। Application.Waitকখনও কখনও খুব দানাদার হয়।
ব্র্যাডিসি

2
@JulianKnight:Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Vegard

42

পরিবর্তে ব্যবহার:

Application.Wait(Now + #0:00:01#)

আমি পছন্দ করি:

Application.Wait(Now + TimeValue("00:00:01"))

কারণ পরে এটি পড়া অনেক সহজ।


7
এবং এটি কাজ করে, অফিস 2013 এ, # 0: 0: 1 # ফর্ম্যাটটি মধ্যরাতের পরে 1 সেকেন্ডে রূপান্তরিত করে।
জুলিয়ান নাইট

1
সতর্কতা: 'অ্যাপ্লিকেশন.ওয়েট' ব্যবহার করে সমস্ত সমাধানের মধ্যে 1 সেকেন্ডের অসম্পূর্ণতা রয়েছে। বর্তমান দ্বিতীয়টি শুরু হওয়ার পর থেকে এই পদ্ধতিটি ইতিমধ্যে কেটে যাওয়া মিলিসেকেন্ডগুলি বিবেচনা করে না ... উদাহরণস্বরূপ, সময় সেকেন্ড পরিবর্তিত হওয়া অবধি যদি কেবল 1 মিলিসেকেন্ড বাকি থাকে তবে আপনি কেবল 1 মিলিসেকেন্ডের জন্য ঘুমাবেন। আপনি 1 সেকেন্ডের অপেক্ষা না করে কেবল 2 টি বৃত্তাকার সংখ্যা তুলনা করছেন!
সাইবারপঙ্ক

18

এটি আমার পক্ষে নির্দ্বিধায় কাজ করে। "ডু টু ডু" লুপের আগে বা পরে কোনও কোড প্রবেশ করান। আপনার ক্ষেত্রে, আপনার ডু লুপের শেষে 5 টি লাইন (সময় 1 = & সময় 2 = & "" লুপ করা পর্যন্ত করুন) রাখুন

sub whatever()
Dim time1, time2

time1 = Now
time2 = Now + TimeValue("0:00:01")
    Do Until time1 >= time2
        DoEvents
        time1 = Now()
    Loop

End sub

2
আমি এই সমাধানটি সবচেয়ে পছন্দ করি কারণ আমি বার্তার সারিটি থামাতে চাইনি।
ড্যানিয়েল ফুচস

এই সমাধানটি সুনির্দিষ্ট এবং স্লিপ-এপিআই-ফাংশন ঘোষণার প্রয়োজন হয় না। আমি সময়টিকে দ্বিগুণ মানগুলিতে সঞ্চয় করতাম এবং একই ফলাফলের পরিবর্তে মাইক্রোসেকেন্ড ব্যবহার করতাম।
DrMarbuse

এই সমাধানটি নীচের ব্যবহারের নীচের অনুরূপ সমাধানগুলির চেয়ে আরও ভাল কাজ করে Timerকারণ Timerমধ্যরাতের ঠিক আগে এই ব্যর্থতা ব্যর্থ হয়।
ভেকনলস

1
এই সমাধানটি সুনির্দিষ্ট নয়, এটি মিলিসেকেন্ডগুলিকে বিবেচনা করে না যা ইতিমধ্যে বর্তমান সময় থেকে কেটে গেছে ... উদাহরণস্বরূপ, এখন যদি না সেকেন্ড পরিবর্তিত হওয়া অবধি কেবল 1 মিলিসেকেন্ড বাকি থাকে তবে আপনি কেবল 1 মিলিসেকেন্ডের জন্য ঘুমাবেন।
সাইবারপঙ্ক

যখন অন্যান্য সমাধানগুলি একটি নন-এমএস অফিস ভিত্তিক ভিবিএ ম্যাক্রোর জন্য দীর্ঘ সময় নিয়েছিল, তখন এটি একদম সঠিকভাবে কাজ করেছিল - ধন্যবাদ!
জানতে আগ্রহী

12

কার্নেল 32.dll স্লিপ ইন ডিক্লোরেশন 64৪-বিট এক্সেলে কাজ করবে না। এটি আরও কিছুটা সাধারণ হবে:

#If VBA7 Then
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

2
অফিস 2013 এ সংকলন করতে ব্যর্থ হয়েছে Office অফিস 2013 এর জন্য ভিবিএতে ত্রুটি পরীক্ষক সংকলক বিবৃতি উপেক্ষা করছে বলে মনে হচ্ছে।
জুলিয়ান নাইট

2
অফিস 2013 এ আমার জন্য জরিমানা সংকলন করুন
জন পেল্টিয়র

বেশিরভাগ লোকেরা সম্মত হন যে উইন 64 / ভিবিএ 7 ডিডব্লিউমিলিসেকেন্ডগুলি লম্বা, লংপ্রিটার নয়। এক্সেল ভিবিএ বাহ্যিক কলগুলির পরে স্ট্যাক সংশোধন করে এ জাতীয় ত্রুটিগুলি লুকিয়ে রাখে, তবে এর মতো ত্রুটিগুলি ওপেন অফিসের বেশিরভাগ সংস্করণটিকে ক্র্যাশ করবে
ডেভিড

6

ক্লিওমের কোডের কেবল একটি সাফ সংস্করণ - অ্যাক্সেসে কাজ করে, এতে অ্যাপ্লিকেশন.ওয়েট ফাংশন নেই।

Public Sub Pause(sngSecs As Single)
    Dim sngEnd As Single
    sngEnd = Timer + sngSecs
    While Timer < sngEnd
        DoEvents
    Wend
End Sub

Public Sub TestPause()
    Pause 1
    MsgBox "done"
End Sub

2
যদি Timerমধ্যরাতের পর থেকে সেকেন্ডের সংখ্যা দেয় তবে মধ্যরাতের ঠিক আগে (যেমন, sngEnd> = 86,400) কার্যকর করা হলে এই পন্থাটি ব্যর্থ হয়। মধ্যরাতে, Timer0 এ পুনরায় সেট করা এবং এভাবে sngEndচিরকালের চেয়ে কম থাকে ।
21

PS ক্লোমের উপরের কোডটি দিনের যে কোনও সময় কাজ করে।
21

@ ভেকনলস, আপনি যা বলেছেন তা একেবারে সত্য। এবং নীচের পদ্ধতিতেও ক্ষতিপূরণ দেওয়া যেতে পারে। যেহেতু এই পদ্ধতিটি মিলিসেকেন্ডগুলি পরিচালনা করে, তাই আমি মনে করি এটি নিরাপদ বাজি। `` জন সাব ঘুম (sngSecs হিসাবে একক) অস্পষ্ট sngEnd হিসাবে একক sngEnd = টাইমার + + (sngSecs / 1000) যদিও টাইমার <sngEnd DoEvents থাকেন (sngEnd - টাইমার)> 50000 তখন sngEnd = sngEnd - 86400 বন্ধ করে দেন পথ চলা শেষ উপ ` `
প্রভিয়ানন্দাস

5

উপস্থাপিত সমাধানগুলির বেশিরভাগই অ্যাপ্লিকেশন.ওয়েট ব্যবহার করে যা স্রোতের দ্বিতীয় গণনা শুরু হওয়ার পরে ইতিমধ্যে কেটে যাওয়া সময় (মিলিসেকেন্ড) বিবেচনায় নেয় না, তাই তাদের 1 সেকেন্ড অবধি অভ্যন্তরীণ দোষ রয়েছে ।

টাইমার পদ্ধতিরাই সেরা সমাধান , তবে আপনাকে মধ্যরাতে রিসেটটি ધ્યાનમાં নিতে হবে, তাই টাইমারটি ব্যবহার করে এখানে একটি নিখুঁত ঘুমের পদ্ধতি রয়েছে:

'You can use integer (1 for 1 second) or single (1.5 for 1 and a half second)
Public Sub Sleep(vSeconds As Variant)
    Dim t0 As Single, t1 As Single
    t0 = Timer
    Do
        t1 = Timer
        If t1 < t0 Then t1 = t1 + 86400 'Timer overflows at midnight
        DoEvents    'optional, to avoid excel freeze while sleeping
    Loop Until t1 - t0 >= vSeconds
End Sub

এটি কোনও স্লিপ ফাংশন পরীক্ষা করতে ব্যবহার করুন: (ডিবাগ তত্ক্ষণাত উইন্ডো: CTRL + G খুলুন)

Sub testSleep()
    t0 = Timer
    Debug.Print "Time before sleep:"; t0   'Timer format is in seconds since midnight

    Sleep (1.5)

    Debug.Print "Time after sleep:"; Timer
    Debug.Print "Slept for:"; Timer - t0; "seconds"

End Sub

3

Application.Wait Second(Now) + 1


সতর্কতা: 'অ্যাপ্লিকেশন.ওয়েট' ব্যবহার করে সমস্ত সমাধানের মধ্যে 1 সেকেন্ডের অসম্পূর্ণতা রয়েছে। বর্তমান দ্বিতীয়টি শুরু হওয়ার পর থেকে এই পদ্ধতিটি ইতিমধ্যে কেটে যাওয়া মিলিসেকেন্ডগুলি বিবেচনা করে না ... উদাহরণস্বরূপ, সময় সেকেন্ড পরিবর্তিত হওয়া অবধি যদি কেবল 1 মিলিসেকেন্ড বাকি থাকে তবে আপনি কেবল 1 মিলিসেকেন্ডের জন্য ঘুমাবেন। আপনি 1 সেকেন্ডের অপেক্ষা না করে কেবল 2 টি বৃত্তাকার সংখ্যা তুলনা করছেন!
সাইবারপঙ্ক

2
Function Delay(ByVal T As Integer)
    'Function can be used to introduce a delay of up to 99 seconds
    'Call Function ex:  Delay 2 {introduces a 2 second delay before execution of code resumes}
        strT = Mid((100 + T), 2, 2)
            strSecsDelay = "00:00:" & strT
    Application.Wait (Now + TimeValue(strSecsDelay))
End Function

1
সতর্কতা: 'অ্যাপ্লিকেশন.ওয়েট' ব্যবহার করে সমস্ত সমাধানের মধ্যে 1 সেকেন্ডের অসম্পূর্ণতা রয়েছে। বর্তমান দ্বিতীয়টি শুরু হওয়ার পর থেকে এই পদ্ধতিটি ইতিমধ্যে কেটে যাওয়া মিলিসেকেন্ডগুলি বিবেচনা করে না ... উদাহরণস্বরূপ, সময় সেকেন্ড পরিবর্তিত হওয়া অবধি যদি কেবল 1 মিলিসেকেন্ড বাকি থাকে তবে আপনি কেবল 1 মিলিসেকেন্ডের জন্য ঘুমাবেন। আপনি 1 সেকেন্ডের অপেক্ষা না করে কেবল 2 টি বৃত্তাকার সংখ্যা তুলনা করছেন!
সাইবারপঙ্ক

2

এখানে ঘুমের বিকল্প:

Sub TDelay(delay As Long)
Dim n As Long
For n = 1 To delay
DoEvents
Next n
End Sub

নিম্নলিখিত কোডগুলিতে আমি একটি স্পিন বোতামটিতে একটি "গ্লো" প্রভাব তৈরি করি যাতে তারা যদি তাদের "সমস্যা" হয় তবে এটি লুপে "স্লিপ 1000" ব্যবহারের ফলে লিংকে কোনও দৃশ্যমান ঝলকানি না ঘটায় তবে লুপটি দুর্দান্ত কাজ করছে।

Sub SpinFocus()
Dim i As Long
For i = 1 To 3   '3 blinks
Worksheets(2).Shapes("SpinGlow").ZOrder (msoBringToFront)
TDelay (10000)   'this makes the glow stay lit longer than not, looks nice.
Worksheets(2).Shapes("SpinGlow").ZOrder (msoSendBackward)
TDelay (100)
Next i
End Sub

1

আমি সমস্যার উত্তর দেওয়ার জন্য এটি তৈরি করেছিলাম:

Sub goTIMER(NumOfSeconds As Long) 'in (seconds) as:  call gotimer (1)  'seconds
  Application.Wait now + NumOfSeconds / 86400#
  'Application.Wait (Now + TimeValue("0:00:05"))  'other
  Application.EnableEvents = True       'EVENTS
End Sub

সতর্কতা: 'অ্যাপ্লিকেশন.ওয়েট' ব্যবহার করে সমস্ত সমাধানের মধ্যে 1 সেকেন্ডের অসম্পূর্ণতা রয়েছে। বর্তমান দ্বিতীয়টি শুরু হওয়ার পর থেকে এই পদ্ধতিটি ইতিমধ্যে কেটে যাওয়া মিলিসেকেন্ডগুলি বিবেচনা করে না ... উদাহরণস্বরূপ, সময় সেকেন্ড পরিবর্তিত হওয়া অবধি যদি কেবল 1 মিলিসেকেন্ড বাকি থাকে তবে আপনি কেবল 1 মিলিসেকেন্ডের জন্য ঘুমাবেন। আপনি 1 সেকেন্ডের অপেক্ষা না করে কেবল 2 টি বৃত্তাকার সংখ্যা তুলনা করছেন!
সাইবারপঙ্ক

1

আমি অ্যাপ্লিকেশন বিরতি দিতে সাধারণত টাইমার ফাংশন ব্যবহার করি । আপনার এই কোডটি .োকান

T0 = Timer
Do
    Delay = Timer - T0
Loop Until Delay >= 1 'Change this value to pause time for a certain amount of seconds

3
যদি Timerমধ্যরাত থেকে সেকেন্ডের সংখ্যা দেয় তবে মধ্যরাতের ঠিক আগে (যেমন, T0মধ্যরাত থেকে দেরি হওয়া সেকেন্ডের তুলনায় এটি কম ) কার্যকর করা হলে এই পন্থাটি ব্যর্থ হয় । মধ্যরাতে, Timerবিলম্ব সীমা পৌঁছানোর আগে 0 এ পুনরায় সেট করুন। Delayকখনও বিলম্বের সীমাতে পৌঁছে না, তাই লুপ চিরকালের জন্য চলে runs
21

যেহেতু টাইমার অ-পূর্ণসংখ্যক মান তৈরি করে, তাই আপনার ব্যবহার করা উচিত Loop Until Delay >= 1, বা আপনার ঝুঁকিটি 1 এর বেশি হবে এবং কখনও লুপটি প্রস্থান করবেন না।
জন পেল্টিয়র 21

1

অপেক্ষা করুন এবং ঘুম ফাংশনগুলি এক্সেলকে লক করে এবং বিলম্ব শেষ না হওয়া পর্যন্ত আপনি আর কিছুই করতে পারবেন না। অন্যদিকে লুপ বিলম্ব আপনাকে অপেক্ষা করার সঠিক সময় দেয় না।

সুতরাং, আমি উভয় ধারণার একটি সামান্য বিট যোগদান এই workaround করেছি। সময়টি আপনি চান না হওয়া অবধি লুপ হয়।

Private Sub Waste10Sec()
   target = (Now + TimeValue("0:00:10"))
   Do
       DoEvents 'keeps excel running other stuff
   Loop Until Now >= target
End Sub

যেখানে আপনার বিলম্ব দরকার সেখানে আপনাকে কেবল ওয়েস্ট 10 এসেকে কল করতে হবে



0

আপনি এখন অ্যাপ্লিকেশনটি অপেক্ষা করতে পারেন + এখনই সময়সীমা ("00:00:01") বা অ্যাপ্লিকেশন.উইট করুন + টাইমসিরিয়াল (0,0,1)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.