Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di TheOne
    Registrato dal
    Aug 2002
    Messaggi
    23

    [VBA] ricercare files in una directory

    Salve,
    farò mille volte al giorno la stessa operazione: devo cercare in una sola directory soltanto dei file il cui nome contenga una o parte di una parola. Mi spiego: io cerco sempre nelal directory c:\ale e di volta in volta ho bisogno di trovare tutti i file che stanno li dentro e che nel loro nome contengono magari la parola"istruz" che dovrebbe restituirmi l'elenco comprendente per esempio "istruzioni casa.doc", "istruzione ufficio.doc" etc
    Attualmente lo faccio con la ricerca di Windows ma capite che è davvero lunghissimo: tutte le volte devo impostare la ricerca in quelal cartella precisa.

    Purtroppo, al di là del msgbox, non so molto altro di VBA.
    Qualcuno ha già realizzato un programmino semplice per questo tipo di ricerca?
    So che sono poche righe di codice...

    Grazie a chi mi potrà aiutare.

  2. #2
    Ciao,
    tempo fa avevo fatto qualcosa che potrebbe aiutarti, va solo un po' adattato.
    Non è VBA ma VBS quindi non gira all'interno delle applicazioni office ma nel browser IE (solo in quello).
    Per cominciare a provarlo crea in una cartella qualsiasi un file di nome Estrattore.txt, mettici dentro il codice che ti passo più avanti, salvalo e rinominalo come Estrattore.htm.
    Fatto questo aprilo con IE (se è il browser predefinito basta cliccarci sopra altrimenti "apri con..."), rispondi di sì agli avvisi di sicurezza e poi scrivi, nella casellina che ti apparirà, il nome di un file che non esiste per esempio lista.txt.
    Alla fine dell'elaborazione nella cartella troverai il nuovo file lista.txt contenente il nome di tutti i file presenti nella cartella.

    Questo era il funzionamento originale che si può facilmente adattare alla tua esigenza specifica, vidi se ci riesci da solo, altrimenti chiedi pure, comunque più giù ti spiego a grandi linee come funziona:

    codice:
    <html>
    <head>
    <title>estrattore di nomi file</title>
    </head>
    <body>
    <script language="vbscript">
    
    '----------------------------------------------------------------------------------------------
    
       Option Explicit
    
       Dim Nome_File, Nome_Cartella, FSO, ActualPath, FDN, FOL, Elemento, NomeInput
    
       ActualPath        = Replace(Left(Replace(Document.Url, "file://", ""), InStrRev(Replace(Document.Url, "file://", ""), "\")), "%20", " ")
       NomeInput         = InputBox("Nome del file in cui scrivere la lista dei file di questa cartella")
       Nome_File         = ActualPath & NomeInput
       Nome_Cartella     = Left(ActualPath, (Len(ActualPath) - 1))
    
       Set FSO = CreateObject("Scripting.FileSystemObject")
       Set FDN = FSO.CreateTextFile(Nome_File,true)
       Set FOL = FSO.GetFolder(Nome_Cartella)
    
       For Each Elemento in FOL.files
          If Elemento.name <> NomeInput           AND _
             Elemento.name <> "Estrattore.htm"    AND _
             Elemento.name <> "Thumbs.db"             _
          Then
             FDN.Writeline Elemento.name
          End If
       Next
    
       Set FOL = Nothing
       FDN.Close
       Set FDN = Nothing
    
       MsgBox "FINITO"
    
    '----------------------------------------------------------------------------------------------
    
    </script>
    </body>
    </html>
    La option explicit obbliga a definire nella dim tutte le variabili che si usano (sostanzialmente serve a evitare di sbagliare a digitare i nomi delle variabili).

    Nella dim devi mettere tutte le variabili che userai.

    ActualPath viene impostato col percorso della cartella in cui si trova lo script perché è di quella cartella che si andrà a fare la lista dei file. Nel funzionamento originale infatti era previsto che il file estrattore.htm venisse inserito nella cartella di cui ottenere la lista, nel tuo caso, se ti è più comodo puoi impostarlo in modo fisso con la cartella in cui cercare.

    NomeInput riceve il nome "lista.txt" digitato nella input box.

    Su Nome_File e Nome_Cartella credo non ci sia nulla da dire.

    Le tre istruzioni seguenti creano le istanze degli oggetti necessari ad accedere alla cartella.

    C'è poi il ciclo For Each che esplora tutta la cartella e scrive nel file il nome dei file trovati escludendo però i nomi Estrattore.htm e Thumbs.db (un file di sistema presente in xp nelle cartelle di immagini).

    E poi operazioni di chiusura ed msgbox. Tutto qui.

    Non credo che sia difficile adattarlo, si tratterà di impostare i percorsi in modo fisso, di richiedere con inputbox la stringa da cercare e poco altro.
    Ciao
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  3. #3
    Utente di HTML.it L'avatar di TheOne
    Registrato dal
    Aug 2002
    Messaggi
    23
    ti ringrazio moltissimo ma purtroppo se so poco di VBA so proprio zero di VBS.

    Vediamo se ci aiuta ancora qualcuno.

    Grazie.

  4. #4
    Mmmmh
    Potresti usare un ciclo del genere :
    codice:
    dim FSO as new FileSystemObject
    Dim folder As folder
    Dim myfile2 As File
    Set folder = FSO.GetFolder("C:\Programmi") ' metti la cartella che ti serve poi, potresti usare 'anche una TextBox per impostare il nome della cartella
    For Each myfile2 In folder
         If InStr(myfile2.ShortName, "stringa che devecomprarire") then
            ListBox1.AddItemmyfile2.ShortName
        end if
        Next
    Così ti restituisce nella listbox tutti i file contenenti la stringa "stringa che deve comprarire"
    Cosa importante: devi impostare nei riferimenti (Strumenti > Riferimenti...) la libreria "Microsoft Scripting Runtime"

    ciao!

  5. #5
    Utente di HTML.it L'avatar di TheOne
    Registrato dal
    Aug 2002
    Messaggi
    23
    ringrazio anche cepu ma strumenti/riferimenti nel mio Visual Basic Express 2008 non c'è.
    Il codice mi da nove errori...

  6. #6
    Ma scusa eh hai detto che usavi VBA

  7. #7
    Utente di HTML.it L'avatar di TheOne
    Registrato dal
    Aug 2002
    Messaggi
    23
    ops... visual basic non è VBA ?
    scusate la confuzione ma io sono solo in grado di modificare qualche parametro quando faccio le macro di excel poi vado su visual basic e modifico qualcosina li, oppure faccio delel msgbox con visual basic express 2008... questo è il massimo che, al momento, so fare, purtroppo...

    Nel tuo codice ovviamente so personalizzare l'indirizzo della cartella, la form, etc ma non so impostare variabili, codice, o riferimenti (di cui non ho mai sentito) :-(

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,462
    Originariamente inviato da TheOne
    ops... visual basic non è VBA ?
    VBA è Visual Basic for Application, ed è il linguaggio integrato in Office (e altri software) che ne consente in generale l'automazione.

    Controlla che versione stai utilizzando e dacci una conferma in proposito.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Già
    Comunque se sei a un livello così basso è meglio che imapri ancora qualcosina, altrimenti non riuscirai mai a fare niente
    Prova a guardare questa guida, è per Visual basic 2005 ma va bene anche per il 2008

    ciao

  10. #10
    Utente di HTML.it L'avatar di TheOne
    Registrato dal
    Aug 2002
    Messaggi
    23
    Grazie mod per la precisazione, grazie cepu per l'invito ad imparare (la mia è un'esigenza direi piuttosto unica e soprattutto urgente, sicchè coglierò il tuo invito in un secondo tempo).
    Intanto sbattendomi un po' ho trovato questo codice che mi apre Visual Studio 2010, lo lancio e fa esattamente quello che vorrei. GRANDE!!!!
    Avrei però bisogno una mano per apportare una modifica credo per voi molto veloci:
    1) nella finestra dove compaiono i risultati della ricerca, facendo doppio click, purtroppo, non si apre il file, il che rende la mia ricerca inutile. Tenete presente che sono tutti file di world: è possibile impostare il codice in modo che al doppio click sul file in elenco a seguito di ricerca me lo apra?

    Ecco codice:
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.IO;
    using System.Threading;

    namespace Search
    {
    /// <summary>
    /// Descrizione di riepilogo per Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
    Thread t;
    delegate void PathSearch(string t);
    delegate void FindResult(string t);
    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.Label label1;
    private System.Windows.Forms.ListBox l;
    private System.Windows.Forms.StatusBar st;
    private System.Windows.Forms.Label label2;
    private System.Windows.Forms.TextBox t2;
    private System.Windows.Forms.TextBox t1;
    /// <summary>
    /// Variabile di progettazione necessaria.
    /// </summary>
    private System.ComponentModel.Container components = null;

    public Form1()
    {
    //
    // Necessario per il supporto di Progettazione Windows Form
    //
    InitializeComponent();

    //
    // TODO: aggiungere il codice del costruttore dopo la chiamata a InitializeComponent
    //
    }

    /// <summary>
    /// Pulire le risorse in uso.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if (components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    }

    #region Codice generato da Progettazione Windows Form
    /// <summary>
    /// Metodo necessario per il supporto della finestra di progettazione. Non modificare
    /// il contenuto del metodo con l'editor di codice.
    /// </summary>
    private void InitializeComponent()
    {
    this.l = new System.Windows.Forms.ListBox();
    this.st = new System.Windows.Forms.StatusBar();
    this.button1 = new System.Windows.Forms.Button();
    this.t2 = new System.Windows.Forms.TextBox();
    this.label1 = new System.Windows.Forms.Label();
    this.label2 = new System.Windows.Forms.Label();
    this.t1 = new System.Windows.Forms.TextBox();
    this.SuspendLayout();
    //
    // l
    //
    this.l.ItemHeight = 24;
    this.l.Location = new System.Drawing.Point(11, 12);
    this.l.Name = "l";
    this.l.Size = new System.Drawing.Size(672, 196);
    this.l.TabIndex = 0;
    //
    // st
    //
    this.st.Location = new System.Drawing.Point(0, 352);
    this.st.Name = "st";
    this.st.Size = new System.Drawing.Size(783, 31);
    this.st.SizingGrip = false;
    this.st.TabIndex = 1;
    this.st.Text = "Pronto.";
    //
    // button1
    //
    this.button1.Location = new System.Drawing.Point(480, 334);
    this.button1.Name = "button1";
    this.button1.Size = new System.Drawing.Size(203, 33);
    this.button1.TabIndex = 2;
    this.button1.Text = "Ricerca";
    this.button1.Click += new System.EventHandler(this.button1_Click);
    //
    // t2
    //
    this.t2.Location = new System.Drawing.Point(11, 334);
    this.t2.Name = "t2";
    this.t2.Size = new System.Drawing.Size(458, 30);
    this.t2.TabIndex = 3;
    this.t2.Text = "J:\\Articoli, scritti, risposte che ho fornito";
    //
    // label1
    //
    this.label1.Location = new System.Drawing.Point(11, 310);
    this.label1.Name = "label1";
    this.label1.Size = new System.Drawing.Size(469, 24);
    this.label1.TabIndex = 4;
    this.label1.Text = "Unità/Percorsi dove ricercare il file, char che separa i vari path ;";
    //
    // label2
    //
    this.label2.Location = new System.Drawing.Point(11, 264);
    this.label2.Name = "label2";
    this.label2.Size = new System.Drawing.Size(133, 35);
    this.label2.TabIndex = 5;
    this.label2.Text = "File da ricercare:";
    this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
    //
    // t1
    //
    this.t1.Location = new System.Drawing.Point(149, 264);
    this.t1.Name = "t1";
    this.t1.Size = new System.Drawing.Size(534, 30);
    this.t1.TabIndex = 6;
    //
    // Form1
    //
    this.AutoScaleBaseSize = new System.Drawing.Size(8, 23);
    this.ClientSize = new System.Drawing.Size(783, 383);
    this.Controls.Add(this.t1);
    this.Controls.Add(this.label2);
    this.Controls.Add(this.label1);
    this.Controls.Add(this.t2);
    this.Controls.Add(this.button1);
    this.Controls.Add(this.st);
    this.Controls.Add(this.l);
    this.Font = new System.Drawing.Font("Comic Sans MS", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
    this.MaximizeBox = false;
    this.Name = "Form1";
    this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScree n;
    this.Text = "Search File by Dokkis";
    this.ResumeLayout(false);
    this.PerformLayout();

    }
    #endregion

    /// <summary>
    /// Il punto di ingresso principale dell'applicazione.
    /// </summary>
    [STAThread]
    static void Main()
    {
    Application.Run(new Form1());
    }
    public void Cerca(string path)
    {
    try
    {
    string[] dirs1 = Directory.GetDirectories(@path);
    string[] dirs2 = Directory.GetFiles(@path);
    foreach (string dir in dirs2)
    {
    string[] a = dir.Split('\\');
    string sdir=a[a.Length-1];
    if(sdir.ToLower().IndexOf(t1.Text.ToLower())!=-1)
    FR(dir);
    }
    foreach (string dir in dirs1)
    {
    string[] a = dir.Split('\\');
    string sdir=a[a.Length-1];
    if(sdir.ToLower().IndexOf(t1.Text.ToLower())!=-1)
    FR(dir);
    PS(dir);
    Cerca(dir);
    }
    }
    catch{}
    }
    void PS(string t)
    {
    PathSearch ps = new PathSearch(PSearch);
    st.BeginInvoke(ps,new object[]{t});
    }

    void FR(string t)
    {
    FindResult fr = new FindResult(FResult);
    l.BeginInvoke(fr,new object[]{t});
    }
    void PSearch(string t)
    {
    st.Text=t;
    }
    void FResult(string t)
    {
    l.Items.Add(t);
    }


    private void button1_Click(object sender, System.EventArgs e)
    {
    if(button1.Text=="Ricerca")
    {
    if(t1.Text!="" && t2.Text!="")
    {
    Ricerca();
    }
    else
    {
    MessageBox.Show("Completa tutti i campi!","Errore");
    }
    }
    else
    StoppaRicerca();
    }
    void Ricerca()
    {
    l.Items.Clear();
    if(t!=null)
    t.Abort();
    t = new Thread(new ThreadStart(IniziaRicerca));
    t.Start();
    button1.Text="Stoppa ricerca";
    TEnabled(false);
    }
    void IniziaRicerca()
    {
    string[] a = t2.Text.Split(';');
    foreach(string search in a)
    {
    Cerca(search);
    }
    MessageBox.Show("FINITO!");
    StoppaRicerca();
    }
    void StoppaRicerca()
    {
    button1.Text="Ricerca";
    TEnabled(true);
    st.Text="Pronto.";
    if(t!=null)
    t.Abort();
    }
    void TEnabled(bool b)
    {
    t1.Enabled=b;
    t2.Enabled=b;
    }
    }
    }

    La form poi me la modifico come mi piace, quello dovrei essere in grado.

    Ultima cosa: come faccio per renderlo eseguibile (.exe). Ho provato a fare compila e va a buon fine ma dove cacchio è il file???

    Grazie davvero a tutti.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.