Autore |
Discussione  |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 28 novembre 2010 : 08:50:20
|
Questa funzione apre un file excel, si posiziona in un determinato foglio e legge il contenuto di una cella.
Sintassi: (excel file_excel foglio_di_lavoro cella)
Argomenti: file_excel - Stringa indicante il file con estensione xls foglio_di_lavoro - Stringa indicante un foglio di lavoro valido (es. Foglio1) cella - Stringa indicante la cella da valutare
(defun excel (fileexcel foglioexcel cella / fogliodilavoro valorecella)
(if (and (stringp fileexcel)
(stringp foglioexcel)
(stringp cella)
)
(progn
(setq fogliodilavoro
(vlax-get-property
(vlax-get-property
(vla-open
(vlax-get-property
(vlax-get-or-create-object "Excel.Application")
'workbooks
)
fileexcel
)
'worksheets
)
'item
foglioexcel
)
valorecella (vlax-get (vlax-get-property
fogliodilavoro
'Range
cella
)
'Value2
)
)
(vlax-invoke
(vlax-get-property
(vlax-get-or-create-object "Excel.Application")
'workbooks
)
'close
)
valorecella
)
(progn
(cond
((not (stringp fileexcel))
(setq valorecella nil)
(princ
(strcat "; errore: tipo di argomento errato: stringp: "
fileexcel
)
)
)
((not (stringp foglioexcel))
(setq valorecella nil)
(princ
(strcat "; errore: tipo di argomento errato: stringp: "
foglioexcel
)
)
)
((not (stringp cella))
(setq valorecella nil)
(princ
(strcat "; errore: tipo di argomento errato: stringp: "
cella
)
)
)
)
)
)
)
Per la funzione excel viene usata un'altra funzione che serve a verificare che l'argomento inserito sia una stringa, la funzione stringp:
(defun stringp (argomento / stringa)
(setq stringa "STRINGA")
(if (= (numberp argomento) nil)
(if (equal (type argomento)(type stringa)) T nil)
)
)
|
|
aforza
Utente Master
Regione: Italia
Prov.: Padova
Città: Cavarzere(VE)-Monselice(PD)
1798 Messaggi |
Inserito il - 29 novembre 2010 : 09:09:50
|
ciao,
complimenti....
cos'hai una scarica ormonale di programmazione.... :-)
ciao |
Andrea Forza
CadWorx 2014 & Plant3D AutoCAD 2014 su Seven 64bit - Dell Vostro i7 ram 8gb - doppio monitor Hanns-g 22" |
 |
|
arri
Utente Master
Regione: Lombardia
14951 Messaggi |
Inserito il - 29 novembre 2010 : 09:36:17
|
Messaggio inserito da aforza
ciao,
complimenti....
cos'hai una scarica ormonale di programmazione.... :-)
ciao
siamo fortunati che Terminator abbia scelto CADlandia 
Gli si addice anche il nick, è un terminatore di problemi, li risolve tutti   |
Modificato da - arri in data 29 novembre 2010 09:39:45 |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 29 novembre 2010 : 10:15:12
|
Adesso con l'ActiveX e i reattori si sono aperti nuovi orizzonti. L'unico limite rimane solo la fantasia... |
 |
