Newsgroup: it.comp.appl.access
Titolo: Vba non rilascia servizio Excel

Salve a tutti,
stò esportando una query verso un file execl, dopodiche
tramite il seguente codice formatto il foglio:
 
Dim ex          As Excel.Application
Dim wb          As Excel.Workbook
Dim ws          As Excel.Worksheet
 
'apre excel
Set ex = New Excel.Application
 
'apre il file xls
Set wb = ex.Workbooks.Open("C:\Pippo.xlsx")
 
'seleziona il foglio 1
Set ws = wb.Worksheets(1)
 
'CONTO LE COLONNE
Dim LastCol As Integer
With ws
  LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
End With
 
'CONTO LE RIGHE
Dim LastRig As Integer
With ws
   LastRig = .Cells(.Rows.Count, 1).End(xlUp).Row
End With
 
'CAMBIO LE INTESTAZIONI
Dim strValore As String
i = 0
For i = 1 To LastCol
   strValore = ws.Cells(1, i).Value
   strNewval = DecodificaCampo(strValore)
   ws.Cells(1, i).Value = strNewval
Next i
 
CAMBIO FONT E DIMENSIONE CARATTERE
ws.Range(Cells(1, 1), Cells(LastRig, LastCol)).Font.Name = "PComm Session"
ws.Range(Cells(1, 1), Cells(LastRig, LastCol)).Font.Size = 8
ws.Range(Cells(1, 1), Cells(1, LastCol)).Font.Bold = True
ws.Range(Cells(1, 1), Cells(1, LastCol)).Font.Italic = True
 
wb.Sheets(1).Name = NomeFoglio
 
'ADATTO LE COLONNE AL TESTO
wb.ActiveSheet.Cells.EntireColumn.AutoFit
 
'CHIUDO IL FILE E LE ISTANZE
 
wb.Close True
 
'esce da excel
ex.Quit
 
'cancella variabili oggetto
Set ws = Nothing
Set wb = Nothing
Set ex = Nothing
 
 
 
Il problema è che nonostante chiuda il file e le relative istanze
da Gestione Attività trovo sempre aperto il servizio di Excel,
che ovvimente mi manda in errore se eseguo un'altra volta la suddetta
Funzione, aprendo un'altro servizio Excel per ogni volta che provo ad
eseguire il codice.
 
Francamente non riesco a capire come mai non chiude il servizio.
 
Ho provato a cercare e sembra che motli hanno avuto questo problema
ma soluzione nessuna.
 
Dove stò sbagliando?
 
-- 
O no ?
 
WS


i casi possibili sono tre : 
1)
o hai aperta una sessione excel indipendentemente dalla tua 
applicazione
 
2)
o senza rendertene conto apri un excel da qualche altra parte
dell' applicazione e poi non la chiudi 
 
3)
oppure la tua macchina è posseduta :-) 
 

 ...trovo sempre aperto il servizio di Excel ...
 
Siccome non salvi la causa potrebb'essere il dialogo di confermazione 
aperto. Invece del wb.Close prova con:
 
wb.Save
'e poi
ex.Quit
 
-- 
Ciao
Karl
*********
Access FAQ:  
http://www.donkarl.com/it
 
 
 
 

Dopo dura riflessione, 
radica...@gmail.com
 ha scritto :

No sono sicuro di non avere nessun foglio excel aperto.
 
L'unico comando che utilizzo prima della funzione è il seguente
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, NomeQuery, DirCorrente & "\" & NomeFile & ".xlsx"
 
Ma il problema lo avevo anche quando bypassavo la suddetta funzione
 
Ho paura che sia la 3 8-o
 
Boh, non riesco a capire


 ex.Quit
 
Ma se fai 
 
wb.close true
 
il sistema salva e chiude 
 
 
 

 Ho paura che sia la 3 8-o
 
che cosa è la 3 8-o ? 
 

Winston Smith wrote on 17-11-16 :

Intanto stai sbagliando con stò...
 
