stampavalori con Offset



  • stampavalori con Offset
    di rambo424 data: 10/05/2013 11:21:19

    Ciao Ragazzi... ancora una volta chiedo il vostro aiuto:

    ho la necessità di stampare una sotto l'altra una serie di tabelle che mi creo con dei cicli for. Il problema è che non so a priori il numero di righe di ogni array (nel codice postato, gli array sono S19, S20, ecc.. ) .. ho provato con un ciclio for, ma ovviamente non va bene perchè non so a priori dove finisce la prima tabella e quindi dove inizia la sseconda... avevo pensato a un count da inserire in aggiunta al contatore delle righe.. ma mi sa che non è molto efficiente.. pensate sia meglio un OFFSET ? se sì, mi sapreste aiutare con la sua sintassi ?

    vi posto un primo codice provvisorio che ho scritto, che può essere utilizzato come esempio. Il limite di questo codice è che oraio ho inserito in modo statitico i riferimenti alle righe di stampa delle tabelle, ma il mio goal è quello di eliminare ogni statitcità del file, perchè non sempre posso contarmi 'a mano' la lunghezza di ogni tabella (parliamo di 350 tabelle da stampare.... )

    aspetto un vostro aiuto ! grazie a tutti !

    ps.: il comando di cancellazione delle righe bianche serve perchè in ogni array creato potrebbero essserci delle righe bianche che non voglio siano conservate proprio perchè voglio una scrittura sequenziale..

     
    For i = 0 To r - 2
    For j = 0 To 10
    Worksheets("Sheet1").Cells(1 + i, j + 1) = S18(i, j)
    Next j
    Next i
    Sheets("Sheet1").Select
    range("B1:D4000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    For i = 0 To r - 2
    For j = 0 To 10
    Worksheets("Sheet1").Cells(2 + i, j + 1) = S19(i, j)
    Next j
    Next i
    Sheets("Sheet1").Select
    range("B1:D4000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    For i = 0 To r - 2
    For j = 0 To 10
    Worksheets("Sheet1").Cells(3 + i, j + 1) = S20(i, j)
    Next j
    Next i
    Sheets("Sheet1").Select
    range("B1:D4000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    



  • di Baz (utente non iscritto) data: 10/05/2013 11:47:19

    Ciao,
    potresti postare un fogli come esempio?
    Magari su un foglio con i dati di origine (ovviamente senza dati sensibili) e su un secondo foglio i dati che vorresti ottenere

    Dal tuo codice mi sembra poter dire che lavori tutto su un solo foglio? è corretto?



  • di rambo424 (utente non iscritto) data: 10/05/2013 12:46:33

    ragazzi ho buttato giù questo codice.. ma non funge assolutamente perchè mi scrive solo la senconda tabella ...
     
    For i = 0 To r - 2
    For j = 0 To 10
    Worksheets("Sheet1").Cells(1 + i, j + 1) = S18(i, j)
    Next j
    Next i
    Sheets("Sheet1").Select
    range("B1:D4000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    If range("A1").Value = "" Then range("A1").Select
    Else
    If range("A1").Value <> "" And range("A2").Value = "" Then
    range("A2").Select
    Else:
    ultimacella = Worksheets("Sheet1").range("A1").End(xlDown).Offset(1, 0).Select
    End If
    End If
    
    For i = 0 To r - 2
    For j = 0 To 10
    'Worksheets("Sheet1").Cells(i + ultimacella, j + 1) = S19(i, j)
    'Worksheets("Sheet1").range("A1:F1").Offset(i, j).Cells = S19(i, j)
    Worksheets("Sheet1").Cells(1 + i, j + 1) = S19(i, j)
    Next j
    Next i
    Sheets("Sheet1").Select
    range("B1:D4000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    
    
    For i = 0 To r - 2
    For j = 0 To 10
    'Worksheets("Sheet1").Cells(3 + i, j + 1) = S20(i, j)
    Worksheets("Sheet1").range("A1:F1").Offset(i + 1, 1).Cells = S20(i, j)
    Next j
    Next i
    Sheets("Sheet1").Select
    range("B1:D4000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    For i = 0 To r - 2
    For j = 0 To 10
    Worksheets("Sheet1").range("A1:F1").Offset(i + 1, 1).Cells = S21(i, j)
    'Worksheets("Sheet1").Cells(4 + i, j + 1) = S21(i, j)
    Next j
    Next i
    Sheets("Sheet1").Select
    range("B1:D4000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    



  • di Baz (utente non iscritto) data: 10/05/2013 13:25:48

    scusa, mi permetto di insistere, almeno per quel che mi riguarda non capisco cha dati hai e come li vuoi ottenere ...
    vedo solo molti (forse troppi) cicli For ...

    cosa intendi con ARRAY ?



  • di Vecchio Frac data: 10/05/2013 13:33:49

    Sarebbe utile e bello anche vedere la firma della Sub (o Function che sia), con tutti i Dim opportuni.
    Segui il consiglio di Baz... aiutaci ad aiutarti ^_^





  • di rambo424 data: 10/05/2013 14:39:50

    allora ragazzi.. cerco di spiegarmi meglio...
    da un database generale mi sono creato una serie di sottomatrici (che vedete con i nomi S19, S20, ecc.. ), che sono composte da un numero fisso di colonne (=6) e un numero variabile di righe (dipende dalle caratteristiche del database, i cui valori sono filtrati con degli IF).

    ora, quello che voglio è stampare tutte le matrici S19, S20 ec.. in modo sequenziale, ovvero senza righe bianche, nello stesso foglio. il problema è chè nelle matrici, oltre alle righe "fillate" con i valori del database (che voglio stampare), ho anche delle righe bianche, che corrispondono ai "pezzi" del database che non rispettano le caratteristiche e che quindi a seguito degli IF restano bianche.

    quindi, come faccio a stampare la prima matrice, cancellare le righe bianche (vi ricordo che sono in un numero varibile che non conosco a priori) e stampare a seguire le altre matrici (con le stesse caratteristiche della prima: righe variabili, alcune fillate e altre bianche, e colonne standard pari a 6) ?

    quanto ai dim che mi richiedeva vecchio frac, nulla di speciale: ho solo dichiarato i contatori dei cicli come integer e le sottomatrici come S19(10000,10).

    Spero di essere stato più chiaro e grazie ovviamente a voi tutti che mi state dando una mano




  • di rambo424 (utente non iscritto) data: 10/05/2013 15:16:50

    allora ragazzi ho risolto con un modo abbastanza "artigianale" che vi posto nel codice sotto !!!

    se volete però ugualmente suggerirmi qualche metodo più efficiente e meno time wasting... accetto consigli con molto piacere !!!

    grazie per avermi aiutato a ragionare "ad alta voce"....
     
    Set myrange = Worksheets("Sheet1").range("B:B")
    u = WorksheetFunction.CountA(myrange)
    
    For i = 0 To r - 2
    For j = 0 To 10
    Worksheets("Sheet1").Cells(1 + i + u, j + 1) = S19(i, j)
    Next j
    Next i
    Sheets("Sheet1").Select
    range("B1:D4000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Set myrange = Worksheets("Sheet1").range("B:B")
    u = WorksheetFunction.CountA(myrange)
    
    
    For i = 0 To r - 2
    For j = 0 To 10
    Worksheets("Sheet1").Cells(1 + i + u, j + 1) = S20(i, j)
    Next j
    Next i
    Sheets("Sheet1").Select
    range("B1:D4000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Set myrange = Worksheets("Sheet1").range("B:B")
    u = WorksheetFunction.CountA(myrange)
    



  • di Baz (utente non iscritto) data: 10/05/2013 15:39:16

    innanzitutto eviterei di scrivere dei dati che poi devi andare a cancellare
    se non ho capito male, ti basta verificare il valore della tua latrice, se è vuota passa al record successivo, mentre le righe del foglio non devono incrementarsi ...facilmente ottenibile aggiungendo le relative variabili.

    in tal modo eviteresti le selezioni nel foglio che certo non aiutano alle performance.

    infine aggiungi l'istruzione
    Application.ScreenUpdating = False
    che non fa aggiornare il foglio

    ...
    ...
    tue istruzioni

    infine
    Application.ScreenUpdating = True

    Se hai problemi fai sapere.