Newsgroup: it.comp.lang.visual-basic
Titolo: FORM --> EXCEL

Ciao a tutti,
mi sono da pochissimo avvicinato al mondo del VB e tentando di
scrivere un programmino ho avuto il seguente problema:
Ho impostato una form con diverse textbox dove alcuni utenti dovranno andare
ad inserire del testo. Vorrei che, premendo un pulsante, questo testo
venisse salvato in un foglio di excel in maniera molto semplice, per esempio
textbox1.text = prima riga libera della prima colonna, textbox2.text = prima
riga libera della seconda colonna, e cosě via...
Ho provato cosě:
Dim Excel As Excel.Application
Dim ExcelWBk As Excel.Workbook
Dim ExcelWS As Excel.Worksheet
Set Excel = GetObject(, "Excel.Application")
Set ExcelWBk = Excel.Workbooks.Add
Set ExcelWS = ExcelWBk.Worksheets(1)
MA in questo modo riesco solo a CREARE un file ed eventualmente salvarlo...
Non ho idea di come fare per:
- aprirene uno esistente
- dirgli come posizionarsi sulla prima riga libera
- inserire i dati nuovi e salvare
C'č qualcuno che riesce ad aiutarmi ???
Grazie mille....

 - inserire i dati nuovi e salvare
    Poniamo che il file esistente si chiami "Cartel1.xls" e sia registrato
(salvato) nella cartella (directory) "Pippo" della cartella (directory)
"Prove", nel disco "C:". Se vuoi, sperimenta col codice seguente:
Option Explicit
Private Sub AggiornaCartellaDiLavoro( _
  ByVal NomeCompletoCartellaDiLavoro As String _
, ByVal NomeFoglioDiLavoro As String _
, ParamArray CoppieRifcellaValore() As Variant)
  Dim oXlApp As Excel.Application
  Dim oXlWbk As Excel.Workbook
  Dim oXlWks As Excel.Worksheet
  Dim lIndex As Long
  Set oXlApp = New Excel.Application
  With oXlApp
    Set oXlWbk = .Workbooks.Open(NomeCompletoCartellaDiLavoro)
    With oXlWbk
      Set oXlWks = .Worksheets(NomeFoglioDiLavoro)
      With oXlWks
        For lIndex = LBound(CoppieRifcellaValore) _
            To UBound(CoppieRifcellaValore) _
            Step 2
          .Range(CoppieRifcellaValore(lIndex)).Value _
            = CoppieRifcellaValore(lIndex + 1)
        Next
      End With
      .Close xlSaveChanges
    End With
    .Quit
  End With
  Set oXlWks = Nothing
  Set oXlWbk = Nothing
  Set oXlApp = Nothing
End Sub
Private Sub Command1_Click()
  AggiornaCartellaDiLavoro _
      "C:\Prove\Pippo\Cartel1.xls" _
    , "Foglio1" _
    , "A2", Text1(0).Text _
    , "A3", Text1(1).Text _
    , "A4", Text1(2).Text
End Sub
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------


Ho provato il tuo codice e funziona alla PERFEZIONE!
L'unica cosa, che poi è quella che ti spiegavo prima, è che invece che
scrivere il testo in una cella ben definita (A2, A3, A4...) vorrei farlo
scrivere nella prima cella vuota di una determinata colonna...
Pensi sia possibile una cosa del genere ???
Grazie ancora!

 Pensi sia possibile una cosa del genere ???
    Certamente. Come dicevo il modello degli oggetti di Excel ha numerose
funzioni per gestire questo tipo di esigenze. Dovresti approfondire tali
metodi e proprieta' dell'oggetto Range.
    In particolare considera, cercandole nel "Visualizzatore oggetti", le
seguenti:
        Property CurrentRegion As Range
            sola lettura
            Membro di Excel.Range
        Property Offset([RowOffset], [ColumnOffset]) As Range
            sola lettura
            Membro di Excel.Range
        Property Resize([RowSize], [ColumnSize]) As Range
            sola lettura
            Membro di Excel.Range
e abituati ad analizzare e a sperimentare in questo modo:
     - apri excel con una nuova cartella di lavoro;
     - passa a visual basic;
     - accertati che sia visibile la finestra "Immediata";
     - inserisci un nuovo modulo nel progetto;
     - inserisci in tale madulo una nuova routine di nome "test" (o quel che
preferisci):
        Option Explicit
        Public Sub test()
        End Sub
     - sperimenta usando "debug.print" e la proprieta':
        Property Address( _
            [RowAbsolute] _
          , [ColumnAbsolute] _
          , [ReferenceStyle As XlReferenceStyle = xlA1] _
          , [External] _
          , [RelativeTo] _
          ) As String
            sola lettura
            Membro di Excel.Range
    Per esempio:
        Option Explicit
        Public Sub test()
            Debug.Print Range("A1").Address
            Debug.Print Range("A1").Worksheet.Name
            Debug.Print Range("A1").
Worksheet.Parent.Name
        End Sub
    Esegui con F5 o F8 e il cursore all'interno della routine e leggerai:
    Immediata:
    $A$1
    Foglio1
    Cartel1
Chiaro il meccanismo? Ed ora facciamo sul serio. Scrivi "Pippo" nella cella
"A1", poi:
Option Explicit
Public Sub test()
  Dim oXlWbk  As Excel.Workbook
  Dim oXlWsh  As Excel.Worksheet
  Dim oXlRng  As Excel.Range
  Set oXlWbk = Excel.ActiveWorkbook
  Set oXlWsh = oXlWbk.Worksheets(1)
  With oXlWsh
    With .Range("A1")
      Debug.Print .CurrentRegion.Address
      With .CurrentRegion
        Set oXlRng _
          = .Resize(1, 1).Offset(.Rows.Count, 0)
        With oXlRng
          .Value = 123
          Debug.Print .Address; " = "; .Value
        End With
      End With
    End With
  End With
  Set oXlRng = Nothing
  Set oXlWsh = Nothing
  Set oXlWbk = Nothing
End Sub
e premi diverse volte F5. Come vedi ad ogni esecuzione il valore 123 viene
scritto nella prima cella vuota sotto "Pippo".


 --------
Ciao Maurizio,
le tue spiegazioni sono state OTTIME!
Ho rovato con il codice che mi hai mandato, ho studiato il funzionamento di
excel.range e sono riuscito ad integrare quanto fatto ieri con quello che mi
hai detto oggi..... e funziona!!!
GRAZIE!!!

 GRAZIE!!!
    :)
    ... e grazie a te per la tua cortesia.
