VBA में गोल्फिंग के लिए टिप्स


16

करने के लिए इसी तरह के इस , यह है, और यह सवाल ...

आपके पास गोल्फिंग के लिए क्या सामान्य सुझाव हैं VBA ? मैं उन विचारों की तलाश कर रहा हूं, जो सामान्य रूप से कम से कम कुछ विशिष्ट VBA(जैसे "टिप्पणियों को हटाएं" कोई उत्तर नहीं है) कोड गोल्फ समस्याओं को लागू किया जा सकता है । कृपया प्रति उत्तर एक टिप पोस्ट करें।

जब मैंने अन्य भाषाओं के साथ काम किया है, तो मैं सबसे मजबूत हूं VBAऔर मुझे VBAइस साइट पर कई गोल्फरों का उपयोग नहीं दिखता है ।


नीति के अनुसार सामुदायिक विकी में परिवर्तित।
dmckee --- पूर्व-संचालक बिल्ली का बच्चा

क्षमा करें कि मेरी ओर से स्वचालित नहीं था!
गफ्फी

कोई परेशानी नहीं। वास्तव में, उन्होंने सीडब्ल्यू को उपयोगकर्ताओं से दूर करने की शक्ति ले ली है (आप अभी भी उत्तर दे सकते हैं, मुझे लगता है)। आप मॉडरेटर के ध्यान के लिए झंडा लगा सकते हैं, लेकिन कोडगॉल्फ को जितनी कम गतिविधि मिलती है, उतनी शायद ही आवश्यक हो।
dmckee --- पूर्व-संचालक बिल्ली का बच्चा

2
VBA कुछ सिंटैक्स शॉर्टकट के साथ एक अपेक्षाकृत क्रिया भाषा है। यदि आप सर्वश्रेष्ठ स्कोर के लिए जा रहे हैं, तो VBA एक अच्छा विकल्प नहीं हो सकता है। यदि आप अपने कौशल को सुधारने की कोशिश कर रहे हैं, तो आपको अधिक शक्ति मिलेगी।
श्री लामा

2
@GigaWatt मेरे कौशल का सम्मान करना। वास्तव में विभिन्न चुनौतियों के साथ खेलने के बाद से, मैंने VBA के साथ काम करने के लिए पहले ही कुछ नई तरकीबें चुन ली हैं! मुझे VBA के साथ किसी भी वास्तविक कोड-गोल्फ चुनौतियों को जीतने की उम्मीद नहीं है , लेकिन यह अच्छा अभ्यास है। :-)
गफ्फी

जवाबों:


8

का शोषण करें ByRef डिफॉल्ट का

कभी-कभी इसका उपयोग करना संभव है SubFunction कुछ अतिरिक्त वर्णों को सहेजने के लिए कॉल ...

यह ( 87 वर्ण)

Sub a()
b = 0
Do Until b = 5
b = c(b)
Loop
End Sub
Function c(d)
c = d + 1
End Function

फिर से काम किया जा सकता है ( 73 वर्ण):

Sub a()
b = 0
Do Until b = 5
c b
Loop
End Sub
Sub c(d)
d = d + 1
End Sub

इस पर ध्यान नहीं जाएगा कि यह हमेशा के लिए लूप करेगा, हालांकि ऐसा प्रतीत होता है कि आप कभी भी bमूल्य को पुन: असाइन नहीं कर रहे हैं ।

ऊपर एक Functionकॉल का उपयोग नहीं करता है , लेकिन इसके बजाय ByRef("संदर्भ द्वारा") की कार्यक्षमता का शोषण करता हैSub । इसका मतलब यह है कि पास किया गया तर्क कॉलिंग फ़ंक्शन के रूप में एक ही चर है (जैसा कि ByVal, "वैल्यू" पास होने के विपरीत है , जो एक प्रति है)। पारित चर का कोई भी संशोधन कॉलिंग फ़ंक्शन पर वापस अनुवाद करेगा।

डिफ़ॉल्ट रूप से, सभी तर्कों को लेता है ByRef, इसलिए इसे परिभाषित करने के लिए वर्णों का उपयोग करने की कोई आवश्यकता नहीं है।

उपरोक्त उदाहरण आपके फ़ंक्शन के रिटर्न मूल्य के आधार पर आपके लिए पूरी तरह से अनुवाद नहीं कर सकता है। (यानी जो बीत चुका है, उससे अलग डेटा प्रकार लौटाता है), लेकिन यह आपके मूल चर को संशोधित करते हुए रिटर्न वैल्यू प्राप्त करने की संभावना के लिए भी अनुमति देता है।

उदाहरण के लिए:

Sub a()
b = 0
Debug.Print c(b) ' This will print 0, and b will equal 1.'
End Sub
Function c(d)
c = d
d = d + 1
End Function

7

VBA कोड को तत्काल विंडो में लिखें और चलाएँ

तत्काल विंडो किसी भी मान्य VBA निष्पादन योग्य कथन का मूल्यांकन करती है। जैसे ही आप कोड एडिटर में होंगे, तत्काल विंडो में एक बयान दर्ज करें। यह VBA कोड को जल्दी से कार्यान्वित करता है और यह कई अतिरिक्त वर्णों को सहेज सकता है क्योंकि:

  1. कथन की शुरुआत में प्रश्न चिह्न (?) लगाते हुए अपने कोड का परिणाम प्रदर्शित करने के लिए तत्काल विंडो बताता है।

यहाँ छवि विवरण दर्ज करें

  1. आपको अपने कोड में एक सब एंड एंड सब का उपयोग करने की आवश्यकता नहीं है।

यहाँ छवि विवरण दर्ज करें


पीपीसीजी के पोस्ट को टैग साथ उत्तर देने के लिए तत्काल विंडो में VBA कोड का उदाहरण दिया गया है : A के लिए Letter A

?Chr(88-23);

जोफान द्वारा उत्तर दिया गया


क्रेडिट छवियाँ: एक्सेल कैम्पस


1
हालांकि एक REPL वातावरण का उपयोग करता है? इसका मतलब है कि यह केवल एक झलकी है, कोई कार्यक्रम या समारोह नहीं है
शाम 4:27

मुझे लगता है कि जोड़ने के लिए एक और उदाहरण यह हो सकता है कि आप चर इनलाइन भी बना सकते हैं; उदा a="value":?aपहले मूल्य निर्धारित करता है a, फिर उसे प्रिंट करता है।
लालची

6

लूपिंग से पहले सशर्त जाँच

जब लूप्स के साथ संयोजन में उपयोग किया जाता है तो कुछ सशर्त जांच निरर्थक हैं। उदाहरण के लिए, एFor लूप प्रक्रिया नहीं करेगा यदि प्रारंभिक स्थिति चल रही स्थिति के दायरे से बाहर है।

दूसरे शब्दों में, यह ( 49 वर्ण):

If B > 0 Then
For C = A To A + B
'...
Next
End If

इसे इस ( 24 वर्णों) में बदला जा सकता है :

For C = A To A + B ' if B is 0 or less, then the code continues past Next, unabated.
'...
Next

नीचे में टिप्पणी गलत है। यदि बी = 0 है तो लूप दर्ज किया जाएगा। pastebin.com/97MBB7hq
QHarr

5

परिवर्तनीय घोषणा

VBA के अधिकांश मामलों में, आप बाहर निकल सकते हैं Option Explicit(अक्सर डिफ़ॉल्ट रूप से छोड़ा जा सकता है , वैसे भी) और छोड़ेंDim अपने कई वेरिएबल्स को ।

ऐसा करने में, यह ( 96 शुल्क ):

Option Explicit

Sub Test()
Dim S As String
Dim S2 As String
S = "Test"
S2 = S
MsgBox S2
End Sub

यह बन जाता है ( 46 वर्ण):

Sub Test()
S = "Test"
S2 = S
MsgBox S2
End Sub

यदि आपको कुछ वस्तुओं (उदाहरण के लिए, सरणियों) का उपयोग करने की आवश्यकता है, तो आपको अभी भी Dimउस चर की आवश्यकता हो सकती है ।