Se crei un range in Excel da Access poi con le buone
maniere, a mia esperienza, non ci esci più!
Poni un REM davanti alle quattro istruzioni ws.Range(...
e vedrai che tutto funziona regolarmente.
Poi con un ciclo For... Next di Cells puoi andare
a cambiare i caratteri.
Se poi le righe e/o colonne sono tante...
 
Bruno

Dopo dura riflessione, Bruno Campanini ha scritto :

Funziona, grazie !
In effetti il problema era proprio li.
Adesso anche se molto, ma molto piu lento sembra funzionare.
 
Ho sostituito i ws.range con questo ciclo
 
i = 0
    For i = 1 To LastRig
        z = 0
        For z = 1 To LastCol
            With ws
                .Cells(i, z).Font.Name = "PComm Session"
                .Cells(i, z).Font.Size = 8
            End With
        Next z
    Next i
 
Mi sai eventualmente consigliare un ciclo più performante, perchè
questo è molto lento, e parlo di una matrice di 11 colonne per 100 
righe
 
E poi serei curioso di capire dove è il problema con i range



cavolo
questa proprio non la sapevo. 
 
 

 righe
 
prova a fare cosi (intuizione) : 
 
dim R as new range
set R = <range che ti serve>
poi usa R. solo R
 
e non usare l' active sheet : indirizza tutto in variabili oggetto
 
poi fai 
 
wb.save 
wb.close 
doevents
ex.quit 
doevents
 
poi metti a nothing tutte le variabili range e quelle oggetto.
Scommetti che funziona ? 
 
 
 
 
 

Nel suo scritto precedente, 
radica...@gmail.com
 ha sostenuto :

Dim Ran As New Range
Set Ran = ws.Range(Cells(1, 1), Cells(LastRig, LastCol))
 
Ran.Font.Name
 = "PComm Session"
   Ran.Font.Size = 8
Set Ran = Nothing
 
Ho sostituito con questa ma non mi riconosce Range come
oggetto e mi da errore.
 
Questi sono i riferimenti del progetto
 
Visual Basic for Applications
Microsoft Access 16.0 Object library
Microsoft Excel 16.0 Object Library
Microsoft Office 16.0 Access Database engine object
OLE Automation
 
può dipendere dal fatto che manca qualcosa qui?



Perchè usi il NEW...?
 
Devi comprendere la differenza tra definire una VARIABILE e creare un'istanza di un OGGETTO.
In questo caso non stai creando un istanza, ma definendo una VARIABILE di Typo RANGE che verrà assegnata nella riga successiva... quindi è un errore.
 
Dim Ran As Range
 
Altrimenti prova a definirlo Object, e vedi se l'errore persiste... poi valuta il LATEBINDING.
 
@Alex

 poi valuta il LATEBINDING.
 
Giustissimo, per carita. 


vedi ultimo intervento di @Alex


e (secondo me) e' meglio se fai 
dim R as excel.range  
 
 

 dim R as excel.range
 
Sei sicuro...? (che range sia esposto come mebro di Excel in questo modo...)
 
Secondo me è meglio il LATEBINDING:
 
Dim R as Object
 
@Alex


Grazie per le correzioni.
Variato il codice e provato con le varie soluzioni proposte, ma 
purtroppo mi si ripresenta il problema iniziale, funziona tutto al 
primo giro ma poi mi va in errore perchè rimane il servizio di Excel 
aperto. 8-o
Evidentemente l'uso dei range incasina excel.
 
Proverò a documentarmi sul LATEBINDING che non conosco.
 
Se ci sono altre idee benvengano, vado avanti con altre prove
altrimenti userò il ciclo for..next che per il momento è l'unico che 
funziona.
 
Se riesco a risolvere vi farò sapere.
Grazie ancora.


 Dim R as Object
 
perchè ? Spiegami


Allora...facendo svariate prove mi è venuto fuori che il problema
sta nell'uso di Cells con Range.
 
Se sostituisco il codice sopra con
 
 
ws.Range("A1", "M77").Font.Name = "PComm Session"
ws.Range("A1", "M77").Font.Size = 8
ws.Range("A1", "M1").Font.Bold = True
ws.Range("A1", "M1").Font.Italic = True
 
tutto fila liscio.
Per le mie conoscenze è un gran mistero.
A questo punto però vi chiederei un'altra cosa, con il formato
A1:A1 come posso reperire i limiti della matrice del foglio excel?


 A1:A1 come posso reperire i limiti della matrice del foglio excel?
 
Oddio oddio ... lo sapevo ma non mi ricordo ... 
 
 

 A1:A1 come posso reperire i limiti della matrice del foglio excel?
 
Ecco : 
http://stackoverflow.com/questions/6262743/convert-cells1-1-into-a1-and-vice-versa
 
 
devi usare il metodo address
 
Cells(1, 1).Address(RowAbsolute:=False, ColumnAbsolute:=False)
restituisce  A1.
 

Mah... LateBinding e EarlyBinding sono la base dell'uso di componenti COM o Automazione... trovi un sacco di 3D su questo tema.
 
@ALEX

 componenti COM o Automazione... trovi un sacco di 3D su questo tema.
 
Ma io conosco la differenza tra i due concetti. Ti chiedevo perchè 
pensi che il late binding sia migliore ed in particolare perchè in 
questo caso. E' diverso.
 
 


In questo caso specifico non lo so, ma il LATEBINDING è utilissimo per svicolare l'applicazione da ciò che hai installato sul pc. Tu sviluppi con excel 2016 (x esempio), l'utente ha un'altra versione. L'applicazione va subito in crash xchè non trova i riferimenti alle librerie corrette. Se usi LATE tu specifiche solo che userai excel, qualunque versione ci sia installata. E' meno vincolante e ti risolve un mare di problemi quando distribuisci il tuo programma (visto che non sai mai cosa l'utente ha installato). Li risolve soprattutto nel tempo, altrimenti devi riscrivere codice o cmq toccare i riferimenti ogni volta che aggiorni Office, e ciò non è bene :)

