|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 2188
|
[VB.NET]programma in background che legge file excel
come da titolo vorrei realizzare un piccolo programma che legge da un file excel alcune celle (sempre le stesse) e se trova una data a 6 mesi apre un messagebox contenente l'intera riga.
fine! poi mi piacerebbe che potesse mandare una mail al posto del messaggio, ma questa è un'altra storia... iniziamo dalle cose semplici! chi mi da uno spunto su come procedere? grazie! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
"In background" significa che deve funzionare "di nascosto" ? ( tanto se vogliono chiudertelo, te lo chiudono comunque ) Oppure che deve funzionare senza che Excel sia installato... O cosa ?
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 2188
|
Quote:
background -> in tray i dati sarebbero in excel e il programma è installato su tutti i pc... ma non è obbligatorio utilizzarlo con il programma, è solo per comodità. nel file excel ci sono indirizzi e date di "scadenza" ma possono essere messi anche su file di testo! pensavo alla comodità che si ha in excel di avere celle formattate e selezionabili facilmente, mentre un file di testo è meno "simpatico" Ultima modifica di radeon_snorky : 07-11-2009 alle 13:25. |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Codice:
Dim appExcel As New Microsoft.Office.Interop.Excel.Application
appExcel.Visible = False
Dim WB As Microsoft.Office.Interop.Excel.Workbook = appExcel.Workbooks.Open(percorso & nomeFile)
Dim WS As Microsoft.Office.Interop.Excel.Worksheet = WB.Worksheets("Foglio1")
...
...
ecc...
|
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 2188
|
Quote:
|
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Certo, non puoi fare copia-incolla da VBA a VB.NET e pretendere che funzioni tutto... |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 2188
|
Quote:
però per quel che devo fare io il copia-incolla lo posso fare di un buon 85-90% ... ma siamo sempre alle solite: c'è bisogno di uno spunto, un "cicchetto", un bottarella nella giusta direzione... altrimenti la mia incapacità mi lascia al palo! dove mi posso leggere guide ed esempi? |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 2188
|
ho cercato in lungo e in largo ma non ho trovato nulla che potesse fare al caso mio... perché non ho trovato nulla? per 2 motivi... non so cosa cercare e tra i millemila link c'è tanto materiale in inglese...
comunque ho seguito questa strada: 1) come mi hai suggerito ho referenziato Microsoft.Office.Interop.Excel e aggiunto le tue righe di codice. 2) ho definito un array formato dal range che contiene TUTTI i dati che mi servono (2 colonne per 40 righe) 3) creato un ciclo for next per leggere le celle e mostrare un messaggio al verificarsi di una condizione (per ora è data <> da now) ora: - è giusto creare una array con tutti i valori? oppure devo suddividerlo separando le date dai testi? se dovessi applicare un array a molte celle, quanto può essere grande l'array prima di diventare "pesante, lento e ingestibile", o non c'è problema? - altra cosa, ma legata alla prima, avendo un array di testi&date, la condizione che vorrei verificare è now() + 180 >= della data ma ho 2 difficoltà, dà errore sui testi (so che è semplice risolvere... tipo aggiungere una condizione "madre" che screma i testi... giusto? provo? o c'è di meglio?), e poi non riesco ad aggiungere 180 alla data (devo forse convertire la data in numero, fare l'operazione e riconvertire in data?) - la sub creata vorrei che fosse indipendente dall'utente, deve essere gestito da un timer e solo secondariamente dalla pressione di un tasto. ho provato a dichiarare la sub pubblica ma mi da errore... non ti posso dire l'errore perché il programmino ce l'ho in ufficio! adesso riprovo a farlo a casa... helpatemi |
|
|
|
|
|
#9 | |||
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Impossibile rispondere alla seconda domanda. L'array diventerà pesante, o pesantissimo e ingestibile ( come tutte le cose ), a seconda della bontà del tuo codice per farvi accesso in lettura/scrittura e ovviamente della mole di dati... Quote:
Per confronti tra intervalli di date usa i TimeSpan... Quote:
La "Sub pubblica" spesso va in errore perchè si fa riferimento ad oggetti della UI. Mai fare riferimento diretto a componenti UI, al di fuori del codice di una Form. |
|||
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 2188
|
so che hai risposto.. ho letto tutto ma volevo mostrarti il codice come è ora con aggiunti i commenti:
Codice:
Dim appExcel As New Microsoft.Office.Interop.Excel.Application
appExcel.Visible = True
Dim WB As Microsoft.Office.Interop.Excel.Workbook = appExcel.Workbooks.Open("C:\Users\max\Documents\cpi.xls")
Dim WS As Microsoft.Office.Interop.Excel.Worksheet = WB.Worksheets("Foglio1")
'devo dichiarare l'array nel modo giusto... e al momento non credo sia giusto
Dim scadenze(4, 1)
Dim indirizzi(4, 1)
Dim xlsRange(4, 2)
'dichiaro che il dato che mi serve è una data e l'indirizzo una stringa
Dim DataFine As Date
Dim indirizzo As String
'popolo l'array... quando riuscirò a capire qual'è...
xlsRange = WS.Range("A1:B4").Value
scadenze = WS.Range("B1:B4").Value
indirizzi = WS.Range("A1:A4").Value
'poi basta leggere dall'array
For Each DataFine In scadenze
'fare il calcolo
If DateDiff(DateInterval.Day, Now, DataFine) <= 180 Then
'nelle mie intenzioni vorrei conoscere la posizione
'del valore all'interno dell'array
'per usarlo per definire la cella che deve
'SOLO apparire nel messaggio
'quindi ne cerco l'index.... ma prima devo far bene le cose precedenti!!!!
Dim index As Integer
index = Array.IndexOf(scadenze, DataFine)
'poi uso index per prendere il valore della cella
index = index + 1
indirizzo = WS.Range("A" & index).Value
'e scrivo il messaggio
MsgBox("Attenzione! il " & DataFine & " scade la pratica! Riferimento: " & indirizzo)
End If
Next
WB.Close()
appExcel.Quit()
appExcel = Nothing
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 2188
|
Quote:
scappo, la signora ha un coltello in mano!!!! |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
No, non ci siamo. Almeno, per come lo risolverei io...
Concettualmente può essere fatto in modo molto più pulito e diretto. Anzitutto DateDiff(DateInterval.Day, DataFine, Now). Altrimenti ricevi differenze sempre negative... Come già detto, preferisco mappare ogni coppia indirizzo-data con un oggetto : Codice:
Private Structure scadenza
Public indirizzo As String
Public data As DateTime
End Structure
Codice:
Dim appExcel As New Microsoft.Office.Interop.Excel.Application
appExcel.Visible = True
Dim WB As Microsoft.Office.Interop.Excel.Workbook = appExcel.Workbooks.Open(percorsoNomeFile)
Dim WS As Microsoft.Office.Interop.Excel.Worksheet = WB.Worksheets("Foglio1")
Dim scadenze As New List(Of scadenza)
For i As Integer = 1 To 4
Dim s As New scadenza
s.indirizzo = WS.Range("A" & i).Text
s.data = WS.Range("B" & i).Text
scadenze.Add(s)
Next
'Controllo
For Each s As scadenza In scadenze
If DateDiff(DateInterval.Day, s.data, Now) <= 180 Then
MsgBox("Attenzione! il " & s.data & " scade la pratica! Riferimento: " & s.indirizzo)
End If
Next
WB.Close()
appExcel.Quit()
appExcel = Nothing
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 2188
|
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 2188
|
Quote:
p.s. il processo excel rimane in memoria!!! uffiiiiiiiiiiii |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
A mio modo di vedere... SI !
Ma non prenderla come una critica "cattiva". Potrei postare codice VB6 scritto da me anni fa... Cose da far venire i brividi... Quote:
Ci sono diverse strategie per evitarlo. Puoi killare il processo... Personalmente mi sto facendo una classe che gestisce in modo efficiente e definitivo i Processi Office da Interop, ma non penso certo di postarla qui... |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Mar 2003
Messaggi: 2188
|
Quote:
il fatto è che vorrei avviare il programma in esecuzione automatica e usare un timer per avviare lo "scan"... vabbè... avranno un processo excel in più... non è la fine del mondo. grazie ancora delle dritte (e del codice) ieri ho passato un sacco di tempo fermo sul capitolo che parla di array su un manuale di francesco balena ma non c'ho cavato un ragno dal buco.... |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:14.




