एक सेकंड रुको, आपने अपने प्रश्न का अपना उत्तर स्वीकार कर लिया। शांत नहीं, यार।
टेलर स्कॉट

1
@TaylorScott यह एक विकी पोस्ट है - कोई बिंदु नहीं है, और इस मामले में, एक भी सर्वश्रेष्ठ उत्तर नहीं है। :) मैं अपने सवालों की सूची में एक झंडा होने से बचने के लिए ~ 5 साल पहले जवाब स्वीकार करता हूं।
गफ्फि

1
@TaylorScott भी यदि आप अपना स्वयं का उत्तर स्वीकार करते हैं, तो आपको +15 या +2 नहीं मिलता है (स्वीकार करने के लिए)
caird coinheringaahing

5

Evaluate() तथा []

जैसा कि पहले बताया गया है, वर्ग कोष्ठक [A1]संकेतन का उपयोग करके हार्ड-कोडेड रेंज कॉल को कम किया जा सकता है। हालाँकि इसके कई और उपयोग हैं।

MSDN दस्तावेज़ीकरण के अनुसार , Application.Evaluate()विधि एक एकल तर्क लेती है, जो कि एक है Name, जैसा कि Microsoft Excel के नामकरण सम्मेलन द्वारा परिभाषित किया गया है।

एनबी के [string]लिए आशुलिपि है Evaluate("string")( ""स्ट्रिंग डेटैटाइप को दर्शाते हुए भाषण चिह्न पर ध्यान दें ), हालांकि कुछ महत्वपूर्ण अंतर हैं जो अंत में कवर किए गए हैं।

तो उपयोग के संदर्भ में इसका क्या मतलब है?

आवश्यक रूप से, [some cell formula here]एक एक्सेल वर्कशीट में एक सेल का प्रतिनिधित्व करता है, और आप इसमें बहुत अधिक कुछ भी डाल सकते हैं और इसमें से कुछ भी प्राप्त कर सकते हैं जो आप एक सामान्य सेल के साथ कर सकते हैं

क्या अंदर जाता है

सारांश में, उदाहरण के साथ

  • A1- शैली संदर्भ। सभी संदर्भों को पूर्ण संदर्भ माना जाता है।
    • [B7] उस सेल का संदर्भ देता है
    • जैसा कि संदर्भ निरपेक्ष हैं, ?[B7].Addressरिटर्न"B$7$"
  • रेंज आप संदर्भों के साथ रेंज, इंटरसेक्ट और यूनियन ऑपरेटर्स (क्रमशः, कोलोन, स्पेस और कॉमा) का उपयोग कर सकते हैं।
    • [A1:B5] के लिए एक सीमा संदर्भ देता है A1:B5(रेंज) के
    • [A1:B5 A3:D7] के लिए एक सीमा संदर्भ देता है A3:B5(Intersect) के
    • [A1:B5,C1:D5]A1:D5(तकनीकी रूप से A1:B5,C1:D5) (संघ) के लिए एक सीमा संदर्भ देता है
  • परिभाषित नाम
    • उपयोगकर्ता [myRange]को A1: G5 के संदर्भ में परिभाषित किया गया है
    • स्वचालित, टेबल नामों की तरह [Table1](संभवतः कोडगोल्फ के लिए कम उपयोगी)
    • कुछ भी आप [Formulas]> [Name Manager]मेनू में पा सकते हैं
  • सूत्र
    • बहुत उपयोगी है ; कोई भी सूत्र जो सेल में जा सकता है Evaluate()या अंदर जा सकता है[]
    • [SUM(1,A1:B5,myRange)]यहाँ myRange रेंज में मानों की अंकगणितीय राशि लौटाता है, एक वीबीए चर नहीं एक कार्यपुस्तिका नाम को संदर्भित करता है
    • [IF(A1=1,"true","false")](1 बाइट vba समतुल्य से कम Iif([A1]=1,"true","false"))
    • एरियर फॉर्मूले [CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]- सभी स्ट्रिंग्स को रेंज में जोड़ते हैं जिनकी लंबाई 2 से अधिक होती है
  • बाहरी संदर्भ
    • आप !किसी कार्यपुस्तिका में परिभाषित सेल या किसी नाम का उल्लेख करने के लिए ऑपरेटर का उपयोग कर सकते हैं
    • [[BOOK1]Sheet1!A1]BOOK1 में A1 के ['[MY WORKBOOK.XLSM]Sheet1!'A1]लिए या उसी में रेंज रेफरेंस देता हैMY WORKBOOK
    • 'उनके नाम के रिक्त स्थान वाली कार्यपुस्तिकाओं के लिए ध्यान दें , और डिफ़ॉल्ट नाम वाली कार्यपुस्तिकाओं के लिए विस्तार की कमी ( BOOK+n)
  • चार्ट ऑब्जेक्ट्स (MSDN लेख देखें)

NB मैंने इस जानकारी के लिए SO पर एक सवाल पूछा, इसलिए बेहतर स्पष्टीकरण के लिए वहां एक नज़र डालें

क्या निकलता है

जो अंदर जाता है, उसके समान, इसमें कुछ भी शामिल होता है जो एक वर्कशीट सेल वापस कर सकता है। ये मानक एक्सेल डेटा प्रकार (और उनके VBA समकक्ष) हैं:

  • तार्किक ( Boolean)
  • पाठ ( String)
  • संख्यात्मक ( Double)
  • त्रुटि ( Variant/Error) (ये गैर-ब्रेकिंग त्रुटियां हैं, यानी वे कोड निष्पादन को बंद नहीं करते हैं, ?[1/0]ठीक निष्पादित करते हैं)

लेकिन कुछ चीजें हैं जिन्हें लौटाया जा सकता है जो कोशिकाएं नहीं कर सकती हैं:

  • रेंज संदर्भ ( Range) (ऊपर अनुभाग देखें)
  • सरणियाँ ( Variant())

Arrays

जैसा कि दिखाया गया है, []का उपयोग सरणी सूत्रों के मूल्यांकन के लिए किया जा सकता है जो मानक एक्सेल डेटा प्रकारों में से एक को लौटाते हैं; उदा [CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]जो लौटता है Text। हालांकि प्रकार के Evaluateसरणियों को भी वापस कर सकते हैं Variant। ये हो सकते हैं

हार्ड कोडित:

[{1,2;3,4}]- एक 2D सरणी आउटपुट: ,स्तंभ विभाजक है, ;पंक्तियों को अलग करता है। एक 1D सरणी उत्पादन कर सकते हैं

सरणी सूत्र:

[ROW(A1:A5)]- एक 2 डी सरणी आउटपुट {1,2,3,4,5}, यानी (2,1) दूसरा आइटम है (फिर भी कुछ फ़ंक्शन आउटपुट 1 डी सरणियाँ)

  • जो भी कारण के लिए, कुछ फ़ंक्शन डिफ़ॉल्ट रूप से एरेज़ वापस नहीं करते हैं

[LEN(A1:A5)] केवल श्रेणी के 1 सेल में पाठ की लंबाई को आउटपुट करता है

  • हालाँकि इन्हें एरेज़ देने के लिए बाध्य किया जा सकता है

Split([CONCAT(" "&LEN(A1:A5))]) 1D सरणी 0 से 5 देता है, जहां पहला आइटम खाली है

[INDEX(LEN(A1:A5),)]एक और वर्कअराउंड है, अनिवार्य रूप से आपको अपने सरणी RAND()वर्कशीट को अस्थिर बनाने के लिए अर्थहीन जोड़ने के समान वांछित सरणी रिटर्निंग व्यवहार प्राप्त करने के लिए एक सरणी हैंडलिंग फ़ंक्शन को नियोजित करना चाहिए ।

  • मैंने SO पर एक प्रश्न पूछा, इस पर कुछ बेहतर जानकारी प्राप्त करने का प्रयास करने के लिए कृपया बेहतर विकल्प के साथ संपादित करें / टिप्पणी करें यदि आप उन्हें ढूंढते हैं

