मैं मध्यम आकार के डेटासेट के दो-तिहाई हिस्से को शीघ्रता से हटाने के बारे में अंतर्दृष्टि की तलाश में हूं। वर्तमान में, मैं टेक्स्ट फ़ाइल से स्पेस-सीमांकित डेटा एक्सेल में आयात कर रहा हूं, और मैं पंक्ति द्वारा डेटा पंक्ति को हटाने के लिए लूप का उपयोग कर रहा हूं। लूप डेटा की सबसे निचली पंक्ति से शुरू होता है और ऊपर जाने वाली पंक्तियों को हटा देता है। डेटा कालानुक्रमिक रूप से क्रमबद्ध है, और मैं केवल पहले या अंतिम दो तिहाई डेटा को काट नहीं सकता। अनिवार्य रूप से क्या हो रहा है कि डेटा का नमूना लिया जा रहा है और बहुत सारे डेटा बिंदु एक दूसरे के बहुत करीब मौजूद हैं। यह एक श्रमसाध्य धीमी प्रक्रिया है, और मैं बस एक और तरीका ढूंढ रहा हूं।

Sub Delete()

Dim n As Long

n = Application.WorksheetFunction.Count(Range("A:A"))

Application.Calculation = xlCalculationManual

Do While n > 5

n = n - 1
Rows(n).Delete
n = n - 1
Rows(n).Delete
n = n - 1

Loop

   Application.Calculation = xlCalculationAutomatic

End Sub
1
Jesse 6 सितंबर 2017, 01:40

2 जवाब

सबसे बढ़िया उत्तर

लूप के लिए उपयोग करें जो एक निश्चित संख्या से कदम उठाने की अनुमति देता है:

For i = 8 To n Step 3

एक श्रेणी चर में संग्रहीत एक असंबद्ध श्रेणी बनाने के लिए संघ का उपयोग करें।

Set rng = Union(rng, .Range(.Cells(i + 1, 1), .Cells(i + 2, 1)))

फिर एक बार में सभी को हटा दें।

rng.EntireRow.Delete

प्रोत्साहित करने की एक और अच्छी आदत हमेशा का उपयोग किसी भी श्रेणी की वस्तुओं के माता-पिता को घोषित करना है। जैसे-जैसे आपका कोड अधिक से अधिक जटिल होता जाता है, माता-पिता की घोषणा न करने से समस्याएँ हो सकती हैं।

With ब्लॉक का उपयोग करके।

With Worksheets("Sheet1")

हम उस माता-पिता के लिंक को दर्शाने के लिए . के साथ सभी श्रेणी वस्तुओं से पहले कर सकते हैं।

Set rng = .Range("A6:A7")

Sub Delete()

Dim n As Long
Dim i As Long
Dim rng As Range

Application.Calculation = xlCalculationManual

With Worksheets("Sheet1") 'change to your sheet
    n = Application.WorksheetFunction.Count(.Range("A:A"))

    Set rng = .Range("A6:A7")

    For i = 8 To n Step 3
        Set rng = Union(rng, .Range(.Cells(i + 1, 1), .Cells(i + 2, 1)))
    Next i
End With

rng.EntireRow.Delete

Application.Calculation = xlCalculationAutomatic    


End Sub
1
Scott Craner 6 सितंबर 2017, 01:57

आप सरणियों का उपयोग कर सकते हैं और एक तिहाई पंक्तियों को एक नई सरणी में लिख सकते हैं। फिर मूल को साफ़ करने के बाद स्क्रीन पर प्रिंट करें।

यदि कोई है तो आप सूत्र खो देंगे। यदि आपके पास सिर्फ एक बुनियादी डेटासेट था, तो यह आपके लिए उपयुक्त हो सकता है। यह तेज़ होना चाहिए

Sub MyDelete()
    Dim r As Range
    Set r = Sheet1.Range("A1").CurrentRegion  'perhaps define better
    Set r = r.Offset(1, 0).Resize(r.Rows.Count - 1)  ' I assume row 1 is header row.

Application.ScreenUpdating = False

    Dim arr As Variant
    arr = r.Value

    Dim newArr() As Variant
    ReDim newArr(1 To UBound(arr), 1 To UBound(arr, 2))
    Dim i As Long, j As Long, newCounter As Long
    i = 1
    newCounter = 1

    Do
        For j = 1 To UBound(arr, 2)
            newArr(newCounter, j) = arr(i, j)
        Next j

        newCounter = newCounter + 1
        i = i + 3
    Loop While i <= UBound(arr)

    r.ClearContents
    Sheet1.Range("A2").Resize(newCounter - 1, UBound(arr, 2)).Value = newArr

Application.ScreenUpdating = True

End Sub
0
MacroMarc 6 सितंबर 2017, 03:05