Compiler des informations sous excel

  • Auteur de la discussion ChristopheBrug
  • Date de début

ChristopheBrug

Nouveau membre
Bonjour à tous !

Particulièrement rouillé avec excel, je sèche depuis deux jours sur un problème que je vais vous expliquer :

J'ai un tableau de compta qui n'a ni continuité, ni uniformité.

Je cherche à créer une macro qui me permette de copier dans une autre document ou une autre page, c'est égal, le contenu de deux cellules qui ne sont pas contiguës, si la première cellule commence par le chiffre "22", puis répliquer l'opération aussi souvent que ce code "22" se reproduit dans le fichier de base.

Exemple :

cellule A1 = "22xxx" donc copier cette cellule et copier la dernière cellule active du bloc d'informations correspondant à ce bloc de la colonne H (par exemple la cellule H6) tout en sachant qu'au niveau de la ligne 1, la cellule de la colonne H n'est pas active, puis recommencer tant que dans la colonne A on trouve du texte commençant par 22 et copier aussi la dernière cellule et sachant que chaque bloc peut comporter un nombre variant de lignes...

Je me rends compte que mes explications sont un peu confuses.

Merci d'avance !

 

drul

Obscur pro du hardware
Staff
Pourquoi ne pas simplement copier les colonnes qui t'intéresse et ensuite trier ?
 

ChristopheBrug

Nouveau membre


 

ChristopheBrug

Nouveau membre
Ce n'est pas une solution pratique, car les colonnes sont trop importantes. Elles sont issues d'un logiciel de comptabilité qui cumule toutes les données saisies les unes à la suite des autres, or je n'ai besoin que d'une partie des informations. Merci tout de même pour la suggestion.
 

zeb

Modérateur
Salut,

Considérons que la première cellule dans laquelle rechercher est Cel1.
Avec un Cel1.Worksheet.Cells(Rows.Count, Cel1.Column).End(xlUp) on obtient la dernière cellule à scruter. On l'appelle CelDer.
Voilà notre plage de recherche : Cel1 -> CelDer.

Quand on trouve "22" dans une cellule de la même colonne que Cel1, on détermine le bloc de lignes contiguës.
On définit un bloc par un ensemble de lignes séparé d'un autre par au moins une ligne vide.

Pour déterminer si une ligne est vide, je propose la fonction suivante :
Code:
' La ligne donnée est-elle vide ?
' le paramètre peut être un entier, un Range ou la ligne courante s'il n'est pas donné
Function IsRowEmpty(Optional ByVal row) As Integer
    If IsMissing(row) Then Set row = Application.ActiveCell
    If IsNumeric(row) Then Set row = Rows(row)
    If Not IsObject(row) Then Exit Function
    If TypeName(row) <> "Range" Then Exit Function
    Set row = row.Cells(1, 1).EntireRow
    IsRowEmpty = row.Cells(1).Formula = "" And row.Cells(Columns.Count).End(xlToLeft).Column = 1
End Function

Pour déterminer un bloc de lignes, voici comment je m'y prendrais :
Code:
Function GetLineBlock(ByVal cel As Range) As Range
	Dim r As Range

	Set r = cel.EntireRow
	Do While Not IsRowEmpty(r)
		Set r = r.Offset(1)
	Loop
	
	Set GetLineBlock = Range(cel.EntireRow, r.Offset(-1))
End Function

On met le tout dans une grande boucle qui part de Cel1, et qui arrive à CelDer, au pas de chaque bloc :
Code:
Dim c As Range
Dim b As Range

Set c = Cel1
Do
    If c.Text Like "22*" Then
        Set b = GetLineBlock(c)
        MsgBox c.Value & " => " & b.Rows(b.Rows.Count).Cells(8).Value
        Set c = c.Offset(b.Rows.Count)
    Else
        Set c = c.Offset(1)
    End If
    
Loop While c.row <= CelDer.row
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 135
Messages
6 718 102
Membres
1 586 397
Dernier membre
Chachabidou
Partager cette page
Haut