Evaluate() बनाम []

के बीच कुछ अंतर हैं Evaluate()और []जागरूक होना है

  1. स्ट्रिंग्स बनाम हार्डकोड
    • शायद सबसे महत्वपूर्ण अंतर, मूल्यांकन एक स्ट्रिंग इनपुट लेता है जहां [] हार्डकोड इनपुट की आवश्यकता होती है
    • इसका मतलब यह है अपने कोड चर के साथ स्ट्रिंग जैसे का निर्माण कर सकते हैं Evaluate("SUM(B1,1,"&v &",2)")योग हैं [B1], 1, 2और चरv
  2. Arrays

    एक ऐरे लौटते समय, केवल एरे इंडेक्स के साथ मूल्यांकन का उपयोग किया जा सकता है, इसलिए

    v=Evaluate("ROW(A1:A5)")(1,1) ''#29 bytes

    के बराबर है

    i=[ROW(A1:A5)]:v=i(1,1) ''#23 bytes

मैमथ पोस्ट के लिए क्षमा करें, अगर किसी को लगता है कि वे क्षेत्रों को अधिक संक्षिप्त बना सकते हैं / यदि आपके पास जोड़ने के लिए युक्तियां हैं, तो स्वतंत्र महसूस करें। हालाँकि, मैंने इस पर कुछ शोध किया, लेकिन VBA में प्रयोग के माध्यम से एक उचित भाग पाया गया, इसलिए यदि आपको लगता है कि गलतियाँ हैं, तो कुछ गायब है, उसके अनुसार टिप्पणी / संपादित करने में संकोच न करें!
Greedo

1
वास्तव में सरणियों पर अंतिम खंड थोड़ा बंद है - इसका उपयोग तत्काल विंडो में किया जा सकता हैi=[ROW(A1:A5)]:v=i(2,1):?v
टेलर स्कॉट

@TaylorScott तो आप कर सकते हैं, मैं पूरी तरह से अनजान था कि आप उन वेरिएबल्स में वैल्यूज़ सेट / होल्ड कर सकते हैं जो पहले से परिभाषित नहीं थे, लेकिन मुझे लगता है कि मैं अभी भी तत्काल विंडो 1-लाइनर्स के साथ पकड़ में आ रहा हूँ। तदनुसार अद्यतन किया है
Greedo

क्या यह मैच के साथ काम करता है? मैंने कोशिश की, लेकिन यह हमेशा त्रुटियों को लौटाता है। मैं एक श्रेणी के बजाय एक सरणी से गुजर रहा था, हालांकि।
seadoggie01

5

Nextकथन सम्मिलित करें

Next:Next:Next

नीचे संक्षेपण किया जा सकता है

Next k,j,i

जहां के लिए iterators Forलूप बने हैं i, jऔर k- इसी क्रम में।

उदाहरण के लिए नीचे (69 बाइट्स)

For i=0To[A1]
For j=0To[B1]
For k=0To[C1]
Debug.?i;j;k
Next
Next
Next

65 बाइट्स तक घनीभूत हो सकते हैं

For i=0To[A1]
For j=0To[B1]
For k=0To[C1]
Debug.?i;j;k
Next k,j,i

और जहां तक ​​यह प्रभाव स्वरूपण और इंडेंटेशन को प्रभावित करता है, मुझे लगता है कि इसे संभालने के लिए सबसे अच्छा दृष्टिकोण बयान के लिए बाहरी के साथ अगले बयान को संरेखित करना है। उदाहरण के लिए।

For i=0To[A1]
    For j=0To[B1]
        For k=0To[C1]
            Debug.?i;j;k
Next k,j,i

4

Ifकथन को कम करना

सशर्त If ... Then ... Elseजांच का उपयोग करके एक चर असाइन करते समय , आप End Ifएक लाइन पर पूरे चेक को डालकर समाप्त किए गए कोड की मात्रा को कम कर सकते हैं ।

उदाहरण के लिए, यह ( 37 वर्ण):

If a < b Then
c = b
Else
c = a
End If

इसे कम किया जा सकता है ( 30 वर्ण)

If a < b Then c = b Else c = a

यदि आपके पास एक से अधिक नेस्टेड सशर्त हैं, तो आप उन्हें इस तरह से भी कम कर सकते हैं:

If a Then If b Then If c Then Z:If d Then Y:If e Then X Else W Else V:If f Then U 'Look ma! No "End If"!

नोट :आपको एक से अधिक लाइन / कमांड जोड़ने की अनुमति देता हैIf ब्लॉक के ।

इस तरह के सरल मामलों में, आप आमतौर पर चेक ( 25 वर्ण) Elseसे पहले चर को सेट करके भी निकाल सकते हैं :If

c = a
If a < b Then c = b

इससे भी बेहतर, IIf()फ़ंक्शन ( 20 वर्ण) का उपयोग करके उपरोक्त को और कम किया जा सकता है :

c = IIf(a < b, b, a)

3

कम करें Range("A1")और लाइक करें कॉल

Range("A1").Value(17 बाइट्स) और सरल Range("A1")(11 बाइट्स) नीचे [A1](4 बाइट्स) घटाए जा सकते हैं


2
या सामान्य तौर पर, वीबीए में []बदलने का उपयोग Evaluate()सिर्फ रेंज कॉल की तुलना में बहुत अधिक बहुमुखी है। जैसे आप इसका उपयोग WorksheetFunction.FuncName(args)सिर्फ [FuncName(args)], जैसे कि ?[SUMPRODUCT({1,3,5},{2,7,-1})]या बहुत उपयोगी [MIN(1,2,3)]/[MAX(1,2,3)]
लालची

लालच, यह एक अविश्वसनीय रूप से महत्वपूर्ण कार्यशीलता है जिसके बारे में मुझे पता नहीं था कि आपको इसे स्वयं के उत्तर के रूप में जोड़ना चाहिए।
टेलर स्कॉट

1
निश्चित बात है, मैं जल्द ही कुछ लिखूंगा। हाँ Evaluate("str")या आशुलिपि [str]VBA में बहुत शक्तिशाली है, मुझे हाल ही में पता चला है, और मुझे लगता है कि यह गोल्फ के लिए भी उपयोगी होगा!
लालचो

बहुत उपयोगी, पर्याप्त है कि मैं अपने उत्तरों के माध्यम से वापस जा रहा हूं, यह देखने के लिए कि क्या मैं इसके कारण अपने बाईटेकाउंट को छोड़ सकता हूं
टेलर स्कॉट

3

रिक्त स्थान निकालें

VBA बहुत सी रिक्ति जोड़ने के लिए ऑटो-प्रारूप करेगा कि इसकी वास्तव में आवश्यकता नहीं है। मेटा पर एक उत्तर है जो मुझे बहुत समझ में आता है कि हम ऑटो-फ़ॉर्मेटिंग द्वारा जोड़े गए बाइट्स को छूट क्यों दे सकते हैं। यह सत्यापित करना हमेशा महत्वपूर्ण है कि आपने बहुत अधिक नहीं हटाया है, हालाँकि। एक उदाहरण के लिए, यहाँ मेरा एक जवाब है जो रिक्त स्थान को हटाकर लगभग 22% घटाया गया था:

मूल संस्करण: (188 बाइट्स)

Sub g(n)
For i = 0 To 1
For x = -3 To 3 Step 0.05
y = n ^ x * Cos(Atn(1) * 4 * x)
If y < m Then m = y
If i = 1 Then Cells(500 * (1 - y / m) + 1, (x + 3) * 100 + 1) = "#"
Next
Next
End Sub

कम संस्करण: (146 बाइट्स)

Sub g(n)
For i=0To 1
For x=-3To 3Step 0.05
y=n^x*Cos(Atn(1)*4*x)
If y<m Then m=y
If i=1Then Cells(500*(1-y/m)+1,(x+3)*100+1)="#"
Next
Next
End Sub

