création d'un nouvel onglet

  • Initiateur de la discussion ALAIN_DELOIN13
  • Date de début
A

ALAIN_DELOIN13

Guest
Bonjour à tous,
je suis débutant dans le VBA et je bosse en ce moment sur une facturation automatisée!!
Je désirerais en appuyant sur un bouton 'valider' que ma facture aille s'enregistrer dans un classeur et dans un nouvel onglet à chaque validation!!!
J'espere avoir étais clair mais j'ai du mal !! lol !
Merci d'avance
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Alain, le Forum

Déjà pour commencer si tu es débutant regarde ce Fil :

Lien supprimé

Qui te montrera les rudiments de base pour comment incrémenter automatiquement un Numéro de Facture...(La Base)

Ensuite Regarde ce Fil qui te montrera comment faire une Sauvegarde d'une Feuille à la volée car si on parle de facture, en génral (de par mon expérience) ce n'est pas dans le classeur 'Maître' lui-même que l'on sauve chaque facture, mais juste la feuille contenant la facture dans un répertoire adéquoite...

Lien supprimé

Tu y trouveras une Démo toute prête Lien supprimé

Et enfin si tu veux jongler avec les Feuille et pouvoir les Insérrer dans des Classeurs Existant alors c'est un peu plus avancé dans ce Film de Discussion :

Lien supprimé

Tu y trouveras également une Démo toute prête Lien supprimé

Voilà tu as de quoi t'occuper...

Bonne Journée
@+Thierry
 
A

ALAIN_DELOIN13

Guest
Un grand merci Thierry!!! Je vais tout dessuite regarder tout cela.
Mais puisque je tiens un pro B) , j'ai prévu d'envoyer quelques cellules de la facture dans un récap (pour suivre les créances) qui se présente en ligne!!
J ai fais une macro enregistrer (avec des copier/coller) pour envoyer les info mais quand je fais une nouvelle facture et que je la valide il faudrait que la macro m'envoye me copie les info mais sur la ligne d'en dessous!!! (OUF!!)
Pour l'instant ça m'écrase les info existantes sur la prmiere ligne!!
Désolé pour le monologue mais j'ai fais de mon mieux pour etre clair!!
merci de me renseigner!!
 

ChTi160

XLDnaute Barbatruc
Re thierry
Salut ALAIN_DELOIN13

pour faire ce que tu demandes incrémenter ta ligne
il faut que tu introduises dans ta macro qui transfert les données une recherche de la dernière ligne utilisée
un truc du genre (je n'ai pas ta macro)
dim derlgn as integer 'declare la variable derlgn
With Worksheets('Recap')
derlgn=.range('A65536').end(xlUp).row+1
'ainsi
.Cells(derlgn,1)= ???? 'ref ou valeur à copier dans colonne 1
.Cells(derlgn,2)= ???? ' Idem dans colonne 2
.Cells(derlgn,3)= ???? ' Idem dans colonne 3 et etc
End With
en espérant avoir fait avancer le chimilimBlick
Amicalement
Jean Marie
Ps le patron va surement passer et corriger le cas échéant donc pas de problème Lol

Message édité par: ChTi160, à: 04/04/2005 12:00
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour Alain

Donc pour ta dernière question regarde ce Fil pour commencer :

Lien supprimé

Et sinon ce Fil avec une bonne vieille démo UserForm...(voir la VersionIII) et aussi la franche rigolade sur ce Fil !

=> DEMO UserForm de Facturation avec Gestion de Stock

En fait la 'Clef' est très simple, il faut savoir utiliser une Variable 'DernièreLigne'...

Option Explicit

Sub ReportData()
Dim DerniereLigne As Long 'Déclaration de variable 'L' pour connaitre la Ligne Numéro

'ici je repère la dernière ligne vide pour la Collections des données
'NB Il faut que la Colonne 'A' contienne des données, sinon prendre une autre colonne...
DerniereLigne = Sheets('Recapitulation').Range('A65536').End(xlUp).Row + 1

'Ici c'est le report de la saisie dans la feuille Récap...
   
With Sheets('Recapitulation')
    .Range('A' & DerniereLigne).Value = Sheets('Facture').Range('B5').Value
    .Range('B' & DerniereLigne).Value = Sheets('Facture').Range('C15').Value
    .Range('C' & DerniereLigne).Value = Sheets('Facture').Range('F15').Value
    .Range('D' & DerniereLigne).Value = Sheets('Facture').Range('G15').Value
   
End With
End Sub


Tu peux aussi regarder cette Démo de Base pour une mise en pratique USF-Rudiments-Basic.zip

Bon Appétit
@+Thierry

Message édité par: _Thierry, à: 04/04/2005 12:09
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour Alain, Jean-Marie, le Forum

Arf je ne t'avais pas vu le Cht'i pendant ma pêche 'miraculeuse' aux démo dans l'ancien Forum, (le problème d'ailleurs c'est qu'il y en a trop de mes démos, alors pour tomber sur la bonne LOL)

