Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923

    [excel vba] errore runtime '1004' in generazione bordi tabella

    Ciao a tutti. Ho un problema nel creare i bordi attorno ad un intervallo di celle tramite vba.

    Ho eliminato tutto il codice superfluo relativo a recordset eccetera per renderlo più facilmente testabile da qualche anima pia.

    codice:
    Private Sub Comando0_Click()
    
    Dim dbs As Database
    Dim strSQL As String
    Dim strQueryName As String
    Dim qryDef As QueryDef
    Dim xlApp As Excel.Application
    Dim xlSheet As Excel.Worksheet
    Dim xlWorkbook As Excel.Workbook
    Dim objRST As Recordset
    
    
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    Set xlWorkbook = xlApp.Workbooks.Add
    
    Set xlSheet = xlWorkbook.Sheets(1)
    
    With xlSheet
        
        .Range("A2").Value = "testo"
        .Range("C2").Value = "testo"
        .Range("E5").Value = "testo"
    End With
    
    
    'metodo per trovare l'ultima riga compilata di un foglio
    'LastRow = ActiveSheet.UsedRange.Rows.Count
    'MsgBox (xlSheet.UsedRange.Rows.Count)
    
    
     xlSheet.Range("A2:E5").Select
        Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        With Selection.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .Weight = xlThin
           .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlInsideVertical)
           .LineStyle = xlContinuous 
           .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlInsideHorizontal)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        With Selection.Borders(xlEdgeLeft)
           .LineStyle = xlContinuous
            .Weight = xlMedium
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .Weight = xlMedium
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .Weight = xlMedium
           .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .Weight = xlMedium
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlInsideVertical)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlInsideHorizontal)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
    
    Set xlSheet = Nothing
    Set xlWorkbook = Nothing
    Set xlApp = Nothing
    
    
    End Sub
    Tale codice funziona soltanto se excel viene chiuso. Se infatti provo a ricliccare il pulsante dopo che il file è già stato generato ottengo l'errore runtime '1004' impossibile impostare la proprietà LineStyle per la classe Border in corrispondenza della riga evidenziata in rosso. Ovviamente se commento quella porzione di codice l'errore semplicemente si trasferisce alla porzione di codice seguente.

    Sapreste dirmi come devo modificare la sintassi per rendere il codice sempre funzionante?
    Ciao e grazie come sempre.

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Allora, cambiando approccio e scrivendo il codice così sembra tutto ok

    codice:
    With xlSheet
            .Range("a3:e64").Borders(xlEdgeLeft).LineStyle = xlContinuous
            .Range("a3:e64").Borders(xlEdgeLeft).Weight = xlMedium
            .Range("a3:e64").Borders(xlEdgeTop).LineStyle = xlContinuous
            .Range("a3:e64").Borders(xlEdgeTop).Weight = xlMedium
            .Range("a3:e64").Borders(xlEdgeBottom).LineStyle = xlContinuous
            .Range("a3:e64").Borders(xlEdgeBottom).Weight = xlMedium
            .Range("a3:e64").Borders(xlEdgeRight).LineStyle = xlContinuous
            .Range("a3:e64").Borders(xlEdgeRight).Weight = xlMedium
            .Range("a3:e64").Borders(xlInsideVertical).LineStyle = xlContinuous
            .Range("a3:e64").Borders(xlInsideVertical).Weight = xlThin
            .Range("a3:e64").Borders(xlInsideHorizontal).LineStyle = xlContinuous
            .Range("a3:e64").Borders(xlInsideHorizontal).Weight = xlThin
            .Range("a3:e64").Borders(xlEdgeBottom).LineStyle = xlContinuous
            .Range("a3:e64").Borders(xlEdgeBottom).Weight = xlMedium
    End With
    Già che ci sono ne approfitto per fare un'altra domanda.
    Poiche dovrò generare diversi fogli all'interno del mio file, devo per ciascuno ripetere tutta la pappardella o esiste un modo per automatizzare il tutto pur non sapendo a priori la lunghezza dei record che verranno estratti ed essendo il numero di colonne per ciascun foglio conosciuto a priori ma variabile?

  3. #3
    Utente di HTML.it L'avatar di luck
    Registrato dal
    Oct 2004
    Messaggi
    550
    secondo me, anche se:
    codice:
    ...
    Set xlSheet = Nothing
    Set xlWorkbook = Nothing
    Set xlApp = Nothing
    
    
    End Sub
    l'istanza di excel rimane in piedi, anche se la sganci da xlApp

    devi generare gli stessi fogli? cicla l'assegnazione alla variabile xlSheet e scorpora la routine in una sub separata, no?

    ciao
    L.

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da luck
    secondo me, anche se:
    codice:
    ...
    Set xlSheet = Nothing
    Set xlWorkbook = Nothing
    Set xlApp = Nothing
    
    
    End Sub
    l'istanza di excel rimane in piedi, anche se la sganci da xlApp

    devi generare gli stessi fogli? cicla l'assegnazione alla variabile xlSheet e scorpora la routine in una sub separata, no?

    ciao
    L.
    Ciao luck, ti ringrazio per il consiglio. Appena ho un attimo di tempo mi ci metto sotto.
    Un'altra domanda. Siccome per tutti i fogli che dovrò generare molto codice è identico (inserimento immagine in intestazione, piè di pagina, ecc.) secondo te eseguendo quest'operazione tramite un ciclo alla fine piuttosto che ripetere il codice per ogni singolo foglio, guadagno qualcosa in termini di prestazioni? Te lo chiedo perchè devo generare 6 fogli, ho inserito solo qualche record di prova per testarne il funzionamento e ho già notato che la creazione dei fogli è abbastanza "scattosa". Non oso pensare quando le tabelle saranno popolate e dovrò eseguire delle query. VVoVe:

  5. #5
    Utente di HTML.it L'avatar di luck
    Registrato dal
    Oct 2004
    Messaggi
    550
    per risparmiare risorse e "scattosità" prova a piazzare in cima alla routine la seguente:

    codice:
    Application.ScreenUpdating = False
    che fa in modo di non farti vedere cosa fa il foglio durante la macro (se non sei in fase di sviluppo fa risparmiare risorse)

    occhio che la macro Excel diventa moooooolto lenta se lavori con le anteprime di stampa (mi viene in mente, visto che hai nominato le intestazioni e pie di pagina)

    noooo, mica ripetere codice identico (non tanto per le risorse, quanto per l'ordine del codice e nel caso ci devi ritornare sopra fra qualche mese), affida gli spezzoni di codice a routine separate, che poi richiami nella sub principale...

    ciao

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da luck
    per risparmiare risorse e "scattosità" prova a piazzare in cima alla routine la seguente:

    codice:
    Application.ScreenUpdating = False
    che fa in modo di non farti vedere cosa fa il foglio durante la macro (se non sei in fase di sviluppo fa risparmiare risorse)

    occhio che la macro Excel diventa moooooolto lenta se lavori con le anteprime di stampa (mi viene in mente, visto che hai nominato le intestazioni e pie di pagina)

    noooo, mica ripetere codice identico (non tanto per le risorse, quanto per l'ordine del codice e nel caso ci devi ritornare sopra fra qualche mese), affida gli spezzoni di codice a routine separate, che poi richiami nella sub principale...

    ciao
    Ti ringrazio per la dritta del screenupdating.
    Sul fatto di evitare la ripetizione del codice hai pienamente ragione. La mia era una curiosità prestazionale. Vedrò di ottimizzare il tutto visto che non sono ferratissimo di vba per excel.
    Gentilissimo come sempre. Grazie luck.

    edit. Non sto lavorando con le anteprime di stampa, inserisco intestazioni e piè di pagina ma al momento della generazione dei fogli non le richiamo.

  7. #7
    Utente di HTML.it L'avatar di luck
    Registrato dal
    Oct 2004
    Messaggi
    550
    Originariamente inviato da nicola75ss
    La mia era una curiosità prestazionale.
    mah, non credo che migliori...

    prego, figurati, do ut des
    ciao
    L.

    edit
    Originariamente inviato da nicola75ss

    edit. Non sto lavorando con le anteprime di stampa, inserisco intestazioni e piè di pagina ma al momento della generazione dei fogli non le richiamo.
    meglio, và...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.