2011-01-19 15 views
5

का उपयोग कर एक्सेल फ़ाइल की सभी चादरों में स्ट्रिंग की खोज करें मैंने एक मैक्रो लिखा है जो एक्सेल फ़ाइल की सभी चादरों में एक स्ट्रिंग खोजेगा। यह मैक्रो शीट में पहली शीट के साथ-साथ सेल को सक्रिय स्ट्रिंग भी सक्रिय करेगा। यदि नहीं मिला तो यह एक संदेश दिखाएगा। यह मैक्रो ठीक चलाता है। मैं इस कार्यक्षमता को सभी चादरों को कवर करने के लिए विस्तारित करना चाहता था जिसमें यह स्ट्रिंग शामिल है और पहले नहीं। तो मैंने मैक्रो को संशोधित किया लेकिन यह उम्मीद के अनुसार काम नहीं कर रहा है। मैंने नीचे दिया गया कोड दिया है और उस स्थान पर भी टिप्पणी की है जहां यह त्रुटि दिखा रहा है।मैक्रोज़

 
Dim sheetCount As Integer 
Dim datatoFind 

Sub Button1_Click() 

Find_Data 

End Sub 

Private Sub Find_Data() 
    Dim counter As Integer 
    Dim currentSheet As Integer 
    Dim notFound As Boolean 
    Dim yesNo As String 

    notFound = True 

    On Error Resume Next 
    currentSheet = ActiveSheet.Index 
    datatoFind = InputBox("Please enter the value to search for") 
    If datatoFind = "" Then Exit Sub 
    sheetCount = ActiveWorkbook.Sheets.Count 
    If IsError(CDbl(datatoFind)) = False Then datatoFind = CDbl(datatoFind) 
    For counter = 1 To sheetCount 
     Sheets(counter).Activate 

     Cells.Find(What:=datatoFind, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
     :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
     False, SearchFormat:=False).Activate 

     If InStr(1, ActiveCell.Value, datatoFind) Then 
      If HasMoreValues(counter + 1) Then 'Not completing the method and directly entering 
       yesNo = MsgBox("Do you want to continue search?", vbYesNo) 
       If yesNo = vbNo Then 
        notFound = False 
        Exit For 
       End If 
      End If 
      Sheets(counter).Activate 
     End If 
    Next counter 
    If notFound Then 
     MsgBox ("Value not found") 
     Sheets(currentSheet).Activate 
    End If 
End Sub 

Private Function HasMoreValues(ByVal sheetCounter As Integer) As Boolean 
    HasMoreValues = False 
    Dim str As String 

    For counter = sheetCounter To sheetCount 
     Sheets(counter).Activate 

     str = Cells.Find(What:=datatoFind, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
     :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
     False, SearchFormat:=False).Value 'Not going further than this i.e. following code is not executed 

     If InStr(1, str, datatoFind) Then 
      HasMoreValues = True 
      Exit For 
     End If 
    Next counter 
End Function 


+0

क्षमा करें, लेकिन अपने कोड में कुछ विसंगतियां है और मैं यह नहीं समझ सकता कि आप क्या करने की कोशिश कर रहे हैं। कृपया वर्णन करें कि शीट में एकाधिक मिलान होने पर आपका प्रोग्राम क्या करना चाहिए। और बीटीडब्ल्यू, FindNext विधि –

+0

पर एक नज़र डालें मेरा कोड निम्न कार्य करता है: 1. सभी चादरों में पहले उपलब्ध मिलान की खोज करता है। यदि पाया जाता है तो यह शीट और सेल सक्रिय करता है जिसमें खोज स्ट्रिंग मौजूद होती है। 2. अगले उपलब्ध मैच के लिए खोज। यदि मौजूद है तो हाँ/नहीं कहकर एक संदेशबॉक्स दिखाता है कि अधिक खोज उपलब्ध हैं। क्या आप जारी रखना चाहते हैं? यदि हां, तो अगला उपलब्ध मैच बिंदु 1 में उल्लिखित दिखाया गया है और फिर अगले उपलब्ध मैच की खोज करता है और तब तक सभी मैच समाप्त हो जाते हैं। 3. यदि कोई मिलान उपलब्ध नहीं है तो प्रक्रिया बंद हो जाती है। इसके अलावा यह FindNext, "सेल" या "शीट्स" किसकी विधि है? – samar

+0

क्षमा करें क्या मुझे कुछ याद आ रहा है ... नियंत्रण + एफ के साथ क्या गलत है? (ढूंढें?) डिफ़ॉल्ट खोज केवल सक्रिय शीट है, लेकिन ढूँढें संवाद पर विकल्प में आप कार्यपुस्तिका में खोज क्षेत्र बदल सकते हैं। मुझे यकीन है कि कार्यक्रम में अंतर्निहित फ़ंक्शन को कॉल करने और स्वयं को अनावश्यक काम सहेजने का एक तरीका होगा। – RichardW1001

