Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

SelectionCelluleNonContingues

  • Initiateur de la discussion Moa
  • Date de début
M

Moa

Guest
Salut à tous !

Plus de trois heures que je galère sur une macro.....héhéhé...!!

Vba commence à me prendre la tête....!!!

j'ai sur une ligne des cellules vides alternées de cellules pleines.

Ex: B5 =1, C5=Rien, D5=3, E5=4, F5=Rien, G5=2 etc....

Je voudrais faire une macro qui me sélectionnerait, uniquement les cellules pleines, afin de faire un copier / Coller sur une autre ligne.

J'ai essayer avec "For Each Next", mais soit ma macro s'arrête à la première cellule pleine ou soit elle ne recopie que la dernière.

Un coup de main...(ou alors coup de pied....)me serait bien utile.

Merci d'avance

@ +

Moa
 
@

@+Thierry

Guest
Bonsoir Moa, le Forum

J'ai du mal à comprendre ce que tu veux faire ?

Vers où veux tu copier ces cellules si elles ne sont pleines ? "afin de faire un copier / Coller sur une autre ligne." n'est pas suffisant comme info ?

Par exemple si tu veux recopier en Colonne "H" toutes les cellules pleines trouvées dans une plage de "A1" à "G10" il faudra écrire ceci :

Sub MoaMoa()
Dim Plage As Range, Cell As Range
Dim i As Integer

Set Plage = Range("A1:G10")

i = 1

For Each Cell In Plage
If Cell.Value <> "" Then
Cells(i, 8) = Cell
i = i + 1
End If
Next Cell

End Sub

Mais je suppose que c'est autre chose de plus compliqué que tu cherches à faire...

Bonne Soirée et ne te prends pas la Tête sinon avec VBA y a pas bon

@+Thierry
 
M

Moa

Guest
Salut Thierry !

Gros merci à toi de m'aider

Voici ta macro modifiée :

Sub MoaMoa()
Dim Plage As Range, Cell As Range
Dim i As Integer
Set Plage = Range("B30:AO30")
i = 1
For Each Cell In Plage
If Cell.Value <> "" Then
Cells(3, i) = Cell
i = i + 1
End If
Next Cell
Set Plage = Range("B31:AO31")
i = 1
For Each Cell In Plage
If Cell.Value <> "" Then
Cells(4, i) = Cell
i = i + 1
End If
Next Cell

End Sub

Comme tu l'as remarqué, j'ai inversé dans les "Cells" le "i" et le numéro de colonne, afin que mes valeurs soient écrites sur une ligne et non pas en colonne.

Mais j'ai deux problèmes :

Le premier et que je voudrais que mes valeurs soient recopiées à partir de G3.

Le second et que je dois faire cela pour 26 lignes, donc, n'y a-t-il pas moyen d'éviter de recopier 26 fois le bloc ?

En fait l'année dernière, j'avais une macro qui me selectionnait les cellules non vides, à droite de ma cellule active, sur la ligne, juste ça.

Et j'avais rajouté le copier / coller via une cellule de mon choix.

Puis je relançais la macro pour la ligne suivante.

J'ai recherché cette macro durant plus d'une heure dans mes fichiers et j'ai même fait une recherche sur le forum, de tous les posts que j'avais fait depuis presque un an, sans succès.

Enfin bref mon proclème est d'économiser 1482 formules, en remplissant mon tableau final avec des macros.

Et il ne reste plus que cette partie à traîter.

Héhéhé....costaud le tableau...

Sur ce je te remercie beaucoup et te souhaite une bonne nuit.

@ +

Moa
 
Z

ZON

Guest
Bonsoir à tous,

Moa afin d'éviter de faire plusieurs blocs qui se resemblent comme des gouttes d'eau, tu peux faire appel à une procédure qui fait que cela dans une procédure générale comme suit avec un boucle sur la plage:

Sub MOa(Plage As Range, Col As Byte, Lig As Long, Chaine As String)
Dim Cell As Range
For Each Cell In Plage
If Cell.Text <> Chaine Then Cells(Lig, Col) = Cell: Col = Col + 1
''If Cell.Text like Chaine Then Cells(Lig, Col) = Cell: Col = Col + 1 ' cas où on veut une égalité de chaine en rajoutant Ucase le cas échéant

Next Cell
End Sub

Sub Test()
Dim I As Byte
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With

With Sheets("Feuil1")
For I = 0 To 25 'si 26 colonnes 'plage B30:A030 jusqu'à B55:AO55
Call MOa(.Range("B" & I + 30 & ":AO" & I + 30), 1, I + 3, "")
Next I
End With

With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With

End Sub

Comme tu as des formules il est plus prudent de mettre en calcul manuel. la variable chaine peut être adaptée pour tester autre chose

A+++
 
A

andré

Guest
Salut Moa et les autres,

Tu sais que les macros, c'est pas ma tasse de thé !
Essaie d'enregistrer la procédure suivante : F5 / Cellules / Constantes / OK / Copier ...

Ândré.
 
L

LaurentB (laurent body)

Guest
utiliser le code ci-dessous ne suffit pas toujours
'**************
cell(1,1).value <>""
'**************

fais gaffe aux cellules vides (différent de "")

dans ce cas, utilise :
'**************
if ( isempty( cell(1,1).value ) then
.........
'**************
OU
'**************
if not( isempty( cell(1,1).value ) then
.........
'**************

des doutes ? utilise les deux !
 
M

Moa

Guest
Merci à vous les gars !

Voilà, ce que j'ai fait, j'ai coupé la poire en deux.

La grande partie du tableau se remplit avec une macro plus simple, puisque je n'ai pas de cellule vide, dans ma base ( qui est en fait une préparation perso de plusieurs tableaux et conditions imbriqués).

Puis pour la deuxième partie du tableau, où ma base à des cellules vides, j'ai fait des formules.

Ce qui me fait 494 formules, qui bien sur, sont étirables.

J'ai quand même fait une macro avec l'enregistreur en utilisant la procédure d'André et voilà ce que cela donne :

Range("B30:AO30").Select
Selection.SpecialCells(xlCellTypeConstants, 23).Select
Selection.Copy
Range("G4").Select
ActiveSheet.Paste

Pour une seule ligne, bien sur.

Encore une fois merci à vous

Moa
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…