VBA versus Formules

J

JeFiltre

Guest
Bonjour


SITUTATION:
Un classeur contenant 12 feuilles (12 mois)
et dans chaque feuille une ActiveSheet.usedRange de 502 lignes
avec ces formules répétées dans 500 lignes dans les 12 feuilles
=SI($H3="";"";RECHERCHEV($H3;Bdclient;2;FAUX))
=SI($H3="";"";RECHERCHEV($H3;Bdclient;3;FAUX))
=SI($H3="";"";RECHERCHEV($H3;Bdclient;4;FAUX))

PROBLEME:
L'utilisateur du classeur est un novice
qui parfois efface des formules par inadvertance
(protection classeur inefficace car l'utilisateur sait l'oter)
Est-il préférable de remplacer ces formules par une macro VBA
qui en fin de saisie en Hx-H500 fasse ce que font actuellement les formules?
J'ai pensé mettre la macro ici
Private Sub Worksheet_Change(ByVal Target As Range)

End Sub

Je ne vois encore la syntaxe à utiliser
J'attends vos conseils.

Merci
 
J

JeFiltre

Guest
Bonjour

Précisions:
Le classeur est utilisé par deux personnes.
(En cas de plantage, elles ne savent pas m'envoyer le classeur
par mail)
Je dois me déplacer pour remedier au problème qui souvent est:
suppression de formules
saisie des valeurs (prix) manuellement
insertion de ligne
enfin bref elles ne savent pas se cantonner au minimum, à avoir:
1) saisie du code barre
2) saisie de la date
3) saisie du nomclient
4) ventilation du paiement (ch,esp,cb)
5) Impression du CA (journalier ou mensuel)
Les opérations 2 et 5 étant dans la première version en VBA.

J'essaie donc que tout soit transparent pour elles (donc en VBA)

Suite au conseil de Michel, idée suivante en tête
Un classeur type mensuel (mois en cours)
Un classeur TOTAUX
qui lorsque on arrive au dernier jour ouvré du mois
se copie dans un classeur récapitulatif
efface ensuite les données du mois précedent

un base de donnée client au format csv

Je bute sur les points suivants:
Renseigner correctement la bdclient en cas de nouveau client
(plage nommée non dynamique- pour l'instant)
travailler avec des fichiers fermés.

Questions:
Une profusion de zones nommées nuit-elle à la santé d'un classeur?
Des 500*8*12 cellules contenant des formules ralentissent-elles et augmentent le poids d'un classeur?
En règle générale VBA ou Formules?
Qui choisir?

Merci de vos conseils.

Bon week-end à tous
 
J

JeFiltre

Guest
Bonjour

En pièce jointe:

La première mouture avec barres outils propres au classeur

Ce classeur n'inclut pas le code de Michel_D

(Ce sera pour plus tard)

Une autre piste à laquelle je songe:
Un seule feuille (mensuelle)
qui s'autorenomme
(si Date= premJour du mois en cours -> Nom Feuille = Mois

si Date=Mois(Date)+1 -> Nom Feuille =Mois + 1
Mais avant copie de l' ActiveUsedRange dans une feuille recapitulative
effacement des valeurs dans la feuille mensuelle
J'essaie pour cela d'adapter le code ci-dessous:
'Provient de Excel Tip
Sub CopyUsedRange()
Dim sh As Worksheet
Dim DestSh As Worksheet
Dim Last As Long
If SheetExists("Master") = True Then
MsgBox "The sheet Master already exist"
Exit Sub
End If
Application.ScreenUpdating = False
Set DestSh = Worksheets.Add
DestSh.Name = "Master"
For Each sh In ThisWorkbook.Worksheets
If sh.Name <> DestSh.Name Then
If sh.UsedRange.Count > 1 Then
Last = LastRow(DestSh)
sh.UsedRange.Copy DestSh.Cells(Last + 1, 1)
End If
End If
Next
Application.ScreenUpdating = True
End Sub

Sub CopyUsedRangeValues()
Dim sh As Worksheet
Dim DestSh As Worksheet
Dim Last As Long
If SheetExists("Master") = True Then
MsgBox "The sheet Master already exist"
Exit Sub
End If
Application.ScreenUpdating = False
Set DestSh = Worksheets.Add
DestSh.Name = "Master"
For Each sh In ThisWorkbook.Worksheets
If sh.Name <> DestSh.Name Then
If sh.UsedRange.Count > 1 Then
Last = LastRow(DestSh)
With sh.UsedRange
DestSh.Cells(Last + 1, 1).Resize(.Rows.Count, _
.Columns.Count).Value = .Value
End With
End If
End If
Next
Application.ScreenUpdating = True
End Sub

Function LastRow(sh As Worksheet)
On Error Resume Next
LastRow = sh.Cells.Find(What:="*", _
After:=sh.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0
End Function

Function Lastcol(sh As Worksheet)
On Error Resume Next
Lastcol = sh.Cells.Find(What:="*", _
After:=sh.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
On Error GoTo 0
End Function
Function SheetExists(SName As String, _
Optional ByVal WB As Workbook) As Boolean
On Error Resume Next
If WB Is Nothing Then Set WB = ThisWorkbook
SheetExists = CBool(Len(Sheets(SName).Name))
End Function

Voila ou j'en suis pour le moment.
Merci à tous ceux qui pourront m'aider et à ceux
qui sauront épurer, optimiser le code vba de ce classeur.

Ou m'aiguiller vers d'autres approches
 

Pièces jointes

  • essai.zip
    33.9 KB · Affichages: 24
  • essai.zip
    33.9 KB · Affichages: 24
  • essai.zip
    33.9 KB · Affichages: 25

Discussions similaires

Statistiques des forums

Discussions
312 348
Messages
2 087 508
Membres
103 568
dernier inscrit
NoS