Faccio confusione con le matrici



  • Faccio confusione con le matrici
    di ilFonta (utente non iscritto) data: 19/03/2015 00:17:59

    Salve a tutti.

    Non uso mai matrici e vettori, quindi ovviamente non so usarle.

    Vorrei creare un vettore che ho chiamato nameVector con una dimensione = numFeat che contenga i valori (testo) che si trovano nel foglio 3 dalla casella 1,1 a la casella numFeat,1.

    Vorrei copiare poi il contenuto nel foglio 1 dalla cella 1,1 alla cella 1,numFeat e in ogni cella dovrebbe esserci il valore di nameVector legato alla variabile che ho già inserito nomeClasse.

    Purtroppo però quando faccio girare la macro viene evidenziata la riga nameVector(h) = Cells(numFeat, 1) e ottengo il messaggio d'errore
    "Variabile oggetto o variabile blocco with non impostata".

    Sapete aiutarmi?

    Grazie
     
     ' dimensiono il vettore per i nomi delle bande
        Sheets("Foglio3").Select
        Dim nameVector() As Range
        ReDim nameVector(1 To numFeat)
            For h = 1 To numFeat
                nameVector(h) = Cells(numFeat, 1)
            Next h
        
        ' scrivo il nome delle bande
        Sheets("Foglio1").Select
            For J = 1 To numFeat
                Cells(1, numFeat) = nameVector(J) & nomeClasse1
            Next J



  • di Luca73 data: 19/03/2015 09:01:37

    Ciao il problema sta nel fatto che hai definito un vettore di celle Dim Vettore() as Range e poi cerchi di caricarlo con un testo
    basta modificare la riga
    Dim nameVector() As Range
    in
    Dim nameVector() As string
    Ciao
    LT





  • di Vecchio Frac data: 19/03/2015 10:48:16

    cit. "Non uso mai matrici e vettori, quindi ovviamente non so usarle. "
    ---> Il concetto è di per sè piuttosto semplice. Senza essere troppo tecnicistici, immagina uno schedario che contiene delle cartellette numerate progressivamente (di default a partire da zero). Lo schedario è la "variabile" di tipo "array", anche detta matrice, o vettore; le cartellette sono gli elementi in essa (matrice) contenuti. La cartelletta può contenere stringhe, numeri, date. Tuttavia se si specifica un tipo per il vettore, tutte le cartellette saranno di quel tipo.
    Gli elementi si dicono indicizzati perchè sono accessibili specificando lì'indice, cioè la loro posizione, all'interno del vettore.
    Un array si dichiara con la parola chiave Dim seguita dal nome dell'array, la precisazione dei suoi indici tra parentesi e infine il tipo di dati.
    Un array è monodimensionale se contiene solo un indice (una dimensione), bidimensionale se ne contiene due, multidimensionale se ne contiene di più. Il limite è la memoria del sistema.
    Un vettore monodimensionale è ad esempio la lista della spesa; un vettore bidimensionale è, per non fare esempi astrusi, un foglio di Excel che è composto da righe e colonne. Un array a tre dimensioni può essere usato per rappresentare un punto nello spazio (x, y, z).
    In un array, il valore di ogni elemento può essere assegnato e poi recuperato mediante il suo indice numerico (i suoi indici numerici) che ne indicano la posizione nel vettore.
    Puoi anche creare un vettore di dimensione indefinita, dichiarandolo con una coppia di parentesi vuote, basta che poi al momento dell'assegnazione lo ridimensioni con il numero di dimensioni corretto. Utile quando non si conoscono a priori i limiti degli indici oppure quando gli indici mutano (tipicamente in aumento). In questo caso però attenzione che il ridimensionamento azzera il vettore. per conservare i dati già inseriti di deve ridimensionare l'array con la parola chiave "Preserve" che serve appunto a preservare i valori immessi.

    Nel codice che proponi ci sono alcuni errori concettuali.
    Prima dichiari una cosa come "namevector()" di tipo range (che non ha senso per Excel), poi lo ridimensioni, il che per i range non serve perchè i range sono sempre bidimensionali (righe e colonne); nel ciclo for assegni ad ogni elemento di tale matrice il contenuto di una cella (che si trova in riga "numFeat", che non si sa che valore abbia, e colonna A). Nota che il ciclo for è strano perchè assegna (vorrebbe assegnare se funzionasse) il contenuto della stessa cella a tutti gli elementi del vettore namevector, è proprio quello che vuoi?
    Comunque non funziona perchè namevector è stato dichiarato come Range (ne conserva il tipo perchè è stato solo ridimensionato da ReDim senza influenzarne il tipo di dato: lo puoi verificare con VarType che restituisce 8201, cioè un array di Object) e non sa che valori deve mettere in ogni elemento, visto che Cells è un /range/ che contiene un /valore/.

    La conclusione è quella già indicata da Luca73 senza tutta questa pappardella: basta dimensionare namevector come String invece che come Range.





  • Faccio confusione con le matrici
    di ilFonta (utente non iscritto) data: 19/03/2015 18:49:01

    Luca73 e VecchioFrac siete gentilissimi, come sempre. Grazie mille

    Giacomo