copia



  • copia e incolla valori di una matrice
    di Migua Ing data: 12/02/2016 01:40:09

    Ciao a tutti, sto cercando una funzione in VBA che permette di copiare i valori di una matrice di riferimento di un piccolo algoritmo.
    Tale algoritmo elabora i valori della matrice di riferimento per ogni loop.
    Quindi avrei bisogno una funzione che alla fine di ogni il loop, faccia una copia della matrice elaborata e incollare tale copia n righe sotto.
    in modo tale da poter avere una stampa di tutti i singoli loop con tutte le matrici a seguire in fondo del foglio Excel.
    Chiedo un vostro consiglio, quale funzione è più adatta per fare questo?



  • di Luca73 data: 12/02/2016 11:24:22

    Ciao
    per poterti aiutare sarebbe meglio se allegassi il tuo file una versine semplificata con anche il risultato ottenuto
    Ciao
    Luca





  • di Migua Ing data: 12/02/2016 12:14:17

    Ciao Luca
    ti allego un file Excel di esempio su cui sto lavorando,

    con CommandButton2 si avvia l'algoritmo, impostando il numero di Loop (le iterazioni che deve compiere)
    L'algoritmo lavora sempre sulla stessa matrice ( utilizzando la matrice 1/0 a destra per calcolare la distanza tra le stringhe)
    Adesso vorrei inserire una funzione messa subito dopo L'avvio di un nuovo loop che mi faccia una copia della matrice dove si svolgono i calcoli e delle relative Dist. Hamming e la incolli in fondo, mantenendo una spaziatura ( ad esempio uguale a 5 righe.)
    in questo file ho fatto manualmente ( con copia e incolla), la procedura che voglio realizzare in VBA, per avere un esempio visivo.

    Ad esempio se utilizzo 3 come Loop totali si devono creare 3 copie delle matrici dove si svogono i calcoli(una per ogni loop), + i valori delle relative distanza (Celle : N7:N16) mantenendo quindi inalterata la matrice iniziale (dinamica) dove vengono svolti i calcoli, in modo tale da non cambiare tutti i riferimenti del codice fatto fin adesso).



  • di Luca73 data: 12/02/2016 15:57:47

    Ciao
    Prova e vedere se queste modifiche fanno quello che vuoi.
    Vedi il file allegato.
    Ciao
    Luca






  • di Migua Ing data: 13/02/2016 20:26:50

    Ciao Luca, le modifiche apportate funzionano benissimo, era questo quello che volevo ottenere,sei un grande!!.
    Purtroppo, non sono un esperto in VBA e sto cercando d'imparare, e non capisco bene il funzionamento della macro ( in particolare Option Explicit), e come poter modificare i parametri di riferimento, nel caso in cui voglia cambiare ed aggiungere colonne all'area che che vado a copiare;
    Questo per poterlo adattare ad un altro Alg. piu ampio e variabile in termini di righe e colonne.
    quali parametri devo modificare per in termini di celle per apportare tali modifiche?



  • di Mohican1989 data: 14/02/2016 17:26:58

    Optional explicit è una riga di codice che obbliga chi sta scrivendo il programma a "dimensionare" le variabili, ovvero quello che solitamente viene effettuato all inizio della routine scrivendo cose tipo "Dim A as String" o "Dim Campo as Range" etc etc. Queste indicazioni servono a Vba o meglio all ambiente di sapere quali metodi e proprietà possono essere applicati su una variabile ma sopratutto quanta memoria dedicare alla singola variabile e facilitare quindi la compilazione nonché la velocità della routine.
    È molto utile scriverla per chi è alle prime armi perché obbliga ad impara ad usare correttamente tutti i tipi associabili ad una variabile. Non da meno è utile anche ai più esperti che vogliono scrivere un codice ordinato senza lasciare nulla al caso.



  • di Luca73 data: 15/02/2016 09:19:37

    Ciao Migua Ing
    per la definizione di Optional explicit ha ragione Mohican1989 (un saluto) praticamente ti dà errore se usi variaboili non dichiarate e pertanto aiuta a prevenire certi errori.

    quella qui sotto è òa riga che ti cancella il precente
    Rang("AA21") è un vertice che sa quello in alto a destra
    Per Qeullo in Basso a sinistra ho pensato di fare così parto da una cella della colonna A (che è tutta libera abbastanza in basso da non avere interferenze con le prime celle (A100) poi vado fino in forno .End(xlDown) poi mi sposto di tre righe a destra .Offset(0, 3) (vado sulla colonna D dove ci sono i dati) e salgo fino a trovare la prima cella occupata .End(xlUp) poi mi sposto a sinistra di due celle Offset(0, -2) per includere ancge la colnna C dove di sono le scritte Loopxx

    L'istruzione che copia i valori e'
    'LT copia Valori
    Range(PrimaCella.Offset(0, 1), PrimaCella.Offset(10, 21)).Copy

    PrimaCella è stata definita come C6. pertanto l'istruzione sopra citata copia da D6 A X16 in quanto PrimaCella.Offset(10, 21) punta ad una cella spostata di 10 righe e 21 colonne pertanto se vuoi copiare un intervallo diverso è qui che devi agire.

    'LT Seleziona dove incollarli con passo 10+5
    Set SecondaCella = SecondaCella.Offset(15, 0)

    questa istruzione ti definisce la SecondaCella ovvero dove andrai ad incollare i valori e ad ogni loop si sposta in basso con passo 10+5 (10 sono i valori da copiare e 5 sono le celle libere) qui devi operare se incolli più valori oppure se vuoi aumentare il passo

    Comunque ti consiglio di fare uso pesante dell'help di VBA che spiega tutti i comandi.

    Ciao
    Luca




     
    Private Sub CommandButton1_Click()
    'Dichiaro le variabili
    Dim StringheTotali As Integer, NumerixStringa As Integer, NCambiamenti As Integer, DistanzaHamming As Integer
    Dim StringaRiferimento As Integer
    Dim X As Integer, Y As Integer, Z As Integer, DadoRighe As Integer, DadoColonne As Integer
    Dim QntaCambiamenti As Integer
    Dim OperatoreArray()
    Dim CelleCasuale As Range
    Dim Contatoreloop As Integer
    Dim PrimaCella As Range
    Dim SecondaCella As Range
    
    'LT chiedo conferma
    If MsgBox("Cancello i Loop precedenti?", vbQuestion + vbYesNo, "CANCELLO?") = vbNo Then Exit Sub
    'LT cancello loop precedenti
    If Range("D21") <> "" Then
        Range(Range("AA21"), Range("A100").End(xlDown).Offset(0, 3).End(xlUp).Offset(0, -2)).Clear
    End If
    'LT inizializzo prima cella
    Set PrimaCella = Range("C6")
    Set SecondaCella = PrimaCella
    'Imposto dei riferimenti nel caso si aggiungessero stringhe o numeri alle stringhe
    StringaRiferimento = Range("B3")
    StringheTotali = Range("C7").End(xlDown).Row - 6
    NumerixStringa = Range("D6").End(xlToRight).Column - 4
    NCambiamenti = Range("M3")
    'imposto dei check non esaustivi per controllare almeno che i campi "select row" e "n. cambiamenti loop"
    'non siano lasciati vuoti.
    If NCambiamenti = 0 Then MsgBox ("Hai dimenticato di inserire il numero di cambiamenti"), vbCritical + vbOKOnly, "Check N. Cambiamenti": Exit Sub
    If StringaRiferimento = 0 Then MsgBox ("Hai dimenticato di inserire la stringa di riferimento"), vbCritical + vbOKOnly, "Check Riga riferimento": Exit Sub
    
    Contatoreloop = 0
    'Verifico per ogni stringa il minore tra la distanza di hamming e il n. di cambiamenti richiesto per poi caricarli in un array
    rielabora:
    'LT copia Valori
    Range(PrimaCella.Offset(0, 1), PrimaCella.Offset(10, 21)).Copy
    'LT Seleziona dove incollarli con passo 10+5
    Set SecondaCella = SecondaCella.Offset(15, 0)
    'LT Incolla
    ActiveSheet.Paste Destination:=SecondaCella.Offset(0, 1)
    Application.CutCopyMode = False
    'LT scrive il numero di loop
    SecondaCella = "Loop " & Format(Contatoreloop, "00")
    For X = 1 To StringheTotali
        ReDim Preserve OperatoreArray(StringheTotali)
        If cells(6 + X, 14) > NCambiamenti Then
            OperatoreArray(X) = NCambiamenti
        Else
            OperatoreArray(X) = cells(6 + X, 14)
        End If
    Next
    
    
    For Z = 1 To StringheTotali
        For Y = 1 To OperatoreArray(Z)
                If Y <> StringaRiferimento Then
                    DadoColonne = Application.WorksheetFunction.RandBetween(1, NumerixStringa)
                    Set CelleCasuale = cells(6 + Z, 3 + DadoColonne)
                     CelleCasuale.Select
                     
                     cells(3, 1) = DadoColonne
                     cells(4, 1) = Z
                     
                        Call ControlloDoppioni
                        
                        
                    If CelleCasuale <> cells(6 + StringaRiferimento, 3 + DadoColonne) Then
                        CelleCasuale = cells(6 + StringaRiferimento, 3 + DadoColonne)
                       CelleCasuale.Select
                    Else
                        'Niente
                    End If
                Else
                    'Niente
                End If
        Next
        
        
    Dim k As Integer
    Dim LoopCol As Integer
    Dim LoopRig As Integer
    k = cells(3, 2)
    For LoopCol = 1 To 10
        For LoopRig = 1 To 10
            If LoopRig <> k Then
                If cells(LoopRig + 6, LoopCol + 3) = cells(k + 6, LoopCol + 3) Then
                cells(LoopRig + 6, LoopCol + 14) = 0
                ElseIf cells(LoopRig + 6, LoopCol + 3) <> cells(k + 6, LoopCol + 3) Then
                cells(LoopRig + 6, LoopCol + 14) = 1
                End If
            ElseIf LoopRig = k Then
            End If
        Next LoopRig
    Next LoopCol
    
    
    Next
    
    Contatoreloop = Contatoreloop + 1
    
    'imposto limite di Loop Tot
    If Contatoreloop = cells(3, 9) Then GoTo terminaprocesso
    
    
    
    If Application.WorksheetFunction.Sum(Range("N7:N16")) > 1 Then  'da qui si pu impostare il numero minimo di stringhe con Dist. Hamming =0, per bloccare i loop
    
        GoTo rielabora
        
    Else
    
    terminaprocesso:
    Range("K3") = Contatoreloop
    
    MsgBox ("FINITO !")
    End If
    
    Set CelleCasuale = Nothing
    Erase OperatoreArray
    
    
    End Sub






  • di Migua Ing data: 19/02/2016 15:57:35

    Ciao Luca, alla fine sono riuscito ad adattare il codice al file su cui sto lavorando; in modo tale da renderlo variabile per righe e per colonne; la macro funzione benissimo, ti ringrazio molto per la spiegazione.
    Ringrazio anche Mohican per il suo chiarimento.