|
blubossa
Utente Senior
102 Messaggi |
Inserito il - 29 novembre 2010 : 12:24:46
|
confermo è proprio un Terminator..........
| Messaggio inserito da arri
Messaggio inserito da aforza
ciao,
complimenti....
cos'hai una scarica ormonale di programmazione.... :-)
ciao
siamo fortunati che Terminator abbia scelto CADlandia 
Gli si addice anche il nick, è un terminatore di problemi, li risolve tutti  
|
|
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 03 dicembre 2010 : 06:47:44
|
Il programma come è stato scritto è abbastanza limitato, ogni volta che legge una cella un file excel si apre e si chiude. Siccome bisogna, nella totalità dei casi, leggere sempre più di una cella mi sono chiesto se fosse il caso di creare una funzione che, al pari delle funzioni open e close, apra un file excel in lettura o in scrittura e dopo avere elaborato il file, lo chiuda.
Ora le funzioni sono tre: 1) openexcel 2) cellaexcel 3) closeexcel
OPENEXCEL Sintassi: (openexcel fileexcel foglio flag)
Argomenti: fileexcel - Stringa indicante il file excel compreso di percorso foglio - Stringa indicante il foglio di lavoro interessato flag - Stringa che indica se siamo in modalità lettura, scrittura o append "r" - modalità lettura, il file viene aperto in lettura. Se non esiste, la funzione restituisce nil "w" - modalità scrittura, il file viene aperto in scrittura. Se esiste un file con lo stesso nome questo viene sovrascritto "a" - modalità append, il file viene aperto in scrittura e aggiornato con nuovi dati. Se il file non esiste, viene creato un file nuovo
In tutti i casi, se non esiste il foglio interessato la funzione restituisce nil.
(defun openexcel (fileexcel foglioexcel flag / listafogli fogli)
(if (and (stringp fileexcel)
(stringp foglioexcel)
(stringp flag)
)
(progn
(cond
((or (= (strcase flag) "R")
(= (strcase flag) "W")
(= (strcase flag) "A")
)
(setq WBKS (vlax-get-property
(vlax-get-or-create-object "Excel.Application")
"workbooks"
)
)
(cond
((= (strcase flag) "R")
(if (findfile fileexcel)
(setq fileinlettura (vla-open WBKS fileexcel))
nil
)
)
((= (strcase flag) "W")
(if (findfile fileexcel)
(vl-file-delete fileexcel)
)
(setq fileinlettura (vla-add WBKS))
)
((= (strcase flag) "A")
(if (findfile fileexcel)
(setq fileinlettura (vla-open WBKS fileexcel))
(setq fileinlettura (vla-add WBKS))
)
)
)
(cond
((or (and (= (strcase flag) "R")(findfile fileexcel))
(= (strcase flag) "W")
(= (strcase flag) "A")
)
(setq
insiemefogli (vlax-get-property
fileinlettura
'worksheets
)
listafogli
(vlax-for fogli insiemefogli
(setq nomifogli (consr (strcase (vlax-get-property fogli "Name")) nomifogli))
)
)
(if (equal (strcase foglioexcel)
(car (member (strcase foglioexcel) listafogli))
)
(progn
(setq fogliointeressato
(vlax-get-property
insiemefogli
'item
foglioexcel
)
flagcella flag
foglioexcelcella
foglioexcel
fileexcelcella
fileexcel
)
fileinlettura
)
(progn (vla-close fileinlettura)
(princ)
(setq fileinlettura nil)
)
)
)
)
)
(T
(princ "\n; errore: modalità di apertura sconosciuta: ")
(princ flag)
(princ)
)
)
)
(progn
(cond
((not (stringp fileexcel))
(princ
(strcat "; errore: tipo di argomento errato: stringp: "
fileexcel
)
)
)
((not (stringp foglioexcel))
(princ
(strcat "; errore: tipo di argomento errato: stringp: "
foglioexcel
)
)
)
((not (stringp flag))
(princ
(strcat "; errore: tipo di argomento errato: stringp: "
flag
)
)
)
)
)
)
)
CELLAEXCEL Sintassi: (cellaexcel cella valore)
Argomenti: cella - Stringa indicante la cella da leggere o da scrivere valore - Stringa indicante il valore da inserire in fase di scrittura file, in caso contrario inserire nil.
Il valore restituito è il valore della cella che viene letta se siamo in lettura, nil se siamo in scritttura
(defun cellaexcel (cella valore)
(cond
((= (strcase flagcella) "R")
(setq valorecella
(vlax-variant-value
(vlax-get-property
(vlax-get-property
fogliointeressato
'Range
cella
)
'Value2
)
)
)
)
((or (= (strcase flagcella) "W")
(= (strcase flagcella) "A")
)
(vlax-put-property
(vlax-get-property
fogliointeressato
'Range
cella
)
'Value2
valore
)
)
)
)
CLOSEEXCEL Sintassi: (closeexcel file_desc)
Argomenti: file_desc - E' la variabile che contiene il file memorizzato nella funzione openexcel, al pari della funzione close
(defun closeexcel (file_excel / fogliointeressato)
(cond
((= (strcase flagcella) "R")
(vla-close fileinlettura)
)
((= (strcase flagcella) "W")
(vla-close fileinlettura :vlax-true fileexcelcella)
)
((= (strcase flagcella) "A")
(if (findfile fileexcelcella)
(vla-close fileinlettura :vlax-true)
(vla-close fileinlettura :vlax-true fileexcelcella)
)
)
)
(setq flagcella nil
fileexcelcella nil
fileinlettura nil
)
(princ)
)
Se potete testare il tutto per vedere se ci sono bug o miglioramenti.
Trovato bug e aggiornata funzione openexcel, se il file non esisteva in modalità lettura c'era un messaggio di errore, invece del più naturale nil, come specificato fra l'altro nelle istruzioni. |
Modificato da - Terminator in data 03 dicembre 2010 12:08:26 |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 04 dicembre 2010 : 19:27:04
|
Due brevissime funzioni che si integrano alle funzioni descritte precedentemente. Utili soprattutto quando si devono fare letture sul file excel di più celle di seguito.
CELLAHOR - Restituisce una stringa indicante la cella successiva orizzontale
Sintassi: (cellahor cella)
Argomenti: cella - Cella di excel
(defun cellahor (stringalettera / listalettere)
(setq index 0)
(setq listalettere
'("A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z")
)
(if (and (equal (strcase (substr stringalettera 1 1))
(car
(member (strcase (substr stringalettera 1 1)) listalettere)
)
)
(not (equal (strcase (substr stringalettera 1 1)) "Z"))
(> (atoi (substr stringalettera 2 (strlen stringalettera)))
0
)
)
(strcat (cadr
(member (strcase (substr stringalettera 1 1)) listalettere)
)
(itoa
(atoi (substr stringalettera 2 (strlen stringalettera)))
)
)
nil
)
)
CELLAVER - Restituisce una stringa indicante la cella successiva verticale
Sintassi: (cellaver cella)
Argomenti: cella - Cella di excel
(defun cellaver (stringalettera)
(strcat (substr stringalettera 1 1) (itoa (1+ (atoi (substr stringalettera 2 (strlen stringalettera))))))
)
|
Modificato da - Terminator in data 04 dicembre 2010 19:28:39 |
 |
