Copier des valeurs d'une feuille à l'autre avec une macro
Bonjour à tous,
J'ai écumé de nombreux forum pour tenter de résoudre mon problème, mais en vain... Je débute en VBA, j'ai des notions en codage informatique mais là rien à faire ça fait deux jours que je galère et surement pour un truc tout bête. Je m'explique.
Je cherche à réaliser une feuille de relevé de mesures (feuille1 que j'ai nommé "Fiche_releves") qui enregistre automatiquement les données dans un tableau qui sert de base de donnée (feuille4 : "BBD"). L'idée est que lorsqu'on ferme excel, la feuille1 se réinitialise mais les données de la feuille4 s'enregistrent. Pour cela, j'ai créé un tableau en feuille3 ( "Valeurs") qui récupère les valeurs de la feuille 1 quand je les écrits. Et j'essaie de faire une macro qui va copier-coller les valeurs (et non les formules) de la feuille 3 à la feuille 4.
J'ai essayé plusieurs méthodes et j'en ai conclu qu'avec une boucle cela devrait faire l'affaire.
J'ai donc essayé avec ça :
Sub Recopie()
Application.ScreenUpdating = Fasle
With Sheets("Valeurs")
Dim i As Integer
i = 3
While i <= 14
If Cells(i, 29) <> "" Then
Range(Cells(i, 25), Cells(i, 37)).Copy
Sheets("BDD").Cells(i-1, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
i = i + 1
Else
Sheets("BDD").Cells(i - 1, 1).ClearContents
End If
Wend
End WithCe code lance une boucle infinie qui fait planter excel...
J'ai ensuite essayé avec une boucle for :
Sub Recopie()
Application.ScreenUpdating = Fasle
With Sheets("Valeurs")
Dim i As Integer
Dim j As Integer
j = 1
For i = 3 To 14
j = j + 1
Range(Cells(i, 25), Cells(i, 37)).Copy
Sheets("BDD").Cells(j, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
i = i + 1
Next
End With
Application.ScreenUpdating = True
End SubAvec ce code, les deux premières lignes se copie dans ma feuille4 mais pas les autres...
Je pense donc à un problème d'incrémentation, mais je ne sais vraiment pas comment le résoudre.
Si vous avez des pistes à me proposer, je suis preneuse...
Merci
Bonjour Julia.
Je te propose deux possibilités.
La première avec une boucle.
Sub Recopie()
Dim i%, j%
j = 1
With Sheets("Valeurs")
For i = 3 To 14
j = j + 1
.Range(Cells(i, 25), Cells(i, 37)).Copy
Sheets("BDD").Cells(j, 1).PasteSpecial xlValues
Application.CutCopyMode = False
Next
End With
End SubLa seconde en copiant directement la plage de cellules.
Sub Recopie2()
Sheets("Valeurs").Range(Cells(3, 25), Cells(14, 37)).Copy
Sheets("BDD").Cells(2, 1).Resize(12, 13).PasteSpecial xlValues
Application.CutCopyMode = False
End Sub
Dans ton second code, étant donné que tu boucles sur i, pas besoin de l'incrémenter manuellement.
Alléluia ! Ca fonctionne merci merci merci !
Une autre petite question tant que j'y suis...
Comment puis-je faire pour qu'il ne copie pas les lignes qui sont vides. Mon soucis est qu'elles semblent vides (dans la feuille3) mais elles contiennent la formule qui récupère les valeurs de la feuille 1. Or quand il n'y a pas de valeur dans la feuille1, je voudrais que dans ma base de donné il n'y ai rien.
Merci !
N'ayant pas le fichier sous les yeux c'est difficile de répondre.
Mais on peut faire un test pour compter le nombre de cellules vides dans la plage.
Si le nombre est inférieur au nombre de cellules on copie les valeurs, sinon nous passons à la suite.
Sub Recopie()
Dim i%, j%
j = 1
For i = 3 To 14
If WorksheetFunction.CountBlank(Range(Cells(i, 25), Cells(i, 37))) < 13 Then
j = j + 1
Range(Cells(i, 25), Cells(i, 37)).Copy
Cells(j, 1).PasteSpecial xlValues
Application.CutCopyMode = False
End If
Next
End SubCa ne fonctionne pas. Rien ne change par rapport au code précédent.
Je vous met le fichier dans ce lien pour que cela soit plus clair.
https://www.cjoint.com/c/FFyhGub2XwZ
En fait, suite à ça, je veux créer une marco qui me permettra de continuer d'écrire dans la base de données sans supprimer les valeurs. Du style "insérer des lignes, enregistrer, quitter" et quand je ré-ouvre ma macro recopie reproduit la même chose que précédemment.
Peut être que le plus simple pour éviter les lignes vide dans la base de donnée serait en fait de mettre un filtre. Non ?
Merci !
Tu n'avais pas précisé que tu considères lignes vides quand il n'y a pas de valeurs à partir de la colonne [AC].
En effet, je suis parti pour une vérification à partir de [Y]
Avec le code ci-dessous, ça fonctionne :
Sub Recopie2()
Dim i%, j%
j = 1
With Sheets("Valeurs")
For i = 3 To 14
If WorksheetFunction.CountBlank(.Range(.Cells(i, "AC"), Cells(i, "AK"))) < 9 Then
j = j + 1
.Range(Cells(i, 25), Cells(i, 37)).Copy
Sheets("BDD").Cells(j, 1).PasteSpecial xlValues
Application.CutCopyMode = False
End If
Next
End With
End SubAutant pour moi. Effectivement ça fonctionne parfaitement maintenant !
Encore un grand MERCI pour ton aide !!!