কলাম তথ্য ফিল্টার


2

আমার একটি কলাম আছে যা আমি ফিল্টার করতে চাই, এই ফিল্টারটিতে দুটি স্বতন্ত্র উপাদান রয়েছে।

ধাপ 1:

  • তথ্য একটি কলামের মাধ্যমে নিচে সরানো
  • তথ্য ব্লক মধ্যে ফাঁক সনাক্ত করুন
  • মনোনীত কোষের মান থেকে কম গ্যাপ 1 এর মান পূরণ করে

ধাপ ২:

  • ধাপ 1 হিসাবে তথ্য একই কলামের মাধ্যমে নিচে সরানো
  • মনোনীত সেল মানের চেয়ে কম সংখ্যক সারি ধারণ করে এমন ডেটা গোষ্ঠী চিহ্নিত করুন
  • মনোনীত সেল মানের চেয়ে ছোট ডেটা ব্লক মুছে ফেলা হয়

আমি ইতিমধ্যে একটি ম্যাক্রো তৈরি করেছি যা একটি নির্দিষ্ট কোষের মান (ঘরগুলি (1, 15)। ভ্যালু) -এর কম ডেটা গোষ্ঠীতে ফাঁক পূরণ করে, নীচে দেখানো হয়েছে।

এখানে যা আছে তাই আমি দ্বিতীয় ধাপের জন্য একটি ম্যাক্রো লিখতে শুরু করেছি কিন্তু সিনট্যাক্স ত্রুটিটি পূর্ববর্তী হতে পারছি না। নীচের দেখানো হয় কাঁচা এবং ফিল্টার তথ্য একটি উদাহরণ।

সিনট্যাক্স ত্রুটিটি এক জিনিস, আমি দ্বিতীয় ধাপ কীভাবে পরিচালনা করব তা নিয়ে সংগ্রাম করছি, তাই সহায়তাটি প্রশংসা করা হবে।

চিয়ার্স

Option Explicit
Sub FillInTheBlanks()
'
' FillInTheBlanks Macro
'
'Declare integers and decimal characters

Dim iCol As Long, Last As Long, i As Long
    Dim iBlank As Long, BlankMode As Boolean, iCount As Long
    Dim j As Long, i1 As Long, iFullCount As Long 'Declare integers, boolean and decimal characters


    iCol = ActiveCell.Column 'Column identified by active cell
    Last = Cells(Rows.Count, iCol).End(xlUp).Row 'Determine end of nominated range
    iBlank = 0 'iBlank starts at zero
    iFullCount = 0 'iBlank starts at zero
    BlankMode = False 'BlankMode starts as False


    For i = 4 To Last 'Start at row 4 and go to the end of column
        If BlankMode Then  'If the next cell is empty

            If Cells(i, iCol) = "" Then
                iBlank = iBlank + 1 'If an emty cell is detected increase iBlank by 1
                iCount = iBlank 'Count the spaces

            Else
                  For j = i1 To i - 1 And iCount < Cells(1, 15).Value
                      Cells(j, iCol).Value = 1
                  Next j
                  BlankMode = False
            End If

        Else

            If Cells(i, iCol) = "" Then
                iBlank = 1
                i1 = i
                BlankMode = True
            End If

        End If
    Next i
End Sub

Option Explicit
Sub EraseSpikes()
'
'
'
'

