XL 2013 VBA : For Each Cell In [selection] et fonction If

Geebe

XLDnaute Nouveau
Bonjour,

Je cherche à cumuler en VBA les fonctions "If" et "For Each cell..." pour améliorer grandement une macro sur un des fichiers que j'utilise.

J'ai programmé il y a quelques années un enchainement de fonctions de type :


Sub Structure()
'
' Structure Macro
' Macro qui sert à copier la même structure sur tous les tronçons

'
If (Sheets("Détail réseau").Cells(16, 1) = "") Then
Sheets("Détail réseau").Cells(16, 9) = ""
Else
Sheets("Détail réseau").Cells(16, 9) = Sheets("Calcul").Cells(151, 2)

End If
If (Sheets("Détail réseau").Cells(17, 1) = "") Then
Sheets("Détail réseau").Cells(17, 9) = ""
Else
Sheets("Détail réseau").Cells(17, 9) = Sheets("Calcul").Cells(151, 2)

End If


Bon là j'ai raccourcis le nombre de cellules, car j'ai 40 lignes environ et excel met très longtemps à effectuer tous ces tests...

Mon idée serait de traduire toutes ces lignes par quelque chose de type :

Pour chacune des cellules dans [C1:C10] ; (ou sur chacune de [A1:A10] ?)

Si [A] = 0 ; alors [C] = 0 ; Sinon [C] = [D]


Après quelques recherches ça se traduirait très certainement par la fonction "For each cell in" suivie de "If ; Then ; Else"

Ma fonction pourrait alors tenir en quelques lignes et le temps de traitement en serait surement grandement amélioré.


Si quelqu'un peut m'aider sur ce sujet... je lui en serais grandement reconnaissant ^^'

(et j'en profiterai pour utiliser la recherche par "Range" plutot que par "Cells", plus pratique à s'y retrouver... mais ça je sais déjà le faire)

Et juste au cas où, étant donné mon fichier beaucoup plus complet que cette seule fonction, je ne peux pas me permettre de simplement remplir les formules "=si(.....)" dans la feuille de calcul
 

Chris401

XLDnaute Accro
Re : VBA : For Each Cell In [selection] et fonction If

Bonsoir

Sous réserve d'avoir bien compris :
Si la cellule C est vide la cellule A est vide - sinon la cellule A prend la valeur de la cellule D

Code:
Sub Test()
Dim c As Range
For Each c In Range("C1:C10")
  With c.Offset(0, -2)
    .Value = IIf(c.Value = "", "", c.Offset(0, 1).Value)
  End With
Next
End Sub

Edit : en relisant ta demande :
Si la cellule A est vide la cellule C est vide - sinon la cellule C prend la valeur de la cellule D

Code:
Sub Test2()
Dim c As Range
For Each c In Range("A1:A10")
  With c.Offset(0, 2)
    .Value = IIf(c.Value = "", "", c.Offset(0, 3).Value)
  End With
Next
End Sub
Cordialement
Chris
 
Dernière édition:

Geebe

XLDnaute Nouveau
Re : VBA : For Each Cell In [selection] et fonction If

Bonsoir et tout d'abord merci de ta réponse rapide !
Mais je crois que j'ai oublié un point qui pose problème avec ton code : dans la pratique mon test donne plutot la chose suivante :

La cellule que je veux remplir est dans la colonne C, mais si sur la même ligne A est vide, alors C doit rester vide.

Si A n'est pas vide, C doit alors prendre la valeur d'une cellule spécifique en feuille "Calculs", et étant donné la structure de ma feuille "Calcul", ça le numéro de ligne n'est pas le même.

Exemple : A5 et C5 sont liés et en ligne, ça c'est Ok. Mais si A5 n'est pas vide, alors C5 prend la valeur de [Feuille"Calcul"]D108 (et C6 prendra la valeur de D109, etc...)

Et cette demande étant adaptée pour plusieurs macro ensuite, je suis incapable de tout lier dans le même numéro de ligne. (sauf à créer des multitude de liaisons dans ma fameuse feuille "Calcul")

Ceci dit ton code semble pouvoir s'adapter à une autre macro, un peu plus simple que celle qui concerne ma demande initiale, alors je vais la garder sous le coude pour quand j'en serai rendu à cette macro ;)

Bonsoir

Sous réserve d'avoir bien compris :
Si la cellule C est vide la cellule A est vide - sinon la cellule A prend la valeur de la cellule D

Code:
Sub Test()
Dim c As Range
For Each c In Range("C1:C10")
  With c.Offset(0, -2)
    .Value = IIf(c.Value = "", "", c.Offset(0, 1).Value)
  End With
Next
End Sub
Cordialement
Chris
 
Dernière modification par un modérateur:

Chris401

XLDnaute Accro
Re : VBA : For Each Cell In [selection] et fonction If

Re

J'ai édité mon 1er message.

Ce que je ne comprends pas, si A n'est pas vide est-ce que c'est toujours le résultat de [Feuille"Calcul"]D108 ou bien cette valeur peut-elle changée ? Si elle peut changer, merci de joindre un fichier avec les réponses attendues sur 3 lignes non vides.

Chris
 
Dernière édition:

Geebe

XLDnaute Nouveau
Re : VBA : For Each Cell In [selection] et fonction If

Edit : en fait la valeur cible est fixe (dans le cas du fichier que je joins c'est D25 dans l'onglet calcul)

Enfin sa valeur peut changer mais elle est toujours au même endroit. (c'est un autre contrôle qui s'occupe de la changer)

Re

J'ai édité mon 1er message.

Ce que je ne comprends pas, si A n'est pas vide est-ce que c'est toujours le résultat de [Feuille"Calcul"]D108 ou bien cette valeur peut-elle changée ? Si elle peut changer, merci de joindre un fichier avec les réponses attendues sur 3 lignes non vides.

Chris
 

Pièces jointes

  • Test.xlsx
    8.7 KB · Affichages: 81
  • Test.xlsx
    8.7 KB · Affichages: 68
Dernière modification par un modérateur:

Geebe

XLDnaute Nouveau
Re : VBA : For Each Cell In [selection] et fonction If

Merci, cela fonctionne parfaitement !

Et en plus j'ai compris le fonctionnement donc je vais pouvoir adapter aux quelques macros qui s'y apparentent.

Je ne connaissais pas du tout la partie "centrale" de ton code mais il fait exactement ce dont j'avais besoin.

Je repasserai sur ce forum car j'ai plein d'idées en tête, mais pas assez de connaissances pour les réaliser sans aide... :'(
 

Discussions similaires

Réponses
1
Affichages
160
Réponses
0
Affichages
137

Statistiques des forums

Discussions
312 103
Messages
2 085 317
Membres
102 862
dernier inscrit
Emma35400