Tableaux dans vba

Tableau

  • Choix du sondage...

  • Choix du sondage...


Les résultats ne sont visibles qu'après le vote.

KIM

XLDnaute Accro
J'ai continué mes tests, j'ai toujours le message d'erreur :
"Argument ou appel de procédure incorrect"
J'ai utilisé,
VB:
With ColLignesOùCondR1C1(RngRés, "LEFT(RC2,5)=""Total""")
'Total est en 2è colonne
  .Interior.ColorIndex = 6
  .Font.Bold = True
  .NumberFormat = "#,##0"
End With
Merci d'avance
KIM
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonsoir.
VB:
With ColLignesOùCondR1C1(RngRés, "LEFT(RC" & RngRés.Columns(2).Column & ",5)=""Total""")
Ce que je ne comprends pas c'est pourquoi tu n'en restes pas, vu que c'est une macro qui met ces totaux et qu'elle sait où elle les met, au 1 mis dans une colonne supplémentaire temporaire (comme en utilise d'ailleurs aussi une la fonction LignesOùCondR1C1).
Ayant été mis en colonne CFin de RngRés cette instruction marche aussi :
VB:
With Intersect(RngRés, RngRés.Columns(CFIN).SpecialCells(xlCellTypeConstants).EntireRow)
Il ne resterait plus qu'à ajouter une de ces deux instructions :
VB:
RngRés.Columns(CFIN).Clear
RngRés.Columns(CFIN).Delete xlShiftToLeft
La fonction LignesOùCondR1C1 utilise la 2ième: ColTrv.Delete xlShiftToLeft.
 
Dernière édition:

KIM

XLDnaute Accro
Bonsoir Dranreb,
En effet j'utilise ta première solution de la manière suivante :
VB:
With Intersect(RngRés, RngRés.Columns(CFIN).SpecialCells(xlCellTypeConstants).EntireRow)
   .Interior.ColorIndex = 37 
   .Font.Bold = True
   .NumberFormat = "#,##0"
End With
RngRés.Columns(CFIN).SpecialCells(xlCellTypeConstants).ClearContents
Je vais modifier la dernière ligne par :
RngRés.Columns(CFIN).Clear
Par contre ma dernière demande consiste à me familiariser avec tes nouvelles fonctions.
Merci encore pour tes conseils.
KIM
 

KIM

XLDnaute Accro
Bonjour Dranreb, et le forum,
Je reviens vers toi suite à un problème de formatage de données. et je t'en remercie par avance de tes conseils.
Je compare 2 bases selon 2 colonnes communes qui proviennent de 2 logiciels différents :
For Each DR In Gigogne(TE, 1, 2)
Le résultat est : Disparu, Nouveau ou Mis-à-jour.
Je retrouve des données identique mais sont considérées soit Disparu ou Nouveau car elles ne sont pas du même format.

En effet, dans la col 2 je retrouve du texte et du numérique mais le format de la cellule est "Standard".
J'ai essayé de créer une col supplémentaire avec un format Texte, ou numérique mas sans succès.
Comment je peux appliquer un format identique à l'ensemble d'une colonne définie dans Gigogne ?
Merci d'avance
KIM

For Each DR In Gigogne(TE, 1, 2)
For Each BAT In DR.Co
L = L + 1: Cas = 0
For Each Détail In BAT.Co
If Détail(0) = 0 Then
For c = 1 To 4: TS(L, c) = Détail(c): Next c
Cas = 1
Else
For c = 1 To 7: TS(L, c + 4) = Détail(c): Next c
Cas = Cas + 2
End If
Next Détail
TS(L, 13) = Choose(Cas, "Disparu", "Nouveau", "Mis-à-jour")
Next BAT
Next DR
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonjour.
Juste après CréerTableUnique TE… mettez ça pour tout avoir en texte :
VB:
For L = 1 To UBound(TE, 1)
   If Not IsEmpty(TE(L, 2)) Then TE(L, 2) = CStr(TE(L, 2))
   Next L
L = 0
Remarque: ce n'est pas une question de format mais de type de donnée.
 

KIM

XLDnaute Accro
Merci Dranreb,
Cela fonctionne, tout est dans l'ordre.
C'est très pratique et cela évite de créer des col supplémentaires.

Pour information, que faut-il mettre pour avoir toute une colonne en numérique ?

Merci d'avance
KIM
 

Dranreb

XLDnaute Barbatruc
VB:
   If IsNumeric(TE(L, 2)) Then TE(L, 2) = CDbl(TE(L, 2))
IsNumeric indique si ça peut être converti en nombre, entre autre si c'en est déjà un, mais pas seulement.
 

KIM

XLDnaute Accro
Bonjour Dranreb,
Quelques macros de traitement de données n'utilisent pas le format tableau.
Je déclare les données par exemple :
Set PlgSrc = FTS.[C4].Resize(25, CFIN)
With PlgSrc.Rows(1) '1ière ligne du tableau, ligne des titres.

Est-ce que nC_OP= NColTab(PlgSrc.Row(1), "Operateur région") fonctionne avec PlgSrc ?
Sinon As-tu une fonction qui me donne le numéro de colonne d'un titre d'une plage définie par PlgSrc à utiliser dans For Each OP In Gigogne(PlgSrc, nC_OP) ?
Merci d'avance
KIM
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Non, ça ne marche qu'avec des tableaux.
Mais devrait fonctionner:
VB:
nC_OP = WorksheetFunction.Match("Operateur région", PlgSrc.Rows(1), 0)
 

KIM

XLDnaute Accro
Bonsoir Dranreb et le forum,
Avec ces 2 méthodes je retrouve le num de col d'un titre.
nC_OP= NColTab(PlgSrc.Row(1), "Operateur région")
ou
nC_OP = WorksheetFunction.Match("Operateur région", PlgSrc.Rows(1), 0)

Pour créer les titres de colonnes du tableau TS j'utilise la ligne suivante :
For c = 1 To ColDep: TS(1, c) = Choose(c, "OP", "DPT", "LIBELLE", "ETAT"): NEXT c

Ma question, j'espère ne pas dire de bétises, as-tu une fonction ou commande pour récupérer le titre de la colonne trouvée ci-dessus pour me permettre d'écrire la ligne suivante : exemple fonction Titre(numCol) ?
For c = 1 To ColDep: TS(1, c) = Choose(c, Titre(nC_OP), Titre(nC_DPT), Titre(nC_LIBELLE), Titre(nC_ETAT)): NEXT c

Cela facilite l'exploitation de la macro.
Merci d'avance
KIM
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Personnellement je chargerait dans un TTit = PlgSrc.Rows(1).Value
Alors ce serait For c = 1 To ColDep: TS(1, c) = TTit(1, Choose(c, nC_OP, nC_DPT, nC_LIBELLE, nC_ETAT)): Next c
 

KIM

XLDnaute Accro
Bonjour Dranreb et le forum,
Il y a des fois je n'arrive pas à trouver le pb et je souhaite éviter de rajouter des variables.
J'ai mis en place 3 tableaux de récap. J'ai seulement un problème avec le 2è tableau que je n'arrive pas à résoudre sauf peut-être qu'il faut rajouter des variables pour le total.
Le problème se situe au niveau du 1er DT. Le nombre NBat du 1er Dr est erronée (fichier ci-joint). et je n'arrive pas à trouver pourquoi!
Code:
'Nbr DS et DB par DR
L = 0: NSite = 0: NBat = 0
ReDim TS(1 To 10000, 1 To 3)
For Each Dr In Gigogne(TE, 1, 2, 3)
  L = L + 1
  TS(L, 1) = Dr.ID
  TS(L, 2) = Dr.Count
  NSite = NSite + Dr.Count
    For Each DS In Dr.Co
       TS(L, 3) = DS.Count
       NBat = NBat + DS.Count
    Next DS, Dr
   
  L = L + 1
  TS(L, 2) = NSite
  TS(L, 3) = NBat
TDonn.[K3].Resize(10000, 3).Value = TS
Merci d'avance
KIM
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonjour.
Je doute que vous vouliez laisser dans la colonne 3 de chaque Dr le nombre d'éléments du dernier DS trouvé dedans, écrasant les précédents.
Il me semblerait plus logique de les cumuler: TS(L, 3) = TS(L, 3) + DS.Count
Du reste le total produit à la fin devient ainsi la somme des chiffres portés en colonne 3.
 

KIM

XLDnaute Accro
Merci Dranreb,
voilà, résultat OK par contre est-ce que c'est normal que le cumul correct soit dans nBat V
Code:
'Nbr DS et DB par DR
L = 0: NSite = 0: NBat = 0
ReDim TS(1 To 10000, 1 To 3)
For Each Dr In Gigogne(TE, 1, 2, 3)
  L = L + 1
  TS(L, 1) = Dr.ID
  TS(L, 2) = Dr.Count
  NSite = NSite + Dr.Count
  For Each DS In Dr.Co
  TS(L, 3) = TS(L, 3) + DS.Count
  NBat = NBat + DS.Count
  Next DS, Dr

  L = L + 1
  TS(L, 2) = NSite
  TS(L, 3) = NBat
TDonn.[K3].Resize(10000, 3).Value = TS
Bonne soirée
KIM
 

KIM

XLDnaute Accro
Bonsoir Dranreb et le forum,

Avec le code ci-dessous, j'identifie les doublons de la col DB par DS
Comment je peux identifier les doublons selon les 5 premiers caractères de DB ?
et aussi faire un comptage selon les mêmes conditions ?
voir fichier ci-joint
Merci encore
KIM

VB:
For Each DB In Gigogne(TE, 3, 2)
  For Each DS In DB.Co
  Ap1 = 1: For Each Détail In DS.Co
  TA(Détail(4), 1) = Ap1: Ap1 = 0: Next Détail, DS, DB
Plage.Columns(4).Value = TA
et le récap
Code:
'Nbr DS et DB par DR
L = 0: NSite = 0: NBat = 0
ReDim TS(1 To 10000, 1 To 3)
For Each Dr In Gigogne(TE, 1, 2, 3)
  L = L + 1
  TS(L, 1) = Dr.ID
  TS(L, 2) = Dr.Count
  NSite = NSite + Dr.Count
    For Each DS In Dr.Co
       TS(L, 3) = TS(L, 3) + DS.Count
       NBat = NBat + DS.Count
    Next DS, Dr

  L = L + 1
  TS(L, 2) = NSite
  TS(L, 3) = NBat
TDonn2.[K3].Resize(10000, 3).Value = TS
      
End Sub
 

Fichiers joints

Discussions similaires


Haut Bas