radica...@gmail.com
 ha usato la sua tastiera per scrivere :

funziona grazie.
E però importante specificare l'oggetto
 
ws.Cells(1, 1).Address(RowAbsolute:=False, ColumnAbsolute:=False
 
altrimenti si genera lo stesso errore di mancata chiusura del
servizio, e alla seconda esecuzione va in errore.
La spiegazione del problema,  l'ho trovata qui
https://support.microsoft.com/it-it/kb/178510
 



uh
 
La per la mi tornava tutto, ma poi a pensarci bene quando fai l'early
binding non ti riferisci a particolari versioni di excel, o di word o
... 
 
Es : 
Dim x as excel.application, qualunque sia la versione dell' excel. 
 
 
 
 


Ma nei riferimenti si.....

 
https://support.microsoft.com/it-it/kb/178510
 
Ottima ricerca e ottimo ritrovamento, certamente di buona
utilità, anche se il workaround mi sembra un po'... infantile con
quell'uso di Cells() e la rinuncia ad avvalersi appieno dell'uso
di Range, il quale Range è il cuore della programmazione VBA di Excel.
 
Premesso questo:
    StartCell = "A1"
    xlFileName = "D:\Pippo.xlsm"
    Set xlWorkbook = xlApp.Workbooks.Open(xlFileName)
    Set xlSheet = xlWorkbook.Worksheets(1)
 
ciò che segue non funziona:
    Set TargetRange = Range(StartCell)
    Tet TargetRange = Range(TargetRange, TargetRange.End(xlDown). _
                  End(xlToRight))
 
Con la stessa premessa funziona invece questo:
    Set TargetRange = xlSheet.Cells(1, 1)
    With xlSheet
       NumRows = .Cells(.Rows.Count, 1).End(xlUp).Row
       NumCols = .Cells(1, .Columns.Count).End(xlToLeft).Column
    End With
    Set TargetRange = TargetRange.Resize(NumRows, NumCols)
 
Bel colpo! l'abbiamo vercato in tanti...
 
Bruno


certo, ma funziona lo stesso. Almeno a memoria mi pare cosi. 
 
Ma forse intendevi qualche altra cosa ... 
 
 


avevo ragione, dunque. Si deve riferire tutto a variabili oggetto.
Evidentemente, il VBA altrimenti è come se si facesse lui una sua
interna variabile oggetto : la quale tu non puoi mettere a nothing
e quindi wb.quit fallisce. 
 
Piu o meno. Molto piu o meno :-) 
 
 


come fai a sapere che l' avete verificato in tanti ? Siete in
contatto anche esternamente ? 
 
 
 

 contatto anche esternamente ? 
Se dai un'occhiata in Internet trovi un sacco di richieste
di chiarimento riferite al problema in oggetto... veramente.
 
Trovi anche un sacco di soluzioni che o sono specifiche
o presso i vari richiedenti, me compreso, non hanno funzionato.
 
Quella individuata da Winston Smith ha funzionato egregiamente
in alcune circostanze nelle quali l'ho testata.
 
Quel che mi spiace di essa l'ho già scritto.
 
Bruno

Il giorno sabato 19 novembre 2016 03:30:46 UTC+1, 
radica...@gmail.com
 ha scritto:

Mmmmm se conosci la differenza, hai già anche la risposta, altrimenti non conosci la differenza.
 
In questo specifico caso, dichiarare una Variabile come OBJECT è indice di LateBinding... e siccome la premessa è che è MEGLIO... non vedo perchè debba essere diverso anche in questo caso, oppure serva un motivo ulteriore.
 
@Alex

 motivo ulteriore.
 
Boh
 
L' LB è più lento dell' EB perchè la associazione avviene ogni volta
che il codice viene eseguito. 
 
Poi il codice è meno chiaro (imho)
 
Qual' è allora il vantaggio che offre e che è cosi rilevante da 
piu che compensare la maggior lentezza d' esecuzione  ?  
 
 

 Quel che mi spiace di essa l'ho già scritto.
 
ok 
 
 


La versione delle librerie!!! Quando tu indichi nei riferimenti excel 14, poi da codice hai l'intellisese e tutto. Ma se l'utente ha il 13? Il xx? Non lo sai. E l'applicativo si pianta. E quando l'utente aggiorna Office? Devi riscrivere, non hai soluzioni. Quindi la buona norma è: chiedi al sistema! E' come impostare i percorsi dei file affidandosi a variabili (current.path...) o a variabili d'ambiente (%AppData%...) invece di specificare il percorso: ti mette al riparo da guai. Sviluppi in EB, dopo i test, trasformi in LB. hai il meglio dei due mondi :)

Più lento è un'affermazione relativa e decisamente inutile... l'istanza avviene 1 volta e la differenza di 200ms fa ridere...
Sei decisamente fuori strada... ed è evidente che non ti poni il problema di distribuire applicativi ma solo di usarli sul tuo PC.
Questo non è male... ma decisamente limitante nei ragionamenti.
 
EB ha senso solo nel caso si abbia la necessità di ereditare EVENTI cosa non fattibile in LB.
 
Per il resto devi approfondire un po di lettura prima di esporre concetti non completi.
 
@ALEX

 concetti non completi.
 
ok, nessun problema. 
 
 

 in LB. hai il meglio dei due mondi :)
 
Si, intuitivamente capisco ! Ci sono quasi arrivato :-) 
 
 


Scusa ma quando dicevi di conoscere la differenza... cosa intendevi...?
 
