2008-09-17 24 views
5

कोड रहा है:एक स्ट्रिंग के माध्यम से फिर से कैसे करें और प्रत्येक चरित्र के बाइट मूल्य की जांच कैसे करें?

 cell_val = CStr(Nz(fld.value, "")) 
     Dim iter As Long 
     For iter = 0 To Len(cell_val) - 1 Step 1 
     If Asc(Mid(cell_val, iter, 1)) > 127 Then 
      addlog "Export contains ascii character > 127" 
     End If 
     Next iter 

इस कोड काम नहीं करता। क्या कोई जानता है कि इसे कैसे करना है? मुझे बस वीबी या वीबीए के साथ कोई जानकारी नहीं मिली है।

उत्तर

12

मेरा मानना ​​है कि आपकी समस्या है कि VBA में स्ट्रिंग अनुक्रमणिका 0. पर 1 और नहीं पर शुरू निम्नलिखित का प्रयास करें है:

For iter = 1 To Len(cell_val) 
    If Asc(Mid(cell_val, iter, 1)) > 127 Then 
     addlog "Export contains ascii character > 127" 
    End If 
Next 
0

आप इसे डिबग किया? ;) क्या आप वाकई सेल_वल खाली नहीं हैं? इसके अलावा आपको फॉर लूप में 'चरण 1' की आवश्यकता नहीं है क्योंकि यह डिफ़ॉल्ट है। इसके अलावा आप अपने कोड के साथ क्या उम्मीद करते हैं? यह लॉग करता है अगर कोई एएससीआई मान 127 से ऊपर है? लेकिन यह है - परिणाम के आधार पर कोई शाखा नहीं है?

+0

मुझे संदेह है कि उन्होंने समस्या पर ध्यान केंद्रित एक साधारण उदाहरण प्रदान किया है। और "चरण 1" डिफ़ॉल्ट होने पर, पाठक को कोड को और स्पष्ट करने के लिए वहां कोई नुकसान नहीं होता है। – ahockley

0

वीबी/VBA तार एक के बजाय शून्य ताकि आप उपयोग करने की आवश्यकता से आधारित होते हैं:

For iter = 1 To Len(cell_val) 

मैं भी step 1 दूर छोड़ दिया गया है के बाद से है कि डिफ़ॉल्ट है।

2

आपका उदाहरण संशोधित किया जाना चाहिए ताकि इसकी बाहरी निर्भरता न हो, अब यह एनजे और एडलॉग पर निर्भर करता है।

वैसे भी, यहां समस्या यह है कि आप 0 से लेन() -1 तक लूपिंग कर रहे हैं। वीबीए में यह 1 से एन होगा।

Dim cell_val As String 
cell_val = "øabcdæøå~!#%&/()" 
Dim iter As Long 
For iter = 1 To Len(cell_val) 
    If Asc(Mid(cell_val, iter, 1)) > 127 Then 
     'addlog "Export contains ascii character > 127" 
     Debug.Print iter, "Export contains ascii character > 127" 
    End If 
Next iter 
0

आप इसे डिबग किया? ;) क्या आप वाकई सेल_वल खाली नहीं हैं? इसके अलावा आप को फॉर लूप में 'चरण 1' की आवश्यकता नहीं है क्योंकि यह डिफ़ॉल्ट है। इसके अलावा आप को अपने कोड के साथ लागू करने की उम्मीद करते हैं? यह लॉग करता है यदि कोई ascii मान 127 से ऊपर है? लेकिन यह है - परिणाम के आधार पर शाखा नहीं है?

मैंने इसे डीबग नहीं किया, मुझे नहीं पता कि वीबीए या उसके साथ चलने वाले किसी भी उपकरण का उपयोग कैसे करें। हाँ मुझे यकीन है कि सेल_वल खाली नहीं है। कोड प्रतिनिधि था, मैं शाखा को लिखने से पहले शाखा की स्थिति को सुनिश्चित करता था।

मेरा मानना ​​है कि आपकी समस्या है कि VBA में स्ट्रिंग अनुक्रमणिका 1 से शुरू करें और नहीं 0. पर

आह, बात का सही तरह है कि VBA कि मैं याद आती है करने के लिए बाध्य किया गया था के साथ चला जाता, धन्यवाद है आप।

3

वीबीए के साथ, वीबी 6 आप बस एक बाइट सरणी घोषित कर सकते हैं और इसे एक स्ट्रिंग मान असाइन कर सकते हैं और यह आपके लिए परिवर्तित हो जाएगा। फिर आप इसे नियमित सरणी की तरह फिर से चला सकते हैं।

उदा।

Dim b() as byte 
Dim iter As Long 
b = CStr(Nz(fld.value, "")) 

For iter = 0 To UBound(b) 
    if b(iter) > 127 then 
     addlog "Export contains ascii character > 127" 
    end if 
next