Condividi:        

vb2012: "scandagliare" tutte le cartelle e i file di un albe

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

vb2012: "scandagliare" tutte le cartelle e i file di un albe

Postdi karug64 » 15/12/12 22:34

Salve a tutti.
Con visual basic 2012 dovrei eseguire una scansione di tutti i file presenti in tutte le cartelle e sottocartelle a partire da una cartella scelta dall'ultente.
Quindi se la struttura fosse: c:\test
sotto test presenti 3 file e due cartelle (test1 e test2)
In test1 ci sono 5 file
in test2 ci sono 10 file
Quindi, supponendo che l'utente scelga la cartella c:\test, il programma dovrebbe cercare tutti i file presenti e (per il momento) contarli (in seguito, per alcuni di questi verra effettuata una operazione): il risultato dovrebbe essere 18.

Sapreste indicarmi qualche routine da cui attingere per prendere spunto ?
Grazie
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Sponsor
 

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi PcBase » 15/12/12 23:46

Ciao

Codice in ThisWorkbook:
Option Explicit

Private Sub Workbook_Open()

Sheets("Results").Cells.ClearContents
[ask_for_subdirs] = "<scegli>"
[ask_for_pie] = "<scegli>"
[A2] = ""
Sheets("Start").Activate
[ask_for_subdirs].Select

End Sub

Codice in Foglio1:
Option Explicit

Private oFileSys As Object, nFiles As Long, nSubDirs As Long, ext_file As String, ir As Long

Sub select_directory()
Dim fd As FileDialog

Set fd = Application.FileDialog(4) ' msoFileDialogFolderPicker
If fd.Show = 0 Then Exit Sub
[A2] = fd.SelectedItems(1)

End Sub


Sub go()

If [A2] = "" Then
MsgBox "Non hai selezionato alcuna cartella da esaminare.", vbCritical + vbOKOnly, "Attenzione"
Exit Sub
End If
If [ask_for_subdirs] = "" Or [ask_for_subdirs] = "<scegli>" Then
MsgBox "Non hai deciso se esaminare o meno anche le sottocartelle.", vbCritical + vbOKOnly, "Attenzione"
Exit Sub
End If
If [ask_for_pie] = "" Or [ask_for_pie] = "<scegli>" Then
MsgBox "Non hai deciso se creare o no anche un grafico a torta sui dati.", vbCritical + vbOKOnly, "Attenzione"
Exit Sub
End If

Sheets("Results").Activate
Call create_report([A2])

Sheets("Results").[A1].Activate

If Sheets("Start").[ask_for_pie] = "Sì" Then
Call create_pie(Sheets("Results").Range("A" & ir + 1).CurrentRegion.Offset(2, 0).Resize(Sheets("Results").Range("A" & ir + 1).CurrentRegion.Rows.Count - 2))
End If

MsgBox "Ho terminato.", vbInformation + vbOKOnly, "Finito!"

End Sub


Private Sub create_report(source As String)
Dim i As Long, j As Long, v As Variant, ext As Variant, c As Collection

Set oFileSys = CreateObject("Scripting.FileSystemObject")

Sheets("Results").[A:B].Clear

nFiles = 0
nSubDirs = 0
ext_file = ""

GetDir source, i

With Sheets("Results")
.Cells(i + 2, 1) = "Totale " & nFiles & " files in " & nSubDirs & " subdirectory."
.Cells(i + 2, 1).Font.Bold = True
.Cells(i + 2, 1).Font.ColorIndex = 5
.Cells(i + 3, 1) = "Statistiche sui singoli files:"
.Cells(i + 3, 1).Font.Italic = True
End With

ext_file = Replace(ext_file & "@", ";@", "")
v = Split(ext_file, ";")
j = i + 3

ir = j 'da qui inizia il range dei valori da "tortizzare"

Set c = New Collection
Set c = duplicates(v)

For Each ext In c
j = j + 1
Sheets("Results").Cells(j, 1) = ext
Sheets("Results").Cells(j, 2) = count_occurrences(v, CStr(ext))
Next