Questo è un mio vecchio articolo:
 
 
 
    Ci sono 2 modi per sfruttare OLE Automation al fine di controllare applicazioni esterne(che ovviamente espongono un'interfaccia OLE)
 
    1) LATE BINDING (Associazione Tardiva) che sfruttando il metodo CreateObject(per istanziare un oggetto nuovo)
    o GetObject(per usare l'istanza di un'oggetto già aperto).
 
    Questo metodo non fa esplicito riferimento ad una Libreria, ma lascia l'autonomia al
    sistema di istanziare il riferimento più recente di quel SERVER di Automazione.
    NON SERVONO RIFERIMENTI A LIBRERIE ESTERNE.
 
    Esempio di codice in modalità LATEBINDING per istanziare un'oggetto EXCEL:
    codice:
 
            Dim xlApp As Object
            Set xlApp = CreateObject("Excel.Application")
            xlApp.Workbooks.Open "c:\NomeFile.xls"
 
    Oppure apriamo l'istanza di Excel già in esecuzione:
    codice:
 
            Dim xlApp As Object
            Set xlApp = GetObject("c:\NomeFile.xls")
 
    La variabile Oggetto [xlApp] ora contiene un'istanza di Excel nuova o preesistente.
    Chiaramente se si cerca di usare il GetObject e non esiste nessuna istanza del Server di Automazione(EXCEL in questo caso) verrà
    restituito un'errore Err=429, gestendo il quale si prevengono inceppamenti, in quanto si tenta di usare GETOBJECT, si intercetta l'errore 429 ed in tal caso si
    ricorre al CREATEOBJECT.
 
    VANTAGGI:
    Non richiedendo riferimenti fissi, su qualsiasi macchina venga eseguito il codice, anche se presenti VERSIONI di SERVER OLE diverse.
    Il LATEBINDING è definito VERSION INDIPENDENT.
    Notevole miglioria soprattutto per distribuzioni MDE che non richiederà lo scroll della collection REFERENCES con il Check della propery
    ISBROKEN o BROKENREFERENCE membro di Application per poi caricarle RUNTIME, ma questo richiede la selezione del File SERVER OLE, quindi altro Codice.
 
    SVANTAGGI:
    Gli oggetti dichiarati in LATEBINDING non consentono di esporre gli EVENTI, quindi se si devono intercettare EVENTI dell'oggetto EXCEL da Access
    è impossibile con questa tecnica.
    Gli oggetti dichiarati in LATEBINDING non consentono l'elenco di Metodi/Proprietà come in VBEditor è normale vedere con l'uso dell'Intellisense.
    Gli oggetti dichiarati in LATEBINDING non consentono di usare le costanti appartenenti a quella Application in quanto non inseriti.
    Gli oggetti dichiarati in LATEBINDING non consentono l'accesso all'HELP specifico della Libreria.
 
    2) EARLY BINDING (Associazione Preventiva)
    Questo metodo invece richiede l'esplicito riferimento al SERVER di AUTOMAZIONE, che dovrà essere inserito nelle LIBRERIE di riferimento del progetto.
    Esempio di codice in modalità EARLYBINDING per istanziare un'oggetto EXCEL:
    codice:
 
            Dim xlApp As New Excel.Application
            Set xlApp = New Excel.Application
            xlApp.Workbooks.Open "c:\NomeFile.xls"
 
    VANTAGGI:
    E' leggermente più veloce l'istanza dell'oggetto in quanto non serve la ricerca del SERVER OLE, che è già definito
    Possiamo ereditare EVENTI.
    Possiamo accedere all'uso delle Costanti.
    Possiamo avere, tramite Intellisense da VBeditor, l'elenco di Metodi/Proprietà/Eventi.
    Possiamo accedere all'HELP della libreria.
 
    SVANTAGGI:
    Il più grosso svantaggio, che però pesa a tal punto da rendere sconveniente questo metodo nonostante i numerosi vantaggi, è il
    fatto che proprio per essere VERSION DIPENDENT, è come avere le mani legate, quindi le librerie del PC di sviluppo dovranno
    essere le stesse di quelle del PC di destinazione, cosa non sempre possibile.
 
    In conclusinoe, se non si devono ereditare eventi, il suggerimento è di far riferimento SEMPRE alla tecncia LATEBINDING, ma, in fase di sviluppo
    è stupido rinunciare ai VANTAGGI di EARLYBINDING, quindi il mio consiglio è di sviluppare inserendo i RIFERIMENTI, e prima di distribuire
    toglierli, inserendo la parte di codice per l'istanza in LATEBINDING sostituendo l'assegnazione delle Variabili da esplicito ad Object. 
 
 
La questione degli EVENTI richiede che tu sappia che un OGGETTO o CLASSE può esporre eventi e che tu puoi ereditarli usando WITHEVENTS, ma questo è possibile solo se l'oggetto è EARLY BINDING, ovvero dichiarato esattamente come classe oggetto specifica.
Di fatto se erediti dell'oggetto ExcelApplication l'evento CLOSE, quanto viene chiuso dall'utente, viene rilevato l'evento in Access e puoi agire di conseguenza.
Questo è una cosa a cui prestare attenzione, delicata e possibilmente da evitare per vari motivi... 
 
