bonjour Vincent, le forum,
savoir où placer les codes dépasse mes connaissances alors si tu veux bien me donner un coup de main, j'en serais ravi.
je ne parvient pas à compresser les classeurs en dessous de 50 ko; je met donc les macros ci-après.
le classeur "planning" est composé de 8 feuilles semblables, avec 4 boutons identiques sur chaque feuille pour lancer une macro qui ne s'applique qu'à la feuille d'où le bouton à été pressé. ces 4 macros sont regroupé dans 2 modules (je pourrais les mettre dans un seul d'ailleurs...), comme décrit ci-après.
c'est la macro "trier" qui est lente lorsque le 2eme classeur est ouvert.
Bonne journée à tous.
classeur " planning", module 1 , macro "trier" :
NB : dans cette macro il y a 2 codes pour effacer les " # " situé en C2, car le 2eme code intitulé " efface les lignes " ne fonctionnait pas toujours bien (plantage si lancé 2 fois de suite).
-------------------------------------------------------------------------------------
Option Explicit
Sub trier()
' deprotéger la feuille
ActiveSheet.Unprotect
'effacer le contenu des colonnes G et H
Range("G2:H250").Select
Selection.ClearContents
'trier les lignes
Range("A2:E250").Select
Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Key2:=Range("B2") _
, Order2:=xlAscending, Key3:=Range("C2"), Order3:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
'effacer les #
Dim Plage As Range
Dim Cell As Range
Set Plage = Range("C2:C" & Range("C65535").End(xlUp).Row)
For Each Cell In Plage
If Cell.Value = "#" Then
Cell.Clear
End If
Next Cell
'macro de jean marie
Dim c As Range
Dim firstAddress As String
Dim ChaineSelection As String
Dim I As Double
Application.ScreenUpdating = False
'efface les lignes
ChaineSelection = ""
With Range("C2", Range("C65536").End(xlUp).Address)
Set c = .Find("#", After:=Range("C2"))
If Not c Is Nothing Then
firstAddress = c.Address
Do
ChaineSelection = ChaineSelection & Range(c.Offset(0, -2), c.Offset(0, 2)).Address & ","
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
ChaineSelection = Mid(ChaineSelection, 1, Len(ChaineSelection) - 1)
Range(ChaineSelection).Delete shift:=xlUp
End If
End With
'insère les lignes
For I = Range("E65536").End(xlUp).Row To 2 Step -1
If Range("E1").Offset(I - 1, 0) > 1 Then
Range(Range("A1").Offset(I, 0), Range("E1").Offset(Range("E1").Offset(I - 1, 0) + I - 2, 0)).Insert shift:=xlDown
Range(Range("C1").Offset(I, 0), Range("C1").Offset(Range("E1").Offset(I - 1, 0) + I - 2, 0)) = "#"
End If
Next
Dim vLigne As Double
vLigne = 1
For I = 1 To Range("J65536").End(xlUp).Row - 1
If Range("k1").Offset(I, 0) > 0 Then
Range(Range("G1").Offset(vLigne, 0), Range("G1").Offset(vLigne + Range("k1").Offset(I, 0) - 1, 0)) = Range("J1").Offset(I, 0)
vLigne = vLigne + Range("k1").Offset(I, 0)
End If
Next
'fin de la macro de jean marie
' recopier la formule de H2 à H250
Range("H2").Select
ActiveCell.FormulaR1C1 = "=IF(ISBLANK(RC[-4]),"""",RC[-4]-(RC[-1]+2))"
Range("H2:H250").Select
Selection.FillDown
'enlever protection cellule
Range("A2:I65536").Select
Selection.Locked = False
'se positionner en B2
Range("B2").Select
'protéger la feuille
ActiveSheet.protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
classeur " planning", module 2 :
-------------------------------------------------------------------------------------
Option Explicit
Sub effacer()
' deprotéger la feuille
ActiveSheet.Unprotect
'effacer le contenu des colonnes G et H
Range("G2:H250").Select
Selection.ClearContents
'trier les lignes
Range("A2:E250").Select
Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Key2:=Range("B2") _
, Order2:=xlAscending, Key3:=Range("C2"), Order3:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
'effacer les #
Dim Plage As Range
Dim Cell As Range
Set Plage = Range("C2:C" & Range("C65535").End(xlUp).Row)
For Each Cell In Plage
If Cell.Value = "#" Then
Cell.Clear
End If
Next Cell
'enlever protection cellule
Range("A2:I65536").Select
Selection.Locked = False
'se placer en B2
Range("B2").Select
'proteger la feuille
ActiveSheet.protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
------------------------------------------------------------------------------------------
Sub imprimer1page()
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate _
:=True
End Sub
-----------------------------------------------------------------------------------------
Sub imprimer2pages()
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=2, Copies:=1, Collate _
:=True
End Sub
enfin, toujours dans ce classeur "planning", j'ai la macro suivante dans thisworkbook :
-----------------------------------------------------------------------------------
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Save
End Sub
dans le 2eme classeur "stock", il y a :
dans une feuille
------------------------------------------------------------------
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)
Dim x As Integer
Dim cible As String
On Error Resume Next
cible = Target.Value
Worksheets(cible).Activate
x = Worksheets(cible).Range("a1").End(xlDown).Row + 1
Worksheets(cible).Range("A" & x).Select
End Sub
dans environ 300 autres feuilles (un bouton me renvoie à la feuille d'accueil "recap")
---------------------------------------------------------------------
Private Sub CommandButton1_Click()
Sheets("Récap").Select
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
End Sub
dans "this workbook"
-------------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Save
End Sub
dans un module et avec activation par un bouton situé sur chaque feuille (sauf 2) et pour la feuille où est situé le bouton
-----------------------------------------------------------------
Sub tripardate()
'
Range("A6:H65536").Select
Selection.Sort Key1:=Range("B6"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Dim Fin As Integer
Range("a6").Select ' selectionne la cellule a6 comme cellule de depart
Fin = Range("a6").End(xlDown).Row 'Definie jusqu'ou les cellules sont remplis dans le colonnes A
Range("H6").Select
ActiveCell.FormulaR1C1 = _
"=(SUM(RC[-4]:R6C[-4])-SUM(RC[-3]:R6C[-3]))+(SUM(RC[-2]:R6C[-2])-SUM(RC[-1]:R6C[-1]))"
Range("H6").Copy
Range("H6:H" & Fin).Select 'selection de la range de cellule où copier
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False 'copie la formule
Application.CutCopyMode = False
Dim x As Integer
x = Range("a6").End(xlDown).Row + 1
Range("A" & x).Select
End Sub