autocompilazione



  • auto-compilazione
    di fabiogiallo (utente non iscritto) data: 27/02/2013 12:18:55

    Non sono pratico di vba, per questo vorrei chiedere il vostro aiuto.
    In allegato c'è un file riportato in esempio.
    Vorrei che il nome "a" riportato in tabella sia cercato in una data cella (la prima nell'esempio) di tutti i fogli della cartella di lavoro, e, qualora lo trovi, copi da quel foglio una determinata cella (solo il valore)(in giallo nel caso di "a") per incollarla in corrispondenza della tabella in una cella da me stabilita in precedenza (solo il valore).
    Spero di essere riuscito a spiegarmi e spero mi possiate aiutare.
    Grazie anticipatamente.



  • di HarryBosch data: 27/02/2013 19:21:06

    Ciao Fabio
    prova la routine qua sotto.
    In sostanza, ricerca il valore che si trova nella cella A4 del foglio1 in tutti gli altri fogli (escluso il foglio1). La ricerca viene effettuata nella cella A1 e se il valore corrisponde, la cella D16 viene riportata (solo il valore) nella cella D4.

    Dovresti riuscire ad adattarlo facilmente. Se la ricerca deve essere eseguita per ogni valore lungo la colonna A, ti servirà un ciclo che passi tutti i valori della colonna.
    Eventualmente puoi provare a impostarlo che poi lo vediamo.
     
    Sub riporta()
        Dim X As String
        Dim ws As Worksheet
    
        With Sheets("Foglio1")
           'valore da cercare
            X = .[a4]
           
    'passo ogni foglio...
            For Each ws In Worksheets
            '...diverso dal foglio1
                If ws.Name <> "Foglio1" Then
                   'se trovo la corrispondenza...
                    If ws.[a1] = X Then
                          '...riporto il valore
                        .[d4] = ws.[d16]
                        Exit For
                    End If
                End If
                
            Next
        End With
    End Sub
    



  • di fabiogiallo (utente non iscritto) data: 28/02/2013 15:51:13

    ok lo provo e ti faccio sapere, grazie!



  • di fabiogiallo (utente non iscritto) data: 05/03/2013 12:19:16

    Ottimo, il tuo script funziona perfettamente, grazie.
    Ma se il nome "a" della tabella da ricercare nei fogli si trovasse in un file diverso?

    Inoltre volevo chiederti come si esprime in VBA la classica funzione cerca.orizzontale di excel, considerando sempre che la casella da ricercare si trova in un file e la tabella in cui cercare si trova in un altro file?
    grazie.



  • di HarryBosch data: 05/03/2013 13:07:10

    Per cercare un dato in un file diverso da quello aperto, ci sono vari modi. Tra l'altro non è nemmeno necessario aprire il file dove effettuare la ricerca.
    Il cerca.orizzontale si può impostare utilizzando il metodo FIND, la cui sintassi è:
    intervallo.FIND(valore)
    - intervallo sarà la riga di ricerca, nel foglio chiuso
    - valore sarà appunto quello che stiamo cercando

    AL momento, ti mostro un'utilissima funzione impostata dal nostro VecchioFrac che permette appunto di leggere ecuperare dati da un file chiuso.

    Appena ho un attimo possiamo fare un esempio, giusto per capire meglio; sempre se nel frattempo non ti va di fare qualche tentativo pratico e vederlo poi assieme.
     
    Function read_closed(filename)
    Dim app As New Excel.Application, wbk As Excel.Workbook  
    'apre il file ma non lo rende visibile  
        Set wbk = app.Workbooks.Add(filename)
        '----------------------------------------------------------------
        ' Le operazioni col file cominciano qui
        MsgBox "Cell A1 = " & wbk.Worksheets("foglio1").[a1]
        ' e finiscono qui
        wbk.Close SaveChanges:=False
        app.Quit
        Set app = Nothing
        '----------------------------------------------------------------
    End Function
    


  • dubbio
    di fabiogiallo (utente non iscritto) data: 07/03/2013 16:36:00

    su excel
    =CERCA.ORIZZ(A2;E9:T52;45;FALSO)
    dove A2 è la cella da cercare; E9:T52 è la matrice entro cui cercare (assodato che la cella A2 da cercare si trova sulla prima riga); 45 è la riga da cui restituire il valore.

    il codice che mi hai dato:
    intervallo.FIND(valore)
    come faccio a specificare la riga da cui restituire il valore?
    grazie.



  • di HarryBosch (utente non iscritto) data: 07/03/2013 18:58:54

    Detta così:
    "assodato che la cella A2 da cercare si trova sulla prima riga"
    potrebbe essere fuorviante.

    Assodato che
    il valore della cella A2 si trova sulla prima riga della matrice A9:T52
    allora possiamo cercare il terzo elemento. Che però nel tuo caso restituirebbe un errore perché hai indicato 45 che va oltre la matrice assegnata (visto che partiamo dalla riga 9); e l'ultima disponibile è la 52 (T52).

    L'ultima riga che si potrebbe cercare è la 44:
    =CERCA.ORIZZ(A2;E9:T52;44;FALSO)
    e il valore A2 si deve trovare lungo la riga 9

    Per un miglior dettaglio:
    h t t p://office.microsoft.com/it-it/excel-help/cerca-orizz-funzione-cerca-orizz-HP010342579.aspx

    Venendo alla funzione per il vba, potresti sfruttare il Find in questo modo:

    c = Rows(9).Find([a2]).Column

    dove questa istruzione troverà il valore presente nella cella A2, lungo tutta la riga 9 (ma puoi impostare qualsiasi intervallo, nel tuo caso sarebbe bastato Range("E9:T9")) e ti restituirà l'indice della colonna dove si trova tale valore... mentre l'indice della riga lo sai in partenza



  • di fabiogiallo (utente non iscritto) data: 11/03/2013 10:52:44

    ok grazie, ma tralasciando il cerca.orizz e tornando alla richiesta iniziale.
    Relativamente al codice sotto riportato, da voi suggerito, avviene che quando la condizione(1)
    If ws.[a1] = X Then
    non è verificata, la successiva operazione
    .[d4] = ws.[d16]
    mi riporta in .[d4] questo "/"
    ma quello che servirebbe a me è la cella vuota in caso di mancata corrispondenza della condizione(1)
    si può fare qualcosa?
    grazie.
     
    Sub riporta()
        Dim X As String
        Dim ws As Worksheet
    
        With Sheets("Foglio1")
           'valore da cercare
            X = .[a4]
           
    'passo ogni foglio...
            For Each ws In Worksheets
            '...diverso dal foglio1
                If ws.Name <> "Foglio1" Then
                   'se trovo la corrispondenza...
                    If ws.[a1] = X Then
                          '...riporto il valore
                        .[d4] = ws.[d16]
                        Exit For
                    End If
                End If
                
            Next
        End With
    End Sub



  • di Vecchio Frac data: 11/03/2013 11:27:01

    Questa modifica risulta leggermente più lenta della precedente versione ma rispetta la tua esigenza.
     
    Sub riporta()
        Dim X As String
        Dim ws As Worksheet
    
        With Sheets("Foglio1")
           'valore da cercare
            X = .[a4]
           'passo ogni foglio...
            For Each ws In Worksheets
                '...diverso dal foglio1, se trovo la corrispondenza riporto il valore 
                'altrimenti riporto una stringa vuota
                If ws.Name <> "Foglio1" Then .[D4] = IIf(ws.[A1] = X, ws.[D16], "")
            Next
        End With
    End Sub