Saluti.
@Alex

 Questo è un mio vecchio articolo:
 
Letto tutto. Eccezionale ! Questo me lo stampo e lo metto nel cassetto
dell' ufficio. Grazie,  sul  serio.  Non  sbaglio  dicendo che include 
quello che mi diceva Fair87, giusto ? 
 
PS
simpatico Fair87,  non trovi ? Mi da l' impressione che è un "buono",
non so ... 


Purtroppo  (o per fortuna) si...un buono!!!!
Praticamente io ho imparato che è sempre meglio chiedere a Win di dirti cosa devi fare (percorsi, librerie, costanti, versioni....). Pensa solo al cambio di sistema operativo (XP e successivi), il drammatico 'Document and setting'. Poi sparito. Se impostavi riferimenti rigidi non andava più nulla. Se invece chiedi %CURRENTUSER%\Desktop, qualunque movimento faccia Microsoft nelle budella del SO, andrà tutto a buon fine, sempre. E' la differenza tra professionisti (tra i quali io non mi ci metto neanche da lontano) e noi poveri pigiabottoni! (e infatti questi 'trucchetti' mi sono stati detti, mica li ho pensati io....). PROGRAMMAZIONE DIFENSIVA :)
 
Ciao a tutti
 
Roberto


per fortuna, secondo me. Se poi qualche stronzo ne profitta peggio per 
lui perchè è lui che perde qualcosa, non tu. Tu perdi uno stronzo, lui
una persona intelligente e di buon cuore. 
 
E chissà quante volte ti sara' capitato. Dico bene ? :-) 
 
(omissis)
 
si, tutto chiaro (finalmente ... scusate) 

 una persona intelligente e di buon cuore. 
 
Cazzo che sviolinata!
 
Bruno


Ho detto solo quello che pensavo. Parola d' onore. E lo faro' anche 
adesso : ROSICONE ! ;-) 
 
 
 
 

 @Alex
 
Ho provato a seguire il consiglio sul LateBinding
ho sostituito il codice con questo, e tolto i riferimenti
alle librerie excel
 
    Dim xlApp           As Object
    Dim xlBook          As Object
    Dim xlSheet         As Object
 
 
    'APRO EXCEL
    Set xlApp = CreateObject("Excel.Application")
    'xlApp.Visible = True
 
    'APRO IL FILE EXCEL
    Set xlBook = xlApp.Workbooks.Open("C:\Pippo.xlsx")
 
    'SELEZIONO FOGLIO 1
    Set xlSheet = xlBook.Worksheets(1)
 
    'CONTO LE COLONNE
    Dim LastCol As Integer
    With xlSheet
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
    End With
 
Ma quando va ad eseguire il CONTO DELLE COLONNE
mi va in errore "1004" alla riga LastCol = ...
 
Dove sto sbagliando?


Dichiaralo come LONG non come INTEGER, quello andava bene quando le COlonne erano limitate a 65535... 
 
 
@Alex

 WS
 
Ho visto in ritardo..., e tu non hai letto attentamente il mio TUTORIAL...!
Usando LATEBINDING non puoi usare le COSTANTI del sistema, sicchè
 
xlToLeft lo devi definire tu come costante LOCALE:
 
Io di solito faccio così in un Modulo di Costanti:
 
Const xlToLeft = -4159
 
Saluti.
@Alex

 Const xlToLeft = -4159
 
OK ! 
 

Il 21/11/2016, @Alex ha detto :

