Risultati da 1 a 11 di 11

Discussione: Popolare un array con dati di altri array



  1. #1
    L'avatar di Lcbsm
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Italia
    Messaggi
    46
    Versione Office
    Office 2013
    Likes ricevuti
    0
    Likes dati
    21

    Popolare un array con dati di altri array

    Ciao a tutti.

    Avevo scritto un post dettagliatissimo, poi al momento di vedere l'anteprima il sistema mi ha detto di non essere loggato, mi sono loggato ed ora ho perso tutto :118:

    Cercherò di essere dettagliato così come lo sono stato poco fa.


    Allora:

    Voglio copiare dei dati, incollarli da una parte, poi copiare altri dati e incollarli sotto a quelli che avevo incollato prima.

    I dati da copiare sono in A2...An (con n che può andare da 2 a boh, numero grande) e in O2...Om (con m che può andare da 2 a boh, numero grande).

    L'operazione è semplicissima e non ho problemi, ma stavolta mi sono imputato che devo farlo con gli array.

    Pertanto ho scritto questo:

    Codice: 
    Sub attaccagliarray()
    
    Dim wb As Workbook
    Dim opt As Worksheet
    
    Dim Arr1() As String
    Dim Arr2() As String
    Dim ArrDef() As String
    
    Dim NrRighe1 As Integer
    Dim NrRighe2 As Integer
    Dim i As Integer
    Dim p1 As Integer
    Dim p2 As Integer
    
    Set wb = ActiveWorkbook
    Set opt = wb.Sheets("Output")
    
    ' Dimensiono l'array dentro il quale finiscono le celle del primo blocco
    ' Tali intestazioni partono dalla cella A2
    NrRighe1 = Range(opt.Range("A2"), opt.Range("A2").End(xlDown)).Rows.Count
    ReDim Arr1(NrRighe1 - 1)
    'Popolo l'array
    For i = 0 To UBound(Arr1)
        Arr1(i) = Cells(i + 2, 1).Value
    Next i
    
    ' Dimensiono l'array dentro il quale finiscono le celle del secondo blocco
    ' Tali intestazioni partono dalla cella O2
    NrRighe2 = Range(opt.Range("O2"), opt.Range("O2").End(xlDown)).Rows.Count
    ReDim Arr2(NrRighe2 - 1)
    'Popolo l'array
    For j = 0 To UBound(Arr2)
        Arr2(j) = Cells(j + 2, 15).Value
    Next j
    
    ' Ora dimensiono un array all'interno del quale voglio far confluire tutti i dati già inglobati nei primi due array
    ReDim ArrDef(UBound(Arr1) + UBound(Arr2) + 1)
    
    ' Inserisco in ArrDef i dati di Arr1
    For i = 0 To UBound(Arr1)
        ArrDef(i) = Arr1(i)
    Next i
    
    ' Accodo ai dati di Arr1 già inseriti in ArrDef i dati di Arr2
    For i = UBound(Arr1) + 1 To UBound(Arr1) + UBound(Arr2) + 1
        ArrDef(i + UBound(Arr1) + 1) = Arr2(i)
    Next i
    End Sub
    Il problema si verifica con l'ultimo ciclo for, che mi da l'errore "Indice non incluso nell'intervallo" e mi evidenzia la riga "ArrDef(i + UBound(Arr1) + 1) = Arr2(i)".
    Quindi: ho riempito la prima parte dei ArrDef con i dati di Arr1, ma non riesco ad accodare i dati di Arr2.
    Pensando che si potrebbe tratta di una gestione troppo "leggera" degli Ubound, li ho sostituiti con le variabili nrRiga che ho calcolato in precedenza, ma senza successo.

    Allora ho provato a cambiare qualcosa; ho trovato una soluzione su internet che mi permette di fare quello che voglio fare io, sebbene non accodi Arr2 a Arr1, bensì "mischi" i dati dei due array (ma non è un problema) Questa soluzione va a sostituire i due cicli for che ho alla fine del codice:

    Codice: 
    
    ' Due variabili che tengono conto della dimensione massima di ognuno dei due array
    p1 = UBound(Arr1)
    p2 = UBound(Arr2)
    
    For i = 0 To Application.WorksheetFunction.Max(p1, p2)
        ArrDef(i * 2) = Arr1(i)
        ArrDef(i * 2 + 1) = Arr2(i)
    Next i
    Questa istruzione funziona se al posto di "Application.WorksheetFunction.Max(p1, p2)" metto, ad esempio, "Ubound(Arr1)", solo che avendo array di dimensioni differenti, devo per forza fare riferimento all'array che ha il numero massimo di elementi e quindi ho pensato a Max(n,m), ma mi da errore "Indice non incluso nell'intervallo" e mi evidenzia la riga ArrDef(i * 2) = Arr1(i)".

    Insomma, il tutto si blocca a due passi dalla fine :167:

    Avete qualche idea di cosa succeda?

    Grazie!

  2. #2
    L'avatar di Lcbsm
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Italia
    Messaggi
    46
    Versione Office
    Office 2013
    Likes ricevuti
    0
    Likes dati
    21
    ... E infatti anche stavolta era una stupidaggine. Me ne fossi accorto prima, avrei evitato la figuraccia di scrivere il post :167:

    Gli ultimi due cicli for del primo tentativo posso scriverli così:

    Codice: 
    For i = 0 To UBound(Arr1)
        ArrDef(i) = Arr1(i)
    Next i
    
    For i = 0 To UBound(Arr2)
        ArrDef(i + UBound(Arr1) + 1) = Arr2(i)
    Next i
    E tutto va come deve andare.

  3. #3

    L'avatar di Rubik72
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Cosenza
    Età
    45
    Messaggi
    2808
    Versione Office
    Excel 2013
    Likes ricevuti
    1020
    Likes dati
    979
    L'errore sta nell'ultimo ciclo:
    prova così
    Codice: 
    ' Accodo ai dati di Arr1 già inseriti in ArrDef i dati di Arr2
    For i = UBound(Arr1) + 1 To UBound(Arr1) + UBound(Arr2) + 1
        ArrDef(i + UBound(Arr1) + 1) = Arr2(i) ' da sostituire con ArrDef(i) = Arr2(i - UBound(Arr1) - 1)
    Next i
    in quanto fai cominciare la variabile i già dal valore successivo al ciclo precedente quindi non c'è bisogno di aumentarla di valore

    EDIT:
    solo ora mi accorgo che hai già risolto

  4. #4

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1015
    Versione Office
    .
    Likes ricevuti
    366
    Likes dati
    0
    Citazione Originariamente Scritto da Lcbsm Visualizza Messaggio
    E tutto va come deve andare.
    Ciao,

    presumo lo scopo sia solo didattico per capire come unire due array in un terzo, ma nel codice che proponi ci sono molte cose che, se non sono errate sono quanto meno discutibili, in quanto potrebbero creare più di un problema:
    • non hai dichiarato tutte le variabili;
    • le variabili destinate a ricevere un numero che rappresenta una riga od una colonna dovrebbero essere dichiarate Long e non Integer;
    • il metodo che hai usato per calcolare l'ultima cella di una colonna è debole in quanto si ferma alla prima cella vuota della colonna, ignorando eventuali celle successive contenenti valori; inoltre nell'istruzione Range(opt.Range("O2"), opt.Range("O2").End(xlDown)).Rows.Count Range è privo di paternità e quindi si riferisce al foglio attivo (che potrebbe non essere il foglio assegnato alla variabile opt).
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  5. #5
    L'avatar di Lcbsm
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Italia
    Messaggi
    46
    Versione Office
    Office 2013
    Likes ricevuti
    0
    Likes dati
    21
    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    Ciao,

    presumo lo scopo sia solo didattico per capire come unire due array in un terzo, ma nel codice che proponi ci sono molte cose che, se non sono errate sono quanto meno discutibili, in quanto potrebbero creare più di un problema:
    In effetti è così: ho iniziato da poco con VBA. Risposte come la tua mia aiutano tantissimo a migliorare, quindi grazie! :246:

    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    • non hai dichiarato tutte le variabili;

    A me sembra di averle dichiarate tutte... cosa mi sto perdendo?

    Citazione Originariamente Scritto da scossa Visualizza Messaggio


    • le variabili destinate a ricevere un numero che rappresenta una riga od una colonna dovrebbero essere dichiarate Long e non Integer;
    Ok!

    Citazione Originariamente Scritto da scossa Visualizza Messaggio


    • il metodo che hai usato per calcolare l'ultima cella di una colonna è debole in quanto si ferma alla prima cella vuota della colonna, ignorando eventuali celle successive contenenti valori;
    Lo so, e non solo nel caso che dici tu: problemi si verificano anche, ad esempio, se la cella di partenza è unita ad un altra cella. Ma è l'unico metodo che conosco; ci sono altri modi per conteggiare righe/colonne fino all'ultima di un intervallo di celle?

    Citazione Originariamente Scritto da scossa Visualizza Messaggio


    • inoltre nell'istruzione Range(opt.Range("O2"), opt.Range("O2").End(xlDown)).Rows.Count Range è privo di paternità e quindi si riferisce al foglio attivo (che potrebbe non essere il foglio assegnato alla variabile opt).
    Non basta indicare che i dati deve prenderli nel foglio assegnato ad opt? Come mi suggerisci di fare, allora?

    Di nuovo grazie mille!

  6. #6

    L'avatar di Rubik72
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Cosenza
    Età
    45
    Messaggi
    2808
    Versione Office
    Excel 2013
    Likes ricevuti
    1020
    Likes dati
    979
    Citazione Originariamente Scritto da Lcbsm Visualizza Messaggio
    A me sembra di averle dichiarate tutte... cosa mi sto perdendo?
    Inserisci Option explicit in testa al Modulo e lancia la macro

    Citazione Originariamente Scritto da Lcbsm Visualizza Messaggio
    Lo so, e non solo nel caso che dici tu: problemi si verificano anche, ad esempio, se la cella di partenza è unita ad un altra cella. Ma è l'unico metodo che conosco; ci sono altri modi per conteggiare righe/colonne fino all'ultima di un intervallo di celle?
    NrRighe1 = opt.Range("A" & rows.Count).End(xlUp).Row

    Citazione Originariamente Scritto da Lcbsm Visualizza Messaggio
    Non basta indicare che i dati deve prenderli nel foglio assegnato ad opt? Come mi suggerisci di fare, allora?
    No bisogna indicare anche la paternità dell'oggetto principale

    opt.Range(opt.Range("O2"), opt.Range("O2").End(xlDown)).Rows.Count Range

  7. I seguenti utenti hanno dato un "Like"


  8. #7
    L'avatar di Lcbsm
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Italia
    Messaggi
    46
    Versione Office
    Office 2013
    Likes ricevuti
    0
    Likes dati
    21
    Maledetta j! mi era sfuggita :)

    Grazie Rubik!


    Citazione Originariamente Scritto da Rubik72 Visualizza Messaggio
    NrRighe1 = opt.Range("A" & rows.Count).End(xlUp).Row
    Questa istruzione mi da un errore di sintassi...


    EDIT:
    Funziona, nessun errore; probabilmente ho quotato nell'istante successivo a un tuo edit ;)

  9. #8
    L'avatar di Lcbsm
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Italia
    Messaggi
    46
    Versione Office
    Office 2013
    Likes ricevuti
    0
    Likes dati
    21
    Citazione Originariamente Scritto da Rubik72 Visualizza Messaggio
    NrRighe1 = opt.Range("A" & rows.Count).End(xlUp).Row
    Ho provato il codice, ho capito come funziona ed è sicuramente utilissimo!

    Ma se mi trovo in un caso come quello che vedete nel file allegato, in cui ho più gruppi di celle nella colonna A, il codice di Rubik (potrebbe essere il nome di un libro, "Il codice di Rubik" :242:) mi va a prendere tutto quello che c'è nella colonna A; a quel punto, esiste un modo per prendere solo le celle relative alla Tabella 1?
    File Allegati File Allegati

  10. #9

    L'avatar di Rubik72
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Cosenza
    Età
    45
    Messaggi
    2808
    Versione Office
    Excel 2013
    Likes ricevuti
    1020
    Likes dati
    979
    Il codice proposto prima tiene conto di un database singolo in cui possono esserci record vuoti.
    Un buon Database strutturato correttamente, dovrebbe avere campi e record organizzati in maniera corretta tipo Access (e questo non è il caso).

    In questo caso si potrebbe usare un ciclo Do... Loop fintanto non si trova la tabella2.

    Codice: 
    Option Compare Text
    
    
    Sub Tabella1()
    Dim iRow As Long
    
    
    iRow = 3
    Do Until Left(Foglio1.Cells(iRow, 1), 7) = "Tabella"
         iRow = iRow + 1
    Loop
    
    
    End Sub

  11. #10
    L'avatar di Lcbsm
    Clicca e Apri
    Data Registrazione
    Mar 2016
    Località
    Italia
    Messaggi
    46
    Versione Office
    Office 2013
    Likes ricevuti
    0
    Likes dati
    21
    Citazione Originariamente Scritto da Rubik72 Visualizza Messaggio
    Un buon Database strutturato correttamente, dovrebbe avere campi e record organizzati in maniera corretta tipo Access (e questo non è il caso).
    Eeeeh, Rubik, magari fosse sempre così... :242:

    Grazie!

  12. #11

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1015
    Versione Office
    .
    Likes ricevuti
    366
    Likes dati
    0
    Citazione Originariamente Scritto da Lcbsm Visualizza Messaggio
    ...
    Ma se mi trovo in un caso come quello che vedete nel file allegato, in cui ho più gruppi di celle nella colonna A, ....esiste un modo per prendere solo le celle relative alla Tabella 1?
    Ciao,

    esistono diversi modi per farlo, in base alla struttura del tuo foglio, delle tabelle contenute (n.ro fisso o variabile di righe, posizione nel foglio etc) una sarà più adatta di altre.
    Coi dati del foglio presente nel tuo esempio, la cosa migliore sarebbe "dare un nome" alle celle della Tabella 1 (A3..A9) e a quelle della Tabella 2.

    Comunque non ha molto senso passare da range ad array e di nuovo a range per fare un semplice copia incolla (senza che vi sia una elaborazione del contenuto).
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  13. I seguenti utenti hanno dato un "Like"


Discussioni Simili

  1. [Risolto] Riempire array in un modulo e richiamare lo stesso array su un modulo diverso
    Di Domynix nel forum Domande su Excel VBA e MACRO
    Risposte: 8
    Ultimo Messaggio: 07/01/17, 19:36
  2. [Risolto] Approfondimenti su Array
    Di G.Bove nel forum Domande su Excel VBA e MACRO
    Risposte: 15
    Ultimo Messaggio: 31/10/16, 13:42
  3. Replace usando array
    Di Scherman83 nel forum Domande su Excel VBA e MACRO
    Risposte: 4
    Ultimo Messaggio: 19/09/16, 18:23
  4. Array in convalida dati
    Di Textomb nel forum Domande su Excel VBA e MACRO
    Risposte: 35
    Ultimo Messaggio: 28/05/16, 20:34
  5. Popolare array bidimensionale
    Di alfrimpa nel forum Domande su Excel VBA e MACRO
    Risposte: 9
    Ultimo Messaggio: 18/04/16, 22:52

Tag per Questa Discussione

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •