OVH Cloud OVH Cloud

problème insoluble - macro teste et tableau croisé

4 réponses
Avatar
gdubois
Bonjour =E0 tous,

Je lance un d=E9fi. A celui ou celle qui gagne j'offre soit un gros
bouquet de fleurs soit une caisse de Laurent Perrier (du champagne).

Voici le cas

J'ai cr=E9=E9 un macro qui :
- R=E9alise un test sur un des onglets de l'un des fichiers en
particulier
- Renvoi les valeurs qui r=E9pondent =E0 mon crit=E8re, les copie en
enlevant les blancs entre les lignes (de mani=E8re =E0 avoir une liste
continu), et les classe par ordre alphab=E9tique
- Et enfin cr=E9=E9 un tableau avec bordure de la longueur de la liste
et copie chaque ligne de la liste dans le tableau.

J'aimerais remplacer la formule entre '........................ par une
r=E9f=E9rence vers une cellule d'une de mes feuilles contenant la formule
en question. Le probl=E8me c'est que ActiveCell.FormulaR1C1 =3D _ ne veut
pas chercher ce qu'il y a =E0 l'int=E9rieur de la cellule et se contente
de ce qu'il y a entre "".

Autrement dit, si j'enl=E8ve
"=3DIF('[ADP PT-SH-str.xls]AVR'!R[-2]C[6]=3D""N"",'[ADP
PT-SH-str.xls]AVR'!R[-2]C[-2],"""")"

et que je le remplace par un truc du style "=3DB4", alors Excel ne veut
pas aller chercher la formule qui se trouve en B4. Il me prend soit le
r=E9sultat de la formule, soit juste =3DB4.

et =E7a me fais... pleurer. Oui je suis triste.

Voila le code de ma fonction multit=E2che dont je suis fier car j'ai
commenc=E9 visual basic avant hier. Au passage si vous avez des id=E9es
pour optimiser un peu tout =E7a...

Merci =E0 tous pour votre =E9ventuelle participation.

Bisou X

Sub DCR()
'Cr=E9ation d'une feuille de temporaire qui r=E9cup=E9rera les
donn=E9es pour les pr=E9formater
Sheets.Add
ActiveSheet.Name =3D "TEMP"

'Cr=E9ation d'une autre feuille (pour les tests)
Sheets.Add
ActiveSheet.Name =3D "test"

'Test des valeurs qui r=E9pondent =E0 la condition : DCR =3D N
Sheets("TEMP").Select
Range("A1").Select

'=2E.......................................................................=
.=2E.......................
ActiveCell.FormulaR1C1 =3D _
"=3DIF('[ADP PT-SH-str.xls]AVR'!R[-2]C[6]=3D""N"",'[ADP
PT-SH-str.xls]AVR'!R[-2]C[-2],"""")"

'=2E.......................................................................=
.=2E.......................
Selection.AutoFill Destination:=3DRange("A1:A193"),
Type:=3DxlFillDefault
Calculate

'Filtrage des cellules vides
Range("A1").Select
Selection.AutoFilter Field:=3D1, Criteria1:=3D"<>"

'Copie des cellules non vide en une liste continue
Range("A1:A193").Select
Selection.Copy
Range("B1").Select
Selection.PasteSpecial Paste:=3DxlValues, Operation:=3DxlNone,
SkipBlanks:=3D _
True, Transpose:=3DFalse
Range("B1:B193").Select
Selection.Sort Key1:=3DRange("B1"), Order1:=3DxlAscending,
Header:=3DxlGuess, _
OrderCustom:=3D1, MatchCase:=3DFalse, Orientation:=3DxlTopToBottom

'Comptage des valeurs renvoy=E9es par la copie
Range("C1").Select
ActiveCell.FormulaR1C1 =3D "=3DCOUNTA(RC[-1]:R[192]C[-1])"

'Insertion dans du nombre de lignes correspondantes au nombre de
valeurs renvoy=E9es
Dim nbLigne
Dim i
nbLigne =3D Range("C1").Value
For i =3D 1 To nbLigne
Sheets("test").Select
Range("A1:G1").Select
Selection.Insert Shift:=3DxlDown
Next

'Insertion des valeurs pour chaque ligne
i =3D 1
For i =3D 1 To nbLigne
Sheets("TEMP").Select
Range("B" & i).Select
Selection.Copy
Sheets("test").Select
Range("A" & i).Select
ActiveSheet.Paste
Next
'Formatage du tableau
Range("A1:G" & nbLigne).Select
Selection.Borders(xlDiagonalDown).LineStyle =3D xlNone
Selection.Borders(xlDiagonalUp).LineStyle =3D xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle =3D xlContinuous
.Weight =3D xlThin
.ColorIndex =3D xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle =3D xlContinuous
.Weight =3D xlThin
.ColorIndex =3D xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle =3D xlContinuous
.Weight =3D xlThin
.ColorIndex =3D xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle =3D xlContinuous
.Weight =3D xlThin
.ColorIndex =3D xlAutomatic
End With
Selection.Borders(xlInsideVertical).LineStyle =3D xlNone
Selection.Borders(xlInsideHorizontal).LineStyle =3D xlNone
Range("A1").Select

