Excel Forum Per condividere esperienze su Microsoft Excel

Salvataggio dati particolare

  • Messaggi
  • OFFLINE
    by sal
    Post: 7.246
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 07/05/2023 17:29
    ciao a tutti, come faccio a salvare dei dati, ma in modo particolare, diciamo che ho questa tabella



    come vedere è una semplice tabella non si sono formule o altro,

    ma vorrei salvare il tutto, non come copia incolla in un altra parte del foglio, devo salvare sullo stesso foglio, su un unica riga ed anche in un unica cella possibilmente, visto che il range non è grande e credo che i caratteri entrerebbero in una cella.

    un poco come un file CSV una stringa che conterrebbe tutti i dati del range, però poi dovrei poter fare anche il procedimento inverso cioè la stringa riportarla di nuovo in tabella.

    credete sia possibile?

    allego il file ma comunque non contiene niente, non so come iniziare a preparare qualcosa.
    perdonatemi cerco sempre di trovare cose impossibili

    Ciao By Sal (8-D
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    tanimon
    Post: 1.561
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 07/05/2023 19:27
    ciao Salvatore
    non so se ho capito, dai un'occhiata

    range(!a19") = valori in unica riga

    se va bene, vediamo di proseguire.
    Allego anche il file.

    ciao
    Frank
    vb
    Sub unica_riga()
    
    Dim arr() As Variant
    Dim r As Long, c As Long
    Dim stringa As String
    
    r = Range("A1", Range("A1").End(xlDown)).Cells.Count
    
    c = Range("A1", Range("A1").End(xlToRight)).Cells.Count
     
    ReDim arr(0 To r, 0 To c)
     
    For r = LBound(arr, 1) To UBound(arr, 1)
        For c = LBound(arr, 2) To UBound(arr, 2)
            If ActiveSheet.Range("A1").Offset(r, c) = "" Then
            Else
                stringa = stringa & ActiveSheet.Range("A1").Offset(r, c)
            End If
            ActiveSheet.Range("A19") = stringa
        Next c
    
    Next r
    End Sub
    







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    tanimon
    Post: 1.562
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 07/05/2023 22:39
    ciao Salvatore,

    spero di avere capito....
    l'allegato dovrebbe essere quello che hai chiesto.

    ciao
    Frank


    Questa la macro
    vb
    Sub unica_riga_tante_colonne()
    
    Dim arr() As Variant
    Dim r As Long, c As Long, d As Long, col As Long
    Dim stringa As String
    Dim sh As Worksheet
    
    '============================================
    'nel range A19 la stringa con tutti i valori
    ' in riga 20 i valori per colonna
    
    '============================================
    Set sh = ActiveSheet
    
    With sh
    
            r = Range("A1", Range("A1").End(xlDown)).Cells.Count
            
            c = Range("A1", Range("A1").End(xlToRight)).Cells.Count
             
            ReDim arr(0 To r, 0 To c)
            
             
            For r = LBound(arr, 1) To UBound(arr, 1)
                For c = LBound(arr, 2) To UBound(arr, 2)
                    
                    arr(r, c) = ActiveSheet.Range("A1").Offset(r, c)
                    If ActiveSheet.Range("A1").Offset(r, c) = "" Then
                    Else
                    
                        stringa = stringa & ActiveSheet.Range("A1").Offset(r, c)
                    End If
                    ActiveSheet.Range("A19") = stringa
                    
                Next c
              
            Next r
            
            col = 1
            
            For r = LBound(arr, 1) To UBound(arr, 1)
                For c = LBound(arr, 2) To UBound(arr, 2)
                
                    arr(r, c) = ActiveSheet.Range("A1").Offset(r, c)
                    
                    If ActiveSheet.Range("A1").Offset(r, c) = "" Then
                    Else
                    
                        Cells(20, col) = ActiveSheet.Range("A1").Offset(r, c)
                    End If
                    
                  col = col + 1
                Next c
             
            Next r
            
            For d = Range("A20", Range("A1").End(xlToRight)).Cells.Count To 1 Step -1
                
                If Cells(20, d).Value = "" Then
                    Cells(20, d).Delete Shift:=xlToLeft
                End If
                
            Next d
            
    End With
    Set sh = Nothing
    
    End Sub
    







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    Marius44
    Post: 1.111
    Registrato il: 24/06/2015
    Città: CATANIA
    Età: 80
    Utente Veteran
    Excel2019
    00 08/05/2023 07:28
    Salve a tutti

    @tanimon
    Frank, perchè utilizzi With sh ... End With ?
    Mi sembra che non sia necessario (e si potrebbe anche evitare di settare il foglio).

    Ciao,
    Mario
  • OFFLINE
    tanimon
    Post: 1.563
    Registrato il: 27/06/2011
    Utente Veteran
    excel 2007
    00 08/05/2023 07:36
    Ciao Mario,
    hai ragione ma non sapendo se nel file
    originale è presente un singolo foglio....
    ho preferito aggiungerlo.
    Ciao
    Frank







    Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
    Excel 2007 forse anche 2013 ... 2021 ... 365 e future...
  • OFFLINE
    by sal
    Post: 7.246
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 08/05/2023 09:03
    Ciao Frank, grazie per la risposta, ma non va bene, la macro funziona, però ho visto che salti le celle vuote, e non deve saltarle, in quanto nel ripristinare i dati nella tabella, come faccio a capire quale sia il dato vuoto.

    per la verità mi sono ricordato di aver creato delle macro per un file CSV, sono riuscito a trovarle, ed ho preso spunto da quelle, questa è la macro risultante per prendere i dati

    Sub nuovo()
    Dim rng, x, r, tmp
      
    r = Cells(Rows.Count, 1).End(xlUp).Row
    Set rng = ActiveSheet.Range("A1:I" & r)
    
    For Each x In rng
        tmp = tmp & x & ";"
    Next x
    tmp = Mid(tmp, 1, Len(tmp) - 1)
    Range("P1") = tmp
    End Sub


    questo il risultato tutto in una cella



    anche se al momento non ho il ritorno a capo, però conosco il numero di colonne della tabella, sto creando adesso la macro di ripristino dividendo la stringa in base alle colonne con il ritorno a capo.

    vediamo come va a finire.

    Ciao Salvatore (8-D

    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    federico460
    Post: 2.955
    Registrato il: 10/10/2013
    Città: VICENZA
    Età: 69
    Utente Veteran
    365
    00 08/05/2023 09:18
    ciao
    ho fatto per capriccio
    alcune prove con formule basiche
    so che a te non può andare bene per via della colonna d'appoggio

    ma se vuoi dare un'occhiata tanto per divertimento

    tutto parte dalla colonna N

    la stringa in Q2

    lo sviluppo della tabella in A22
  • OFFLINE
    by sal
    Post: 7.247
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 08/05/2023 10:39
    Ciao Federico ho visto, però non ho capito la tabella alla riga 22, non riporta i dati come originalmente sopra, a parte che sono tutte formule Matriciali, poi la colonna d'appoggio serve solamente per esplodere la cella Q2, ma non ripristina la tabella originale.

    comunque sono riuscito a riportare i dati di nuovo nella tabella, come si può vedere



    la tabella sotto è solamente per vedere se i dati collimano

    questa la macro

    Sub espandi()
    Dim r, c, c1, d, x, k
    
    k = Split(Cells(1, 16), ";")
    r = 1: c = 1
    For x = 0 To UBound(k)
      Cells(r, c) = k(x)
      c = c + 1
      If c = 10 Then c = 1: r = r + 1
    Next x
    End Sub


    a cosa mi serve questo metodo, ho una tabella giornaliera in cui vengono scritte delle presenze, la tabella è unica ed è relativa ad 1 sola giornata.scritte le presenze devo salvarle perche poi potranno essere modificate successivamente.

    non posso salvare ogni volta la tabella intera con tutti i dati in formato tabella, oltre lo spazio che occorrerebbe, ma anche un foglio dedicato con tutte le tabelle salvate che dovrei riprendere ogni volta.
    e qui il salvataggio della tabella in un unica stringa in una cella e di fianco la data del giorno, a questo punto richiamando la giornata ripristino la tabella salvata nel caso faccio le modifiche e poi la converto in stringa di nuovo con le modifiche fatte per essere usate successivamente.

    P.S. se conoscete qualche altro metodo più semplice e sempre benvenuto

    Ciao a tutti e grazie By Sal (8-D

    [Modificato da by sal 08/05/2023 10:45]
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    federico460
    Post: 2.956
    Registrato il: 10/10/2013
    Città: VICENZA
    Età: 69
    Utente Veteran
    365
    00 08/05/2023 10:54
    ciao
    ti ho avvisato che a te non poteva andare bene
    e certo che ripristina la tabella ma sotto non certamente sopra l'originale
    con le formule non si può

    dove le vedi le differenze
    se vuoi anche l'intestazione
    =SE.ERRORE(INDICE($A$1:$I$16;1+INT((RIF.RIGA(A1)-1)/COLONNE($A$1:$I$16));RESTO(RIF.RIGA(A1)-1+COLONNE($A$1:$I$16);COLONNE($A$1:$I$16))+1);"")

    ma è chiaro che a te serve il VBA
    è solo per curiosità.





    [Modificato da federico460 08/05/2023 10:58]
  • OFFLINE
    by sal
    Post: 7.248
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 08/05/2023 10:58
    Ciao a parte che non mi sarei mai permesso di contestare le tue formule, ma questo è il file che ho scaricato, ho fatto anche F9 nel caso fossero bloccate le formule



    ecco perche ho detto che non è uguale

    Ciao Salvatore (8-D
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    federico460
    Post: 2.957
    Registrato il: 10/10/2013
    Città: VICENZA
    Età: 69
    Utente Veteran
    365
    00 08/05/2023 11:21
    ciao
    non hai l'espansione 😞
    metti questa
    =SCARTO(INDIRETTO("N"&(RIF.RIGA(A2)-1)*9+2);RIF.COLONNA(A$1)-1;0)
    la tiri a destra fino alla colonna I e in basso
  • OFFLINE
    by sal
    Post: 7.249
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 08/05/2023 11:30
    Ciao OK adesso funziona, ho dovuto eliminare gli zero dalla visualizzazione, ma va bene adesso.

    Ciao Salvatore (8-D
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    federico460
    Post: 2.958
    Registrato il: 10/10/2013
    Città: VICENZA
    Età: 69
    Utente Veteran
    365
    00 08/05/2023 11:44
    ciao
    al prossimo acquisto di excel
    passa al 365 è una goduria con le formule😀
  • OFFLINE
    by sal
    Post: 7.250
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 08/05/2023 12:08
    Ciao lo so, stanno facendo una strage del vba con le formule, ma ricorda che dietro ad ogni formula(funzione) vi sempre il VBA, o altro script adesso.

    poi sinceramente, non mi piace la politica che sta usando adesso la Microsoft, il fatto di fare un abbonamento per usarlo, lo so che esiste anche la versione Desktop.
    e posso anche capirla visto le risorse che impiega per lo sviluppo, ma alla fine diventa una guerra per l'ultima formula o funzione.

    che poi vorrei vedere tutte le persone che hanno un abbonamento quante delle nuove funzioni usano, oltretutto quando hanno realizzato un foglio lo possono passare solamente a chi ha lo stesso abbonamento, e questo diventa molto riduttivo, anzi spinge chi non ha un abbonamento a farlo, lo so che è il marketing moderno.

    come pure con win11 che costringe a chi non ha un pc moderno a non poterlo usare, non credi che questa politica alla fine gli si ritorce contro e costringe a passare ad altri software, più liberi e fruibili gratuitamente, perdendo clienti.

    come è successo con il 365 che ha dovuto fare una versione desktop proprio per questo motivo.

    se io compro un paio di scarpe le pago una volta e le uso quando sono rotte o consumate le cambio o mi arrangio, ma non pago un canone per usarle, mi verrebbe a costare di più, è anche se mi dice che quando sono rotte ti do un paio nuovo, ma cio mi rende dipendente a vita, verso questo metodo.

    dal contro però vi è anche che questo metodo genera lavoro, ma non nel nostro paese, ma in paesi lontani che vengono sfruttati da queste per il basso costo della mano d'opera.

    ma finisco qui perche andrei oltre e non finirei mai

    Ciao e scusa di essere diventato un poco prolisso, Salvatore (8-D
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    federico460
    Post: 2.959
    Registrato il: 10/10/2013
    Città: VICENZA
    Età: 69
    Utente Veteran
    365
    00 08/05/2023 12:43
    ciao
    io le nuove formule le utilizzo pochissimo
    giusto per impararle.

    è vero che ti aiutano ma non sostituiscono certamente il VBA

    rimangono sempre formule e l'espansione crea qualche problemino.

    se guardi il LET() sostituisce la costuzione della vecchia formula della barra multifunzione
    LAMBDA() è la vecchia UDF
    poi ci sono parecchie formule che ti aiutano a gestire colonne righe e tabelle varie
    niente che non si potesse fare anche prima ma molto e molto semplificato

    ma stanno andando troppo veloci.

    chiaro che nel forum preferisco usare formule "stagionate"
    uno perchè se non impari le basi non capirai mai quello che hai tra le mani
    due perchè il 365 non è ancora così comune come si crede
    vedo che ci sono persone che hanno ancora il 2003 e mi sembra che le versioni
    più popolari siano tra il 2010 e il 2016

    poi che sia marketing lo si sa😀