Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    vb6 lentezza con documento word

    Buona giornata a tutti...... Mi sono iscritto da poco al Forun e spero di trovare, grazie a VOI, la soluzione o per lo meno la spiegazione di quando mi succede. Un grazie anticipato.
    Esequo una procedura in VB6 (funziona benissimo) dove creo un documento word che contiene una tabella che conterrà all'incirca 13.000 record. Il problema e che per popolare con i primi 500 record (circa) impiego un un paio di minuti, man mamo che la tabella aumenta, aumenta non in modo proporzionale, anche il tempo di popolamento della stessa. Ad esempio 3000 record 40 minuti, 4000 record 70 minuti, 5000 record 120 minuti, e più va avanti più rallenta. E' normale o devo settare qualche proprieta del documento o inserire qualche istruzione per la gestione della memoria? Grazie e spero di aver rispettato tutte le regole del forum.

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    A prescindere dal fatto che senza vedere il codice è impossibile espremire una qualsivoglia affermazione, mi pare (ma posso sbagliare) che usare Word in questo modo non sia proprio ortodosso.

    Una domanda: a cosa serve, in pratica, avere 13.000 record in un documento Word?
    Non so se esiste una ragione 'pratica' che giustifichi questa operazione, ma siccome il mondo è bello perchè è vario, sono curioso di conoscerla.


  3. #3

    Risposta

    ...Grazie per aver letto il mio messaggi! Per quanto riguarda il codice, ripero che non ho problemi a farlo funzionare, infatti è una routine di poche righe che inserisce i record conti in un recordset in un foglio Word. Il problema e che con il passare del tempo e manmano che il file word si riempie passando inizialmente dai 120 insetimenti circa per minuto ai 20/30 inserimenti al minuto quando il documento word è formato da 130 pagine. Per quanto riguarda la Tua curiosità, il documento elenca tutti i dipendenti di una Azienda Statale che per notivi di sicurezza non posso rivelare. Il lavoro mi è stato commissionato in questo modo: produre un documento Word. Grazie.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma potrai mostrare il codice, no?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244

    Re: Risposta

    Originariamente inviato da erio1963
    ...Grazie per aver letto il mio messaggi! Per quanto riguarda il codice, ripero che non ho problemi a farlo funzionare, infatti è una routine di poche righe che inserisce i record conti in un recordset in un foglio Word. Il problema e che con il passare del tempo e manmano che il file word si riempie passando inizialmente dai 120 insetimenti circa per minuto ai 20/30 inserimenti al minuto quando il documento word è formato da 130 pagine. Per quanto riguarda la Tua curiosità, il documento elenca tutti i dipendenti di una Azienda Statale che per notivi di sicurezza non posso rivelare. Il lavoro mi è stato commissionato in questo modo: produre un documento Word. Grazie.
    Vedo che hai capito male!
    Mi pare che nessuno ti abbia chiesto di rivelare i nomi, o sbaglio?
    Anche perchè dubito che a qualcuno possa interessare...

    Ma se non mostri il codice e spieghi i dettagli come pensi che qualcuno possa aiutarti?
    Usando la sfera di cristallo?
    Dai su! Non crearti problemi che non esistono...


  6. #6
    Il problema è quasi sicuramente nella gestione delle risorse ... ma come ti è già stato detto se non mostri il codice nessuno potrà mai dirti dov'è l'errore.

  7. #7

    ........scusate il ritardo

    Chiedo scusa per la mia risposta poco tempestiva, ma a causa di problemi di connessione prima, e si salute dopo non ho potuto rispondere, e per questo vi chiedo nuovamente scusa.
    Non ho nessun problema a mostrarvi il codice, che Vi allego. La novità è che ho provato il codice su una macchina diversa, un portatile con un sistema operativo dicerso, Windows 7 4Gb di ram processore core Duo 2.00 GHz, il risultato è che per creare il documento con word 2003 inpiega all'incirca il 27% del tempo impiegato sulla vecchia macchina che ha come sistema operativo Windosx XP e 3Gb di ram Pentium 4 3.2GHz
    Ps: il foglio word nasce da un file .dot
    e grazie per le eventuali soluzioni al problema.

    Private Sub CmdAvvia_Click()
    Dim cn As ADODB.Connection
    Dim rsAnnUff As ADODB.Recordset
    Dim PAGINA As Integer
    Dim Riga As Long
    Dim docword As Object
    Dim indice, indice2, ordine As Integer
    Dim Ruolo, Grado As String
    Dim CF As String
    On Error GoTo errore
    Screen.MousePointer = vbHourglass
    Set cn = New ADODB.Connection
    cn.Open StrCon
    Set rsAnnUff = New ADODB.Recordset
    rsAnnUff.Open "SELECT * from vw_stampa_annuario_Uff_inf", cn, adOpenForwardOnly, adLockReadOnly
    If Not rsAnnUff.EOF Then
    Label1.Visible = True
    rsAnnUff.MoveFirst
    CF = ""
    Do While Not rsAnnUff.EOF
    If CF <> rsAnnUff!CodiceFiscale Then
    indice2 = indice2 + 1
    CF = rsAnnUff!CodiceFiscale
    End If
    rsAnnUff.MoveNext
    Loop
    rsAnnUff.MoveFirst
    CF = rsAnnUff!CodiceFiscale
    Grado = rsAnnUff!Grado
    Ruolo = rsAnnUff!Ruolo
    Else
    MsgBox "errore nella selezione vw_stampa_annuario_gen"
    Exit Sub
    End If
    ProgressBar1.Max = indice2
    ProgressBar1.Visible = True
    Set docword = New Word.Application
    docword.Documents.Add (App.Path & "\Modelli Stampe\annuario.dot")
    docword.Visible = True
    DoEvents
    ' docword.Visible = False
    ' DoEvents
    rsAnnUff.MoveFirst
    PAGINA = 1
    Do While Not rsAnnUff.EOF
    If PAGINA = 1 Then
    ordine = ordine + 1
    docword.ActiveWindow.Selection.Font.Name = "times new roman"
    docword.ActiveWindow.Selection.Font.Size = 18
    docword.ActiveWindow.Selection.Font.Bold = wdToggle
    docword.ActiveWindow.Selection.ParagraphFormat.Lin eSpacing = 150
    docword.ActiveWindow.Selection.ParagraphFormat.Ali gnment = wdAlignParagraphCenter
    docword.ActiveWindow.Selection.TypeText Text:="ESERCITO"
    docword.ActiveWindow.Selection.Font.Bold = wdToggle
    docword.ActiveWindow.Selection.InsertBreak Type:=wdPageBreak
    ordine = ordine + 1
    docword.ActiveWindow.Selection.InsertBreak Type:=wdPageBreak
    PAGINA = 2
    End If
    If PAGINA = 2 Then
    ordine = ordine + 1
    docword.ActiveWindow.Selection.Font.Size = 20
    docword.ActiveWindow.Selection.Font.Name = "times new roman"
    docword.ActiveWindow.Selection.ParagraphFormat.Lin eSpacing = 150
    docword.ActiveWindow.Selection.TypeParagraph
    docword.ActiveWindow.Selection.ParagraphFormat.Lin eSpacing = 30
    docword.ActiveWindow.Selection.Font.Bold = wdToggle
    docword.ActiveWindow.Selection.ParagraphFormat.Ali gnment = wdAlignParagraphCenter
    docword.ActiveWindow.Selection.TypeText Text:=Trim(rsAnnUff!Ruolo)
    docword.ActiveWindow.Selection.Font.Bold = wdToggle
    docword.ActiveWindow.Selection.InsertBreak Type:=wdPageBreak
    ordine = ordine + 1
    docword.ActiveWindow.Selection.InsertBreak Type:=wdPageBreak
    DoEvents
    PAGINA = 3
    End If
    Riga = 2
    ' intestazione e creazione tabella
    ordine = ordine + 1
    DoEvents
    docword.ActiveWindow.Selection.Font.Name = "times new roman"
    docword.ActiveWindow.Selection.Font.Size = 8
    docword.ActiveWindow.Selection.ParagraphFormat.Ali gnment = wdAlignParagraphCenter
    docword.ActiveWindow.Selection.ParagraphFormat.Spa ceBefore = 3
    docword.ActiveWindow.Selection.ParagraphFormat.Spa ceBeforeAuto = False
    docword.ActiveWindow.Selection.ParagraphFormat.Spa ceAfter = 5
    docword.ActiveWindow.Selection.ParagraphFormat.Spa ceAfterAuto = False
    docword.ActiveWindow.Selection.ParagraphFormat.Lin eSpacing = 12
    DoEvents
    ' scrivo il ruolo
    docword.ActiveWindow.Selection.TypeText Text:=Trim(rsAnnUff!Ruolo)
    ' a capo
    docword.ActiveWindow.Selection.TypeParagraph
    ' scrivoil grado
    docword.ActiveWindow.Selection.Font.Bold = wdToggle
    docword.ActiveWindow.Selection.TypeText Text:=Trim(rsAnnUff!Grado)
    docword.ActiveWindow.Selection.Font.Bold = wdToggle
    docword.ActiveWindow.Selection.TypeParagraph
    ' Bordo superiore doppio
    docword.ActiveWindow.Selection.ParagraphFormat.Lin eSpacingRule = wdLineSpaceDouble
    With docword.ActiveWindow.Selection.ParagraphFormat
    .SpaceBeforeAuto = False
    .SpaceAfterAuto = False
    .LineSpacingRule = wdLineSpaceExactly
    .LineSpacing = 6
    End With
    docword.ActiveWindow.Selection.Font.Size = 7
    'crea la tabella
    docword.ActiveWindow.Selection.Tables.Add Range:=docword.ActiveWindow.Selection.Range, NumRows:=51, NumColumns:= _
    5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:=wdAutoFitFixed
    DoEvents
    docword.ActiveWindow.Selection.Tables(1).Select
    docword.ActiveWindow.Selection.Borders(wdBorderHor izontal).LineStyle = wdLineStyleNone
    docword.ActiveWindow.Selection.Tables(1).Borders(w dBorderTop).LineStyle = wdLineStyleDouble
    docword.ActiveWindow.Selection.Tables(1).Borders(w dBorderBottom).LineStyle = wdLineStyleNone
    docword.ActiveWindow.Selection.Tables(1).Borders(w dBorderHorizontal).LineStyle = wdLineStyles
    With docword.ActiveWindow.Selection.Tables(1)
    .ApplyStyleHeadingRows = True
    .ApplyStyleLastRow = True
    .ApplyStyleFirstColumn = True
    .ApplyStyleLastColumn = True
    End With
    ' INTESTAZIONE della tabella
    docword.ActiveWindow.Selection.Font.Size = 8
    docword.ActiveWindow.Selection.ParagraphFormat.Ali gnment = wdAlignParagraphCenter
    docword.ActiveWindow.Selection.TypeText Text:="N.d'ord."
    docword.ActiveWindow.Selection.Borders(wdBorderBot tom).LineStyle = wdLineStyleSingle
    docword.ActiveWindow.Selection.MoveRight Unit:=wdCell
    docword.ActiveWindow.Selection.ParagraphFormat.Ali gnment = wdAlignParagraphCenter
    docword.ActiveWindow.Selection.TypeText Text:="COGNOME E NOME"
    docword.ActiveWindow.Selection.Borders(wdBorderBot tom).LineStyle = wdLineStyleSingle
    docword.ActiveWindow.Selection.MoveRight Unit:=wdCell
    docword.ActiveWindow.Selection.ParagraphFormat.Ali gnment = wdAlignParagraphCenter
    docword.ActiveWindow.Selection.TypeText Text:="Data di nascita"
    docword.ActiveWindow.Selection.Borders(wdBorderBot tom).LineStyle = wdLineStyleSingle
    docword.ActiveWindow.Selection.MoveRight Unit:=wdCell
    docword.ActiveWindow.Selection.ParagraphFormat.Ali gnment = wdAlignParagraphCenter
    docword.ActiveWindow.Selection.TypeText Text:="Data di anzianità in S.P."
    docword.ActiveWindow.Selection.Borders(wdBorderBot tom).LineStyle = wdLineStyleSingle
    docword.ActiveWindow.Selection.MoveRight Unit:=wdCell
    docword.ActiveWindow.Selection.ParagraphFormat.Ali gnment = wdAlignParagraphCenter
    docword.ActiveWindow.Selection.TypeText Text:="Data di anzianità di grado"
    docword.ActiveWindow.Selection.Borders(wdBorderBot tom).LineStyle = wdLineStyleSingle
    docword.ActiveWindow.Selection.MoveRight Unit:=wdCell
    docword.ActiveWindow.Selection.Tables(1).Columns(1 ).PreferredWidth = docword.CentimetersToPoints(1)
    docword.ActiveWindow.Selection.Tables(1).Columns(2 ).PreferredWidth = docword.CentimetersToPoints(14)
    docword.ActiveWindow.Selection.Tables(1).Columns(3 ).PreferredWidth = docword.CentimetersToPoints(2.3)
    docword.ActiveWindow.Selection.Tables(1).Columns(4 ).PreferredWidth = docword.CentimetersToPoints(2.3)
    docword.ActiveWindow.Selection.Tables(1).Columns(5 ).PreferredWidth = docword.CentimetersToPoints(2.3)
    docword.ActiveWindow.Selection.Font.Size = 7
    DoEvents
    Do While Not rsAnnUff.EOF
    ' indico sulla progressbar1 lo stato di avanzamento della stampa
    indice = indice + 1
    indice3 = indice3 + 1
    Label1.Caption = " Stampa Annuario Ufficiali in preparazione...." & indice3 & "/" & indice2
    ProgressBar1.Value = indice3
    DoEvents
    ' STAMPO DATI ANAGRAFICI
    docword.ActiveWindow.Selection.ParagraphFormat.Ali gnment = wdAlignParagraphCenter
    docword.ActiveWindow.Selection.Tables(1).Cell(Riga , 1).Range.InsertAfter indice
    docword.ActiveWindow.Selection.MoveRight Unit:=wdCell, Count:=1
    docword.ActiveWindow.Selection.ParagraphFormat.Ali gnment = wdAlignParagraphLeft
    docword.ActiveWindow.Selection.Tables(1).Cell(Riga , 2).Range.InsertAfter rsAnnUff!Cognome & " " & rsAnnUff!Nome1
    docword.ActiveWindow.Selection.MoveRight Unit:=wdCell, Count:=1
    docword.ActiveWindow.Selection.ParagraphFormat.Ali gnment = wdAlignParagraphCenter
    docword.ActiveWindow.Selection.Tables(1).Cell(Riga , 3).Range.InsertAfter rsAnnUff!DataDiNascita
    docword.ActiveWindow.Selection.MoveRight Unit:=wdCell, Count:=1
    docword.ActiveWindow.Selection.Tables(1).Cell(Riga , 4).Range.InsertAfter rsAnnUff!DataArruolamento
    docword.ActiveWindow.Selection.MoveRight Unit:=wdCell, Count:=1
    docword.ActiveWindow.Selection.Tables(1).Cell(Riga , 5).Range.InsertAfter rsAnnUff!DataPromozione
    'contatore di una riga della tabella
    Riga = Riga + 1
    rsAnnUff.MoveNext
    docword.ActiveWindow.Selection.MoveRight Unit:=wdCell, Count:=1
    ' se fine file esco
    If rsAnnUff.EOF Then Exit Do
    If Riga > 51 Then
    Riga = 2
    End If
    ' nel caso sia il ruolo o il grado sono diversi da quelli precedenti,
    ' e mi trovo su una pagina dispari, devo inserire una pagina riportante
    ' la tabella vuota
    If Not rsAnnUff!Grado = Grado Or Not rsAnnUff!Ruolo = Ruolo Then

    Omissis per motivi di spazio

    End If
    If Not rsAnnUff!Ruolo = Ruolo Then
    Ruolo = rsAnnUff!Ruolo
    indice = 0
    Riga = 2
    PAGINA = 2
    End If
    If Riga = 2 Then
    ' Selection.TypeParagraph
    docword.Selection.MoveDown Unit:=wdScreen, Count:=6
    DoEvents
    docword.Selection.InsertBreak Type:=wdPageBreak
    DoEvents
    Exit Do
    End If
    Loop
    Loop
    DoEvents
    Screen.MousePointer = vbNormal
    docword.Visible = True
    Set docword = Nothing
    DoEvents
    Exit Sub
    errore:
    Screen.MousePointer = vbNormal
    DoEvents
    Set docword = Nothing
    DoEvents
    MsgBox Err.Description
    End Sub

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.