2012-10-20 24 views
9

में रिक्त पंक्तियां निकालें मैं एक मैक्रो चलाने की कोशिश कर रहा हूं जो तालिका कॉलम में रिक्त कक्ष का चयन करता है और पूरी पंक्ति को हटा देता है।एक्सेल वीबीए - तालिका

नीचे दी गई स्क्रिप्ट हटाने वाले भाग को छोड़कर सबकुछ करती है, जो run-time error 1004 - "Delete method of Range class failed" को संकेत देती है।

कोई समस्या इस समस्या को ठीक करने के लिए कैसे करें? धन्यवाद

Sub test() 
Range("Table1[[New]]").Activate 
Selection.SpecialCells(xlCellTypeBlanks).Select 
Selection.EntireRow.Delete 
End Sub 

उत्तर

7

अच्छा सवाल! एक टेबल के बिना, .EntireRow.Delete हमेशा काम करता है, लेकिन एक टेबल के अंदर ऐसा लगता है जैसे यह नहीं करता है।

यह काम करता है:

Sub Test() 
    Dim Rng As Range 
    On Error Resume Next 
    Set Rng = Range("Table1[[New]]").SpecialCells(xlCellTypeBlanks) 
    On Error Goto 0 
    If Not Rng Is Nothing Then 
    Rng.Delete Shift:=xlUp 
    End If 
End Sub 
+1

यह टेबल्स के लिए सही समाधान है, लेकिन आप त्रुटि की जांच जोड़ना चाहिए (Brettdj के जवाब के अनुसार) इस मामले में कोई रिक्त पंक्तियों पाए जाते हैं –

+1

ठीक है मैं इस सवाल का जवाब और कहा कि त्रुटि संपादित – fthiella

+0

जांचना यह पूरी तरह से काम किया। धन्यवाद। – user91240192094

1

आप वास्तव में यह एक पास में कर सकते हैं, लेकिन ListObject वस्तु और उसके DataBodyRange और ListColumns गुणों का उपयोग करने की आवश्यकता है:

Sub ClearBlankCellsInColumnNew() 
Dim rngBlanks As Excel.Range 

With Worksheets("Sheet1").ListObjects("Table1") 
    On Error Resume Next 
    Set rngBlanks = Intersect(.DataBodyRange, .ListColumns("New").Range).SpecialCells(xlCellTypeBlanks) 
    On Error GoTo 0 
    If Not rngBlanks Is Nothing Then 
     rngBlanks.Delete 
    End If 
End With 
End Sub 
+0

यह विधि अभी भी मुझे रन-टाइम त्रुटि 1004 देता है: हालांकि थोड़ा अलग है, कह रहा है कि" ऑपरेशन की अनुमति नहीं है। ऑपरेशन आपके वर्कशीट पर किसी तालिका में कक्षों को स्थानांतरित करने का प्रयास कर रहा है। " – user91240192094

+0

क्या नीचे कोई और तालिका है एक हम किसके बारे में बात कर रहे हैं? यदि ऐसा है, तो आपको डिज़ाइन को बदलने के बारे में सोचना चाहिए ताकि एक दूसरे के ऊपर ढेर टेबल नहीं हो सकें। यदि आप एक्सेल में ऐसा करते हैं, तो वीबीए के बिना मैं आपको वही संदेश प्राप्त करने की अपेक्षा करता हूं। इसके अलावा, यदि ऐसा है, तो कृपया इसे किसी तालिका पर ऊपर या नीचे किसी भी अन्य टेबल के साथ आज़माएं। यदि नहीं, तो मैं स्टंप हो सकता है :)। –

+0

अरे डौग - वर्कशीट में बस एक ही टेबल। – user91240192094

1

चरण 1: एक सहायक बनाओ तालिका में कॉलम जहां आप उस पंक्ति में किसी रिक्त फ़ील्ड की जांच करते हैं। उदाहरण के लिए, यदि आपके टेबल में 3 कॉलम थे: ए (मूल्य), बी (मात्रा), और सी (लागत), तो आप चौथा कॉलम डी जोड़ देंगे और इसे "कोई भी रिक्त स्थान" लेबल करेंगे। समीकरण =IF(OR(ISBLANK([@Price]),ISBLANK([@Quantity]),ISBLANK([@Cost])),"Yes","No")

इससे आपको सभी रिक्त स्थान देखने के लिए फ़िल्टर करने के लिए एक कॉलम मिलेगा।

चरण 2: VBA में आप तो क्या करना होगा निम्नलिखित:

Range("MyTableNameHere").AutoFilter Field:=Range("MyTableNameHere[Any Blanks?]").Column, Criteria1:="Yes" 
Application.DisplayAlerts = False 
Range("MyTableNameHere").ListObject.DataBodyRange.SpecialCells(xlCellTypeVisible).Delete 
Application.DisplayAlerts = True 
Range("MyTableNameHere").AutoFilter Field:=Range("MyTableNameHere[Any Blanks?]").Column 

यह अनिवार्य रूप से आप जिन पंक्तियों को सहायक स्तंभ का उपयोग तालिका में हटाना चाहते हैं, तालिका में दिखाई देने वाले सभी डेटा का चयन करने के लिए फ़िल्टर कर रही है , और मेज को unfiltering। मैं एक टेबल में सभी दृश्य पंक्तियों को हटाने के तरीके के आसपास खोज रहा था और इसे तब तक पाया जब तक मुझे पता चला कि यह काम करेगा। किसी भी रिक्त स्थान के साथ सभी पंक्तियों का चयन करने के लिए इसे लेना और एक सहायक कॉलम के साथ संयोजन करना ऐसा लगता है कि आप जो भी चाहते थे।

0

अनुकूल पिछले जवाब:

On Error Resume Next 
Set Rng = ListObjects(1).DataBodyRange.SpecialCells(xlCellTypeBlanks) 
On Error GoTo 0 
If Not Rng Is Nothing Then 
Rng.Delete Shift:=xlUp 
End If