Vero, il problema era li, ma era anche nel mio purtoppo livello
basso di conoscenza, avevo letto ma completamente sottovalutato
il discorso sulle costanti :-(


 il discorso sulle costanti :-(
 
Senza tante magie di Early, Late. Const...
===========================================
Private Sub Command0_Click()
Dim xlApp As New Excel.Application
Dim xlWorkbook As Excel.Workbook
Dim xlFileName As String, xlSheet As Excel.Worksheet
Dim TargetRange As Range
Dim StartCell As String, NumRows As Long, NumCols As Long
 
StartCell = "A1"
xlFileName = "D:\Pippo.xlsm"
Set xlWorkbook = xlApp.Workbooks.Open(xlFileName)
Set xlSheet = xlWorkbook.Worksheets(1)
 
Set TargetRange = xlSheet.Cells(1, 1)
With xlSheet
    NumRows = .Cells(.Rows.Count, 1).End(xlUp).Row
    NumCols = .Cells(1, .Columns.Count).End(xlToLeft).Column
End With
 
Set TargetRange = TargetRange.Resize(NumRows, NumCols)
xlSheet.Name = "Canta_che_ti_passa"
 
'CAMBIO LE INTESTAZIONI
'Dim strValore As String
For i = 1 To NumCols
   'strValore = xlSheet.Cells(1, i).Value
   strNewval = "Col-" & i ' DecodificaCampo(strValore)
   xlSheet.Cells(1, i).Value = strNewval
Next i
 
'CAMBIO FONT E DIMENSIONE CARATTERE
With xlSheet
    .Range(.Cells(1, 1), .Cells(NumRows, NumCols)).Font.Name = "PComm 
Session"
    .Range(.Cells(1, 1), .Cells(NumRows, NumCols)).Font.Size = 8
    .Range(.Cells(1, 1), .Cells(1, NumCols)).Font.Bold = True
    .Range(.Cells(1, 1), .Cells(1, NumCols)).Font.Italic = True
End With
 
xlWorkbook.Close SaveChanges:=True
xlApp.Quit
 
MsgBox "Start Again!"
 
End Sub
==========================================
 
Bruno

Bruno Campanini scriveva il 21/11/2016 :

Complimenti Bruno, funziona perfettamente e sicuramente è molto
più pulito del mio.
Ma in questo caso devo comunque mettere i riferimenti alle librerie
di excel.
Mentre se non avevo capito male, il vantaggio di quello che mi
aveva suggerito @Alex, era che potevo omettere il riferimento e
quindi slegarmi dalla versione di Excel che è installata sul Pc.
Ora ...nel mio caso visto che quello che faccio è ad uso mio personale
o al limite su altri uno/due pc dell'ufficio potrei anche fregarmene e 
variare il riferimento in caso di necessità, ma se riesco a togliere
anche questa piccola incombenza male non fa.
Giusto?


 Giusto?
Deve piacere a te.
Come sopra ho detto io procedo diversamente.
 
Bruno


no no,  è utilissimo invece, che scherziamo ? 

 no no,  è utilissimo invece, che scherziamo ? 
 
Allora...
Io ho sempre avuto il PC aggiornato al processore più
performante, al massimo della RAM contenibile a bordo,
al sistema operativo e software vari di ultima generazione.
E così nello sviluppo del software non ho mai dovuto
rinunciare a nessuna prestazione delle nuove release
di OS, Office, etc.
 
Dovendo poi prevedere l'utilizzo in PC con release di
software non aggiornate alle mie, ho di volta in volta
modificato sui PC destinatari il mio codice, ovvero ho
installato in altro HD sul mio PC il sistema operativo
e l'altro software coi quali mi interessava
testare/modificare il codice.
Alla fine ho quasi sempre trovato la via di mezzo che
consentiva al codice di girare sul mio ed altri PC.
Se poi la via di mezzo non l'ho trovata, ho provveduto
ad ogni cambio di PC a modificare le References.
 
Ho perso un sacco di tempo inutilmente?
Beh, il mio programmare - anche se remunerato - è sempre
stato una questione di hobby e non di lavoro.
Il mio lavoro era un altro: facevo l'insegnante,
non di Informatica...
 
Bruno


ho capito
 
Addirittura simulavi sulla tua la macchina del cliente, 
in soldoni. 
 
Mi piace
 
 
 

Bruno Campanini ha spiegato il 21/11/2016 :

In definitiva l'uno o l'atro diventa una questione di preferenza
personale. Bene cosi.
Grazie per il supporto e per il codice ottimizzato con
l'esempio sull'utilizzo del range che per me era un po fumoso.