'Remise =E0 z=E9ro des param=E8tres
Application.ScreenUpdating =3D True
Application.DisplayAlerts =3D True
=20
Sheets("test").Select
End Sub

4 réponses

Avatar
pierref
Bonsoir,

Je ne comprends pas très bien ton problème.
As-tu essayé d'utiliser ActiveCell.Formula = "=..." au lieu de
ActiveCell.FormulaR1C1 = "=..." ?

Ca devrait marcher ou alors je n'ai rien compris :-)

Cdt

Pierre



Bonjour à tous,

Je lance un défi. A celui ou celle qui gagne j'offre soit un gros
bouquet de fleurs soit une caisse de Laurent Perrier (du champagne).

Voici le cas

J'ai créé un macro qui :
- Réalise un test sur un des onglets de l'un des fichiers en
particulier
- Renvoi les valeurs qui répondent à mon critère, les copie en
enlevant les blancs entre les lignes (de manière à avoir une liste
continu), et les classe par ordre alphabétique
- Et enfin créé un tableau avec bordure de la longueur de la liste
et copie chaque ligne de la liste dans le tableau.

J'aimerais remplacer la formule entre '........................ par une
référence vers une cellule d'une de mes feuilles contenant la formule
en question. Le problème c'est que ActiveCell.FormulaR1C1 = _ ne veut
pas chercher ce qu'il y a à l'intérieur de la cellule et se contente
de ce qu'il y a entre "".

Autrement dit, si j'enlève
"=IF('[ADP PT-SH-str.xls]AVR'!R[-2]C[6]=""N"",'[ADP
PT-SH-str.xls]AVR'!R[-2]C[-2],"""")"

et que je le remplace par un truc du style "´", alors Excel ne veut
pas aller chercher la formule qui se trouve en B4. Il me prend soit le
résultat de la formule, soit juste ´.

et ça me fais... pleurer. Oui je suis triste.

Voila le code de ma fonction multitâche dont je suis fier car j'ai
commencé visual basic avant hier. Au passage si vous avez des idées
pour optimiser un peu tout ça...

Merci à tous pour votre éventuelle participation.

Bisou X

Sub DCR()
'Création d'une feuille de temporaire qui récupérera les
données pour les préformater
Sheets.Add
ActiveSheet.Name = "TEMP"

'Création d'une autre feuille (pour les tests)
Sheets.Add
ActiveSheet.Name = "test"

'Test des valeurs qui répondent à la condition : DCR = N
Sheets("TEMP").Select
Range("A1").Select

'..................................................................................................
ActiveCell.FormulaR1C1 = _
"=IF('[ADP PT-SH-str.xls]AVR'!R[-2]C[6]=""N"",'[ADP
PT-SH-str.xls]AVR'!R[-2]C[-2],"""")"

'..................................................................................................
Selection.AutoFill Destination:=Range("A1:A193"),
Type:=xlFillDefault
Calculate

'Filtrage des cellules vides
Range("A1").Select
Selection.AutoFilter Field:=1, Criteria1:="<>"

'Copie des cellules non vide en une liste continue
Range("A1:A193").Select
Selection.Copy
Range("B1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone,
SkipBlanks:= _
True, Transpose:úlse
Range("B1:B193").Select
Selection.Sort Key1:=Range("B1"), Order1:=xlAscending,
Header:=xlGuess, _
OrderCustom:=1, MatchCase:úlse, Orientation:=xlTopToBottom

'Comptage des valeurs renvoyées par la copie
Range("C1").Select
ActiveCell.FormulaR1C1 = "=COUNTA(RC[-1]:R[192]C[-1])"

'Insertion dans du nombre de lignes correspondantes au nombre de
valeurs renvoyées
Dim nbLigne
Dim i
nbLigne = Range("C1").Value
For i = 1 To nbLigne
Sheets("test").Select
Range("A1:G1").Select
Selection.Insert Shift:=xlDown
Next

'Insertion des valeurs pour chaque ligne
i = 1
For i = 1 To nbLigne
Sheets("TEMP").Select
Range("B" & i).Select
Selection.Copy
Sheets("test").Select
Range("A" & i).Select
ActiveSheet.Paste
Next
'Formatage du tableau
Range("A1:G" & nbLigne).Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Range("A1").Select

'Remise à zéro des paramètres
Application.ScreenUpdating = True
Application.DisplayAlerts = True

Sheets("test").Select
End Sub




Avatar
docm
bonjour.
pierref a raison. Utilise la propriété FORMULA comme ceci par exemple:
ActiveCell.Formula = Worksheets("avr").Range("B4").Formula

docm

wrote in message
news:
Bonjour à tous,

Je lance un défi. A celui ou celle qui gagne j'offre soit un gros
bouquet de fleurs soit une caisse de Laurent Perrier (du champagne).

Voici le cas

J'ai créé un macro qui :
- Réalise un test sur un des onglets de l'un des fichiers en
particulier
- Renvoi les valeurs qui répondent à mon critère, les copie en
enlevant les blancs entre les lignes (de manière à avoir une liste
continu), et les classe par ordre alphabétique
- Et enfin créé un tableau avec bordure de la longueur de la liste
et copie chaque ligne de la liste dans le tableau.

J'aimerais remplacer la formule entre '........................ par une
référence vers une cellule d'une de mes feuilles contenant la formule
en question. Le problème c'est que ActiveCell.FormulaR1C1 = _ ne veut
pas chercher ce qu'il y a à l'intérieur de la cellule et se contente
de ce qu'il y a entre "".

Autrement dit, si j'enlève
"=IF('[ADP PT-SH-str.xls]AVR'!R[-2]C[6]=""N"",'[ADP
PT-SH-str.xls]AVR'!R[-2]C[-2],"""")"

