एक्सेल में पूरी पंक्ति को कैसे हटाएं यदि पिछली पंक्ति में एक ही सेल समान है? एक्सेल, एक्सेल-वीबीए

मेरी एक्सेल स्प्रेडशीट में 11 कॉलम और 500k शामिल हैंपंक्तियों। प्रत्येक पंक्ति 8-चैनल डिजिटल तर्क विश्लेषक से नमूना है: कॉलम ए एक टाइम स्टैंप है; कॉलम बी के माध्यम से मैं बिट मान हैं (या तो प्रत्येक सेल में 1 या 0); कॉलम जे कंकेटनेट (बी, सी, डी, ई, एफ, जी, एच, आई) के साथ बनाई गई बाइनरी में एक बाइट है; और कॉलम के एक ही बाइट है जो हेक्साडेसिमल में BIN2HEX (J) के साथ बनाया गया है।

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

A        B  C  D  E  F  G  H  I  J         K
0.67497  1  0  0  1  1  1  1  0  10011110  9E
0.67498  1  0  0  1  1  1  0  1  10011101  9D
0.67499  1  0  0  1  1  1  0  1  10011101  9D
0.67500  1  0  0  1  1  1  0  1  10011101  9D
0.67501  1  0  0  1  1  1  1  0  10011110  9E

इसके लिए:

A        B  C  D  E  F  G  H  I  J         K
0.67497  1  0  0  1  1  1  1  0  10011110  9E
0.67498  1  0  0  1  1  1  0  1  10011101  9D
0.67501  1  0  0  1  1  1  1  0  10011110  9E

यदि मैं सेल के 1 का चयन करने के बाद निम्न कोड चलाता हूं, तो यह मेरी इच्छा के अनुसार ओवर-नमूने हटा देता है, लेकिन यह बहुत धीरे-धीरे चलता है। (इसे खत्म करने में कई दिन लगेंगे।)

Sub DeleteOverSamples()
Do Until ActiveCell.Value = ""
If ActiveCell.Value = ActiveCell.Offset(-1, 0).Value Then
ActiveCell.EntireRow.Delete
ElseIf ActiveCell.Value <> ActiveCell.Offset(-1, 0).Value Then
ActiveCell.Offset(1, 0).Select
End If
Loop
End Sub

मैं इसे और अधिक कुशल कैसे बना सकता हूं?यदि EntireRow.Delete एक समय लेने वाली फ़ंक्शन है, तो क्या मैं एक समय में हटाने के लिए कई पंक्तियों का चयन कर सकता हूं (कभी-कभी बार-बार नमूने सैकड़ों नमूने के लिए दोहराया जाता है)? बहुत धन्यवाद!

उत्तर:

जवाब के लिए 3 № 1

हटाएं विधि धीमी है, और सेल के मान का व्यक्तिगत इनपुट / आउटपुट भी धीमा है। इसका उपयोग करना Variant सरणी तेज है।

Sub test()
Dim vDB As Variant, vR() As Variant
Dim r As Long, c As Integer, n As Long, j As Integer
Dim s As String

vDB = Range("a1").CurrentRegion
r = UBound(vDB, 1)
c = UBound(vDB, 2)

s = vDB(1, 11)

n = n + 1
ReDim Preserve vR(1 To r, 1 To c)
For j = 1 To c
vR(n, j) = vDB(1, j)
Next j

For i = 1 To r
If s <> vDB(i, 11) Then
n = n + 1
For j = 1 To c
vR(n, j) = vDB(i, j)
Next j
s = vDB(i, 11)
End If
Next i
Sheets.Add
Range("a1").Resize(n, c) = vR

End Sub

जवाब के लिए 2 № 2

निम्नलिखित कोड पहली शीट से प्रासंगिक मानों की प्रतिलिपि बनाकर एक नई शीट तैयार करेगा:

Sub test()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim ws0 As Worksheet
Dim ws1 As Worksheet
Dim r0 As Long
Dim r1 As Long
Dim c As Long
Dim startTime As Single
startTime = Timer

Set ws0 = ActiveSheet
Set ws1 = Worksheets.Add
r0 = 1
r1 = 1
Do While Not IsEmpty(ws0.Cells(r0, 1).Value)
If r0 = 1 Then
ws1.Rows(r1).Range("A1:I1").Value = ws0.Rows(r0).Range("A1:I1").Value
r1 = r1 + 1
Else
For c = 2 To 9
If ws0.Cells(r0, c).Value <> ws0.Cells(r0 - 1, c).Value Then
ws1.Rows(r1).Range("A1:I1").Value = ws0.Rows(r0).Range("A1:I1").Value
r1 = r1 + 1
End If
Exit For
Next
End If
r0 = r0 + 1
Loop

MsgBox "Finished in " & (Timer - startTime) & " seconds"
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

मैंने पहले कुछ पंक्तियों के लिए आपके द्वारा प्रदान किए गए डेटा का उपयोग करके इसका परीक्षण किया, और फिर अपनी अगली पंक्ति को अगले 49 99 5 पंक्तियों के लिए दोहराया (कॉलम बी को यादृच्छिक रूप से चुना गया है 0 या 1) and it took slightly over 20 seconds to copy डेटा की लगभग 250,000 पंक्तियां। कॉलम बी में यादृच्छिक प्रभाव के बिना, आपको 3 पंक्तियों की प्रतिलिपि बनाने में केवल 1 9 सेकंड लग गए थे जिन्हें आप उम्मीद करेंगे। कॉलम बी के बजाय कॉलम I में एक यादृच्छिक प्रभाव, 28 सेकंड से अधिक समय ले लिया - जो शायद सबसे धीमा होगा।

(यदि यह आपके उपयोग का उपयोग करता है तो यह तेज़ होगागणना की गई कॉलम जे या के, क्योंकि इसे केवल 8 कक्षों की बजाय प्रत्येक पंक्ति में एक सेल को देखने की आवश्यकता होगी, लेकिन मुझे यकीन नहीं था कि आपको वास्तव में उन कॉलम की आवश्यकता है या आपने उन्हें केवल अपने मौजूदा बनाने के लिए जोड़ा है कोड आसान है।)


संबंधित सवाल
सबसे लोकप्रिय