Problème avec CurrentRegion

dancar

XLDnaute Junior
Bonjour à toutes et tous,

Voici mon problème avec CurrentRegion :
J'ai la plage C5:J58 qui contient des formules et cette plage est entourée de cellule vide et sans formule.
Dans C5:J58 il n'y a que C5:J13 qui contient des valeurs.
Je voulais avec CurrentRegion récupérer que les valeurs de C5:J13 pour les coller dans une autre feuille, dans une macro j'ai donc le code suivant :
[C5].Select
[C5].CurrentRegion.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
[C5].CurrentRegion.Copy

Le premier CurrentRegion.Copy sélectionne bien C5:J58 mais le second aussi alors qu'il devrait sélectionner que C5:J13 puisqu'il n'y a des valeurs que dans cette plage.
Je pense que C14:J58 doit contenir quelque chose que CurrentRegion considère comme des valeurs, formules ou autre car si je fais un Suppr sur C14:J14 CurrentRegion sélectionne bien que C5:J13.

Si quelqu'un a une explication, celle-ci est la bienvenue car jusqu'à maintenant je n'avait pas de problème avec CurrentRegion.

Au cas ou vous en auriez besoin, je préfère joindre de suite un petit fichier.

Bien cordialement
 

Pièces jointes

  • Conversion P10 de 1 à 6 colonnes.xlsm
    27.8 KB · Affichages: 38

Dranreb

XLDnaute Barbatruc
Bonsoir.
C'est un fait que les formules qui renvoient un texte vide ne comptent pas pour des cellules vides et sont donc incluses dans la zone en cours.
Je propose assez souvent ces fonctions de service secondaires dans un module Utilit :
VB:
Function PlgUti(ByVal PlageDép As Range, Optional ByVal PlagExam As Range = Nothing, _
  Optional ByVal LMin As Long, Optional ByVal CMin As Long) As Range
Rem. Cherche la partie utilisée d'une plage, c'est à dire celle qui s'étend jusqu'à la dernière cellule renseignée de plus qu'une chaîne vide.
'  PlageDép: Plage de départ. Seule la 1ère cellule spécifiée est prise en compte pour la déterminer, et suffit donc pour une utilisation VBA.
'                   Pour utilisation en formules, il est néanmoins nécessaire de spécifier la plage depuis celle ci jusqu'au reste des colonnes entières.
'  PlageExam: Plus grande plage susceptible de contenir la plage cherchée.
'                   Facultatif: UsedRange assumé par défaut.
'  LMin: Mombre de lignes minimum à considérer même si tout est vide.
'  CMin: Mombre de colonnes minimum à considérer même si tout est vide.
Dim LMax As Long, CMax As Long, NbL As Long, NbC As Long
On Error GoTo RienTrouvé
If PlagExam Is Nothing Then Set PlagExam = PlageDép.Worksheet.UsedRange
LMax = PlagExam.Find("*", PlagExam.Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
CMax = PlagExam.Find("*", PlagExam.Cells(1, 1), xlValues, xlWhole, xlByColumns, xlPrevious).Column
On Error GoTo 0
NbL = LMax - PlageDép.Row + 1: If NbL < LMin Then NbL = LMin
NbC = CMax - PlageDép.Column + 1: If NbC < CMin Then NbC = CMin
If NbL < 1 Or NbC < 1 Then GoTo CEstToutVide
Set PlgUti = PlageDép.Resize(NbL, NbC)
Exit Function
RienTrouvé: Resume CEstToutVide
CEstToutVide: Set PlgUti = Nothing
End Function
'

Function ColUti(ByVal PlageDép As Range, Optional ByVal LMin As Long, Optional ByVal CMin As Long) As Range
Rem. Comme PlgUti, mais la plage rendue se limitera aux colonnes couvertes par la plage de départ spécifiée.
Set ColUti = PlgUti(PlageDép, Intersect(PlageDép.Worksheet.UsedRange, PlageDép.EntireColumn), LMin, CMin)
End Function
Elles permettent de résoudre votre problème comme ceci :
VB:
Sub Convertir_les_P10()
'On garde que les valeurs (pas les formules)
With ColUti([C5:J5])
  MsgBox .Address ' Vérification
  .Value = .Value
  .Copy
  End With
End Sub
Remarque: J'aurais plutôt pris comme formule, à partir de E5 :
Code:
=SI(DECALER($A$1;L5-1;$R5-1)="";"";DECALER($A$1;L5-1;$R5-1))
VB:
.FormulaR1C1 = "=IF(OFFSET(R1C1,RC[7]-1,RC18-1)="""","""",OFFSET(R1C1,RC[7]-1,RC18-1))"
 
Dernière édition:

dancar

XLDnaute Junior
Dranreb et Patrice, je vous remercie pour vos réponses elles sont efficaces et instructives et il est toujours bon d'apprendre.
Ceci dit je n'avais encore pas vu vos réponses que j'ai trouvé ceci et qui peut éventuellement vous intéresser :
[C5].CurrentRegion.Value = [C5].CurrentRegion.Value
[C5].CurrentRegion.Copy

Je vais conserver toutes ces solutions dans un coin car selon le cas, elles ont sûrement chacune un avantage.

Dranreb, hormis le fait que la formule que vous auriez pris est plus simple que la mienne (d'ailleurs je vais l'utiliser), a-t-elle d'autres avantages ?

Un grand merci à vous deux pour vous êtres intéressé et m'avoir apporté des solutions à mon problème.

Bon dimanche
 

Staple1600

XLDnaute Barbatruc
Bonjour à tous

Bonjour à toutes et tous,
Voici mon problème avec CurrentRegion :
J'ai la plage C5:J58 qui contient des formules et cette plage est entourée de cellule vide et sans formule.
Dans C5:J58 il n'y a que C5:J13 qui contient des valeurs.
Je voulais avec CurrentRegion récupérer que les valeurs de C5:J13 pour les coller dans une autre feuille, dans une macro j'ai donc le code suivant :
Ci-dessous une macro pour faire spécifiquement ce que tu décris
VB:
Sub a()
'on ne copie que les cellules numériques sans formule de la plage C5:J58 de la Feuille 1
Feuil1.Range("C5:J58").SpecialCells(xlCellTypeConstants, 1).Copy
'et on les colle dans une autre feuille, ici la Feuille 2
Feuil2.Paste
End Sub
 

dancar

XLDnaute Junior
Merci Staple1600, mais ne fonctionne pas chez moi :
upload_2016-9-25_11-26-10.png


et même en modifiant le code par :
Sub a()
'on ne copie que les cellules numériques sans formule de la plage C5:J58 de la Feuille 1
Sheets("Feuil1").Range("C5:J58").SpecialCells(xlCellTypeConstants, 1).Copy
'et on les colle dans une autre feuille, ici la Feuille 2
Sheets("Feuil2").Paste
End Sub


upload_2016-9-25_11-31-48.png


Salutations
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof