Il giorno sabato 5 gennaio 2013 11:49:12 UTC+1, teddyk ha scritto:
[...]
Ciao teddyk,
penso che il tuo quesito meriti un approfondimento.
1. Occorre precisare che la routine dell'esempio e` stata pensata, anche se malamente, per il linguaggio VBScript, un sottoinsieme di Visual Basic (Classic). In VBScript esiste solo il Late Binding (Associazione tardiva) mentre scrivendo codice nell'ambiente Visual Basic di Excel (volgarmente: VBA) possiamo usufruire dei vantaggi del Early Bindig (Associazione anticipata), principalmente, nel nostro caso, il completamento automatico delle istruzioni (IntelliSense:
http://it.wikipedia.org/wiki/IntelliSense).
Per iniziare a approfondire vedi:
Utilizzando l'associazione anticipata e associazione tardiva nell'automazione
http://support.microsoft.com/kb/245115
(Se puoi, meglio se te lo leggi in inglese!)
2. Spesso e` opportuno, una volta scritte le istruzioni e averle testate, interrompere il collegamento con l'oggetto di automazione, usando quindi il Late Bindig, per garantirsi contro eventuali problemi di compatibilita` e differenze di versione fra l'oggetto al quale ci siamo riferiti scrivendo il codice e quello realmente esistente nel computer nel quale verra` eseguito il nostro codice. Nasce così la necessita` di alternare il tipo di Binding a seconda che si sia in fase di sviluppo (Design) o di esecuzione (Run). Io spesso la risolvo cosi`:
2.a Aggiungo alle proprieta` del progetto un argomento di compilazione condizionale:
- Strumenti
- Proprieta` di VBAProject...
- Argomenti di compilazione condizionale:
DesignMode = 1
- [OK]
2.b Aggiungo ai riferimenti del progetto l'oggetto di automazione:
- Strumenti
- Riferimenti...
- [v] Microsoft Scripting Runtime
- [OK]
2.c Scrivo le istruzioni usufruento di IntelliSense:
Option Explicit
Private Const mcMod = "Modulo1"
#If DesignMode Then
' NOTHING
#Else
Public Enum IOMode
ForAppending = 8
ForReading = 1
ForWriting = 2
End Enum
Public Enum Tristate
TristateFalse = 0
TristateMixed = &HFFFFFFFE
TristateTrue = &HFFFFFFFF
TristateUseDefault = &HFFFFFFFE
End Enum
#End If
Public Sub OpenTextFileTest()
Const cProc = "OpenTextFileTest"
On Error GoTo ErrH
#If DesignMode Then
Dim fso As Scripting.FileSystemObject
Dim ts As Scripting.TextStream
#Else
Dim fso As Object
Dim ts As Object
#End If
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile("D:\Percorso\Test.TXT" _
, ForAppending _
, True _
, TristateFalse)
With ts
.Write "Salve"
.Close
End With
ExitProc:
Set ts = Nothing
Set fso = Nothing
Exit Sub
ErrH:
MsgBox Err.Description, vbCritical + vbOKOnly, mcMod & "." & cProc
Resume ExitProc
End Sub
2.d Dopo essermi accertato che tutto funzioni come da me previsto e prima di "licenziare" il programma, tolgo il riferimento all'oggetto (qui Microsoft Scripting Runtime) e assegno all'argomento di compilazione condizionale il valore zero:
DesignMode = 0
2.e Ricompilo il progetto:
- Debug
- Compila VBAProject
e salvo.
2.f (Ocio che non rileggo;)
--
Ciao!
Maurizio