Newsgroup: it.comp.lang.visual-basic
Titolo: Da File di Excel a Text1?

Salve, qualcuno conosce il modo di importare in un textbox i dati salvati in
un file di Excel?
Grazie, Apuleius.
apul...@tiscalinet.it

 wrote in message
9305tr$vu8$1...@lacerta.tiscalinet.it...


 qualcuno conosce il modo di importare in un textbox i dati salvati in un
file di Excel?
In *un* textbox ci sta *un* dato... ma tu parli di *dati*... Per caso vuoi
vedere nel textbox i valori di piu` celle?
L'accesso al foglio excel puo` avvenire in vari modi fra i quali:
. aggiunta della libreria di excel ai riferimenti del progetto;
. uso di createobject o getobject (vedi guida);
. se i dati sono in forma tabellare: accesso (DAO, ADO, ...) come se la
cartella di excel fosse un database;
. ecc.
Oltre che nella guida, nei post recenti trovi molti esempi.
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 ha scritto nel messaggio
news:930f72$8hms3$2...@ID-52090.news.dfncis.de...


 Capito?
Mica tanto... Ma vediamo: 'sta roba qui sotto:
staz        punto        angolo             dist
100        101            24.1245        2.123
e` in un foglio di una cartella di lavoro excel, giusto? Ipotizziamo che la
cartella di lavoro si chiami "Cartel1.xls" e sia salvata in "C:\Documenti";
che il foglio che contiene i dati si chiami "Foglio1" e che i dati siano
scritti a partire dalla cella "A1". (Tutto a me tocca fare?!).
Ipotizziamo anche che tu voglia assegnare tali dati alla proprieta` Text
della TextBox "Text1" nella forma:
staz=100
punto=101
angolo=24.1245
dist=2.123
(Ci sarebbe da chiarire anche se quei punti di 24.1245 e 2.123 sono virgole
decimali...)
In modo progettazione dovrai assegnare alla proprieta` Multiline di Text1 il
valore True per avere il testo su piu` righe.
Quindi dovrai aggiungere ai riferimenti del progetto la "libreria" di Excel:
"Microsoft Excel 9.0 Object Library", se hai Excel 2000.
Poi dovrai decidere quando leggere tali dati: al caricamento del form, alla
pressione di un pulsante di comando, ...
Optiamo per il pulsante di comando.
Quindi i controlli su "Form1" saranno: Text1 (Multiline!) e Command1.
Che ci manca?... Niente, possiamo cominciare.
Dobbiamo prima di tutto decidere come informare il programma che il file che
useremo e` "c:\documenti\cartel1.xls". Potremmo assegnare tale stringa ad
una variabile ma se in seguito decidiamo di spostare il file dovremmo
modificare il programma e ricompilare: no buono. Meglio scrivere tale
informazione in un file facilmente editabile anche con notepad e collocarlo
nella stessa cartella del nostro eseguibile: "c:\progetti\prova\prova.txt".
Le informazioni che ci servono sono:
Percorso del file dati: c:\documenti\
Nome del file dati: cartel1.xls
Foglio dati: foglio1
Cella inizio: a1
Piu` professionale?
[Data]
Folder=c:\documenti\
Workbook=cartel1.xls
Worksheet=foglio1
StartRange=A1
Ti ricorda niente? Si`? Allora ribattezziamo il file in:
"c:\progetti\prova\prova.ini". ;-)
Ora tocca alla routine per leggere questo file. Che ne dici di affidare
questo compito ad una classe dell'applicazione? Figo, no? Tale classe
potrebbe avere le proprieta`... Folder, Workbook, ... Proviamo:
Progetto/Aggiungi modulo di classe. E assegnamo alla classe il nome "CIni".
' CIni
'
Option Explicit
Private m_strFolder     As String
Private m_strWorkbook   As String
Private m_strWorksheet  As String
Private m_strStartRange As String
Public Property Get Folder( _
) As String
  Folder = m_strFolder
End Property
Public Property Get Workbook( _
) As String
  Workbook = m_strWorkbook
End Property
Public Property Get Worksheet( _
) As String
  Worksheet = m_strWorksheet
End Property
Public Property Get StartRange( _
) As String
  StartRange = m_strStartRange
End Property
Fatto. E a scriverla, se sei bravo col copia/incolla, ci stai un attimo.
Come vedi abbiamo solo proprieta` pubbliche di sola lettura.
Qualoraquando... m'intendi? Ossia, se in un secondo momento vorremo
permettere la gestione del file ini dall'applicazione bastera` aggiungere le
Property Let.
Abbiamo una bella classe che non fa niente, pero`. Dobbiamo assegnarle un
compito da svolgere: leggere il file ini.
' CIni
'
Public Sub ReadIniFile( _
)
End Sub
E se qualcosa va storto? Meglio saperlo subito. Allora invece che una sub
una function:
' CIni
'
Public Function ReadIniFile( _
) As Boolean
On Error GoTo ReadIniFile_Err
  ReadIniFile = True
  Exit Function
ReadIniFile_Err:
End Function
che ci restituisce True se tutto e` ok. Limitiamoci a farle aprire e
chiudere il file, poi "debugghiamo".
' CIni
'
Public Function ReadIniFile( _
) As Boolean
On Error GoTo ReadIniFile_Err
  Dim strFile As String
  Dim intFile As Integer
  With App
    strFile = .Path & "\" & .EXEName & ".ini"
  End With
  intFile = FreeFile(0)
  Open strFile For Input Access Read As #intFile
  Close #intFile
  ReadIniFile = True
  Exit Function
ReadIniFile_Err:
End Function
Aggiungiamo un modulo "MMain" con una procedura Main e modifichiamo le
proprieta` del progetto in modo che l'applicazione si avvii con "Sub Main":
' MMain
'
Option Explicit
Private Sub Main( _
)
End Sub
Testiamo la classe:
' MMain
'
Option Explicit
Private Sub Main( _
)
  Dim obj As CIni
  Set obj = New CIni
  obj.ReadIniFile
  Set obj = Nothing
End Sub
F8... F8... F8... Tutto bene! Proseguiamo.
' CIni
'
Public Function ReadIniFile( _
) As Boolean
On Error GoTo ReadIniFile_Err
  Dim strFile   As String
  Dim intFile   As Integer
  Dim strBuffer As String
  With App
    strFile = .Path & "\" & .EXEName & ".ini"
  End With
  intFile = FreeFile(0)
  Open strFile For Input Access Read As #intFile
  Line Input #intFile, strBuffer
  Line Input #intFile, strBuffer
  m_strFolder = Mid$(strBuffer, Len("Folder=") + 1)
  Line Input #intFile, strBuffer
  m_strWorkbook = Mid$(strBuffer, Len("Workbook=") + 1)
  Line Input #intFile, strBuffer
  m_strWorksheet = Mid$(strBuffer, Len("Worksheet=") + 1)
  Line Input #intFile, strBuffer
  m_strStartRange = Mid$(strBuffer, Len("StartRange=") + 1)
  Close #intFile
  ReadIniFile = True
  Exit Function
ReadIniFile_Err:
End Function
F8. Ok.
Il modo qui usato di leggere il file ini non e` quello canonico ma l'ho
fatto per non perdere tempo e per non aggiungere "rumore". Consulta il Sito
comune di questo ng:
 
