Calcolo campi modulo



  • Calcolo campi modulo
    di fedora (utente non iscritto) data: 10/08/2015 16:56:49

    Salve,
    credo che con il VB si possa prelevare dalla stessa pagina di word quanti giorni ha il mese (dal campo "data corrente"), calcolare i giorni rimanenti dalla data corrente a fine mese in questione, dividere il campo "importo" in euro per i gg del mese e moltiplicarli per i giorni rimanenti per conoscerne l'importo per popolare un ulteriore campo "importo mese corrente".
    Credo si possa fare ma non io...
    Grazie Fedora



  • di alfrimpa data: 10/08/2015 17:23:48

    Ciao Fedora

    Ti rispondo solo per darti la benvenuta sul forum in quanto di VBA per Word ne so quanto di sanscrito

    Comunque, in attesa che qualcuno con maggiori competenze ti possa rispondere, ti chiedo se per caso potessi trasferire il tutto in Excel; in tal caso risolveresti facilmente con un paio di formulette.

    Qualora non potessi, considera nullo questo mio messaggio tranne che per la parte relativa al benvenuto

    Alfredo





  • di Vecchio Frac data: 10/08/2015 19:18:52

    cit. " in quanto di VBA per Word ne so quanto di sanscrito"
    ---> Ma no dai, ne abbiamo già parlato, non esiste "VBA di Word" nè "VBA di Excel". Il linguaggio interpretato è VBA (Visual Basic for Application), poi ogni applicativo espone per l'uso i propri oggetti e proprietà, che VBA è in grado di manipolare. Infatti la sintassi è e rimane identica. Conosciuto il linguaggio base, puoi interagire con tutti gli strumenti Office, da Excel a Outlook a Powerpoint, passando da Access a Publisher eccetera.

    Ora magari do un'occhiata al problema di "fedora" ma è solo un problema di come si vuole affrontare la questione... con userform? con un nuovo documento? con un report in Excel? :)





  • di Vecchio Frac data: 10/08/2015 19:29:47

    @fedora
    L'immagine allegata va bene per capire lo scenario, ma dovresti allegare un documento Word con i campi modulo (senza dati reali ovviamente), senza che noi ci si debba inventare un file che non ha le caratteristiche originali.





  • di alfrimpa data: 10/08/2015 19:46:43

    Si Vecchio Frac quello che dici è più che giusto ma mentre in Excel me la cavicchio (diciamo che so dove mettere le mani) in Word non saprei proprio da dove iniziare, ferma restando la sintassi di base valida per tutti.

    Nel caso specifico non saprei come fare riferimento al valore di un campo modulo presente in un documento Word; qualcosa del genere?

    Alfredo  

    P.S. Ho fatto qualche ricerca con Google ma mentre per Excel/VBA trovi il mare per Word/VBA c'è qualche litro......
     
    ActiveDocument.campomodulo.Value?






  • di Vecchio Frac data: 10/08/2015 20:28:25

    Ora, nello specifico non ho messo mano (ho usato campi modulo circa tredici anni fa per alcuni documenti chiave ma appesantivano talmente il file finale che li ho ben presto abbandonati).
    In casi del genere serve il Registratore di macro.
    Per approfondire naturalmente c'è il visualizzatore oggetti (F2 nell'editor) e lì troverai il mare e tutti i suoi affluenti :)

    p.s. "activedocument.Fields(1).Result" restituisce il valore del primo campo modulo del documento





  • di alfrimpa data: 10/08/2015 20:44:19

    Grazie degli input VF ma, chissà perchè, Word non ha mai esercitato su di me alcun tipo di fascino; l'ho sempre considerato una macchina da scrivere o poco più

    Alfredo





  • di Vecchio Frac data: 10/08/2015 21:39:51

    Io invece, purtroppo o per fortuna, ho smanettato di più su Word che su Excel e continuo a farlo tuttora perchè ricevo documenti con numerose tabelle che devo recuperare, i documenti spesso vengono stravolti dagli utenti e quindi servono numerosi controlli incrociati sulla struttura delle tabelle e un confronto col modello standard. E serve usare Word perchè ancora oggi è lo strumento più diffuso e conosciuto da coloro che devono riempire i campi richiesti.





  • di alfrimpa data: 10/08/2015 22:22:12

    Comunque è proprio vero che il lavoro determina "l'evoluzione della specie"

    Alfredo





  • di fedora (utente non iscritto) data: 10/08/2015 22:26:04

    @vecchio frac, ho allegato il file di word ma mi sa che siete tutti orientati su Excel... ahimè...



  • di Vecchio Frac data: 10/08/2015 22:42:48

    Non preoccuparti, siamo tutti abili e arruolati, si può fare ma domani, con Nelsen ^_^






  • di Vecchio Frac data: 11/08/2015 10:58:35

    Compila un documento nuovo, magari con importi di cui puoi fare facilmente la verifica, poi fai girare in un modulo questo codice e vediamo come va.
    Da qui poi faremo le considerazioni che servono.
     
    Option Explicit
    
    Sub calcola_importo()
    Dim data1 As Date, data2 As Date, giorni_rimanenti As Integer, giorni_mese_corrente As Integer
    Dim costo_periodo As Currency, importo_mese_corrente As Currency
    Dim s As String
        
        data1 = CDate(ActiveDocument.FormFields(1).result)
        data2 = DateSerial(Year(data1), Month(data1) + 1, 0)
        giorni_rimanenti = DateDiff("d", data1, data2)
        giorni_mese_corrente = Day(DateSerial(Year(data1), Month(data1) + 1, 0))
        
        costo_periodo = ActiveDocument.FormFields("mesestd").result
        importo_mese_corrente = costo_periodo / giorni_mese_corrente * giorni_rimanenti
        
        s = "La data iniziale è " & data1 & "." & vbCrLf
        s = s & "Il mese di " & Format(Month(data1), "mmmm") & " ha " & giorni_mese_corrente & " giorni." & vbCrLf
        s = s & "Da oggi rimangono " & giorni_rimanenti & " giorni alla fine del mese." & vbCrLf
        s = s & "Il costo del periodo è euro " & FormatNumber(costo_periodo, 2)
        s = s & ", quindi l'importo del mese corrente" & vbCrLf
        s = s & "per i rimanenti " & giorni_rimanenti & " giorni è pari a euro " & FormatNumber(importo_mese_corrente, 2)
        
        MsgBox s, vbInformation + vbOKOnly, "Calcolo eseguito"
        
    End Sub






  • di Luca73 data: 11/08/2015 11:22:39

    Ciao a tutti
    pur conoscendo poco poco VBA per word ma soprttutto come il VBA dialoga con le varie entita di Word mi ci sono buttatto
    io per selezionare avevo usato un accrocchio del tipo
    ActiveDocument.Bookmarks("DataInizio").Select
    DataInizioPeriodo = Selection
    e per scrivere un altro accrocchio del tipo
    ActiveDocument.Bookmarks("PrimoMeseSuccessivo").Select 'selezione campo Data fine periodo
    Selection.Fields(1).Result.Text = CDate("01/" & mese & "/" & anno)

    ovvero selezionanando il segnalibro corrispondente .....

    Qui sotto riporto il mio codice modificato dopo che ho visto quello di VF

    Ho solo una domanda come faccio ad automatizzare il tutto?
    la versione originale prevede che la data sia quella di oggi quindi quando apro il foglio dovrebbe in automatico compilare tutti i campi. Come si fa?
    Lo stesso dovrebbe accadere se la data non è qulla automatica ma un'altra da impostare manualmente.

    Aggiungo una nota: ho nominato tutti campi con un segnalibro. (alcuni erano mancanti)


     
     
    Public Sub Prova2()
    
    Dim DataPrimoDelMese As Date
    Dim DataInizioPeriodo As Date
    Dim DataFineMese As Date
    
    Dim mese As Integer
    Dim anno As Integer
    
    Dim RataMese As Currency
    Dim RataParziale As Currency
    Dim NumeroGiorni As Integer
    
    DataInizioPeriodo = ActiveDocument.FormFields("datainizio").Result
    RataMese = ActiveDocument.FormFields("mesestd").Result
    anno = Year(DataInizioPeriodo)
    mese = (Month(DataInizioPeriodo) Mod 12) + 1
    DataPrimoDelMese = CDate("01/" & Month(DataInizioPeriodo) & "/" & Year(DataInizioPeriodo))
    If mese = 1 Then anno = anno + 1
    DataFineMese = CDate("01/" & mese & "/" & anno)
    DataFineMese = DataFineMese - 1
    ActiveDocument.FormFields("DataFine").Result = DataFineMese
    NumeroGiorni = DataFineMese - DataInizioPeriodo ' calcolo numero di giorni da pagare
    RataParziale = RataMese * NumeroGiorni / (DataFineMese - DataPrimoDelMese)
    ActiveDocument.FormFields("costoperiodo").Result = Format(Round(RataParziale, 2), , "0,00")
    ActiveDocument.FormFields("PrimoMeseSuccessivo").Result = CDate("01/" & mese & "/" & anno)
    
    End Sub






  • di Vecchio Frac data: 11/08/2015 11:39:21

    @Luca
    La mia formula canonica per conoscere la data di fine mese è questa, robusta, infallibile, affidabile e collaudata:
    DateSerial(anno, mese + 1, 0)
    E poi per le operazioni tra date poi utilizzo preferibilmente DateAdd (anche in negativo, per sottrarre quantità).

    "mese" col Mod mi pare particolarmente curiosa... Month() da solo non ti basta? :)

    Sulla domanda per automatizzare, nè più nè meno di quel che faresti in Excel: o lanci la macro a mano (Alt-F8, scegli dall'elenco, Esegui), o la associ a una combinazione di tasti, o la infili nell'evento di apertura del documento: tipicamente Document_New() visto che si tratta di generare un documento nuovo basato sul modello.

    Sui segnalibri, presenti e mancanti, io ne ho fatto a meno :)





  • di Luca73 data: 11/08/2015 11:55:29

    Ciao VF
    non conoscendo dateserial (da memorizzare...) per ottenere l'ultimo del mese avevo calcolato il primo del mese successivo e avevo tolto un giorno, il mod mi ha permesso di calcolare il mese successivo senza un ciclo if per dicembre...

    aggiungo al mi bagaglio dateAdd, dateserial e DateDiff...Grazie

    Per l'automazione OK ho capito, Pensavo, comunque che si potesse automatizzare il sistema in quanto nel campo ci sono le due caselle con scritto esegui macro in entrata/uscita ma non ho ottenuto risultati....

    Sotto come verrebbe usando le formule appena imparate...


     
    Option Explicit
    Public Sub Prova3VF()
    Dim DataPrimoDelMese As Date
    Dim DataInizioPeriodo As Date
    Dim DataFineMese As Date
    Dim mese As Integer
    Dim anno As Integer
    Dim RataMese As Currency
    Dim RataParziale As Currency
    Dim NumeroGiorni As Integer
    DataInizioPeriodo = ActiveDocument.FormFields("datainizio").Result
    RataMese = ActiveDocument.FormFields("mesestd").Result
    DataPrimoDelMese = DateSerial(Year(DataInizioPeriodo), Month(DataInizioPeriodo), 1)
    DataFineMese = DateSerial(Year(DataInizioPeriodo), Month(DataInizioPeriodo) + 1, 0)
    ActiveDocument.FormFields("DataFine").Result = DataFineMese
    NumeroGiorni = DateDiff("d", DataInizioPeriodo, DataFineMese)
    RataParziale = RataMese * NumeroGiorni / DateDiff("d", DataPrimoDelMese, DataFineMese)
    ActiveDocument.FormFields("costoperiodo").Result = Format(Round(RataParziale, 2), , "0,00")
    ActiveDocument.FormFields("PrimoMeseSuccessivo").Result = DateSerial(Year(DataInizioPeriodo), Month(DataInizioPeriodo) + 1, 1)
    
    End Sub






  • di fedora (utente non iscritto) data: 11/08/2015 19:10:20

    Grazie ad entrambi; ho aggiunto alla funzione datediff un 1g in + viceversa esclude il giorno odierno (credo);

    @Vecchio Frac: il calcolo della rata è perfetto anche se il mese di " & Format(Month(data1), "mmmm") restituisce sempre gennaio (ma non serve...), conteggiando comunque il vero numero dei giorni del mese in corso; rimangono da popolare i campi.... cui non so quali valori assegnare.
    @Luca73: intuitivo tutto per me escluso il calcolo della RataParziale che non fa il suo dovere....
    ****************
    In realtà il costo standard del mese ha in + 2 euro di marche (1.552,00) che sottrarrò per calcolare il costo giornaliero e sommerò al costo del periodo, credo di farcela...almeno per questo!
    grazie davvero
    Fedora
    p.s. salvando i dotm a volte perdo il codice.... mha! per ora posso starci