2016-06-25 48 views
5

Ho un foglio di calcolo molto grande su cui voglio eseguire i calcoli. Per accelerare questo voglio farli in vba. Ho una conoscenza di base di vba così da iniziare stavo cercando di scrivere codice che avrebbe semplicemente copiato le celle nella colonna A e assegnarle a un array e quindi incollare tutti i valori in un'altra colonna D. Ho definito i numeri per ottenere il numero di file verso il basso in quanto questo cambierà di mese in mese. Ho pensato che se avessi potuto farlo funzionare avrei potuto costruirlo da lì - ma sfortunatamente non riesco a farlo funzionare. Se qualcuno potesse dirmi cosa sto facendo male, lo apprezzerei davvero.Excel vba assegna i valori all'array e quindi incolla nel foglio di lavoro

Ho provato molte varianti di questo - al momento sto ricevendo l'errore Errore Run Time '424' oggetto richiesto quindi penso che la matrice è vuota.

Option Explicit 
Option Compare Text 
Option Base 1 


Sub Macro1() 

Dim numRows As Long 

Dim numCols As Integer 
numCols = 1 

Dim RowCounter As Long 
Dim ColCounter As Integer 
Dim SumCols() As Variant 
numRows = Cells(Rows.Count, "A").End(xlUp).Row 
ReDim SumCols(numRows, numCols) 
Dim tempSumCols As Variant 

tempSumCols = Range("A2", Cells(numRows, 1)) 

For RowCounter = 1 To numRows 
    For ColCounter = 1 To numCols 
     SumCols(RowCounter, ColCounter) = tempSumCols(RowCounter, ColCounter).Value 
    Next ColCounter 
Next RowCounter 

Range("D2", Cells(numRows, "D")) = SumCols 





End Sub 
+0

In quale riga viene visualizzato l'errore? Non dovremmo indovinare. –

+0

Mi scuso, è la prima volta che faccio una domanda, mi assicurerò di includere l'errore nelle domande future. –

risposta

1

Il modo più semplice per riempire una matrice da un intervallo:

  • dichiarare la matrice come variante
  • creare una gamma di forma corretta
  • matrice = range() valore.

È ora possibile iterare l'array usando

For i = lBound(array) to uBound(array)

o

For each e in array

 
Sub Macro1() 

    Dim SumCols As Variant 
    Dim e As Variant 

    SumCols = Range(Range("A2"), Range("A" & Rows.Count).End(xlUp)).Value 

    For Each e In SumCols 

    Next 

    Range("D2").Resize(UBound(SumCols, 1), UBound(SumCols, 2)) = SumCols 

End Sub 
+0

Grazie mille, questo ha funzionato ed è davvero efficiente. –

+0

Prego, è contento che abbia aiutato –

2

Per risolvere il codice, si devono indovinare numRows in entrambi gli array perché si inizia a A2 - tuoi Neds indice di riga per essere incrementato

E anche - remove .Value dal secondo array

Questo dovrebbe funzionare - o almeno rimuovere l'errore di runtime:

Sub Macro1() 

Dim numRows As Long 

Dim numCols As Integer 
numCols = 1 

Dim RowCounter As Long 
Dim ColCounter As Integer 
Dim SumCols() As Variant 
numRows = Range("A" & Rows.Count).End(xlUp).Row 
ReDim SumCols(numRows, numCols) 
Dim tempSumCols As Variant 

' Increment number of rows to match numrows starting at A2 
tempSumCols = Range("A2", Cells(numRows + 1, 1)) 

For RowCounter = 1 To numRows 
    For ColCounter = 1 To numCols 
     ' Remove .Value from tempSumCols 
     SumCols(RowCounter, ColCounter) = tempSumCols(RowCounter, ColCounter) 
    Next ColCounter 
Next RowCounter 

Range("D2", Cells(numRows, "D")) = SumCols 

End Sub 
+1

Grazie per questo, ha rimosso l'errore ma c'era ancora un problema con il mio codice, quindi sono andato con il codice di Thomas Inzina che era molto più efficiente del mio –