मैं निम्नलिखित कोड के साथ बैच फ़ाइल का उपयोग करता हूं:

cscript DeleteDuplicateDataMacro.vbs "C:\Users\techadmin\Documents\DeleteDuplicateDataMacro\DeleteDuplicateDataMacro.xlsm

जो इस वीबीस्क्रिप्ट कोड को चलाता है:

Dim args, objExcel

Set args = wScript.Arguments
Set objExcel = CreateObject("Excel.Application")

objExcel.Workbooks.Open args(0)
objExcel.Visible = True

ObjExcel.Run "DeleteDuplicateData"

objExcel.ActiveWorkbook.Save
objExcel.ActiveWorkbook.Close(0)
objExcel.Quit

जो मेरी मैक्रो-सक्षम कार्यपुस्तिका खोलता है और निम्नलिखित मैक्रो चलाता है:

Sub DeleteDuplicateData()  
'  
' DeleteDuplicateData Macro  
'  

'  
    Application.DisplayAlerts = False  
    **With ActiveSheet.QueryTables(1).Refresh _
        .Connection = "TEXT;C:\Users\techadmin\Documents\Sapphire Report Agent\Sapphire_NK_Export.csv"**  
        '.CommandType = 0  
        .Name = "Sapphire_NK_Export"  
        .FieldNames = True  
        .RowNumbers = False  
        .FillAdjacentFormulas = False  
        .PreserveFormatting = True  
        .RefreshOnFileOpen = False  
        .RefreshStyle = xlInsertDeleteCells  
        .SavePassword = False  
        .SaveData = True  
        .AdjustColumnWidth = True  
        .RefreshPeriod = 0  
        .TextFilePromptOnRefresh = False  
        .TextFilePlatform = 437  
        .TextFileStartRow = 1  
        .TextFileParseType = xlDelimited  
        .TextFileTextQualifier = xlTextQualifierDoubleQuote  
        .TextFileConsecutiveDelimiter = False  
        .TextFileTabDelimiter = False  
        .TextFileSemicolonDelimiter = False  
        .TextFileCommaDelimiter = True  
        .TextFileSpaceDelimiter = False  
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1)  
        .TextFileTrailingMinusNumbers = True  
        .Refresh BackgroundQuery:=False  
    End With  
    ActiveWindow.SmallScroll Down:=-9  
    ActiveSheet.Range("$A$1:$Q$2500").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17), Header:=xlYes  
    ActiveSheet.Range("$A$1:$Q$2500").RemoveDuplicates Columns:=17, Header:=xlYes  
    ChDir "C:\Users\techadmin\Documents\Sapphire Report Agent"  
    ActiveWorkbook.SaveAs Filename:="C:\Users\techadmin\Documents\Sapphire Report Agent\Sapphire_NK_Export", FileFormat:=xlCSV, CreateBackup:=False  
    ActiveCell.FormulaR1C1 = "STATE_STUDENT_ID"  
    Range("A1:Q2500").Select  
    Range("A1").Activate  
    Selection.ClearContents  
    Range("A1").Select  
    ChDir "C:\Users\techadmin\Documents\DeleteDuplicateDataMacro"  
    ActiveWorkbook.SaveAs Filename:="C:\Users\techadmin\Documents\DeleteDuplicateDataMacro\DeleteDuplicateDataMacro", FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False  
End Sub  

हर बार यह क्रम चलाया जाता है, मेरी मैक्रो-सक्षम कार्यपुस्तिका का फ़ाइल आकार कुछ किलोबाइट बड़ा हो जाता है। यह बेतहाशा बढ़ जाता है। एक बार जब यह 30,000 किलोबाइट रेंज के आसपास हो जाता है तो मेरी दूसरी वर्कबुक (वह जो इस मैक्रो के दौरान आयात की जा रही है, फिर संपादित की जाती है और अपने मूल स्थान पर वापस सहेजी जाती है) इसके कॉलम डुप्लिकेट होने लगते हैं।

0
cquick00 16 जिंदा 2020, 19:22

1 उत्तर

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

ऐसा इसलिए है क्योंकि With किसी वस्तु के साथ काम करने की अपेक्षा करता है (बिना किसी उद्देश्य के) जबकि QueryTable.Refresh एक को वापस नहीं करता है।
.Refresh के काम करने के लिए आपको पहले से एक कनेक्शन स्थापित करना होगा।
मैंने आपके कोड और क्लीनअप भाग से एक नया कनेक्शन जोड़ने को हटा दिया है। यदि आप हर बार कार्यपुस्तिका खोलते समय एक नया कनेक्शन जोड़ना चाहते हैं, तो आपको कार्यपुस्तिका को सहेजने और बंद करने से पहले उसे हटा देना चाहिए, लेकिन मैं ऐसा करने की अनुशंसा नहीं करता, क्योंकि एक्सेल फाइलें समय के साथ इस तरह टूट जाती हैं।

Sub DeleteDuplicateData()  
'  
' DeleteDuplicateData Macro
'  
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False  
    ActiveSheet.QueryTables(1).Refresh BackgroundQuery:=False
    Application.CalculateUntilAsyncQueriesDone
    ActiveSheet.Range("$A$1:$Q$2500").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17), Header:=xlYes  
    ThisWorkbook.SaveAs Filename:="C:\Users\techadmin\Documents\Sapphire Report Agent\Sapphire_NK_Export", FileFormat:=xlCSV, CreateBackup:=False
    ' I assume A1 to be the ActiveCell, but it's still referring to the ActiveSheet
    Range("A1").FormulaR1C1 = "STATE_STUDENT_ID"
    ThisWorkbook.SaveAs Filename:="C:\Users\techadmin\Documents\DeleteDuplicateDataMacro\DeleteDuplicateDataMacro", FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

कृपया इस प्रश्न को फिर से देखें ताकि आप समझ सकें कि इसका उपयोग करने से कैसे बचा जाए ActiveSheet संदर्भों का चयन करें, सक्रिय करें और निहित करें।

0
Nacorid 17 जिंदा 2020, 09:28