2016-11-14 4 views
1

У меня есть этот код, который просматривает все типы файлов в VBA. Он уже работает, но теперь я хочу, чтобы удалить элемент в массиве, если он является одним из заблокированных типов файлов.Удалить элемент в массиве

Const exts = _ 
    ".ade.adp.app.asp.bas.bat.cer.chm.cmd.com.cpl.crt.csh.der.exe.fxp.gadget" & _ 
    ".hlp.hta.inf.ins.isp.its.js.jse.ksh.lnk.mad.maf.mag.mam.maq.mar.mas.mat" & _ 
    ".mau.mav.maw.mda.mdb.mde.mdt.mdw.mdz.msc.msh.msh1.msh2.mshxml.msh1xml" & _ 
    ".msh2xml.ade.adp.app.asp.bas.bat.cer.chm.cmd.com.cpl.crt.csh.der.exe.fxp" & _ 
    ".gadget.hlp.hta.msi.msp.mst.ops.pcd.pif.plg.prf.prg.pst.reg.scf.scr.sct" & _ 
    ".shb.shs.ps1.ps1xml.ps2.ps2xml.psc1.psc2.tmp.url.vb.vbe.vbs.vsmacros.vsw" & _ 
    ".ws.wsc.wsf.wsh.xnk." 

file = Application.GetOpenFilename(MultiSelect:=True, Title:="Select the files you want to zip") 
If IsArray(file) = True Then 
    'Create empty Zip File 
ReDim Data(1 To UBound(file) + 1, 1 To 1) 
efCount = Empty 

' filter the list 
For j = LBound(file) To UBound(file) 
    ext = LCase(Mid(file(j), InStrRev(file(j), "."))) 
    If InStr(1, exts, ext & ".") = 0 Then ' if not blacklisted 
     count = count + 1 
     Data(count, 1) = file(j) 
    Else 
     ReDim Preserve excludedFile(efCount) 
     excludedFile(efCount) = Dir(file(j)) 
     efCount = efCount + 1 
     file(j - 1) = file(j) 'Ive tried this and other ways bu is not working 
     found = True 
    End If 
Next 

Спасибо за помощь.

+0

Почему бы не использовать словарь, который легче манипулировать? –

+0

@PankajJaju Не пробовал, у меня все еще есть проблемы с его использованием. Благодарю. – ramj

+0

Или [System.Collections.ArrayList] (http://stackoverflow.com/questions/13585660/lists-in-vbscript) (только для Windows) – SBF

ответ

2

вы могли бы пойти, как этот

Dim file As Variant 
    Dim efCount As Long, j As Long, count As Long 
    Dim ext As String 
    Dim found As Boolean 

    Const exts = _ 
     ".ade.adp.app.asp.bas.bat.cer.chm.cmd.com.cpl.crt.csh.der.exe.fxp.gadget" & _ 
     ".hlp.hta.inf.ins.isp.its.js.jse.ksh.lnk.mad.maf.mag.mam.maq.mar.mas.mat" & _ 
     ".mau.mav.maw.mda.mdb.mde.mdt.mdw.mdz.msc.msh.msh1.msh2.mshxml.msh1xml" & _ 
     ".msh2xml.ade.adp.app.asp.bas.bat.cer.chm.cmd.com.cpl.crt.csh.der.exe.fxp" & _ 
     ".gadget.hlp.hta.msi.msp.mst.ops.pcd.pif.plg.prf.prg.pst.reg.scf.scr.sct" & _ 
     ".shb.shs.ps1.ps1xml.ps2.ps2xml.psc1.psc2.tmp.url.vb.vbe.vbs.vsmacros.vsw" & _ 
     ".ws.wsc.wsf.wsh.xnk." 

    file = Application.GetOpenFilename(MultiSelect:=True, Title:="Select the files you want to zip") 
    If IsArray(file) = True Then 
      'Create empty Zip File 
     ReDim Data(1 To UBound(file)) 
     ReDim excludedFile(1 To UBound(file)) 

     efCount = 0 
     ' filter the list 
     For j = LBound(file) To UBound(file) 
      ext = LCase(Mid(file(j), InStrRev(file(j), "."))) 
      If InStr(1, exts, ext & ".") = 0 Then ' if not blacklisted 
       count = count + 1 
       Data(count) = file(j) 
      Else 
       excludedFile(efCount + 1) = Dir(file(j)) 
       efCount = efCount + 1 
      End If 
     Next 
     found = efCount > 0 
    End If 
    ReDim Preserve Data(1 To count) 
    ReDim Preserve excludedFile(1 To efCount) 

    file = Data 
1

Вы можете использовать функцию для удаления определенного значения из массива. Поместите это в свой проект:

Function DeleteElement(x As String, ByRef List() As String) ' As String 
    Dim i As Integer, el As Integer 
    Dim Result() As String 

    ReDim Result(UBound(List) - 1) 

    For i = 0 To UBound(List) 
     If x = List(i) Then 
      el = i 
      Exit For 
     End If 
    Next i 

    For i = 0 To UBound(Result) 
     If i < el Then 
      Result(i) = List(i) 
     Else 
      Result(i) = List(i + 1) 
     End If 
    Next i 

    DeleteElement = Result 
End Function 

Вы можете использовать его как здесь:

Sub test2() 
    Dim arr1(3) As String 

    arr1(0) = "A" 
    arr1(1) = "B" 
    arr1(2) = "C" 
    arr1(3) = "D" 
    arr2 = DeleteElement("B", arr1) 

End Sub