et que je le remplace par un truc du style "´", alors Excel ne veut
pas aller chercher la formule qui se trouve en B4. Il me prend soit le
résultat de la formule, soit juste ´.

et ça me fais... pleurer. Oui je suis triste.

Voila le code de ma fonction multitâche dont je suis fier car j'ai
commencé visual basic avant hier. Au passage si vous avez des idées
pour optimiser un peu tout ça...

Merci à tous pour votre éventuelle participation.

Bisou X

Sub DCR()
'Création d'une feuille de temporaire qui récupérera les
données pour les préformater
Sheets.Add
ActiveSheet.Name = "TEMP"

'Création d'une autre feuille (pour les tests)
Sheets.Add
ActiveSheet.Name = "test"

'Test des valeurs qui répondent à la condition : DCR = N
Sheets("TEMP").Select
Range("A1").Select

'...........................................................................
......................
ActiveCell.FormulaR1C1 = _
"=IF('[ADP PT-SH-str.xls]AVR'!R[-2]C[6]=""N"",'[ADP
PT-SH-str.xls]AVR'!R[-2]C[-2],"""")"

'...........................................................................
......................
Selection.AutoFill Destination:=Range("A1:A193"),
Type:=xlFillDefault
Calculate

'Filtrage des cellules vides
Range("A1").Select
Selection.AutoFilter Field:=1, Criteria1:="<>"

'Copie des cellules non vide en une liste continue
Range("A1:A193").Select
Selection.Copy
Range("B1").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone,
SkipBlanks:= _
True, Transpose:úlse
Range("B1:B193").Select
Selection.Sort Key1:=Range("B1"), Order1:=xlAscending,
Header:=xlGuess, _
OrderCustom:=1, MatchCase:úlse, Orientation:=xlTopToBottom

'Comptage des valeurs renvoyées par la copie
Range("C1").Select
ActiveCell.FormulaR1C1 = "=COUNTA(RC[-1]:R[192]C[-1])"

'Insertion dans du nombre de lignes correspondantes au nombre de
valeurs renvoyées
Dim nbLigne
Dim i
nbLigne = Range("C1").Value
For i = 1 To nbLigne
Sheets("test").Select
Range("A1:G1").Select
Selection.Insert Shift:=xlDown
Next

'Insertion des valeurs pour chaque ligne
i = 1
For i = 1 To nbLigne
Sheets("TEMP").Select
Range("B" & i).Select
Selection.Copy
Sheets("test").Select
Range("A" & i).Select
ActiveSheet.Paste
Next
'Formatage du tableau
Range("A1:G" & nbLigne).Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Range("A1").Select

'Remise à zéro des paramètres
Application.ScreenUpdating = True
Application.DisplayAlerts = True

Sheets("test").Select
End Sub
Avatar
J'ai-Du-Bois
Vous êtes les meilleurs!!

ça marche nikel et vous avez résolu tous mes problèmes...

merci beaucoup!!

J'ai-Du-bois
eMail :
Avatar
J'ai-Du-Bois
Pour résumer en gros ma situation...

Je pensais que ActiveCell.FormulaR1C1 était le seul moyen d'insérer
une formule dans VBE. Le problème c'est que cela permet uniquement
(apparement) de mettre une formule directement après les " " qui le
suivent. En gros aucune référence à une formule se trouvant quelque
part ailleurs n'est possible.

Et c'était là que ça n'allait pas pour moi car il me fallait
absolument réaliser ce genre d'opération.

Maintenant, peut être que j'utilise mal ActiveCell.FormulaR1C1 mais
toujrous est il qu'avec ActiveCell.Formula tout court cela marche au
pas!!

Merci encore pour votre aide.