End Sub

Private Function GetDir(dir, i As Long) As Long
Dim oFolder As Object, oFolders As Object, oFiles As Object, oFold As Object, oFile As Object

Set oFolder = oFileSys.GetFolder(dir)
Set oFolders = oFolder.SubFolders
Set oFiles = oFolder.Files

If i = 0 Then
i = i + 1
nSubDirs = nSubDirs + 1
Sheets("Results").Cells(i, 1) = oFolder.Path
Sheets("Results").Cells(i, 1).Font.Bold = 1
End If

On Error GoTo gest_err

For Each oFile In oFiles
i = i + 1
If i > Rows.Count Then MsgBox "Limite del foglio raggiunto!": Exit Function

Sheets("Results").Cells(i, 2) = oFile.Name
nFiles = nFiles + 1
If InStrRev(oFile, ".") = 0 Then
ext_file = ext_file & "<nessuna estensione>" & ";"
Else
ext_file = ext_file & Mid(oFile, InStrRev(oFile, ".") + 1) & ";"
End If
Next

If Sheets("Start").[ask_for_subdirs] = "Sì" Then
For Each oFold In oFolders
i = i + 1
If i > Rows.Count Then MsgBox "Limite del foglio raggiunto!": Exit Function

nSubDirs = nSubDirs + 1
Sheets("Results").Cells(i, 1) = oFold.Path & "\" & oFold.Name
Sheets("Results").Cells(i, 1).Font.Bold = 1
GetDir oFold, i
Next
End If

Exit Function

gest_err:
If Err.Number = 70 Then Resume Next

End Function


Private Sub create_pie(r As Range)

r.Select
Charts.Add
With ActiveChart
.ChartType = xlPie
.SetSourceData source:=r, PlotBy:=xlColumns
.Location Where:=xlLocationAsNewSheet
.HasTitle = True
.ChartTitle.Characters.Text = "Cartella " & Sheets("Start").[A2] & vbLf & IIf(Sheets("Start").[ask_for_subdirs] = "Sì", "con sottocartelle", "senza sottocartelle")
.ChartTitle.Font.Size = 10

With ActiveChart.SeriesCollection(1)
.ApplyDataLabels AutoText:=True, LegendKey:= _
False, HasLeaderLines:=True, ShowSeriesName:=False, ShowCategoryName:= _
False, ShowValue:=True, ShowPercentage:=True, ShowBubbleSize:=False

With .DataLabels
.AutoScaleFont = True
.NumberFormat = "0.00%"

With .Font
.Name = "Calibri"
.FontStyle = "Normale"
.Size = 8
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
.Background = xlAutomatic
End With
End With
End With
End With

End Sub


Private Function count_occurrences(vettore As Variant, search As String)
Dim s As String

s = Join(vettore, vbNullChar) & vbNullChar
s = LCase(s)
search = LCase(search)
count_occurrences = Len(Replace(s, search & vbNullChar, search & vbNullChar & "*")) - Len(s)

End Function


Private Function duplicates(vettore As Variant) As Collection
Dim v As Variant, dups As Collection

Set dups = New Collection

On Error Resume Next

For Each v In vettore
dups.Add CStr(v), v
Next

On Error GoTo 0
Set duplicates = dups

End Function

segue esempio:
http://www.sendspace.com/file/mo4ivn
Windows xp + Office 2003 Ita
Windows8 Office 2013
PcBase
Utente Senior
 
Post: 143
Iscritto il: 24/02/11 23:26

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi karug64 » 16/12/12 00:05

Ciao, Pcbase.
Cortesissimo ad aver postato questo codice.
Ma, sicuramente mi sono spiegato male ...
Il codice da te postato e' scritto in vba, giusto ?
Quindi va usato all'interno di un foglio excel , giusto ?

A me servirebbe il codice VB da inserire in un programma exe.
Spero do essermi spiegato meglio.

Magari vedo se si puo' adattare, ma immagino sia difficile.....

Grazie, comunque.

