Newsgroup: it.comp.lang.visual-basic
Titolo: interagire con xls

Come apro un file xls e ci scrivo nelle celle?
Grazie
--
Andrea Fabbrucci
anfa...@tin.it

faccio seguito con uno stralcio di un programma che ho scritto di recente,
in linea generale, una volta che hai creato l'oggetto della classe
excel.application (getobject() o createobject() ), hai aperto il workbook
che ti interessa e attivato il foglio giusto si tratta di indivisuare la
cella giusta ( cells(riga,colonna) ) e di assegnargli un valore
cells(riga,colonna) = valore )o una formula (cells(riga,colonna).formula =
Formula in formato testo che inizia con "=" formule in inglese (=SUM e non
=SOMMA) per capirci...)
Buona fortuna.
                on error resume next
                Set oExcel = GetObject(, "Excel.Application")
                If Err.Number <> 0 Then
                    Set oExcel = CreateObject("Excel.Application")
                    Err.Clear
                    lNuovo = True
                End If
                on error goto 0
                oExcel.Workbooks.Add
                Set oWb = oExcel.Workbooks(1)
                oWb.Activate
                Db.TableDefs.Refresh
                nTabelle = (Db.TableDefs("PP" &
rsImmobili.Fields("CodEsercizio")).Fields.Count - 8) / 2
                frmAttesa.lblAzione = "Valorizzazione dei titoli di
colonna."
                frmAttesa.prbProgressione = 9
                DoEvents
                For Each iField In Db.TableDefs("PP" &
rsImmobili.Fields("CodEsercizio")).Fields
                    If iField.Name = "DescScala" Then
                        oWb.ActiveSheet.Cells(cstPrimaRiga - 1, 1) = "Scala"
                    ElseIf iField.Name = "Interno" Then
                        oWb.ActiveSheet.Cells(cstPrimaRiga - 1, 2) =
"Interno"
                    ElseIf iField.Name = "DescAmministrato" Then
                        oWb.ActiveSheet.Cells(cstPrimaRiga - 1, 3) =
"Amministrato"
                    ElseIf iField.Name = "SaldoPrecedente" Then
                        oWb.ActiveSheet.Cells(cstPrimaRiga - 1, 4 +
nTabelle) = "Saldo Prec."
                        oWb.ActiveSheet.Cells(cstPrimaRiga - 1, 5 +
nTabelle) = "Totale"
                    ElseIf Mid(iField.Name, 1, 2) = "T_" Then
                        rsTabelle.FindFirst "Codice = " & Mid(iField.Name,
3)
                        If Not rsTabelle.NoMatch Then
                            oWb.ActiveSheet.Cells(cstPrimaRiga - 1, 3 +
Int((iField.OrdinalPosition - 7) / 2 + 1)) = rsTabelle.Fields("Descrizione")
                        End If
                    End If
                Next
                Set rsBilancio = Db.OpenRecordset("PP" &
rsImmobili.Fields("CodEsercizio"), dbOpenSnapshot)
                nScala = 0
                nRiga = cstPrimaRiga
                nPrimaRiga = cstPrimaRiga
                lNewRiga = True
                frmAttesa.lblAzione = "Valorizzazione delle singole celle."
                frmAttesa.prbProgressione = 10
                DoEvents
                Do While Not rsBilancio.EOF
                    For Each iField In rsBilancio.Fields
                        If iField.Name = "DescScala" And nScala <>
rsBilancio.Fields("Scala") Then
                            nScala = rsBilancio.Fields("Scala")
                            oWb.ActiveSheet.Cells(nRiga, 1) = iField
                            oWb.ActiveSheet.Cells(nRiga, 1).ColumnWidth =
Len(iField)
                        ElseIf iField.Name = "Interno" And lNewRiga Then
                            oWb.ActiveSheet.Cells(nRiga, 2) = iField
                            oWb.ActiveSheet.Cells(nRiga, 1).ColumnWidth =
Len(iField)
                        ElseIf iField.Name = "DescAmministrato" And lNewRiga
Then
                            oWb.ActiveSheet.Cells(nRiga, 3) = iField
                        ElseIf iField.Name = "Ruolo" And
oWb.ActiveSheet.Cells(nRiga + 1, 2) <> "Proprietario" Then
                            oWb.ActiveSheet.Cells(nRiga + 1, 2) = iField
                        ElseIf iField.Name = "SaldoPrecedente" Then
                            oWb.ActiveSheet.Cells(nRiga, 4 + nTabelle) =