http://www.murialdo.it/it_lang_vb
se hai bisogno di sapere come si fa.
Ora non resta che leggere il file xls. Oh!... Vedo che le classi ti sono
piaciute... Come dici?... Ok. Facciamolo con una classe: CData. E come prima
invece di un metodo usiamo una funzione che ci ritorni bell' e formattata la
stringa di cui abbiamo bisogno o una stringa nulla se qualcosa va storto:
' CData
'
Option Explicit
Public Function GetData( _
  ByVal Folder As String _
, ByVal Workbook As String _
, ByVal Worksheet As String _
, ByVal StartRange As String _
) As String
On Error GoTo GetData_Err
  With New Excel.Application
    With .Workbooks.Open(Folder & Workbook)
      With Worksheets(Worksheet)
      End With
      .Close False
    End With
    .Quit
  End With
  Exit Function
GetData_Err:
  GetData = ""
End Function
Testiamo anche questo codice:
' MMain
'
Option Explicit
Private Sub Main( _
)
  Dim objIni As CIni
  Dim objDat As CData
  Set objIni = New CIni
  With objIni
    If .ReadIniFile Then
      Set objDat = New CData
      Set objDat = Nothing
    End If
  End With
  Set objIni = Nothing
End Sub
Questa volta mettiamo un punto di interruzione sulla riga:
    Set objDat = New CData
per non perdere tempo, poi ctrl+f5 e f8 quando si interrompe.
Non resta che leggere i dati...
' CData
'
Option Explicit
Public Function GetData( _
  ByVal Folder As String _
, ByVal Workbook As String _
, ByVal Worksheet As String _
, ByVal StartRange As String _
) As String
On Error GoTo GetData_Err
  With New Excel.Application
    With .Workbooks.Open(Folder & Workbook)
      With Worksheets(Worksheet)
        GetData = GetData _
          & .Range(StartRange).Offset(0, 0).Value & "="
        GetData = GetData _
          & .Range(StartRange).Offset(1, 0).Value & vbNewLine
        GetData = GetData _
          & .Range(StartRange).Offset(0, 1).Value & "="
        GetData = GetData _
          & .Range(StartRange).Offset(1, 1).Value & vbNewLine
        GetData = GetData _
          & .Range(StartRange).Offset(0, 2).Value & "="
        GetData = GetData _
          & .Range(StartRange).Offset(1, 2).Value & vbNewLine
        GetData = GetData _
          & .Range(StartRange).Offset(0, 3).Value & "="
        GetData = GetData _
          & .Range(StartRange).Offset(1, 3).Value & vbNewLine
      End With
      .Close False
    End With
    .Quit
  End With
  Exit Function
GetData_Err:
  GetData = ""
End Function
... e testarli:
' MMain
'
Option Explicit
Private Sub Main( _
)
  Dim objIni As CIni
  Dim objDat As CData
  Set objIni = New CIni
  With objIni
    If .ReadIniFile Then
      Set objDat = New CData
      Debug.Print objDat.GetData( _
        .Folder, .Workbook, .Worksheet, .StartRange)
      Set objDat = Nothing
    End If
  End With
  Set objIni = Nothing
End Sub
Bene. Non ci resta che spostare questo codice nell'evento click di Command1
e modificarlo opportunamente:
' Form1
'
Option Explicit
Private Sub Command1_Click( _
)
  Dim objIni As CIni
  Dim objDat As CData
  Screen.MousePointer = vbHourglass
  Command1.Enabled = False
  DoEvents
  Set objIni = New CIni
  With objIni
    If .ReadIniFile Then
      Set objDat = New CData
      Text1.Text = objDat.GetData( _
        .Folder, .Workbook, .Worksheet, .StartRange)
      Set objDat = Nothing
    End If
  End With
  Set objIni = Nothing
  Command1.Enabled = True
  Screen.MousePointer = vbDefault
End Sub
e sistemare la Sub Main:
' MMain
'
Option Explicit
Private Sub Main( _
)
  Form1.Show
End Sub
Scusate se mi sono dilungato ma... la tastiera andava da sola e non sono
riuscito a fermarla. Non rileggo per cui gli eventuali errori sono fatti
vostri.
E cosi` abbiamo anche accontentato quell'impunito di skunk. :->