उत्तर

4

मैं अपने समस्या को हल करने में सक्षम था और लोगों के लिए कोड है जो इसे

 

Dim sheetCount As Integer 
Dim datatoFind 

Sub Button1_Click() 

Find_Data 

End Sub 

Private Sub Find_Data() 
    Dim counter As Integer 
    Dim currentSheet As Integer 
    Dim notFound As Boolean 
    Dim yesNo As String 

    notFound = True 

    On Error Resume Next 
    currentSheet = ActiveSheet.Index 
    datatoFind = StrConv(InputBox("Please enter the value to search for"), vbLowerCase) 
    If datatoFind = "" Then Exit Sub 
    sheetCount = ActiveWorkbook.Sheets.Count 
    If IsError(CDbl(datatoFind)) = False Then datatoFind = CDbl(datatoFind) 
    For counter = 1 To sheetCount 
     Sheets(counter).Activate 

     Cells.Find(What:=datatoFind, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
     :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
     False, SearchFormat:=False).Activate 

     If InStr(1, StrConv(ActiveCell.Value, vbLowerCase), datatoFind) Then 
      notFound = False 
      If HasMoreValues(counter) Then 
       yesNo = MsgBox("Do you want to continue search?", vbYesNo) 
       If yesNo = vbNo Then 
        Sheets(counter).Activate 
        Exit For 
       End If 
      Else 
       Sheets(counter).Activate 
       Exit For 
      End If 
      Sheets(counter).Activate 
     End If 
    Next counter 
    If notFound Then 
     MsgBox ("Value not found") 
     Sheets(currentSheet).Activate 
    End If 
End Sub 

Private Function HasMoreValues(ByVal sheetCounter As Integer) As Boolean 
    HasMoreValues = False 
    Dim str As String 
    Dim lastRow As Long 
    Dim lastCol As Long 
    Dim rRng As Excel.Range 

    For counter = sheetCounter + 1 To sheetCount 
     Sheets(counter).Activate 

     lastRow = ActiveCell.SpecialCells(xlLastCell).Row 
     lastCol = ActiveCell.SpecialCells(xlLastCell).Column 

     For vRow = 1 To lastRow 
      For vCol = 1 To lastCol 
       str = Sheets(counter).Cells(vRow, vCol).Text 
       If InStr(1, StrConv(str, vbLowerCase), datatoFind) Then 
        HasMoreValues = True 
        Exit For 
       End If 
      Next vCol 

      If HasMoreValues Then 
       Exit For 
      End If 
     Next vRow 

     If HasMoreValues Then 
      Sheets(sheetCounter).Activate 
      Exit For 
     End If 
    Next counter 
End Function 

सादर आवश्यकता हो सकती है,

पोस्ट किया है समर

-1

समस्या यह है कि Cells.Find एक सीमा देता है। जब आप अपने समारोह HasMoreValues में इसका इस्तेमाल करते हैं, तो आप इसे इस तरह का उपयोग करें:

Cells.Find(...).Value 

लेकिन लौटे रेंज सही ढंग से एक .Value में नहीं बदलता। आप .text बजाय .value का उपयोग करके इसे ठीक कर सकते, इस तरह:

Cells.Find(...).text 

या पूरी तरह से:

str = Cells.Find(What:=datatoFind, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
    False, SearchFormat:=False).text 

पूरी तरह से सही होने के लिए, आप शायद set एक रेंज चर के लिए मिल का परिणाम होना चाहिए, और उसके बाद उस तक पहुंचें, अगर खोज खोज कुछ भी नहीं लौटाती है। हालांकि प्रलेखन के अनुसार Cells.Find हमेशा एक सेल की एक श्रृंखला देता है, तो आप ठीक हो सकते हैं।

+0

मैंने इसका उपयोग करने का अपना तरीका आजमाया। इसके बजाय। वैल्यू लेकिन यह एक ही समस्या दे रहा है। वैसे भी मुझे अभी समस्या का समाधान मिला है और मैं इसे यहां पोस्ट कर दूंगा। आपकी सहायता के लिए धन्यवाद. – samar

+1

@samar क्या आपने खोज के परिणामस्वरूप 'रेंज' वैरिएबल सेट करने का प्रयास किया है, और उसके बाद रेंज.कल्स (1,1) का उपयोग कर। टेक्स्ट पर जाने के लिए आगे? – Steven

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