Assegnare una cella a una variabile senza eliminarne il contenuto originale
Domanda
Sto impostando alcuni VBA in Excel per confrontare due date per vedere se sono uguali. Il problema che sto riscontrando è che dopo aver assegnato la variabile della cella a "ActualStartDate", elimina tutto dalla cella. Quindi " ActualStartDate " è assegnato correttamente, ma eliminato allo stesso tempo.
Ecco il mio codice, qualsiasi aiuto sarebbe fantastico. (questa roba di activecell è perché sono tutti riferimenti relativi)
Dim ActualStartDate, ProjectedStartDate
ActiveCell.Offset(-1, -1).Range("A1").Select
ActiveCell.FormulaR1C1 = ActualStartDate
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell.FormulaR1C1 = ProjectedStartDate
If ActualStartDate = ProjectedStartDate Then
ActiveCell.Offset(-1, -1).Range("A1").Interior.Color = RGB(0, 0, 255)
End If
Quando viene eseguito, riconosce le mie date del test come uguali e colora la cella. Elimina semplicemente il contenuto della cella che contiene " ActualStartDate "
Soluzione
Tutto ciò che sta facendo è spostare una cella in alto, una cella a sinistra e sostituire il valore di quella cella con nulla.
Dim ActualStartDate
ActiveCell.Offset(-1, -1).Range("A1").Select
ActiveCell.FormulaR1C1 = ActualStartDate
Si crea la variabile ActualStartDate, ma non si assegna mai nulla ad essa. Pertanto, quando applichi il valore delle variabili ActualStartDate a una cella, "elimina" la data esistente.
Probabilmente vuoi fare qualcosa di più simile a questo, anche se non sono sicuro degli offset perché non so come hai progettato il tuo foglio di calcolo.
Sub Button1_Click()
Dim ActualStartDate, ProjectedStartDate
ActiveCell.Offset(-1, -1).Select
ActualStartDate = ActiveCell.FormulaR1C1
ActiveCell.Offset(1, 0).Select
ProjectedStartDate = ActiveCell.FormulaR1C1
If ActualStartDate = ProjectedStartDate Then
ActiveCell.Offset(-1, -1).Interior.Color = RGB(0, 0, 255)
End If
End Sub
Altri suggerimenti
La selezione delle celle prima di modificarne il valore non è necessaria e FormulaR1C1
è superfluo in quanto non si inserisce un intervallo nella formula. Quanto segue dovrebbe fare esattamente lo stesso, ma penso che sia più facile da seguire ed eseguire il debug.
** Stesso avvertimento di Jim per quanto riguarda gli offset, sembrano un po 'strani ma potrebbero essere ciò che si intende **
Dim ActualStartDate, ProjectedStartDate
ActualStartDate = ActiveCell.Offset(-1, -1)
ProjectedStartDate = ActiveCell.Offset(1, 0)
If ActualStartDate = ProjectedStartDate Then
ActiveCell.Offset(-1, -1).Interior.Color = RGB(0, 0, 255)
End If
Dichiarare esplicitamente il tipo di variabili come Date
è anche una buona idea, poiché altrimenti sono archiviate internamente come tipo di dati Variant
che richiedono più memoria e possono portare a conseguenze inattese in quanto Excel ha la responsabilità di decidere come trattare i dati.
Dim ActualStartDate as Date
Dim ProjectedStartDate as Date
ActualStartDate = ActiveCell.Offset(-1, -1)
ProjectedStartDate = ActiveCell.Offset(1, 0)
If ActualStartDate = ProjectedStartDate Then
ActiveCell.Offset(-1, -1).Interior.Color = RGB(0, 0, 255)
End If