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

    [vb6] Problema con tabella in Word

    Ciao a tutti,

    creo una tabella in word in questo modo:
    codice:
    Private Sub Command4_Click()
    Dim WordApp As Object
    Set WordApp = New Word.Application
    WordApp.Documents.Open App.Path & "\Carta_intestata.doc"
    WordApp.Visible = True
    With WordApp.Selection
       .Tables.Add WordApp.Selection.Range, 1, 7
       .Tables(1).Columns.AutoFit
       .Tables(1).Borders.Enable = True
    End With
    End Sub
    la popolo con i dati presenti in un MSFlexGrid dopo una query in questo modo:

    codice:
       .Tables(1).Cell(2, 1).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 2) & ""
       .Tables(1).Cell(2, 2).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 3) & ""
       .Tables(1).Cell(2, 3).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 8) & ""
       .Tables(1).Cell(2, 4).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 9) & ""
       .Tables(1).Cell(2, 5).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 10) & ""
       .Tables(1).Cell(2, 6).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 17) & ""
       .Tables(1).Cell(2, 7).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 19) & ""
    tutto bene fin qui... ma c'è un modo per aggiungere alla tabella di word un tot di righe per quanti sono i record trovati dalla query sulla MSflexGrid?

    Mi spiego meglio:
    se facendo la query, viene trovato e visualizzato nel MSFlexGrid un solo record allora il codice qui sopra va bene...ma se la query trova più records come faccio ad aggiungere alla tabella tante righe (rows) per quanti sono i record trovati?

    se aumento il numero di righe in queto punto:
    codice:
    .Tables.Add WordApp.Selection.Range, 10, 7
    poi mi lascia ad esempio 7 righe vuote se la query mi trova solo 3 records e non va bene in quanto la tabella dev'essere rapportata al contenuto. Come posso fare? :master:

    inoltre per aggiungere i records alla tabella devo ogni volta ripetere la stessa procedura cambiando il numero di riga e colonna ?
    Esempio:
    codice:
    .Tables(1).Cell(2, 1).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 2) & ""
       .Tables(1).Cell(2, 2).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 3) & ""
       .Tables(1).Cell(2, 3).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 8) & ""
       .Tables(1).Cell(2, 4).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 9) & ""
       .Tables(1).Cell(2, 5).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 10) & ""
       .Tables(1).Cell(2, 6).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 17) & ""
       .Tables(1).Cell(2, 7).Range.Text = " " & MSFlexGrid1.TextMatrix(1, 19) & ""
    .Tables(1).Cell(3, 1).Range.Text = " " & MSFlexGrid1.TextMatrix(2, 2) & ""
       .Tables(1).Cell(3, 2).Range.Text = " " & MSFlexGrid1.TextMatrix(2, 3) & ""
       .Tables(1).Cell(3, 3).Range.Text = " " & MSFlexGrid1.TextMatrix(2, 8) & ""
       .Tables(1).Cell(3, 4).Range.Text = " " & MSFlexGrid1.TextMatrix(2, 9) & ""
       .Tables(1).Cell(3, 5).Range.Text = " " & MSFlexGrid1.TextMatrix(2, 10) & ""
       .Tables(1).Cell(3, 6).Range.Text = " " & MSFlexGrid1.TextMatrix(2, 17) & ""
       .Tables(1).Cell(3, 7).Range.Text = " " & MSFlexGrid1.TextMatrix(2, 19) & ""
    o c'è un modo più veloce ed automatico?

    Spero di essere stato chiaro nella descrizione di ciò che voglio fare...e scusate la scocciatura!!!

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

    Ad esempio, questa routine aggiunge una riga che conterrà i dati passati come parametri:

    codice:
    Sub AddToTable(sID As String, sDateTime As String, _
        sNome As String, sCognome As String, _
        sCosto As Single)
        
        With Tables(1)
            With .Rows.Last
                .Cells(1).Range.Text = sID
                .Cells(2).Range.Text = sDateTime
                .Cells(3).Range.Text = sNome
                .Cells(4).Range.Text = sCognome
                .Cells(5).Range.Text = Format$(sCosto, "###0.00")
            End With
            .Rows.Add
        End With
    End Sub
    Sarà sufficiente creare un ciclo For/Next che
    1 - prelevi i dati dalla griglia
    2 - li passi alla routine AddToTable(...) che modificherai in base alle tue esigenze


    Ciao

  3. #3
    Ciao Gibra,

    grazie come sempre per la risposta, ma sii gentile...mi spieghi come posso incastrare quello che mi hai postato tu in questo mio codice:
    codice:
    Private Sub Command4_Click()
    Dim WordApp As Object
    Set WordApp = New Word.Application
    WordApp.Documents.Open App.Path & "\Carta_intestata.doc"
    WordApp.Visible = True
    With WordApp.Selection
       .TypeText "Struttura: " & Text6.Text & " - " & Text2.Text & ""
       .TypeParagraph
       .TypeParagraph
       .TypeText "All'attenzione dell'Ufficio Contabile."
       .TypeParagraph
       .TypeParagraph
       .TypeText "Riepilogo prenotazioni dal " & Text7.Text & " al " & Text8.Text & ""
       .TypeParagraph
       .TypeText "" & Text6.Text & ""
       .TypeParagraph
       .Tables.Add WordApp.Selection.Range, 10, 7
       .Tables(1).Cell(1, 1).Range.Text = " Codice Prenotazione "
       .Tables(1).Cell(1, 2).Range.Text = " Cliente "
       .Tables(1).Cell(1, 3).Range.Text = " Arrivo "
       .Tables(1).Cell(1, 4).Range.Text = " Partenza "
       .Tables(1).Cell(1, 5).Range.Text = " Camere "
       .Tables(1).Cell(1, 6).Range.Text = " Totale "
       .Tables(1).Cell(1, 7).Range.Text = " Imponibile "
       .Tables(1).Columns.AutoFit
       .Tables(1).Borders.Enable = True
    End With
    End Sub
    se poi mi fai un esempio anche di ciclo For/Next per prelevare i dati dalla griglia e passarli alla routine...te ne sarei immensamente grato...scusami ma sto andando fuori di testa :berto:

  4. #4
    su consiglio di componenti di un altro forum ho provato a fare qualcosa a riguardo ma riscontro un errore:

    "tipo non corrispondente per l'argomento ByRef"

    codice:
    AddToTable i , .TextMatrix(i, 2), .TextMatrix(i, 3), _
                    .TextMatrix(i, 8), .TextMatrix(i, 9), .TextMatrix(i, 10)
                    'eventuali altri parametri per altrettante colonne...
    Il codice completo è il seguente:

    codice:
    Private Sub Command4_Click()
    Dim WordApp As Object
    Dim i As Long
    Set WordApp = New Word.Application
    WordApp.Documents.Open App.Path & "\Carta_intestata.doc"
    WordApp.Visible = True
    With WordApp.Selection
       .TypeText "Struttura: " & Text6.Text & " - " & Text2.Text & ""
       .TypeParagraph
       .TypeParagraph
       .TypeText "All'attenzione dell'Ufficio Contabile."
       .TypeParagraph
       .TypeParagraph
       .TypeText "Riepilogo prenotazioni dal " & Text7.Text & " al " & Text8.Text & ""
       .TypeParagraph
       .TypeText "" & Text6.Text & ""
       .TypeParagraph
       .Tables.Add WordApp.Selection.Range, MSFlexGrid1.rows, 7
        .Tables(1).Columns.AutoFit
       .Tables(1).Borders.Enable = True
    End With
    
    With MSFlexGrid1
        For i = 1 To .rows - 1
            AddToTable i, .TextMatrix(i, 2), .TextMatrix(i, 3), _
                    .TextMatrix(i, 8), .TextMatrix(i, 9), .TextMatrix(i, 10)
                    'eventuali altri parametri per altrettante colonne...
        Next
    End With
    End Sub
    in un modulo ho invece dichiarato quanto segue:
    codice:
    Sub AddToTable(iRiga As Integer, sID As String, sDateTime As String, _
        sNome As String, sCognome As String, _
        sCosto As Single)
        
        With Tables(1)
            With .rows(iRiga)
                .cells(1).Range.Text = sID
                .cells(2).Range.Text = sDateTime
                .cells(3).Range.Text = sNome
                .cells(4).Range.Text = sCognome
                .cells(5).Range.Text = Format$(sCosto, "###0.00")
                'Eventuali altre variabili per altrettante colonne ...
            End With
            .rows.Add
        End With
    End Sub
    Grazie a tutti e scusate l'enorme scocciatura che vi posso creare!

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Devi fare il debug del codice, con F8 esegui riga per riga e puoi vedere dove sta l'errore testando il tutto.
    Vedi la guida per ulteriori dettagli su come fare il debug del codice, che è una delle prime cose da imparare, se vuoi capire bene come si programma.

    Ciao

  6. #6
    Ciao Gibra,

    il debug del codice (F8)... non mi segnala errori in quel frangente.

    L'errore "Errore di compilazione: tipo non corrispondente per l'argomento ByRef" mi viene segnalato al click sul Command_Button4 e mi sottolinea sul codice questo punto
    codice:
    AddToTable i  , .TextMatrix(i, 2), .TextMatrix(i, 3), _
                    .TextMatrix(i, 8), .TextMatrix(i, 9), .TextMatrix(i, 10)
                    'eventuali altri parametri per altrettante colonne...
    ho segnato in rosso quello che mi viene sottolineato.

  7. #7
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da huracan@hush
    Ciao Gibra,

    il debug del codice (F8)... non mi segnala errori in quel frangente.
    Spiega come hai usato F8...

    Domanda:
    hai capito cosa fa la routine AddToTable che ti ho indicato io ?
    (non quella che hanno modificato nell'altro forum!)

    Ciao

  8. #8
    ciao Gibra,

    dopo aver passato la notte cercando di capirci qualcosa..facendo anche il Debug del codice..premendo F8 e passando il codice riga per riga...ho capito che l'errore è in questo punto:

    codice:
     Addtotable i, .TextMatrix(i, 2), .TextMatrix(i, 3), .TextMatrix(i, 5), .TextMatrix(i, 6), .TextMatrix(i, 7), .TextMatrix(i, 8)
                    'eventuali altri parametri per altrettante colonne...
    dove mi viene segnalato errore di runtime '13' - Tipo non corrispondente

    Ho visto che il comando mi crea la tabella in Word con le stesse righe della MSFlexGrid grazie a questo codice:
    codice:
    .Tables.Add WordApp.Selection.Range, MSFlexGrid1.rows, 6
    ma la tabella creata non viene popolata con i dati della MSFlexGrid.

    La routine postata da te, per quel che la mia minima (quasi nulla) conoscenza mi ha permesso di capire, dovrebbe far in modo di non ripetere per ogni riga della griglia cosa inserire, ma di farlo in modo "automatizzato" (non sò se è il termine adatto). Comunque per spiegarmi meglio...se non vado errato quelle che vengono dichiarate tra le 2 parantesi
    codice:
    Sub AddToTable(sID As String, sDateTime As String, _
        sNome As String, sCognome As String, _
        sCosto As Single)
    .. dovrebbero essere le intestazioni delle colonne della MSFlexGrid o del Database (sono le stesse)...poi richiamando la routine:
    codice:
    With MSFlexGrid1
    Dim i As Integer
        For i = 1 To .rows - 1
            Addtotable i, .TextMatrix(i, 2), .TextMatrix(i, 3), .TextMatrix(i, 5), .TextMatrix(i, 6), .TextMatrix(i, 7), .TextMatrix(i, 8)
                    'eventuali altri parametri per altrettante colonne...
        Next
    End With
    dovrebbe (in teoria e almeno credo)..aggiungere alla tabella i record della MSFlexGrid sotto la colonna specificata.

    Adesso non sò se ho capito bene o ho detto solo una marea di c...ate provenienti dalla mia ignoranza in materia...però almeno ci ho provato!

  9. #9
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Allora, prima di tutto devi deciderti:
    1 - usi la routine che ti ho dato io (allora posso aiutarti)
    2 - usi quella modificata (ed allora io no posso aiutarti)

    Stai mescolando le due cose quindi alla fine non ci capiamo più niente.

    Se opti per la 1, prepara un progetto di prova, crea un ZIP includendo il file "Carta_intestata.doc" ed inviamelo a vbcorner@vbcorner.net

    Ciao

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.