Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Assegnamento molte celle in Excel via OLE

Buongiorno a tutti,
Avrei la necessita' di assegnare diverse celle di un foglio Excel via OLE
(oggetto Excel.WorkSheet).
Riesco benissimo ad assegnare i singoli valori alle celle una per volta, in
un ciclo, MA in questo modo il riempimento dei dati e' notevolmente lento.
Sapete se esiste un modo veloce per assegnare una serie di dati da VB ad un
riga di Excel?
Io ho provato a fare una stringa con i valori separati da tab (o punto e
virgola) e assegnarlo ad un Range di Excel, ma cosi' l'intera stringa viene
assegnata AD OGNI cella nel Range... ovviamente non e' quello che vorrei io.
Quasi sicuramente e' possibile farlo con copia-incolla, ma non vorrei
"sporcare" la clipboard per una operazione che deve essere assolutamente
trasparente.
TIA
--
Roal Zanazzi
z...@iol.it

...


...


Ciao roal,
Un range di excel rappresenta un vettore bidimensionale.
puoi tranquillamente passare un puntatore di un range ad un array(x,y) e
viceversa.
esempio:
Dim objAppExcel As excel.Application, _
    objSheet As excel.Worksheet, _
    objRange As excel.Range
Dim RangeArray(2, 2) As Long 'ma anche variant o string
Set objAppExcel = CreateObject("excel.Application")
Set objSheet = objAppExcel.Workbooks.Add.Worksheets(1)
RangeArray(0, 0) = 1
RangeArray(0, 1) = 2
RangeArray(0, 2) = 3
RangeArray(1, 0) = 4
RangeArray(1, 1) = 5
RangeArray(1, 2) = 6
RangeArray(2, 0) = 7
RangeArray(2, 1) = 8
RangeArray(2, 2) = 9
Set objRange = objSheet.Range("A1:C3")
objRange = RangeArray 'Passa il puntatore del vettore e riempie le celle.
objAppExcel.Visible = True
Il concetto vale anche per tutte quelle funzioni di excel
(WorksheetFunction) che accettano un range come parametro: per usarle in VB
occorre passare un Array .
ciao,
Alessandro Scardova
scar...@tin.it
http://space.tin.it/computer/ascardov/

viceversa.
Sei sicuro che funzioni nel primo caso?
Mentre puoi assegnare un array qualsiasi a un range, facendo il contrario a
me ha sempre dato "Can't assign to an array", finche' mi pare di aver
trovato, su msdn, che si puo' usare una variabile (non un array) di tipo
Variant, che lui trasforma in sottotipo Array
Dim v As Variant
v = objSheet.Range("A1:B2")
Debug.Print v(1,1);v(1,2) ...
Enrico

Hai ragione, il problema e' nella sintassi di VB, che non consente di
assegnare i puntatori delle variabili.
il tutto si risolve 'fregando' VB in questo modo:
Option Explicit
Option Base 1 'il range ha option base 1
Dim objAppExcel As Excel.Application, _
    objSheet As Excel.Worksheet, _
    objRange As Excel.Range
Dim RangeArray As Variant ' non un array
Private Sub Command1_Click() 'Riempie le celle
    objRange = RangeArray  'Passa il puntatore del vettore e riempie le
celle.
End Sub
Private Sub Command2_Click() 'Carica l'array dalle celle.
    RangeArray = objRange
End Sub
Private Sub Form_Load()
Set objAppExcel = CreateObject("excel.Application")
Set objSheet = objAppExcel.Workbooks.Add.Worksheets(1)
ReDim RangeArray(3, 3) 'adesso e' un array
RangeArray(1, 1) = 1
RangeArray(1, 2) = 2
RangeArray(1, 3) = 3
RangeArray(2, 1) = 4
RangeArray(2, 2) = 5
RangeArray(2, 3) = 6
RangeArray(3, 1) = 7
RangeArray(3, 2) = 8
RangeArray(3, 3) = 9
Set objRange = objSheet.Range("A1:C3")
objAppExcel.Visible = True
End Sub

Puoi anche usare un array dinamico, in VB6 funzia.
Option Explicit
Option Base 1 'il range ha option base 1
Dim objAppExcel As Excel.Application, _
    objSheet As Excel.Worksheet, _
    objRange As Excel.Range
Dim RangeArray () As Variant 'un array di variant
Private Sub Command1_Click() 'Riempie le celle
    objRange = RangeArray  'Passa il puntatore del vettore e riempie le
celle.
End Sub
Private Sub Command2_Click() 'Carica l'array dalle celle.
    RangeArray = objRange
End Sub
Private Sub Form_Load()
Set objAppExcel = CreateObject("excel.Application")
Set objSheet = objAppExcel.Workbooks.Add.Worksheets(1)
ReDim RangeArray(3, 3)
