Kopiranje datotek - optimizacija kode

Pomoč pri delu z MS Excelom
Odgovori
GoldZ
Prispevkov: 137
Pridružen: Če Sep 01, 2005 10:20 am

Kopiranje datotek - optimizacija kode

Odgovor Napisal/-a GoldZ »

Pozdravljeni!

Potreboval sem makro, ki pregleda datoteke v podani mapi. Če ime datoteke vsebuje določen niz, ustvari novo mapo in datoteke, ki ustrezajo pogoju, prekopira v njo.

Sestavil sem spodnji makro, ki deluje čisto OK. :D
Prisiljen pa sem bil uporabiti

Koda: Izberi vse

On Error Resume Next
a se mi ta rešitev ne zdi najlepša. :?

Uporabil pa sem jo zato, ker funkcija Find, če ne najde niza, javi napako.
Celotna koda:

Koda: Izberi vse

Sub PrekopirajDatoteke()
    Dim datoteka
    Dim MapaInput As String
    Dim sporocilo As String
    Dim iskano As String
    Dim sporocilo_o_iskanju As String
    
    sporocilo = "Vpiši mapo: "
    sporocilo_o_iskanju = "Kateri del imena datoteke iščem: "
    'vpisovanje mape in iskanega niza
    MapaInput = InputBox(sporocilo)
    iskano = InputBox(sporocilo_o_iskanju)
   
    datoteka = Dir(MapaInput & "\*.*")
    If datoteka = "" Then
        'Ce je mapa prazna
        MsgBox ("V mapi ni nobene datoteke!")
    Else
    stevec_kopiranih = 0
    stevec_najdenih = 0
    ' če mapa ni prazna
Do While datoteka <> ""
'če nastopi napaka, nadaljujemo z izvajanjem
        On Error Resume Next

        Dim ime
        ime = datoteka
        ' potrebujemo za preverjanja obstoja mape in kopiranje datoteke
        Set fs = CreateObject("Scripting.FileSystemObject")
             
        ' iščemo niz, ob napaki nadaljujemo
        najdeno = Application.WorksheetFunction.Find(iskano, ime)
        If Err.Number <> 1004 Then 'če številka napake ni 1004
            'zgradimo ime izvora in cilja kopiranja
            izvor = MapaInput & "\" & ime
            cilj = MapaInput & "\" & iskano & "\" '& ime
            ' če mapa še ni narejena
            If fs.folderexists(MapaInput & "\" & iskano) = False Then
                MkDir MapaInput & "\" & iskano 'jo naredimo
                
            End If
            'če datoteka že obstaja
            If fs.FileExists(cilj & ime) Then
                stevec_najdenih = stevec_najdenih + 1
            Else
                stevec_kopiranih = stevec_kopiranih + 1 'povečamo števec
                FileCopy izvor, cilj & ime
            End If

            'fs.CopyFile izvor, cilj, False 'kopiramo, ne prepišemo, če datoteka že obstaja
          
            datoteka = Dir() 'premik na naslednjo datoteko
            
            
       Else 'če je nastopila pričakovana napaka, gremo na naslednjo datoteko
            datoteka = Dir
            'MsgBox Err.Number

        End If
Loop
        End If
        ' končni izpisi
        If stevec_kopiranih = 0 Then
        MsgBox "Nobena datoteka ni bila kopirana!" & vbCrLf & _
        "Ali so prekopirane že vse datoteke, ali pa ne vsebujejo niza: " & iskano
        Else
        MsgBox "Število prekopiranih datotek: " & stevec_kopiranih & vbCrLf & _
        "Število najdenih v ciljni mapi pred kopiranjem: " & stevec_najdenih
        End If
        

End Sub
 
 
Pozna še kdo kakšen način iskanja v nizu, ki ne javi napake, če iskanega niza ni?
Življenje je enostavno, če poznaš "The Secret".
GoldZ
admin
Site Admin
Prispevkov: 3692
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Pozdravljeni,

Funkcija, ki jo iščete je instr.
lp,
Matjaž Prtenjak
Administrator
GoldZ
Prispevkov: 137
Pridružen: Če Sep 01, 2005 10:20 am

Odgovor Napisal/-a GoldZ »

Hvala! :D

Pa če je že nebi kdaj uporabil, se ne bi čudil... :wink:
Življenje je enostavno, če poznaš "The Secret".
GoldZ
Odgovori