Problème de macro (encore

Bonjour à tous,

j'essaye de m'améliorer en VBA mais pas facile ... me voici encore confronté à un problème insoluble

https://www.excel-pratique.com/~files/doc/reprise_macro.xls

j'ai une grande liste de composant électriques (sheet 2 colonne C) et le nombre de chacun de ces composants à un endroit de l'installation (sheet 2 colonne D)

Ma macro (overview) lit toute la colonne C et inscrit UNE fois de le nom de chaque composant et effectue ensuite un tri alphabétique

Premier problème :

seule une partie de la liste (en jaune) et triée alphabétiquement. Pourquoi ?

Deuxième problème :

j'aimerais compter le nombre total de composants dans l'installation (la somme des nombres dans la colonne D de sheet 2) mais je n'y arrive pas. Comment faire ?

Merci d'avance pour votre aide,

Pierre

Bonjour,

Je ne suis pas un spécialiste en VBA. Mais essaye le code suivant dans une module VBA :

Sub SelectionClassement()
  Dim DerLig As Integer
  Dim i As Integer
  Dim j As Integer
  Sheets("sheet 2").Select
  DerLig = [C65536].End(xlUp).Row
  'calculs intermédiaires dans les colonnes temporaires
  Range(Cells(2, 7), Cells(DerLig, 7)).Value = "=COUNTIF(R2C3:RC[-4],RC[-4])" 'éléments uniques
  Range(Cells(2, 8), Cells(DerLig, 8)).Value = "=COUNTIF(R2C3:R[" & DerLig & "]C[-5],RC[-5])" 'nb de fois d'un élément
  j = 5
  For i = 2 To DerLig
    If (Cells(i, 7).Value = 1) Then
      Sheets("overview").Cells(j, 1).Value = Cells(i, 3).Value
      Sheets("overview").Cells(j, 2).Value = Cells(i, 8).Value
      j = j + 1
    End If
  Next i
  'suppression des colonnes intermédiaires
  [G:H].Delete
  Sheets("overview").Select
  [A5].Sort Key1:=Range("A5"), Order1:=xlAscending
End Sub

ca ne marche malheureusement pas ....

Bonjour,

une autre proposition...

le code :

Sub composants()
Dim MesCompos As Object
Dim Cel As Range
Dim It As Long, DerLig As Long
Set MesCompos = CreateObject("Scripting.Dictionary")
Range("C5:D1000").ClearContents
With Sheets("sheet 2")
    DerLig = .[C65000].End(xlUp).Row
    .Range("C2:C" & DerLig).Name = "composants"
    .Range("D2:D" & DerLig).Name = "nombre"
    For Each Cel In .Range("C2:C" & DerLig)
        If Not MesCompos.Exists(Cel.Value) Then MesCompos.Add Cel.Value, Cel.Value
    Next Cel
End With
temp = MesCompos.items
Application.ScreenUpdating = False
For It = LBound(temp) To UBound(temp): Cells(5 + It, 1) = temp(It): Next
Range("B5").FormulaR1C1 = "=SUMPRODUCT((composants=RC[-1])*nombre)"
Range("B5").AutoFill Destination:=Range("B5:B" & [A65000].End(xlUp).Row)
Range("B5:B" & [A65000].End(xlUp).Row).Value = Range("B5:B" & [A65000].End(xlUp).Row).Value
Range("A5:B" & [A65000].End(xlUp).Row).Sort Key1:=Range("A5")
End Sub

Fichier joint

https://www.excel-pratique.com/~files/doc/tespasfou_v1.zip

Re, Salut felix,

Après rectification d'un point, Vois dans le fichier joint, si c'est bien cela qu'il s'agit :

Fichier Joint

Merci à vous deux Felix et Raja.

En partant de la macro de Raja j'ai essayé de la modifier afin de calculer le prix total des composants (le prix unitaire se trouve dans la colonne H)

Malheureusement ça a foiré ... pouvez-vous me dire où est mon erreur ?

https://www.excel-pratique.com/~files/doc/Copy_of_tespasfou_v2.xls

Merci,

Pierre

Bonjour à tous,

Salut felix , Raja,

en modifiant cette ligne ci-dessous

Range("C5").FormulaR1C1 = "=SUMPRODUCT((composants=RC[-2])*prix_materiel)"

Range("C5").AutoFill Destination:=Range("C5:C" & [A65000].End(xlUp).Row)
Range("C5:C" & [A65000].End(xlUp).Row).Value = Range("C5:C" & [A65000].End(xlUp).Row).Value
Range("A5:C" & [A65000].End(xlUp).Row).Sort Key1:=Range("A5")
End Sub

Claude.

Un tout grand merci Claude ... ça marche très bien mais je n'ai pas compris mon erreur.

En plus j'ai du mal avec cette syntaxe : RC[-2]

A quoi correspond le -2 ?

Pierre

Re,

C'est la référence relative d'une cellule par rapport à la cellule active. RC[-2] veut dire, par rapport à la cellule active, même ligne(R) et 2 colonnes à gauche(C[-2]).

D'autres exemples, toujours par rapport à une cellule active (le chiffre 2 ou -2 signifie qu'il existe au moins 2 colonnes, à droite ou à gauche, 2 lignes, au-dessus ou au-dessous de la cellule active. Sinon, il y aura un bug.):

même ligne 2 colonnes à droite : RC[2]

même colonne 2 lignes au-dessus : R[-2]C

même colonne 2 lignes au-dessous : R[2]C

2 colonnes à droite et 2 lignes au-dessus : R[-2]C[2]

2 colonnes à gauche et 2 lignes au-dessus : R[-2]C[-2]

2 colonnes à droite et 2 lignes au-dessous : R[2]C[2]

2 colonnes à gauche et 2 lignes au-dessous : R[2]C[-2]

etc.

j'ai encore appris quelque chose. Merci beaucoup !

Rechercher des sujets similaires à "probleme macro encore"