oWb.ActiveSheet.Cells(nRiga, 4 + nTabelle) + iField * nSegno
                            oWb.ActiveSheet.Cells(nRiga, 4 +
nTabelle).NumberFormat = "#,###;-#,###"
                            oWb.ActiveSheet.Cells(nRiga, 5 +
nTabelle).Formula = "=Sum(d" & nRiga & ":" & Chr(68 + nTabelle) & nRiga &
")"
                            oWb.ActiveSheet.Cells(nRiga, 5 +
nTabelle).NumberFormat = "#,###;-#,###"
                        ElseIf Mid(iField.Name, 1, 2) = "T_" Then
                            oWb.ActiveSheet.Cells(nRiga, 3 +
Int((iField.OrdinalPosition - 7) / 2 + 1)) = oWb.ActiveSheet.Cells(nRiga, 3
+ Int((iField.OrdinalPosition - 7) / 2 + 1)) + Round(iField, 0) * nSegno
                            oWb.ActiveSheet.Cells(nRiga, 3 +
Int((iField.OrdinalPosition - 7) / 2 + 1)).NumberFormat = "#,###;-#,###"
                        ElseIf Mid(iField.Name, 1, 2) = "M_" And iField <> 0
Then
                            oWb.ActiveSheet.Cells(nRiga + 1, 3 +
Int((iField.OrdinalPosition - 8) / 2 + 1)) = oWb.ActiveSheet.Cells(nRiga +
1, 3 + Int((iField.OrdinalPosition - 8) / 2 + 1)) + iField
                            oWb.ActiveSheet.Cells(nRiga + 1, 3 +
Int((iField.OrdinalPosition - 8) / 2 + 1)).NumberFormat = "#.000 ;-#.000 "
                        End If
                    Next
                    ...
                    oWb.ActiveSheet.Range("A" & nRiga + 6 & ":" & Chr(69 +
nTabelle) & nRiga + 6).Select
                    oExcel.Selection.Merge
                    oExcel.Selection.HorizontalAlignment = xlCenter
                    oExcel.Selection.WrapText = True
                    oExcel.Selection.Font.Size = 8
                    oExcel.Selection.Borders(8).LineStyle = xlContinuous
                    oExcel.Selection.Borders(8).Weight = xlThin
                End If
                With oWb.ActiveSheet.PageSetup
                    .FooterMargin = Application.CentimetersToPoints(0)
                    .HeaderMargin = Application.CentimetersToPoints(0)
                    .TopMargin = Application.CentimetersToPoints(2.5)
                    .BottomMargin = Application.CentimetersToPoints(2)
                    .LeftMargin = Application.CentimetersToPoints(1)
                    .RightMargin = Application.CentimetersToPoints(1)
                    If cbFormato.ListIndex = 0 Then
                        .PaperSize = xlPaperA4
                        If nTabelle > 3 Then
                            .Orientation = xlLandscape
                        End If
                    Else
                        .PaperSize = xlPaperA3
                        If nTabelle > 8 Then
                            .Orientation = xlLandscape
                        End If
                    End If
                    .CenterHorizontally = True
                    .CenterVertically = True
                    .Zoom = False
                    .FitToPagesTall = 1
                    .FitToPagesWide = 1
                End With
                frmAttesa.lblAzione = "Stampa Foglio elettronico (apertura
anteprima video)."
                frmAttesa.prbProgressione = 14
                DoEvents
                If cbPrinter.ListCount > 0 Then
                    oExcel.ActivePrinter =
cbPrinter.List(cbPrinter.ListIndex)
                End If
                If chkAnteprima = vbChecked Then
                    oExcel.Visible = True
                    oWb.PrintPreview
                Else
                    oWb.Saved = True
                    oExcel.Visible = False
                    oExcel.ActiveSheet.PrintOut
                    If lNuovo Then
                        oExcel.Quit
                    Else
                        oExcel.Workbooks(oExcel.Workbooks.Count).Close
                    End If
                End If

ah a proposito, quandodevi fare qualcosa e non sai come, attiva il
registratore di macro di excel e fai la'zione che vorresti fare da programma
e poi vai a vedere il codice VBA generato e copialo apportando le modifiche
più opportune, funziona sempre!
Bye