यदि आप कम किए गए संस्करण को VBA में कॉपी / पेस्ट करते हैं, तो यह स्वतः ही मूल में विस्तारित हो जाएगा। आप रिक्त स्थान को हटाने के लिए मान्य है, जहां आप इसके साथ खेल सकते हैं। जिन लोगों को मैंने अब तक पाया है, वे सभी उस पैटर्न का पालन करते हैं जहां VBA एक निश्चित कमांड के रूप में दिखाई देता है क्योंकि इसके बिना, यह मान्य कोड नहीं है। यहाँ कुछ हैं जो मुझे अब तक मिले हैं:

  • किसी भी गणितीय ऑपरेशन से पहले और बाद में: +-=/*^ आदि।
  • पहले Toऔर Stepएक Forबयान में:For x=-3To 3Step 0.05
  • वास्तव में, किसी भी आरक्षित शब्द से पहले ( To, &, Then, आदि) यह एक संख्या के रूप में एक शाब्दिक इस तरह से पहले है, तो ), ?, %, आदि
  • &तार के संयोजन के बाद :Cells(1,1)=Int(t)&Format(t,":hh:mm:ss")
  • फ़ंक्शन कॉल के बाद: If s=StrReverse(s)Then
  • फ़ंक्शन कॉल के भीतर: Replace(Space(28)," ",0)

ऑटो-फ़ॉर्मेटिंग के माध्यम से अतिरिक्त गैर-अंतरिक्ष वर्णों पर क्या नियम है। ?बनाम जैसा कुछ Printमैं देख रहा हूं वह स्वीकार्य है, लेकिन एक प्रकार के ऐलान के &तुरंत बाद टाइप डिक्लेरेशन पर रखा जाता Debug.?a&"z"है Debug.Print a&; "z";यह अभी भी अनुमति दी है - चरित्र जोड़ा आवश्यक चलाने के लिए कोड के लिए है?
गिडो

2
@Greedo मैं इसे जिस तरह से मेटा उत्तर में वर्णित किया गया है उसे देखता हूं : यदि आप इसे संपादक में कॉपी / पेस्ट कर सकते हैं और कोड चलेगा, तो यह ठीक है। IE, यदि VBA कोड डालने पर स्वचालित रूप से वर्ण वापस जोड़ता है, तो यह ठीक है।
इंजीनियर टोस्ट

1
@EngineerToast आप वास्तव में अपने उदाहरण के बंद एक और बाइट ड्रॉप कर सकते हैं: If i=1 Then हो सकता है If i=1Then , क्योंकि एक सामान्य नियम के एक आरक्षित शब्द है कि एक शाब्दिक इस प्रकार है, हो सकता है कि एक नंबर, ), ?, %, .. आदि, एक के द्वारा अलग किए जाने की जरूरत नहीं है अंतरिक्ष
टेलर स्कॉट

1
@EngineerToast, आप अपनी तीसरी बुलेट बिंदु से एक बाइट को भी गिरा सकते हैं क्योंकि आप एक )(या किसी अन्य गैर-नंबर शाब्दिक) और&
टेलर स्कॉट

3

पिक्सेल आर्ट के लिए तैयार करें

पिक्सेल कला एक्सेल के सबसे मजबूत क्षेत्रों में से एक है, क्योंकि कैनवास बनाने की कोई आवश्यकता नहीं है, क्योंकि यह पहले से ही आपके लिए है - आपको बस कुछ छोटे समायोजन करने की आवश्यकता है

1) कोशिकाओं को चौकोर बनाओ

Cells.RowHeight=48

या, वैकल्पिक रूप से, 1 बाइट अधिक के लिए, लेकिन साथ काम करना आसान है

Cells.ColumnWidth=2

2) आवश्यक रेंज रंग

कोई भी Rangeवस्तु कॉल करके रंगीन हो सकती है

`MyRangeObj`.Interior.Color=`ColorValue`

नोट: इसे इस विकी पर उल्लिखित अन्य ट्रिक्स के साथ जोड़ा जा सकता है, जैसे कि या किसी के उपयोग पर []अंकन (जैसे [A1:R5,D6]) के उपयोग से संदर्भित रेंजCells(r,c)Range(cellAddress) कॉल । इसके अलावा, जैसा कि इस विकी पर उल्लेख किया गया है, यह रंग संदर्भों के आकार को नीचे करने के लिए नकारात्मक रंग मान के साथ जोड़ा जा सकता है

त्वरित संदर्भ

रेंज संदर्भ

सेल A1को निम्नलिखित में से किसी भी तरीके से संदर्भित किया जा सकता है

Range("A1")
Cells(1,1)
[A1]

और रेंज A1:D4को निम्नलिखित में से किसी भी तरीके से संदर्भित किया जा सकता है

Range("A1:D4")
Range("A1").Resize(4,4)
Cells(1,1).Resize(4,4)
[A1].Resize(4,4,)
[A1:D4]

रंग संदर्भ

Black  0
White  -1
Red    255
Aqua   -256

3

अंतर्निहित कार्यों को सरल बनाएं

अक्सर कुछ फ़ंक्शन का उपयोग करते समय, उन्हें उपयोगकर्ता-निर्धारित फ़ंक्शन में पुनः असाइन करें।

निम्न कोड ( 127 वर्ण) को निम्न से घटाया जा सकता है:

Sub q()
w = 0
x = 1
y = 2
z = 3
a = Format(w, "0.0%")
b = Format(x, "0.0%")
c = Format(y, "0.0%")
d = Format(z, "0.0%")
End Sub

को ( 124 वर्ण):

Sub q()
w = 0
x = 1
y = 2
z = 3
a = f(w)
b = f(x)
c = f(y)
d = f(z)
End Sub
Function f(g)
f = Format(g, "0.0%")
End Function

इसे ByRef ट्रिक के साथ मिलाकर , आप और भी अधिक अक्षर ( 114 से नीचे ) बचा सकते हैं :

Sub q()
w = 0
x = 1
y = 2
z = 3
a = f(w)
b = f(x)
c = f(y)
d = f(z)
End Sub
Sub f(g)
g = Format(g, "0.0%")
End Sub

इसे विवेकपूर्ण तरीके से करें, क्योंकि VBA को परिभाषित करने के लिए बहुत सारे अक्षर लगते हैं Function। दूसरा कोड ब्लॉक वास्तव में किसी भी संख्या में कम Format()कॉल के साथ पहले की तुलना में बड़ा होगा ।


2
पिछले एक में, आपको असाइनमेंट कॉल की आवश्यकता नहीं है, जिसका अर्थ है कि a = f(w)कम किया जा सकता हैf w
टेलर स्कॉट

3

STDIN और STDOUT

इनपुट चर के माध्यम से Subदिनचर्या और Functionएस के लिए इनपुट

Public Sub A(ByRef B as String)

को कम किया जा सकता है

Sub a(b$) 

PublicऔरByRef कॉल VBA और इस प्रकार निहित के लिए डिफ़ॉल्ट हैं, और (लगभग) हमेशा गिरा दिया जा सकता है।

प्रकार शाब्दिक $बलों bप्रकार की होनी चाहिएString

अन्य प्रकार के शाब्दिक

  • ! एक
  • @ मुद्रा
  • # दोहरा
  • % पूर्णांक
  • $ तार
  • & लंबा
  • ^ LongLong (केवल 64 बिट)

इसके अलावा, यह आमतौर पर स्वीकार किया जाता है कि आप इनपुट चर को डिफ़ॉल्ट प्रकार के रूप में छोड़ सकते हैं, Variantऔर किसी भी प्रकार-आधारित त्रुटियों को अनसुना कर सकते हैं। उदाहरण के लिए। Sub E(F)जिसमें Fप्रकार के होने की उम्मीद है Boolean[](जो इस तरह दिनचर्या में पारित हो जाएगा E Array(True, False, False))

Subरूटीन और तत्काल विंडो फ़ंक्शंस के माध्यम से इनपुट करनाCells

VBA में पूरी तरह से कार्यात्मक कंसोल नहीं है और इस प्रकार इसके पास कोई आधिकारिक STDIN नहीं है , और इस प्रकार कुछ के लिए अनुमति देता है पासिंग इनपुट के साथ खेलने की ।

एक्सेल में, आम तौर पर सेल या रेंज की कोशिकाओं से इनपुट लेना स्वीकार किया जाता है, जिसे पसंद किया जा सकता है

s=[A1]

जिसका तात्पर्य .valueसेल से है [A1](जिसे भी संदर्भित किया जा सकता है cells(1,1)या)range("A1")

उदाहरण समस्या: संदेश बॉक्स में इनपुट प्रदर्शित करें

वाया सबरूटीन Sub A:msgbox[A1]:End Sub

विंडो फ़ंक्शन को तत्काल रद्द करता है msgbox[A1]

इनपुट वाया सशर्त संकलन तर्क

VBA प्रोजेक्ट्स कमांड लाइन से या VBAProject Properties के माध्यम से तर्क लेने का समर्थन करते हैं (प्रोजेक्ट एक्सप्लोरर के माध्यम से देखें -> [आपका VBA प्रोजेक्ट] - (राइट क्लिक) -> VBAProject Properties -> सशर्त संकलन तर्क

यह काफी हद तक उपयोगी है Error Code Challenges के

सशर्त संकलन तर्क को देखते हुए n=[some_value] यह कोड को निष्पादित करने की अनुमति देता है जो एक त्रुटि कोड का उत्पादन करेगा, जिसके मूल्य के आधार पर n। ध्यान दें, यह n=VBAProject Properties फलक के सशर्त संकलन तर्क अनुभाग में आपके कोड के लिए 2 बाइट्स के अतिरिक्त के लिए कहता है ।

उदाहरण कोड

...
#If n=3 then
return ''  Produces error code '3', Return without GoSub
#ElseIf n=20 then
resume ''  Produces error code '20', Resume without Error
#EndIf
...

आउटपुट वाया फंक्शन वैल्यू

यहां कहने के लिए बहुत कुछ नहीं है, नीचे उद्धृत का सामान्य रूप लगभग कॉम्पैक्ट है जैसा कि इसे बनाया जा सकता है।

Public Function A(b)
    ...
    A=C
End Function

ध्यान दें: अधिकांश मामलों में यह अधिक बाइट है जो विधि को सबरूटीन में बदल देता है और VBE को आउटपुट तुरंत विंडो (नीचे देखें) करता है।

VBE इमीडिएट विंडो के माध्यम से Subदिनचर्या और Functions से आउटपुट

VBE के लिए आउटपुट तुरंत विंडो (AKA VBE डीबग विंडो) पाठ आधारित चुनौतियों के लिए VBA के लिए एक सामान्य आउटपुट विधि है, हालांकि, यह याद रखना महत्वपूर्ण है कि Debug.Print "Text"कॉल काफी गोल्फ हो सकता है।

Debug.Print "Text"

कार्यात्मक रूप से समान है

Debug.?"Text"

के रूप में ?करने के लिए autoformats Print

Subअन्य तरीकों के माध्यम से दिनचर्या और VBE तत्काल विंडो कार्यों से आउटपुट

पर दुर्लभ अवसर है, जब स्थिति सिर्फ सही है, तो आप इनपुट अधिक तुच्छ VBA के लिए उपलब्ध आदानों में से कुछ से इस तरह के फ़ॉन्ट आकार समायोजक, फ़ॉन्ट चयनकर्ता के रूप में लेते हैं, और ज़ूम कर सकते हैं। (उदा। शब्द फ़ॉन्ट आकार चयनकर्ता का अनुकरण करना )


2

प्रारूपण पर त्वरित ध्यान दें

क्योंकि StackExchange Markdown और Prettify.js का उपयोग करता है यह आपके कोडिंग जवाब है, जो आम तौर पर उन्हें अधिक पेशेवर दिखाई देना एक भाषा ध्वज जोड़ना संभव है। हालांकि मैं यह गारंटी नहीं दे सकता कि यह आपको VBA में गोल्फिंग में बेहतर बनाएगा, मैं गारंटी दे सकता हूं कि यह आपको वैसा ही दिखाएगा जैसा आप हैं।

नीचे के किसी भी झंडे को जोड़ने से रूपांतरण होगा

Public Sub a(ByRef b As Integer) ' this is a comment

सेवा

Public Sub a(ByRef b As Integer) ' this is a comment

VBA भाषा टैग

<!-- language: lang-vb -->

<!-- language-all: lang-vb -->

नोट: उत्तरार्द्ध आपके उत्तर में सभी कोड खंडों को बदल देता है, जबकि पूर्व केवल निम्नलिखित कोड खंडों को बदल देता है


lang-vbएह? - अजीब है कि उस प्रारूप lang-vbavba जवाब के लिए की तुलना में बेहतर है।
लालची

1
@Greedo, क्योंकि lang-vbaहाइलाइटिंग प्रदान करेगा, इसका वास्तव में सिर्फ डिफ़ॉल्ट हाइलाइटिंग है। जाहिरा तौर पर VBA को Prettify.js में वास्तव में लागू नहीं किया गया है, इसलिए हमें वीबी हाइलाइटिंग के साथ रहना होगा
टेलर स्कॉट

2

कई If .. Thenजाँचें

अन्य भाषाओं की तरह, एकाधिक Ifचेक को आम तौर पर एक एकल लाइन में जोड़ा जा सकता है, जो And/ Or(यानी &&/ ||सी और अन्य में) के उपयोग की अनुमति देता है , जो VBA में ए Thenऔर ए दोनों की जगह लेता है End If

उदाहरण के लिए, नेस्टेड सशर्त ( 93 वर्ण) के साथ:

'There are MUCH easier ways to do this check (i.e. a = d).
'This is just for the sake of example.
If a = b Then
    If b = c Then
        If c = d Then
            MsgBox "a is equal to d"
        End If
    End If
End If

बन सकते हैं ( 69 वर्ण):

If a = b And b = c And c = d Then
    MsgBox "a is equal to d"
End If

यह नॉन-नेस्टेड कंडीशन के साथ भी काम करता है।

विचार करें ( 84 वर्ण):

If a = b Then            
    d = 0
End If

If c = b Then            
    d = 0
End If

यह बन सकता है ( 51 वर्ण):

If a = b Or c = b Then            
    d = 0
End If

1
यदि में - तो "अंत - यदि" भाग वैकल्पिक है, बशर्ते आप सिंगल लाइन में कोड लिखें।
स्टुपिड_इंटरनेट

@newguy सही। इस अन्य उत्तर को भी देखें: codegolf.stackexchange.com/a/5788/3862
Gaffi

उपर्युक्त कथन को और भी संक्षेपित किया जा सकता हैd=iif(a=b or c=b,0,d)
टेलर स्कॉट

2

समापन Forछोरों को

उपयोग करते समय Forछोरों , एNext लाइन को एक चर नाम की आवश्यकता नहीं होती है (हालांकि यह सामान्य कोडिंग में उपयोग करना बेहतर होता है)।

इसलिए,

For Variable = 1 to 100
    'Do stuff
Next Variable

इसे छोटा किया जा सकता है:

For Variable = 1 to 100
    'Do stuff
Next

(बचत आपके परिवर्तनशील नाम पर निर्भर करती है, हालाँकि यदि आप गोल्फ कर रहे हैं, तो शायद यह सिर्फ 1 वर्ण + 1 स्थान है।)


1
2 वर्ण, अंतरिक्ष की गिनती करने के लिए मत भूलना!
11684

मैं लगभग कभी नहीं चर की पहचान, सामान्य कोड में भी होता है!
dnep

2

एक चरित्र सरणी में एक स्ट्रिंग विभाजित करें

कभी-कभी व्यक्तिगत पात्रों में एक स्ट्रिंग को तोड़ने के लिए यह उपयोगी हो सकता है, लेकिन वीबीए में मैन्युअल रूप से ऐसा करने के लिए यह थोड़ा सा कोड ले सकता है।

ReDim a(1 To Len(s))
' ReDim because Dim can't accept non-Const values (Len(s))
For i = 1 To Len(s)
    a(i) = Mid(s, i, 1)
Next

इसके बजाय, आप एक ही लाइन का उपयोग कर सकते हैं, काम पाने के लिए अपेक्षाकृत कम से कम श्रृंखला के कार्य:

a = Split(StrConv(s, 64), Chr(0))

यह आपके स्ट्रिंग sको Variantसरणी में निर्दिष्ट करेगा a। हालांकि, सावधान रहें, क्योंकि सरणी में अंतिम आइटम एक खाली स्ट्रिंग ( "") होगा, जिसे उचित रूप से नियंत्रित करने की आवश्यकता होगी।

यहां बताया गया है कि यह कैसे काम करता है: StrConvफ़ंक्शन Stringआपके द्वारा निर्दिष्ट किसी अन्य प्रारूप में कनवर्ट करता है । इस मामले में, 64 = vbUnicode, इसलिए यह एक यूनिकोड प्रारूप में परिवर्तित हो जाता है। जब सरल ASCII तारों से निपटते हैं, तो परिणाम एक अशक्त चरित्र होता है (खाली स्ट्रिंग नहीं,)"" प्रत्येक वर्ण के बाद डाला गया ) है।

इसके बाद Split, परिणाम Stringको एक वर्ण में बदल देंगे , अशक्त वर्ण का उपयोग करते हुएChr(0) रूप ।

यह ध्यान रखना महत्वपूर्ण है कि Chr(0)खाली स्ट्रिंग के समान नहीं है "", और उपयोग करने Splitपर ""वह सरणी वापस नहीं मिलेगी जिसकी आप उम्मीद कर सकते हैं। यह भी सच है vbNullString(लेकिन अगर आप गोल्फ कर रहे हैं, तो आप पहली जगह में इस तरह की क्रिया स्थिरांक का उपयोग क्यों करेंगे?)।


आपको यह उल्लेख करना चाहिए कि परिणामस्वरूप सरणी में अंत में एक अतिरिक्त खाली स्ट्रिंग है।
हावर्ड

@ हॉवर्ड हाँ, मुझे करना चाहिए। जब मैं इसे टाइप कर रहा था तो यह मेरे दिमाग में था, मेरे दिमाग में फिसल गया होगा।
गफ्फी

2

उपयोग करना With(कभी-कभी! फुटनोट देखें)

का उपयोग करते हुए Withयदि आप कुछ वस्तुओं का बार-बार उपयोग कथन आपके कोड आकार को काफी कम कर सकता है।

अर्थात यह ( 80 वर्ण):

x = foo.bar.object.a.value
y = foo.bar.object.b.value
z = foo.bar.object.c.value

के रूप में कोडित किया जा सकता है ( 79 वर्ण):

With foo.bar.object
    x = .a.value
    y = .b.value
    z = .c.value
End With

ऊपर भी सबसे अच्छा मामला नहीं है। यदि एक्सेस के भीतर से Applicationजैसे कुछ भी उपयोग किया जाता Excel.Applicationहै, तो सुधार बहुत अधिक महत्वपूर्ण होगा।


* स्थिति के आधार पर, Withइस ( 64 वर्ण) से अधिक कुशल हो सकता है या नहीं :

Set i = foo.bar.object
x = i.a.value
y = i.b.value
z = i.c.value

2

अनंत लूप्स

किदर जरा है

Do While a<b
'...
Loop

या

Do Until a=b
'...
Loop

पुष्ट लेकिन कम बाइट गिनती के साथ

While a<b
'...
Wend

यदि आपको समय से पहले Subया बाहर निकलने की आवश्यकता है Function, तो इसके बजायExit ...

For i=1To 1000
    If i=50 Then Exit Sub
Next

विचार करें End

For i=1To 1E3
    If i=50 Then End
Next

ध्यान दें कि Endसभी कोड निष्पादन को रोक देता है और किसी भी वैश्विक चर को हटा देता है, इसलिए बुद्धिमानी से उपयोग करें


आपको अंतिम खंड ( Forऔर End) को फिर से लिखने के लिए विचार करना चाहिए कि मामला 100कभी भी पूरा नहीं होगा और एक आवश्यक बाइट जोड़ता है
टेलर स्कॉट

इसके अलावा, जब यह बहुत सुपाठ्य है, तो आप इन तरीकों के संभावित लाभों को बेहतर दिखाने के लिए व्हाट्सएप को हटाने पर विचार कर सकते हैं (कोडोगोफ़िंग के लिए वीबीए में ऑटोफ़ॉर्मेटिंग का दुरुपयोग करना हमेशा अच्छा होता है)
टेलर स्कॉट

2

का प्रयोग करें Spc(n)अधिक Space(n), [Rept(" ",n)]याString(n," ")

लंबाई के कई स्थानों को सम्मिलित करने का प्रयास करते समय n, उपयोग करें

Spc(n)              ''  6  bytes

ऊपर

B1=n:[Rept(" ",B1)] ''  19 bytes
String(n," ")       ''  13 bytes
Space(n)            ''  8  bytes

नोट: मुझे यकीन नहीं है कि क्यों, लेकिन ऐसा लगता है कि आप Spc(n)एक चर के आउटपुट को असाइन नहीं कर सकते हैं , और यह कि इसे सीधे मुद्रित किया जाना चाहिए - इसलिए कुछ मामलों Space(n)में अभी भी सबसे अच्छा तरीका है।


2

कम करें Debug.Printऔर Printकॉल करें

Debug.Print [some value] 

(12 बाइट्स; ट्रेलिंग स्पेस पर ध्यान दें) को कम किया जा सकता है

Debug.?[some value]

(7 बाइट्स; ट्रेलिंग स्पेस की कमी पर ध्यान दें)।

इसी तरह,

Print 

(6 बाइट्स) को कम किया जा सकता है

?

(1 बाइट)।

इसके अलावा, जब एक अनाम VBE तत्काल विंडो फ़ंक्शन के संदर्भ में काम करते हैं तो Debugस्टेटमेंट को पूरी तरह से गिरा दिया जा सकता है, और इसके बजाय VBE तत्काल विंडो पर प्रिंट करके ?STDIN / STDOUT माना जा सकता है

विशेष वर्ण

स्ट्रिंग्स को प्रिंट करते समय आप इसके स्थान पर विशेष अक्षरों का उपयोग भी कर सकते हैं & । ये मुद्रित या व्हाट्सएप हटाने में वैकल्पिक स्वरूपों के लिए अनुमति देते हैं

इसके बजाय परिवर्तनशील स्ट्रिंग में शामिल होने के लिए

Debug.Print s1 &s2

आप अर्धविराम का उपयोग कर सकते हैं ;

Debug.?s1;s2

यह अर्धविराम लगातार तारों के लिए डिफ़ॉल्ट व्यवहार है, जब तक कि कोई अस्पष्टता न हो इसलिए ये मान्य हैं:

Debug.?s1"a"
Debug.?"a"s1

लेकिन नहीं

Debug.?s1s2 'as this could be interpreted as a variable named "s1s2", not 2 variables
            'use Debug.?s1 s2 instead (or s1;s2)
Debug.?"a""b" 'this prints a"b, so insert a space or ; for ab

ध्यान दें कि ए; एक पंक्ति के अंत में एक नई पंक्ति को दबा दिया जाता है, क्योंकि हर प्रिंट के बाद नई संख्या डिफ़ॉल्ट रूप से जोड़ दी जाती है। VBA कोड द्वारा लौटे बाइट्स की गिनती है बहस के तहत हो रही है

टैब के साथ जुड़ने के लिए कॉमा का उपयोग करें ,(वास्तव में 14 रिक्त स्थान, लेकिन उसके अनुसार)

Debug.?s1,s2 'returns "s1              s2"

अंत में, आप स्ट्रिंग के साथ जुड़ने के लिए प्रकार की घोषणाओं का उपयोग कर सकते हैं; प्रत्येक, स्वरूपण पर इसका अपना मामूली प्रभाव है। नीचे के सभी के a = 3.14159लिए पहली पंक्ति है

Debug.?a&"is pi" -> " 3 is pi" 'dims a as long, adds leading and trailing space to a
Debug.?a!"is pi" -> " 3.14159 is pi" 'dims a as single, adds leading and trailing space
Debug.?a$"is pi" -> "3.14159is pi" 'dims a as string, no spaces added

2

के लिए एक सहायक Subका उपयोग करेंPrint

यदि कोड को छह से अधिक Debug.? कथनों का उपयोग करने की आवश्यकता है तो आप सभी डिबग को बदलकर बाइट्स कम कर सकते हैं? नीचे की तरह एक उप की कॉल के साथ लाइनें। एक रिक्त लाइन को प्रिंट करने के लिए आपको p ""एक पैरामीटर की आवश्यकता होती है।

Sub p(m)
Debug.?m
End Sub

1
इसके साथ एक नई लाइन को प्रिंट करने के लिए आपको केवल आवश्यकता होगी p""या यदि यह अनधिकृत हो सकता है, तो p"। हालांकि, अधिकांश मामलों में जहां यह लागू हो सकता है, यह एक स्ट्रिंग चर का उपयोग करने के लिए अधिक समझ में आता है और केवल अंत में स्ट्रिंग चर प्रिंट करता है।
टेलर स्कॉट

1

या के Array() Choose()बजाय का उपयोग करेंSelectIf...Then

जब एक चर को दूसरे चर के मूल्य के आधार पर असाइन किया जाता है If...Then, तो चेक के साथ चरणों को लिखना समझ में आता है , जैसे:

If a = 1 Then
b = "a"
ElseIf a = 2 Then
b = "c"
'...
End If

हालाँकि, यह बहुत सारे कोड स्थान ले सकता है यदि जाँच करने के लिए एक या दो से अधिक चर हैं (वैसे भी करने के लिए आमतौर पर बेहतर तरीके हैं)।

इसके बजाय, Select Caseबयान एक ब्लॉक में सब कुछ encasing द्वारा चेक के आकार को कम करने में मदद करता है, जैसे:

Select Case a
Case 1:
b = "a"
Case 2:
b = "c"
'...
End Select

यह बहुत छोटे कोड को जन्म दे सकता है, लेकिन इस तरह के बहुत ही सरल मामलों के लिए, एक और भी अधिक कुशल तरीका है: Choose()यह फ़ंक्शन किसी सूची से एक मूल्य को ले जाएगा, जो इसे पारित किए गए मूल्य के आधार पर।

b = Choose(a,"a","c",...)

चयन करने का विकल्प ( aइस मामले में) पहले तर्क के रूप में पारित एक पूर्णांक मान है। बाद की सभी दलीलें (1-अनुक्रमित, सबसे वीबीए की तरह) चुनने के लिए मूल्य हैं। मान किसी भी प्रकार के डेटा प्रकार हो सकते हैं जब तक कि वह सेट किए जा रहे चर से मेल खाता हो (यानी ऑब्जेक्ट Setकीवर्ड के बिना काम नहीं करते हैं ) और यहां तक ​​कि भाव या फ़ंक्शन भी हो सकते हैं।

b = Choose(a, 5 + 4, String(7,"?"))

किसी Arrayअन्य वर्ण को सहेजते समय समान प्रभाव प्राप्त करने के लिए फ़ंक्शन का उपयोग करने के लिए एक अतिरिक्त विकल्प है :

b = Array(5 + 4, String(7,"?"))(a)

गोल्फिंग के लिए एक दिलचस्प और संभवतः बहुत फायदेमंद उपयोग यह एक IIf()या किसी अन्य के साथ संयोजन में उपयोग करना है Choose():A1=IIf(a=Choose(b,c,d,e),Choose(Choose(f,g,h,i),j,k,l),Choose(IIf(m=n,Choose(p,q,r,s),IIf(t=u,v,w)),x,y,z))
गफ्फि

1

बिट-शिफ्ट किए गए आरजीबी मूल्य

जिस तरह से एक्सेल रंगों को संभालता है, (अहस्ताक्षरित, 6-वर्ण हेक्साडेसिमल पूर्णांक) आप नकारात्मक रूप से हस्ताक्षर किए पूर्णांक का उपयोग कर सकते हैं, जिनमें से एक्सेल केवल रंग मान असाइन करने के लिए सही 6 बाइट्स का उपयोग करेगा

यह थोड़ा भ्रमित करने वाला है इसलिए नीचे कुछ उदाहरण दिए गए हैं

कहते हैं कि आप सफेद रंग का उपयोग करना चाहते हैं, जिसे इस प्रकार संग्रहीत किया जाता है

rgbWhite

और के बराबर है

&HFFFFFF ''#value: 16777215

गोल्फ के लिए यह सब हम क्या करने की जरूरत नीचे एक लगता है नकारात्मक हेक्साडेसिमल मान जिसमें समाप्त हो जाता है FFFFFFऔर के बाद से नकारात्मक हेक्स मूल्यों के प्रारूप में होना चाहिए FFFFXXXXXX(जैसे कि Xएक वैध हेक्साडेसिमल है) से नीचे की गिनती FFFFFFFFFF( -1करने के लिए) FFFF000001(-16777215 )

यह जानकर हम उस सूत्र को सामान्य कर सकते हैं

Let Negative_Color_Value = -rgbWhite + Positive_Color_Value - 1
                         = -16777215 + Positive_Color_Value - 1
                         = -16777216 + Positive_Color_Value

इसका उपयोग करते हुए, कुछ उपयोगी रूपांतरण हैं

rgbWhite = &HFFFFFF = -1 
rgbAqua  = &HFFFF00 = -256
16747627 = &HFF8C6B = -29589

यह जानने के लिए अच्छा है कि वहां क्या चल रहा था, मैंने इसे बस उस प्रश्न में दुर्घटना से खोजा - लेकिन यह स्पष्ट विवरण वास्तव में दिखाता है कि यह कैसे काम करता है। एक और बात को ध्यान में रखना है कि गणितीय ऑपरेटरों के साथ कुछ महत्वपूर्ण रंग कम किए जा सकते हैं; rgbWhite= 2^24-1हालाँकि संभवतः और भी कम किया जा सकता है यदि आप -1 से चूक जाते हैं, तो मोटे तौर पर वहाँ
पहुँचें

1
वास्तव में, यहां उनके गणितीय अभ्यावेदन के साथ रंगों की एक सूची दी गई है, जो सकारात्मक या नकारात्मक दशमलव संस्करणों की तुलना में कम हैं: &000080: 2^7, &000100: 2^8, &000200: 2^9, &000400: 2^10, &000800: 2^11, &001000: 2^12, &002000: 2^13, &004000: 2^14, &008000: 2^15, &010000: 2^16, &01FFFF: 2^17-1, &020000: 2^17, &03FFFF: 2^18-1, &040000: 2^18, &07FFFF: 2^19-1, &080000: 2^19, &0FFFFF: 2^20-1, &100000: 2^20, &1FFFFF: 2^21-1, &3FFFFF: 2^22-1, &400000: 2^22, &7FFFFF: 2^23-1 nb जरूरी नहीं कि पूर्ण हो, लेकिन मुझे लगता है कि मैंने एक पूरी तरह से काम किया है
Greedo

1

"तत्काल विंडो को प्रिंट करते समय ओमिट टर्मिनल

नीचे दिए गए फ़ंक्शन को देखते हुए, जिसका उपयोग डिबग विंडो में किया जाना है

h="Hello":?h", World!"

"-1 बाइट के लिए टर्मिनल को गिराया जा सकता है, स्ट्रिंग को छोड़ दिया गया है और बिना किसी त्रुटि के प्रोग्राम निष्पादित करेगा

h="Hello":?h", World!

इससे भी अधिक आश्चर्य की बात यह है कि यह पूरी तरह से परिभाषित उप-क्षेत्रों के भीतर किया जा सकता है।

Sub a
h="Hello":Debug.?h", World!
End Sub

उपरोक्त सबरूटीन अपेक्षा के अनुरूप चलता है और ऑटोफोरमैट्स को

Sub a()
h = "Hello": Debug.Print h; ", World!"
End Sub

1

सशर्त में सत्य और झूठी चर का उपयोग करें

कभी-कभी अंतर्निहित प्रकार रूपांतरण कहा जाता है - सीधे उस नंबर की सत्यता और गलत प्रकृति का उपयोग करके If, [IF(...)]या IIf(...)कथन में किसी संख्या प्रकार का उपयोग करके, आप कुछ बाइट्स को पूरी तरह से बचा सकते हैं।

VBA में, कोई भी संख्या प्रकार चर जो गैर-शून्य है 0, को सत्य माना जाता है (और इस प्रकार शून्य है, केवल मान गलत है और इस प्रकार

If B <> 0 Then 
    Let C = B
Else 
    Let C = D
End If 

को संघनित किया जा सकता है

If B Then C=B Else C=D

और आगे

C=IIf(B,B,D)

1

नाम से पता पत्रक

किसी WorkSheetवस्तु को कॉल करके संबोधित करने के बजाय

Application.ActiveSheet
''  Or 
ActiveSheet   

एक का उपयोग कर सकते हैं

Sheets(n)  ''  Where `n` is an integer
''  Or 
[Sheet1]

या अधिक अधिमानतः एक सीधे वस्तु तक पहुंच सकता है और उपयोग कर सकता है

Sheet1

1

LongLong64-बिट VBA में घातांक और एस

घातांक का सामान्य रूप,

A to the power of B

VBA के रूप में प्रतिनिधित्व किया जा सकता है

A^B 

लेकिन केवल 32-बिट ऑफ़िस ऑफ़िस में , 64-बिट्स ऑफ़िस ऑफ़िस में, सबसे छोटा तरीका जो आप त्रुटि के बिना प्रतिनिधित्व कर सकते हैं, यह है

A ^B

ऐसा इसलिए है क्योंकि VBA के 64-बिट संस्करणों में ^घातांक शाब्दिक और प्रकार की घोषणा वर्ण दोनों के रूप में कार्य करता हैLongLong । इसका मतलब यह है कि कुछ अजीब-सी दिखने वाली लेकिन मान्य वाक्य रचना जैसे पैदा हो सकती है

a^=2^^63^-1^

जो aएक के अधिकतम मूल्य को धारण करने के लिए चर प्रदान करता हैLonglong


1

स्ट्रिंग के रूप में बाइट एरे को संपीड़ित करें

इनवॉइस के लिए जिन्हें निरंतर डेटा रखने के लिए समाधान की आवश्यकता होती है, उस डेटा को एक स्ट्रिंग के रूप में संपीड़ित करना और फिर डेटा को लाने के लिए स्ट्रिंग में पुनरावृति करना उपयोगी हो सकता है।

VBA में, किसी भी बाइट मान को सीधे एक वर्ण में परिवर्तित किया जा सकता है

Chr(byteVal)

और एक longया integerमूल्य के साथ दो अक्षर बदला जा सकता है

Chr(longVal / 256) & Chr(longVal Mod 256)

तो एक byteसरणी के लिए एक संपीड़न एल्गोरिथ्म कुछ इस तरह दिखेगा

For Each Var In bytes
    Select Case Var
        Case Is = Asc(vbNullChar)
            outstr$ = outstr$ & """+chr(0)+"""
        Case Is = Asc(vbTab)
            outstr$ = outstr$ & """+vbTab+"""
        Case Is = Asc("""")
            outstr$ = outstr$ & """"""
        Case Is = Asc(vbLf)
            outstr$ = outstr$ & """+vbLf+"""
        Case Is = Asc(vbCr)
            outstr$ = outstr$ & """+vbCr+"""
        Case Else
            outstr$ = outstr$ & Chr$(Var)
    End Select
Next
Debug.Print "t="""; outstr$

यह देखते हुए कि Select Case खंड उन वर्णों के कारण लागू किया गया है जो स्ट्रिंग में शाब्दिक रूप में संग्रहीत नहीं किए जा सकते हैं।

परिणामी स्ट्रिंग से, जो कुछ इस तरह दिखेगा

t="5¼-™):ó™ˆ"+vbTab+"»‘v¶<®Xn³"+Chr(0)+"~ίšÐ‘š;$ÔÝ•óŽ¡¡EˆõW'«¡*{ú{Óx.OÒ/R)°@¯ˆ”'®ïQ*<¹çu¶àªp~ÅP>‹:<­«a°;!¾y­›/,”Ì#¥œ5*B)·7    

डेटा को तब Ascऔर Midफ़ंक्शंस का उपयोग करके निकाला जा सकता है , जैसे

i=Asc(Mid(t,n+1))

1

अनुचित स्थिरांक का उपयोग करें

VBA अभिव्यक्ति में असंगत या अनुचित स्थिरांक के उपयोग के लिए कुछ मामलों में अनुमति देता है, जिन्हें निरंतर मूल्यों की आवश्यकता होती है। ये अक्सर विरासत मूल्य होते हैं, और उचित मूल्यों की तुलना में लंबाई में कम होते हैं।

उदाहरण के लिए नीचे दिए गए मूल्यों का उपयोग तब किया जा सकता है जब किसी rng.HorizantalAlignmentसंपत्ति को मूल्य दिया जाता है।

अनुचितउचितजनरल लगातारxlHAlign  लगातार11xlGeneralxlHAlignGeneral2-4131xlLeftxlHAlignLeft3-4108xlCenterxlHAlignCenter4-4152xlRightxlHAlignRight55xlFillxlHAlignFill6-4130xlJustifyxlHAlignJustify77xlCenterAcrossSelectionxlHAlignCenterAcrossSelection8-4117xlDistributedxlHAlignDistributed

इसका मतलब है, उदाहरण के लिए कि एक सेल की स्थापना अपने पाठ के साथ केंद्रित है

rng.HorizantalAlignment=-4108

नीचे छोटा किया जा सकता है

rng.HorizantalAlignment=3

3उचित मूल्य के लिए अनुचित निरंतर मूल्य की जगह -4108। ध्यान दें कि यदि आप rng.HorizantalAlignmentसंपत्ति मूल्य प्राप्त करते हैं, तो यह उचित मूल्य लौटाएगा। इस मामले में, यह होगा -4108


1

एक्सेल में, कर्करिंग रेंज द्वारा न्यूमेरिक एरर्स बनाएं

जब मिश्रित लंबाई के संख्यात्मक के एक निरंतर एकल आयामी सेट, एसजरूरत है, यह [{...}]एक सीमा को घोषित करने के लिए संकेतन का उपयोग करने के लिए अधिक कुशल होगा और फिर Split(String)संकेतन या समान का उपयोग करने के बजाय एक संख्यात्मक सरणी में जोर देना होगा।

इस पद्धति का उपयोग करते हुए, एक परिवर्तन Δबाइट की गिनती=-5 बाइट्स सभी के लिए उपार्जित किया जाएगा एस

उदाहरण

उदाहरण के लिए,

x=Split("1 2 34 567 8910")

के रूप में लिखा जा सकता है

x=[{1,2,34,567,8910}]

यह आगे ध्यान देने योग्य है कि जबकि यह विधि प्रत्यक्ष अनुक्रमण के लिए अनुमति नहीं देती है, यह सीधे लूप के लिए पुनरावृत्ति की अनुमति देता है, अर्थात

For Each s In[{1,3,5,7,9,2,4,6,8}]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.