trasponi



  • trasponi
    di claudio (utente non iscritto) data: 12/06/2016 10:54:30

    Sub TraspVal()

    Dim TR, Rig, Col
    Dim Valore
    Rig = 1
    Col = 2

    TR = Cells(Rows.Count, 1).End(xlUp).Row ''conta le righe
    For I = 1 To TR Step 1
    Valore = Cells(I, 1)
    Cells(Rig, Col) = Valore
    If Col = 13 Then ( 12 posizioni)
    Col = 1
    Rig = Rig + 1
    End If
    Col = Col + 1
    Next I
    End Sub

     
    Buongiorno, 
    ho un piccolo problema di trasposizione per un database, da verticale a orizzontale.
    La macro sopra riportata mi risolve parzialmente il problema, mi traspone i dati, partendo dalla colonna A1, io invece ho bisogno che li prenda dalla clonna B1; inoltre la trasposizione deva essere trascritta a partire dalla colonna R3, come si vede dal file allegato. (Il ciclo è di 12 posizioni)
    Le celle della colonna B1 hanno dei collegamenti con altre cartelle, che preferibilmente andrebbero mantenuti, se possibile.
    Quindi avrei bisogno di una piccola modifica della macro che purtroppo, per le mie scarse conoscenze di visual basic, non sono in grado di effettuare.
    Ringrazio anticipatamente per la Vs/ collaborazione e invio cordiali saluti.
    Claudio
     



  • di Marius44 data: 12/06/2016 11:17:35

    Ciao Claudio
    prova con la macro sottoriportata (che è la tua leggermente corretta e che puoi adattare alle 5000 e passa righe).

    Fai sapere. Ciao,
    Mario
     
    Sub ProvaTrasponi()
        Dim TR, Rig, Col
        Dim Valore
        Rig = 10
        Col = 18
    
        TR = Cells(Rows.Count, 2).End(xlUp).Row ''conta le righe
        For i = 1 To TR
            Cells(i, 2).Copy Destination:=Cells(Rig, Col)
            Col = Col + 1
            If Col > 29 Then Col = 18: Rig = Rig + 1
        Next i
    End Sub


  • trasponi
    di claudio (utente non iscritto) data: 12/06/2016 16:36:16

    Salve
    ringrazio per la risposta tempestiva.
    Ho provato la macro. La riga 10 deve diventare riga 3
    Copia i collegamenti, ma non la posizione della cella.
    La prima ad essere copiata è la cella B1, che andrà nella nuova posizione R3.
    Qui si legge il collegamento "='C:UsersUserDesktopdatabase A 5000 fogli[scheda database 1 - 1000 fogli con stampa.xlsm]RiepilogoDatabase'!R1"; quello giusto dovrebbe essere "='C:UsersUserDesktopdatabase A 5000 fogli[scheda database 1 - 1000 fogli con stampa.xlsm]RiepilogoDatabase'!B1", quindi il riferimento alla cella vecchia è sbagliato, per cui non copia il testo.
    Visto il tempo notevole che impiega a copiare il tutto, sarebbe una bella cosa che la macro copiasse dalla posizione 1 alla posizione 12000, che sono le righe della prima cartella. Poi seguiranno altre macro che partiranno dal 12001 al 24000 e così via, sempre naturalmente sullo stesso foglio.
    Fatta una le altre sono di conseguenza.
    Spero di essermi spiegato al meglio e, ringraziando, porgo cordiali saluti
    Claudio



  • di Marius44 data: 12/06/2016 17:55:00

    Ciao Claudio
    come puoi vedere si tratta della "tua" macro che ho leggermente corretto per non sovrascrivere i tuoi dati.
    In particolare tutto è legato alle due variabili Rig = 10 e Col = 18 dove Rig è il valore della riga dalla quale iniziare a scrivere e Col è il numero di colonna. Tutto il resto è un semplice copia/incolla.

    Ciao,
    Mario



  • di Raffaele_53 data: 12/06/2016 18:45:39

    Non ho capito bene la storia dei collegamenti
    EX B1 = ='C:UsersxxxxDocuments[minuti_secondi.xlsx]Foglio3'!$B1
    Se copio la cella B1 in R3, il collegamento rimane uguale
    non capisco cosa intendi ....RiepilogoDatabase'!R1" e quello giusto RiepilogoDatabase'!B1
    Forse perchè non hai messo simbolo $ davanti B1
    Questo comunque dovrebbe essere piu veloce
     
    Sub Trasponi2()
    Dim X, Ur, Rg
    Ur = Range("B" & Rows.Count).End(xlUp).Row
    Rg = 3
    For X = 1 To Ur
        Range("B" & X & ":B" & X + 11).Copy
        Cells(Rg, 18).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
        X = X + 11
        Rg = Rg + 1
    Next X
    MsgBox "fatto"
    End Sub


  • trasponi
    di claudio (utente non iscritto) data: 12/06/2016 19:30:26

    Grazie ancora per la tua sollecita risposta.
    Ti invio il file del riepilogo database dal quale puoi verificare che la sequenza funziona regolarmente fino alla riga 5000 circa poi si inceppa.
    Inoltre non compare il testo, che dovrebbe essere copiato dal collegamento.
    Sarebbe importante che la sequenza si fermasse alla riga 12000, che corrisponde al termine di una cartella.
    Spero che tu riesca a risolvere il problema, altrimenti va bene anche senza collegamenti. Vorrà dire che bisognerà fare un aggiornamento, al cambiamento dei dati di origine, con una certa frequenza.
    Basta che tutto proceda bene fino alla 12000 riga, riportando naturalmente il testo.
    Saluti e cordialità
    Claudio




  • di Raffaele_53 data: 12/06/2016 23:52:04

    Io non ho l'altro allegato, se lo vuoi spostare faccio una prova

    Comunque Non basta dire >>>poi si inceppa.
    Se ti appare un messaggio d'errore, premi debug (si apre l'editor e ti visualizza la riga gialla che produce l'errore)
    Se vai lentamente sopra la X ti dirà in quale riga è successo
    Ora vai a vedere in colonna B la riga e cerca di capire per quale motivo c'è l'errore, in pratica la X Ti fa vedere il cognome, mà siccome stai copiando 12 celle per volta devi controllarle tutte sino alla mail


  • modifica macro
    di claudio (utente non iscritto) data: 13/06/2016 09:01:29

    Scusami per la mia inesperienza, ma se tu vuoi gurdare il file che ti ho inviato, si vede chiaramente il punto in cui il programma si ferma, non si inceppa , come da me erroneamente detto in precedenza. dicendo che ha finito la trsposizione ed è la riga 1001.
    Sulla colonna B2 non vedo nessun problema per proseguire la lettura dei dati, anche perchè le altre macro usate,(quelle senza collegamenti), proseguivano regolarmente !!!
    Però, alla base di tutto, è che non riporta i dati inseriti in colonna B2, riporta solo i collegamenti .Questa è la prima sequenza di 12 righe compilate che partono da !B1 a !B12 ; vengono riportate Come !R1 ........R12 Perchè ?
    Gatti
    Pietro
    Bari
    14/10/1942
    Via piave, 12
    Bari
    Aoxxxxxx
    Aoxxxxxx
    Bari
    A123412341234123
    A123412341234123
    gattipietro@gmail.com
    Se non è possibile sistemare il collegamento, copiamoli almeno come testo e il problema è risolto.
    Non so cosa altro aggiungere, ma io non ho conoscenze approfondite come le vostre e quindi non sono in grado di risolvere il problema.
    Se volete darmi un aiuto, vi ringrazio ancora e vi saluto cordialmente.
    Claudio



  • di Raffaele_53 data: 13/06/2016 09:56:18

    Scusami, ripeto che se non ho l'allegato RiepilogoDatabase'!B1001, non posso avviare il codice
    Se io avvio la macro mi darà errore già dalla prima riga.

    Comunque forse ho capito, Tu avvii la macro e dopo un pò esce una maschera con scritto "fatto"
    Significa che ha finito di fare il suo lavoro e non che "il programma si ferma, non si inceppa"
    Naturale in colonna B ci sono 12.000 righe siccome copia 12 record alla volta, quando arriva 1002 ha terminato.
    12.000/12 = 1000 + 2 righe (righa1+riga2 vuote =1002)



  • di Raffaele_53 data: 13/06/2016 12:13:11

    Mi sono riletto il post
    >>>Forse perchè non hai messo simbolo $ davanti B1
    Anche se tasponi la formula in B1='C:UsersLelloAppDataLocalTempRar$DI36.781database A 5000 fogli[scheda database 1 - 1000 fogli con stampa.xlsm]RiepilogoDatabase'!B1
    diventerebbe in
    R3 ='C:UsersLelloAppDataLocalTempRar$DI36.781database A 5000 fogli[scheda database 1 - 1000 fogli con stampa.xlsm]RiepilogoDatabase'!R3

    Pertanto il riferimento cambia se non gli metti davanti il simbolo $
    Questo codice (non mio) mette il simbolo $ in colonna B, pertanto
    formula =............RiepilogoDatabase'!B1 diventa formula =............RiepilogoDatabase'!$B$1

    Su un file di prova esegui il codice sotto, controlla che siano stati inseriti i $
    Solo allora puoi traspore il tutto in colonna R 
     
    Sub MakeAbsolute()
    Dim C As Range, Ur
    Ur = Range("B" & Rows.Count).End(xlUp).Row
    For Each C In Range("B1:B" & Ur)
        If C.HasFormula Then
        C.Formula = Application.ConvertFormula(Formula:=C.Formula, fromReferenceStyle:=xlA1, toReferenceStyle:=xlA1, toabsolute:=xlAbsolute)
        End If
    Next
    End Sub


  • trasponi
    di claudio (utente non iscritto) data: 13/06/2016 17:51:17

    Grazie molto per il suggerimento di inserire nei collegamenti il valore assoluto della cella.
    Ho fatto una prova sul riepilogo di 60000 righe e tutto funziona alla perfezione.(vengono infatti cambiati tutti i collegamenti, da relativo in assoluto
    Visto che ci vuole molto tempo per l'operazione, volevo chiederti per cortesia, se, ogni volta che vado a cambiare dei dati dai vari fogli di origine, mi rimane impostato il valore assoluto nel riepilogo e quindi viene modificato solo il dato inserito nella cella.
    Chiedo inoltre se, con incolla collegamento, non è possibile già inserire il valore assoluto, mi sembra proprio di no!!!
    Grazie di tutto e complimenti per la soluzione proposta!!
    Adesso proverò l'altra macro, quella "trasponi 2", ma sono convinto che tutto funzionerà alla perfezione.
    Saluti cordiali
    Claudio




  • di Raffaele_53 data: 13/06/2016 20:27:52

    Certo che quando copy/incolli collegamento Ti da i riferimenti in assoluto
    Se Vai a cambiare dei dati dai vari fogli di origine, Ti visualizzarà quelli che hai inserito nuovi
    Se tagli/incolli una cella in nei vari fogli di origine, il collegamento da questa parte si aggiorna a dove hai copiato la cella (però non sò se questo file è chiuso)