Dim iCol As Long, Last As Long, i As Long
    Dim iFullCount As Long
    Dim p As Long


    iCol = ActiveCell.Column
    Last = Cells(Rows.Count, iCol).End(xlUp).Row

    iFullCount = 0



    For i = 4 To Last


            If Cells(i, iCol) = 1 Then
             iFullCount = iFullCount + 1
             p = i
            Else
                  If iFullCount < Cells(1, 15).Value And Sum(Range(Cells(p, iCol),Cells(p-Cells(1, 15).Value,iCol))=0 And Sum(Range(Cells(p+iFullCount, iCol),Cells(p+iFullCount(1, 15).Value,icol))=0

                  End If

            End If
    Next i
End Sub

1   1           1
2   1           1
3   1           1
4   1           1
5   1           1
6   1           1
7   1           1
8               
9               
10              
11              
12              
13              
14              
15              
16              
17              
18              
19              
20              
21              
22              
23              
24  1           1
25  1           1
26  1           1
27  1           1
28  1           1
29  1           1
30  1           1
31  1           1
32  1           1
33  1           1
34  1           1
35  1           1
36  1           1
37  1           1
38  1           1
39              1
40              1
41  1           1
42  1           1
43  1           1
44  1           1
45  1           1
46  1           1
47              1
48  1           1
49  1           1
50  1           1
51  1           1
52  1           1
53  1           1
54              1
55              1
56              1
57              1
58  1           1
59  1           1
60  1           1
61  1           1
62  1           1
63  1           1
64              1
65              1
66              1
67              1
68              1
69  1           1
70  1           1
71  1           1
72  1           1
73  1           1
74  1           1
75              1
76              1
77              1
78              1
79              1
80              1
81              1
82  1           1
83  1           1
84  1           1
85  1           1
86  1           1
87  1           1
88              
89              
90              
91              
92              
93              
94              
95              
96              
97              
98              
99              
100             
101             
102             
103             
104             
105             
106             
107 1           
108 1           
109 1           
110 1           
111 1           
112 1           
113             
114             
115             
116             
117             
118             
119             
120             
121             
122             
123             
124             
125             
126             
127             
128             
129             
130             
131             
132             
133             
134             
135             
136             
137 1           1
138 1           1
139 1           1
140 1           1
141 1           1
142 1           1
143             1
144             1
145             1
146             1
147             1
148             1
149             1
150             1
151             1
152             1
153             1
154             1
155 1           1
156 1           1
157 1           1
158 1           1
159 1           1
160 1           1

আপনার ম্যাক্রো আসলে আপনি বর্ণিত চেয়ে আরো জটিল দেখায়, এছাড়াও এটি আপনার সঠিক সমস্যা যা এটা স্পষ্ট নয়। এটা পরিষ্কার এবং একটি digestible আকার করতে আপনার প্রশ্ন সম্পাদনা করুন।
Máté Juhász

ধন্যবাদ, আমি কিছু সম্পাদন করেছি তাই আশা করছি জিনিষ এখন একটি বিট পরিষ্কার।
Sandie

উত্তর:


2

আপনার সিনট্যাক্স ত্রুটি এই লাইন দিয়ে:

If iFullCount < Cells(1, 15).Value And Sum(Range(Cells(p, iCol),Cells(p-Cells(1, 15).Value,iCol))=0 And Sum(Range(Cells(p+iFullCount, iCol),Cells(p+iFullCount(1, 15).Value,icol))=0

এটা ভেঙ্গে:

Sum(Range(Cells(p, iCol),Cells(p-Cells(1, 15).Value,iCol))

আপনি বন্ধনী অনুপস্থিত, এবং Sum একটি ভিবিএ ফাংশন না। পরিবর্তে, আপনি ব্যবহার করতে চাই Application.Sum

আমি এটা আমি উপর ভিত্তি করে সামান্য ভিন্নভাবে লিখেছেন বিশ্বাস করা আপনি আসলে প্রয়োজন। কাজ করেছে কিনা আমাকে জানান.

Sub EraseSpikes()
'
'
'
'

Dim iCol As Long, Last As Long, i As Long, j As Integer, startOfBlock As Integer

    startOfBlock = -1   'Initialise startOfBlock. -1 means we're not in a block yet


    iCol = ActiveCell.Column
    Last = Cells(Rows.Count, iCol).End(xlUp).Row

    For i = 4 To Last   'Begin loop from row 4 (?) to the end

            If Cells(i, iCol) = 1 Then          'If we find a 1...
                If startOfBlock = -1 Then       'And the block hasn't yet been started...
                    startOfBlock = i            'Mark this line as the start of our block
                End If
            Else                                'If we don't find a 1...
                If startOfBlock = -1 Then       'And we're not in a block...
                    GoTo nextLoop:              'We skip the rest of this until we're in a block
                End If
                If (i - startOfBlock) < Cells(1, 15).Value Then     'We didn't skip, so we're in a block.
                                                                    'we check if (current row number - start row number)
                                                                    'is less than the value in Cell(1,15) (Not equal to?)

                    For j = startOfBlock To i                       'It was, so we loop through all the rows in that block blanking them
                        Cells(j, iCol).Value = ""
                    Next j
                End If

                startOfBlock = -1                                   'Reset to not being in a block
            End If
nextLoop:
    Next i
End Sub

@ স্যান্ডি কোন সমস্যা নেই - যখন আপনি সুখী হন তখন আপনার সমস্যাটি সমাধান হয় উত্তরটির বাম দিকের চেকমার্কটি ব্যবহার করে উত্তরটি সঠিকভাবে চিহ্নিত করতে ভুলবেন না :)
Jonno

ধন্যবাদ Jonno, এই তাই সহায়ক হয়েছে। আপনার কোডটি কাজ করে তবে আইডেন্টিফায়ারের জন্য অতিরিক্ত দুটি মানদণ্ড যুক্ত করতে হবে। ব্লক মুছে ফেলার আগে ব্লক খালি হওয়ার পূর্বে এবং পরে মনোনীত ঘর পরিসরের জন্য জিজ্ঞাসা করুন। যদি (i - startOfBlock) & lt; = কোষ (1, 15)। ভ্যালু এবং অ্যাপ্লিকেশন। স্যাম (রেঞ্জ (কোষ (i, iCol), কোষ (আই + সেলস (1, 15)। ভ্যালু, আইসিওল)) = 0 তারপর - এই অতিরিক্ত মানদণ্ড কাজ করে তবে নীচে দেখানো দ্বিতীয়টি আমার মনে হয় না এটি Row1 এর আগে সারিগুলি দেখতে চেষ্টা করছে? এবং অ্যাপ্লিকেশন। স্যাম (রেঞ্জ (কোষ (i-startof ব্লক, আইসিওল), কোষ (i-startof ব্লক - সেলস (1, 15)। ভ্যালু, আইসিওল)) = 0
Sandie

হ্যাঁ, এটি একটি নেতিবাচক সারির সন্ধান করবে যা করা যাবে না। আপনি আমার মধ্যে দ্বিতীয় মানদণ্ড যোগ করতে পারে If (i - startOfBlock) < Cells(1, 15).Value Then, এবং কিছু ভালো If i - startOfBlock - Cells(1, 15).Value > 0 Then পরবর্তী লাইন If Application.Sum(Range(Cells(i, iCol), Cells(i + Cells(1, 15).Value, iCol))) = 0 And Application.Sum(Range(Cells(i-startofBlock, iCol), Cells(i-startofBlock - Cells(1, 15).Value, iCol)))=0 Then ব্লক মুছে ফেলুন End If পরবর্তী লাইন End If
Jonno

আবারো ধন্যবাদ, জোনো, এটি শুধু উত্তরগুলির জন্য Google অনুসন্ধান নয়, আমি আপনাকে এই সময় কাটানোর জন্য কৃতজ্ঞ।
Sandie

@ স্যান্ডি কোনও সমস্যা নয় - আপনি কোনটি অর্জন করার চেষ্টা করছেন তা আমি জানি না তবে এটি কাজ করে বলে আশা করি :)
Jonno
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.