|
aforza
Utente Master
Regione: Italia
Prov.: Padova
Città: Cavarzere(VE)-Monselice(PD)
1798 Messaggi |
Inserito il - 06 dicembre 2010 : 09:12:41
|
ciao,
scusami hai seguito qualche corso o leggi manuali a manetta?
ciao |
Andrea Forza
CadWorx 2014 & Plant3D AutoCAD 2014 su Seven 64bit - Dell Vostro i7 ram 8gb - doppio monitor Hanns-g 22" |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 06 dicembre 2010 : 09:23:02
|
| Messaggio inserito da aforza
ciao,
scusami hai seguito qualche corso o leggi manuali a manetta?
ciao
|
Corsi non ce ne sono, magari! Bisogna giocoforza fare l'autodidatta con esempi di lisp in rete (sovente gli originali compiono operazioni anche molto diverse da quello che desidero), manuali (le mie letture in treno per andare al lavoro si riducono a manuali AutoLISP, metodi ActiveX, funzioni, reattori) e poi provare, riprovare, riprovare...e ancora riprovare! |
 |
|
aforza
Utente Master
Regione: Italia
Prov.: Padova
Città: Cavarzere(VE)-Monselice(PD)
1798 Messaggi |
Inserito il - 06 dicembre 2010 : 12:18:30
|
ciao,
immaginavo, anche qui corsi zero....
Grazie Ciao |
Andrea Forza
CadWorx 2014 & Plant3D AutoCAD 2014 su Seven 64bit - Dell Vostro i7 ram 8gb - doppio monitor Hanns-g 22" |
 |
|
Terminator
Utente Master
725 Messaggi |
Inserito il - 06 dicembre 2010 : 14:04:56
|
Grazie a Cadlandia ho trovato un bel po' di materiale che mi è stato molto utile. |
 |
|
|
Discussione  |
|