2017-09-05 1 views
0

Je souhaite créer une macro pour copier une plage (C2: C22) contenant des formules et la coller dans la plage de colonnes (D2: D22) en tant que valeurs. Mon problème est que toutes les 6 cellules j'ai une formule et je ne veux pas que la macro l'écrase. J'ai essayé avec cette macro, mais elle ne copie pas les formules, seulement les valeurs et je dois coller sur les valeurs, pas sur les formules.Coller la valeur IF dans la cible

Merci!

Sub example() 
    Dim source As Range 
    Dim target As Range 
    Set source = ActiveSheet.Range("c2:c22") 
    Set target = ActiveSheet.Range("d2:d22") 
    copy_formulas source:=source, target:=target 

End Sub 

Public Sub copy_formulas(source As Range, target As Range) 
    'Assumes that all formulas start with '=' and all non formulas do not 
    Dim i As Long 
    Dim j As Long 
    Dim c As Range 

    For i = 1 To source.Rows.Count 
     For j = 1 To source.Columns.Count 
      Set c = source(RowIndex:=i, ColumnIndex:=j) 
      If Left(c.Formula, 1) <> "=" Then 
       target(RowIndex:=i, ColumnIndex:=j).Value = c.Value 
      End If 
     Next j 
    Next i 
End Sub 
+0

Votre question dit: «J'ai essayé avec cette macro, mais il ne copie pas les formules, seules les valeurs et je dois coller sur des valeurs, et non sur des formules. " qui ressemble à ce que vous faites. Pouvez-vous clarifier? –

+0

@ChrisMoore OP essaie de copier des valeurs sans écraser les formules existantes –

Répondre

2

Modifier l'intérieur de la boucle à:

Set c = target(RowIndex:=i, ColumnIndex:=j) 
If Left(c.Formula, 1) <> "=" Then 
    c.Value = source(RowIndex:=i, ColumnIndex:=j).Value 
End If 

Votre code actuel teste s'il existe une formule dans la cellule source, mais votre question implique que vous devriez tester un formule dans la cellule cible.

+0

Mauvais code incorrect 101: 'c' est un identifiant terrible - ce bug ne serait pas arrivé si' c' était nommé 'targetCell' à la place ... en supposant 'Set targetCell = source (...)' semble assez faux –

+0

Merci beaucoup. J'étais vraiment coincé! Vous résolvez mon problème :) – Diego

0

Cette boucle pourrait être plus efficace:

Dim rSource As Range 
Dim rTarget As Range 
Set rSource = Worksheets("Sheet1").Range("C2:C22") 
Set rTarget = Worksheets("Sheet1").Range("D2:D22") 
For Item = 1 To rSource.Count 
    If Not rTarget.Cells(Item).HasFormula Then 
     rTarget.Cells(Item).Value = rSource.Cells(Item).Value 
    End If 
Next Item 
+0

Merci Tony, j'apprécie vraiment :) – Diego

+0

comment puis-je ajouter plusieurs gammes à cette boucle? J'ai essayé ci-dessous mais il ne fait que copier/coller la première plage Z18: AA250 - AU18: AV250 Dim rSource As Plage Dim rTarget As Plage Définir rSource = ActiveSheet.Range ("Z18: AA250, W18: X250, H18: H250, O18: O250 ") Définir rTarget = ActiveSheet.Range (" AU18: AV250, AX18: AY250, AR18: AR250, AS18: AS250 ") Pour l'élément = 1 Pour rSource.Count Si Non rTarget.Cells (Elément) .HasFormula Puis rTarget.Cells (Article) .Valeur = rSource.Cells (Article) .Valeur Fin Si Article suivant – Diego