Sinon et oui Alain, je ne suis pas vraiment 'Fou de Foot', mais par contre j'habite et travaille en Principauté.

Et sinon (et surtout) l'entraide informatique n'a pas de frontière !!!

is
Allez l'OM !!!....
is
...et L'ASM !!!

@+Thierry
 

ChTi160

XLDnaute Barbatruc
re Thierry
c'est pas grave et tu sais je savais que tu allais repasser
une question (Arf)
pourquoi et quel avantage (s'il y en a un!!! )utilises tu Range('A'&Derlgn) plutôt que Cells(Derlgn,1) ??
Merci d'avance
Bonne journée
tu penseras si tu le peux a me filer l'address de
ton pot Lol
Chip Pearson je n'ai pas fait de recherches

Message édité par: ChTi160, à: 04/04/2005 13:05
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour à tous, et à Jean-Marie en particulier

Donc pour la question d'écrire

With Sheets('TheSheet')
.Range('A'&Derlgn)
End With

Ou :

With Sheets('TheSheet')
.Cells(Derlgn, 2)
End With

Fondamentalement il n'y a pas de Différence, les deux Syntax font références pour retourner un Object Range.

En pratique 'Théorique', surtout dans le cas présent, je préfère pour les dédbutants, employer le Range('A' & L), celui ci étant plus facilement assimilable à ce que l'on voit lorsque l'on enregistre une macro.

En pratique 'Pratique', en fait la rapidité d'exécution est identique, surtout pour ce que l'on ne fait dans ce genre d'action, reporter quelques dizaines d'octets vers quelques cellules de la dernière ligne trouvée dans la Feuille 'Cible'.

En pratique 'Avancée', là tout dépend de ce que l'on veut obtenir, mais il n'est pas rare de faire une double boucle pour se déplacer 'latitudinalement' (Vertical) et 'longitudinalement' (Horizontal)... Et dans ce cas on fera référence obligatoirement à Cells pour retourner l'objet range sacnné lors du déplacement...

Exemple avec l'exemple de ce Fil... En adaptant pour que ce soit simple et cohérent avec des données à traiter comme suit:

Alain doit reporter systématiquement la Ligne 15 de sa Feuille 'Facture' qui contient des donnée de B15 à M15, soit 12 colonnes...et donc vers la Feuille 'Recapitulation' sur la première ligne dispo des Collones A à L, soit 12 colonnes aussi

Voici la méthode 'Basic' avec Range telle que je l'ai écrite :
Sub ReportDataBasic()
Dim DerniereLigne As Long
   
With Sheets('Recapitulation')
          DerniereLigne = .Range('A65536').End(xlUp).Row + 1
        .Range('A' & DerniereLigne).Value = Sheets('Facture').Range('B15').Value
        .Range('B' & DerniereLigne).Value = Sheets('Facture').Range('C15').Value
        .Range('C' & DerniereLigne).Value = Sheets('Facture').Range('D15').Value
        .Range('D' & DerniereLigne).Value = Sheets('Facture').Range('E15').Value
        .Range('E' & DerniereLigne).Value = Sheets('Facture').Range('F15').Value
        .Range('F' & DerniereLigne).Value = Sheets('Facture').Range('G15').Value
        .Range('G' & DerniereLigne).Value = Sheets('Facture').Range('H15').Value
        .Range('H' & DerniereLigne).Value = Sheets('Facture').Range('I15').Value
        .Range('I' & DerniereLigne).Value = Sheets('Facture').Range('J15').Value
        .Range('J' & DerniereLigne).Value = Sheets('Facture').Range('K15').Value
        .Range('K' & DerniereLigne).Value = Sheets('Facture').Range('L15').Value
        .Range('L' & DerniereLigne).Value = Sheets('Facture').Range('M15').Value
   
End With
End Sub


Voici la Méthode Cells, Juxtaposée avec une Double Boucles :
Sub ReportDataDoubleBoucle()
Dim L As Long
Dim C As Byte

   
With Sheets('Recapitulation')
        L = .Range('A65536').End(xlUp).Row + 1
           
For C = 1 To 12
            .Cells(L, C) = Sheets('Facture').Cells(15, C + 1)
           
Next
   
End With
End Sub

A Noter : certaines propriétés sont automatiquement comprise par VBA comme étant par Défaut, comme ici 'Value'... qui est donc sous-entendu.

Voilà grosso modo une grosse différence car il va s'en dire que la seconde méthode est plus lisible, et sur des grosses quantités de cellules par ligne, le temps d'exécution peut aussi être amélioré.

Sinon on a aussi ce genre de chose avec Cells :
Sub HelpSample()
Dim rwIndex As Byte, colIndex As Byte

For rwIndex = 1 To 4
   
For colIndex = 1 To 10
       
With Worksheets('Sheet1').Cells(rwIndex, colIndex)
           
If .Value < 0.001 Then .Value = 0
&nbsp; &nbsp; &nbsp; &nbsp;
End With
&nbsp; &nbsp;
Next colIndex
Next rwIndex
End Sub


Ou encore, et celle là je vous la sort de derrière les Fagots !!!
Sub BarbaCellTruc()
Dim NumeroCell As Integer

&nbsp; &nbsp;
For NumeroCell = 1 To 512
&nbsp; &nbsp; &nbsp; &nbsp; Cells(NumeroCell).Value = 'LOL'
&nbsp; &nbsp;
Next

End Sub

Et oui vous n'avez pas la berlue (lol) on peut très bien se référer au numéro d'index (qui se déplace donc 'longitudinalement' !!!

Voilà pour ta question...

Pour Chip Pearson (sorry pas Cheap finalement) voir cpearson.com

Bon Après Midi
@+Thierry
 
A

ALAIN_DELOIN13

Guest
Re salut thierry,
J ai oublié de te demander comment faire quand ma facture s'enregistre dans un nouvel onglet dans un nouveau classeur, pour que l'onglet prenne le nom de 2 cellules concaténées (exemple: le nom du client et le n° de facture)
Merci d'avance!!!
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir Alain, le Fil

Fissa fissa je me barre du bureau

Option Explicit

Sub SaveAsOneSheet()
Dim FileName As String
Dim PathName As String

PathName = ThisWorkbook.Path & '\\'

&nbsp; &nbsp;
With Sheets('Facture')
&nbsp; &nbsp; &nbsp; &nbsp; FileName = .Range('A1') & '-' & .Range('D5')
&nbsp; &nbsp; &nbsp; &nbsp; .Copy
&nbsp; &nbsp;
End With

&nbsp; &nbsp;
With ActiveWorkbook
&nbsp; &nbsp; &nbsp; &nbsp; .Worksheets(1).Name = FileName
&nbsp; &nbsp; &nbsp; &nbsp; .SaveAs PathName & FileName & '.xls'
&nbsp; &nbsp; &nbsp; &nbsp; .Close
'A Activer si tu as besoin de fermer
&nbsp; &nbsp;
End With
End Sub


Bonne Soirée
@+Thierry

PS => PathName = ThisWorkbook.Path & '\\'
si l'antislash passe pas sur l'HTML de ce Forum
PathName = ThisWorkbook.Path & 'AntiSlash' (le signe)
 
A

ALAIN_DELOIN13

Guest
Merci ça marche super bien!!
Maintenant j'essaye d'envoyer toutes mes classeurs qu'il me crait (par facture) dans un répertoire!!
Par contre le code VBA avec derniereligne ne fonctionne pas , la macro ne se lance pas je vais voir tout ça !!
encore merci!!!
 

Discussions similaires

Réponses
1
Affichages
394
Compte Supprimé 979
C

Statistiques des forums

Discussions
313 020
Messages
2 094 466
Membres
106 029
dernier inscrit
toto1590