uso della clipboard



  • uso della clipboard
    di roberto21 (utente non iscritto) data: 19/03/2013 16:08:35

    Torno al forum con una domanda relativa ad un problema che mi sta facendo impazzire. Cercherò di essere chiaro, ma...
    Nella mia applicazione vba (Excel 2010) ho bisogno di ricavare il codice fiscale. Ho trovato il programma che fa al caso mio, che può essere chiamato dalla linea di comando. Il programma scrive il codice nella cliboard, e di qui uno se lo va a prendere. Riporto qui le istruzioni dell'autore (Mauro Rossi) per utilizzarlo da VBA:

    Per richiamare da una vostra applicazione scritta in VB tale funzionalità potete, ad esempio, sfruttare il seguente codice:
    Dim ret As Long
    ret = Shell(App.Path & "codfis.exe " & "Rossi,Davide,10/03/95,M,Sanremo",vbNormalNoFocus)
    CF = Clipboard.GetText(vbCFText)
    Dove al posto di App.Path & "codfis.exe " potete anche inserire il percorso completo dove si trova installato Codice fiscale:
    "C:ProgrammiCodice fiscalecodfis.exe "

    Tutto chiarissimo, solo che non funziona in quanto PARE che VB7 di excel2010 non riconosca l'oggetto clipboard, per cui l'istruzione
    CF = clipboard.getText
    dà errore "Object required". Navigando qua e là, pensavo di aver trovato la soluzione sostituendo quella parte con

    Dim objDataObject As MSForms.DataObject
    Set objDataObject = New MSForms.DataObject
    ...
    objDataObject.GetFromClipboard
    CF = objDataObject.GetText.

    quindi il mio codice finale è quello riportato sotto.


    Il mistero è il seguente: le debug.print danno un valore corretto per str, mentre CF riporta il valore presente nella clipboard PRIMA dell'esecuzione del programmino. Uno potrebbe pensare: be', non ha funzionato e non ha scritto niente. Forse, ma quel che succede è che se vado in edit nel codice VBA da qualsiasi parte e provo un PASTE viene fuori il Codice fiscale corretto; se vado da qualsiasi altra parte (sul foglio excel, su notepad etc) il comando PASTE mi restituisce il valore presente prima, quello riportato da debug.print. Ma il paste può pescare da due punti diversi? ci sono clipboard diverse? e se è così, come faccio a pescare il CF nella clipboard giusta?
    Credo che la cosa sia talmente assurda che ci deve essere una spiegazione banale, che io non riesco a vedere. Qualcuno mi illumina?
     
    dim str,params as string
    dim ret as long
    Dim objDataObject As MSForms.DataObject
    
    Set objDataObject = New MSForms.DataObject
    params = Me.txtcognome & "," & Me.txtnome & "," & datadinascita & "," & Me.ComboBoxSesso & "," & Me.ComboBoxNascitaComune
    str = "C:Program Files (x86)Codice Fiscalecodfis.exe " & params
    Debug.Print str
    
    objDataObject.Clear
    
    ret = Shell(str, vbNormalFocus)
    
    objDataObject.GetFromClipboard
    CF = objDataObject.GetText
    Debug.Print CF



  • di Vecchio Frac data: 19/03/2013 16:24:35

    Prima di leggere con attenzione il resto del post (ho letto le prime tre righe) mi vien voglia di dirti: "ma perchè non incorpori il codice VBS (perchè sicuramente hai trovato uno script VBS, visto l'autore che so abbia fatto altri ottimi lavori, vedi DirList, sempre in VBS) nel tuo codice VBA? le modifiche da fare sono pochissime e sicuramente eviti un po' di problemi".

    (...e adesso mi leggo il resto del post ^_^)





  • di roberto21 (utente non iscritto) data: 19/03/2013 16:33:56

    Ma non so dove sia il codice vbs. Dal sito di Rossi si scarica solo l'eseguibile setup.exe o codiceFiscale.exe, e nella cartella ci sono solo codfis.exe e uninstall.exe...



  • di Vecchio Frac data: 19/03/2013 16:37:58

    ...mi rispondo da solo: non puoi farlo perchè non hai trovato uno script VBS ma un eseguibile .exe ^_^

    comunque il codice che hai trovato nel sito di cpearson sull'uso della clipboard mediante il DataObject funziona perfettamente... almeno a me funziona, solo che ho dovuto dichiarare Dim CF As String perchè nel tuo codice non c'è e io uso sempre Option Explicit che me lo ha segnalato.
    Prova a dichiarare CF As String.





  • di roberto21 (utente non iscritto) data: 19/03/2013 16:47:30

    Sono contento che ti funzioni. La variabile CF è dichiarata come string all'inizio della sub. Se necessario, la posto tutta, ma il resto del codice non ha niente a che vedere con questo problema. Io continuo ad avere lo stesso problema: paste nel codice vba: codice fiscale. Paste altrove: ultimo contenuto prima del codice fiscale. Non è che ha qualcosa a che fare col fatto che la clipboard di Office non viene cancellata, ma contiene fino a 24 items?



  • di Vecchio Frac data: 19/03/2013 16:54:58

    A essere del tutto onesto, per provare il codice ho sostituito
    ret = Shell(str, vbNormalFocus)
    con
    ret = Shell("calc.exe", vbNormalFocus)
    per avere la calcolatrice (è un programma esterno come codfis), quindi ho digitato un numero e l'ho copiato con Ctrl-C, quindi al ritorno al codice la riga
    Debug.Print CF
    mi ha stampato correttamente il valore preso dalla calcolatrice.
    Fai anche tu questa prova.
    Se il problema è nella (particolare) Clipboard di Office, non saprei e a questo punto servono più test (ma io sto per uscire e devo rinviare a stasera).





  • di roberto21 (utente non iscritto) data: 19/03/2013 17:37:43

    La tua prova è leggermente diversa, nel senso che calc ti visualizza la calcolatrice, mentre codfis chiamato così elabora tutto all'interno senza visualizzare nulla. Se uno ragiona all'inverso, dovrebbe pensare che codfis scrive da una parte, mentre ObjDataObject.GetFromClipoboard prende da un'altra. Il fatto è che anche Paste (o ctrl-v) manifesta un comportamento dissociato. Se può aiutare, ecco le ultime prove.
    Se cancello manualmente la clipboard di office (clear all), dopo l'esecuzione CF è corretto, e il codice fiscale compare nell'elenco della clipboard come unica entry. Se rieseguo, CF riprende il vecchio codice, e quello nuovo NON va nell'elenco della clipboard, che continua ad avere il vecchio CF come unico occupante. Conclusione: il programma di Rossi non riesce a scrivere se la clipboard ha qualcosa dentro, e la mia istruzione objDataObject.clear non ripulisce un bel niente (almeno della clipboard di office),per cui CF riceve il primo item della lista della clipboard; e oviamente il solo momento in cui questo è buono è quando la lista è completamente vuota.



  • di Vecchio Frac data: 20/03/2013 11:52:09

    Mi viene in mente come ultima soluzione quella di cancellare la clipboard di Office.
    Non è particolarmente facile, ma se questa è la soluzione, la dovremo praticare :)





  • di roberto21 (utente non iscritto) data: 20/03/2013 12:42:15

    L'idea era venuta anche a me, ma dopo svariate ricerche su internet mi sta venendo la depressione. Pare sia un'impresa pressocchè impossibile. Il metodo più banale (Application.CutCopyMode = False) non funziona, e anche altri suggerimenti che ho provato non funzionano.
    Uno scambio di idee con Rossi ha portato al suo dubbio che forse le librerie che lui usa per scrivere nella clipboard nella piattaforma a 64 bit non funzionano. Plausibile, ma non è così. Ho installato la sua applicazione sul mio fido XP pro SP3 32 bit e il comportamento è assolutamente identico: la maschera funziona, la chiamata diretta via cmd no. Questo non ha nulla a che vedere con la clipbpoard office: apro la finestra di clipbrd.exe per esaminare il contenuto della clipboard, e nella finestra cmd scrivo codfis.exe rossi,mario,21/12/34,M,Sanremo: se la clipboard era vuota, mi compare il CF corretto. Ora scrivo codfis.exe bianchi,mario,12/12/36,M,Genova, e il CF non compare, ma nella clipboard rimane quello di prima (NB: nessuna segnalazione di errore).
    Continuo a cercare qualche sistema efficace di pulire la clipboard. Se avete news, fatemelo sapere. Grazie



  • di Vecchio Frac data: 20/03/2013 14:10:20

    Ho capito perfettamente il problema (dopo aver letto i tuoi post, sono un po' di coccio ^_^) e ti confermo che l'impresa di cancellare la Clipboard di Office è ardua.
    Proseguo anch'io nella ricerca.





  • di roberto21 data: 21/03/2013 11:25:37

    Vi rendo edotti delle novità. Anche provando con XP a 32 bit, non è cambiato nulla, ma Rossi mi conferma di aver provato e che a lui funziona. Ultima differenza rimasta era che il mio Xp (e win7) sono in inglese: non credevo ciò avesse influenza, e infatti nstallando su win7 italiano non è cambiato nulla. Non ho motivo di dubitare che a Rossi funzioni tutto: ma a qualcuno gli si accende qualche lampadina su che cosa nelle mie installzioni possa causare questo comportamento? Ripeto: sto parlando di questa prova: aprire la finestra clipbrd.exe per monitorare la clipboard, e svuotarla se c'è quaòlcosa dentro.
    aprire la finestra cmd e chiamare il programma di rossi come segue: codfis rossi,mario,10/06/78,M,savona e premere invio: nella clipboard compare il CF corretto. Richiamare di nuovo codfis con un altro nome, p.es. codfis bianchi,alfredo,23/07/65,m,roma, premere invio e la clipboard rimane ferma al valore precedente, mentre Rossi conferma che il nuovo valore sostituisce il precedente, come dovrebbe. Perchè a me no?



  • di Vecchio Frac data: 21/03/2013 15:41:39

    Dalle mie ricerche concludo che non è possibile interagire programmaticamente con la Clipboard di Office.
    Mi manca il riferimento a codfis.exe e non posso quindi provare il test che richiedi.





  • di roberto21 data: 21/03/2013 18:50:34

    Sono riuscito a bypassare il problema con questo stratagemma (l'ho trovato in vari posti, ma credo che anche questo venga da cpearson):

    Private Declare Function OpenClipboard Lib "user32" ( _
    ByVal NewOwner As Long) As Boolean
    Private Declare Function EmptyClipboard Lib "user32" () As Boolean
    Private Declare Function CloseClipboard Lib "user32" () As Boolean

    Sub ClearClipboard()
    ' call ClearClipboard()

    If OpenClipboard(0) Then
    EmptyClipboard
    CloseClipboard
    End If
    End Sub

    chiamando poi ClearClipboard prima di chiamare il programmino di Rossi. Sembra che si riesca così a ripulire la clipboard di windows, non quella di office e ciò basta. Certo che,se funzionasse come dovrebbe la scrittura del programmino in clipboard il marchingegno non servirebbe...
    Se ti interessa provare, basta scaricare il file exe di rossi e installare: ti segni dove mette codfis.exe (di solito c:programmicodice fiscale) e poi lo chiami sotto cmd con dei parametri di esempio, come quelli che avevo scritto io. Ti occorre anche monitorare la clipboard: XP aveva già l'utility clipbrd.exe, con vista e win7 puoi scaricarla per esempio da qui
    blablabla.thewindowsclub.com/downloads/Clipboard-Viewer.zip
    ed eseguirla senza particolari fronzoli.



  • di Vecchio Frac data: 21/03/2013 20:05:46

    No, l'avevo visto e provato anch'io, ma come hai intuito pulisce la Clipboard di Windows, non quella di Office.
    Quindi punto e a capo, per il tuo problema, anche se tu dici " ...e ciò basta "; secondo me non basta :)
    Per codfis.exe, non ho link per scaricarlo :)





  • di roberto21 data: 21/03/2013 23:00:44

    In effetti basta sul serio. Il programma di Rossi prova a scrivere sulla clipboard di windows, per cui se pulisco quella il programma la trova vuota e riesce a scrivere (anche se Rossi continua a dire che a lui funziona comunque: io ho provato su altri due PC con lo stesso risultato negativo, per cui se riesci a provare anche tu o mi conforti o mi convinci che devo essere ritardato). Il fatto poi che l'unica entry della clipboard di windows coincida con la prima entry delle possibili 24 della clipboard di office è un'altra storia, ma sembra che per questo problema almeno si riesca a risolvere così.
    Se metti in google "mauro rossi codice fiscale" il primo risultato è quello che ti serve. Non posso scrivere l'indirizzo qui, comunque è banale: www.maurorossi.net/pagine/programmi/codicefiscale.htm



  • di Vecchio Frac data: 22/03/2013 09:25:04

    cit. " In effetti basta sul serio"
    ---> Bene, grazie per il ritorno. Peccato perchè quasi subito avevo trovato anch'io questa semplice soluzione, bastava postarla ma avevo capito male. Ora però provo e vediamo di simulare il comportamento anomalo.





  • di Vecchio Frac data: 22/03/2013 09:49:35

    Ho appena finito test distinti, sia in macchina reale che in macchina virtuale, però tutte e due winXP (dovrei provare a casa su una macchina con Seven). Ti conforto e ti confermo che l'esecuzione di codfis.exe *non* svuota la clipboard di Winzozz, quindi non sei ritardato :)
    Però se avvii codfis in modalità GUI, cioè grafica (digitando i dati e cliccando sulla textbox del codice fiscale, dopo averlo generato, ti dice "copiato negli appunti", ed è vero, in clipboard c'è).
    Probabilmente codfis in modalità riga di comando fa un utilizzo non convenzionale della memoria (molto strano, penso di più a un baco di VB6). Funziona solamente cancellando previamente la clipboard di Windows (e allora quel codice che hai trovato funziona bene).





  • di roberto21 data: 22/03/2013 23:14:15

    Il grande Mauro Rossi mi ha inviato la versione corretta di codfis da provare. Ora funziona tutto!!! Spero la metta in linea presto.
    Possiamo considerare chiuso il thread. Personalmente, ho imparato un sacco di cose. Adesso passo al prossimo step: aspettatevi la domanda su come attivare il mail merge da macro excel...



  • di Vecchio Frac data: 23/03/2013 08:39:37

    Magnifico... sarebbe interessante però sapere se trattavasi di un baco di Winzozz, di VB6 o del suo codfis originale ^_^
    Mail merge da Excel? uhm :)





  • di roberto21 data: 23/03/2013 09:29:35

    Francamente non gliel'ho chiesto, e dubito che avrei capito se me lo avesse detto...comunque, è una persona disponibilissima, magari se lo contatti all'indirizzo che c'è sul suo sito ti risponde.
    Ho cominciato a provare word mail merge chiamandolo da excel. Per ora provo, eventualmente apro un altro thread...