Ciao
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi Flash30005 » 16/12/12 00:12

Scegliere la cartella?
con il tasto destro del mouse (menu contestuale) andrebbe bene?
se si scarica questo archivio composto da 3 file
file .cmd e file .xls da inserire nella root di C:\
mentre il file .reg lo puoi mettere dove vuoi ma devi avviarlo (con doppio click)
e confermare con ok
aggiunge una voce nel registro di windows che ti permette di avere nel menu contestuale la voce
"Conta File"
selezionandola si aprirà excel che con un messaggio (per il momento) ti indicherà quanti file sono contenuti nella cartella e sottocartella selezionata dal mouse al momento della scelta

Download file necessari

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi karug64 » 16/12/12 00:29

Ragazzi grazie di cuore. Le soluzioni proposte funzionano perfettamente.

Come spiegavo poco su, a me servirebbe un codice da utilizzare all'interno di un progetto fatto con visual basic 2012 che avrebbe il suo completamento con quanto richiesto nell'altro post: vb2012: modificare password a file xls,doc,pdf

Il programma a cui sto lavorando, infatti, dovrebbe scandagliare tutti i file presenti nelle cartelle e sottocartelle, verificare se ci sono file excel , word o pdf. Se li trova, dovrebbe modificarne la password (che io gia' conosco per tutti) e risalvarli (ammesso che si possa fare !!!).

Quindi, le soluzioni proposte, seppur efficaci e valide, non mi permettono di risolvere il problema.

Grazie
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi PcBase » 16/12/12 00:46

Ciao

Citazione: Ragazzi grazie di cuore. Le soluzioni proposte funzionano perfettamente.

Come spiegavo poco su, a me servirebbe un codice da utilizzare all'interno di un progetto fatto con visual basic 2012 che avrebbe il suo completamento con quanto richiesto nell'altro post: vb2012: modificare password a file xls,doc,pdf


Per quanto riguarda la modifica dei file xls,doc si dovreppe poter tramite comandi Vbs. (Visual Basic Script)
Allego alcuni esempi di comando:
Con la seguente istruzione:
Shell ("WScript.exe C:\DATI\Test.VBS")
Esegue il comando Vbs

Per i contenuti all'interno del file Vbs puoi prendere spunto dagli esempi che allego come demo.
http://www.sendspace.com/file/pfh4qn

Un esempio
Windows xp + Office 2003 Ita
Windows8 Office 2013
PcBase
Utente Senior
 
Post: 143
Iscritto il: 24/02/11 23:26

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi Flash30005 » 16/12/12 01:26

Ti passo un'altra parte di soluzione
se hai usato già il precedente file .reg (aggiunta voce registro)
puoi inserire questi due file nella root di C:\
(uno verrà sostituito)
poi userai sempre il menu contestuale (che come dici non ti serve ma è solo uno spunto...)
vedi cosa fa lo script che ti invio
download file

ciao

Edit ore 1:40 - modifica riga nel file .vbs
sostituire con questa
Codice: Seleziona tutto
for i=0 to ubound(riga)   -1
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi karug64 » 16/12/12 01:41

Flash30005 ha scritto:Ti passo un'altra parte di soluzione
se hai usato già il precedente file .reg (aggiunta voce registro)
puoi inserire questi due file nella root di C:\
(uno verrà sostituito)
poi userai sempre il menu contestuale (che come dici non ti serve ma è solo uno spunto...)
vedi cosa fa lo script che ti invio
download file

ciao


Ottengo questo errore:
nella finestra di dos che si apre c'e' scritto "accesso negato" e poi ho questo errore:
script:c\contarighe.vbs
riga:7
carattere:1
Errore:impossibile trovare il file
codice:800a0035
origine:Errore di run-time di microsoft vbscript

P.S.: win7
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi Flash30005 » 16/12/12 01:49

Se nella root di c:\
non hai il file dir.txt
generato dal file "ContaFile.cmd" sempre nella root
il file .vbs va in errore.

Ripeto devi inserire i due ultimi file inviati
"ContaFile.cmd" e "ContaRighe.vbs" nella Root di C:\
e aver avviato il file "ContaFile.reg" almeno una volta (crea la voce nel menu contestuale: tasto destro mouse "Conta Righe")
ti porti su una cartella (con pochi file e non sulla root di C:\)
e selezioni questa voce
Inizialmente si apre una finestra nera (dos) poi si apre una finestra di IE con l'elenco dei file trovati e numerati in ordine crescente es.:
0001: C:\Temp\Pippo.xls
0002: C:\Temp\Mia\Documento.txt
etc
etc

ciao

P.s. agisici come amministratore nel tuo sistema?
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi karug64 » 16/12/12 02:05

Flash30005 ha scritto:Se nella root di c:\
non hai il file dir.txt
generato dal file "ContaFile.cmd" sempre nella root
il file .vbs va in errore.

Ripeto devi inserire i due ultimi file inviati
"ContaFile.cmd" e "ContaRighe.vbs" nella Root di C:\
e aver avviato il file "ContaFile.reg" almeno una volta (crea la voce nel menu contestuale: tasto destro mouse "Conta Righe")
ti porti su una cartella (con pochi file e non sulla root di C:\)
e selezioni questa voce
Inizialmente si apre una finestra nera (dos) poi si apre una finestra di IE con l'elenco dei file trovati e numerati in ordine crescente es.:
0001: C:\Temp\Pippo.xls
0002: C:\Temp\Mia\Documento.txt
etc
etc

ciao

P.s. agisici come amministratore nel tuo sistema?


Fatto quello che mi hai detto.
Nella finestra di dos appare la scritta "accesso negato" e poi l'errore di cui al post precedente.

Si. Sono l'unico utente del sistema ( e quindi amministratore, almeno immagino - Sono passato a win7 solo da una settimana ....)

Per il momento notte. Eventualmente, sempre se siete disponibili, si continua domani.
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi Flash30005 » 16/12/12 02:11

é chiaro che il SO non ti fa avviare un programma (il ContaFile.cmd)
allora devi andare sul file che è sulla root e con tasto destro Propiretà impostare nella scheda compatibilità
mettere la spunta su Livello di Privilegio "Esegui questo programma come amministratore"
Per ora dovresti risolvere ma sappi che se non imposti questo nel pannello di controllo avrai, nel tempo, vari problemi di funzionamento programmi con windows7

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi karug64 » 17/12/12 07:49

Salve. Purtroppo ho dovuto alzare bandiera bianca. Sul mio pc non c'é verso di scrivere un file su c:\. Ho provato di tutto (quello che so fare ovviamente) ma niente. Quindi ottengo sempre "accesso negato" e l'errore evidenziato. Grazie lo stesso. Alla prossima.
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi Flash30005 » 17/12/12 07:59

Ma se vai sulle proprietà di C:\ (con tasto destro)
e, quindi, su scheda sicurezza
l'amministratore ha tutte le opzioni, (Controllo Completo)?
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi karug64 » 17/12/12 23:33

Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Re: vb2012: "scandagliare" tutte le cartelle e i file di un

Postdi Flash30005 » 18/12/12 08:55

Allora prova a modificare il file dal nome "ContaFile.cmd" che è in C:\
con queste righe
Codice: Seleziona tutto
dir %1 /s/b /O:GN > C:\Temp\dir.txt
WScript.exe "C:\ContaRighe.vbs"

e poi modifica anche
ContaRighe.Vbs
inserendo la directory
Codice: Seleziona tutto
path = "C:\Temp\Dir.txt"

Salvi i file lasciandoli sempre i due file nella root
mentre dir.txt andrà in C:\Temp\
La directory Temp dovrebbe essere una directory non di sistema e darti la possibilità di scriverci

fai sapere
ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-


Torna a Applicazioni Office Windows


Topic correlati a "vb2012: "scandagliare" tutte le cartelle e i file di un albe":


Chi c’è in linea

Visitano il forum: Nessuno e 39 ospiti