Probleme de boucle - VB/VBA/VBS - Programmation
Marsh Posté le 11-08-2008 à 13:01:48
Alseidis a écrit : Bonjour tout le monde, |
par contre tu avais toujours un msgbox ms ce "n'etait pas la meme"
Marsh Posté le 11-08-2008 à 13:15:09
Merci de ta réponse 86vomito33, mais en reprenant des modifications ma macro ne se lance plus. Il n'y a pas de message d'erreur, je cherche le problème mais j'avoue que je cale.
Marsh Posté le 11-08-2008 à 13:36:46
Code :
|
Marsh Posté le 11-08-2008 à 14:13:36
effectivement je me suis trompe oupss
noublie pas de gerer le cas si on appui sur cancel
Marsh Posté le 11-08-2008 à 14:18:43
Option Explicit
Sub Equity()
'
' Equity Macro
' Macro recorded 08/08/2008 by alseidis
'
' Keyboard Shortcut: Ctrl+e
Dim Account As String
Dim BBG As String
Dim QTY As integer
Dim Style As String
Dim EXEC As Single
Dim Day As Date
Dim I As String
Dim testi As Boolean
Dim line As Integer
testi = True
line = Worksheets("sheet1" ).Range("A1" ).End(xlDown).Row + 1
MsgBox line
Do While testi <> False
' saisie du nom du compte client
Account = InputBox("Entrer le nom du compte", "Saisie de données", "Compte" )
if Account =cancel then
goto fin
end if
' saisie du ticker du titre
BBG = InputBox("Entrer le ticker", "Saisie de données", "Ticker" )
if BBG =cancel then
goto fin
end if
' saisie de la quantité de titres
QTY = InputBox("Entrer la quantité", "Saisie de données", "Quantité" )
if QTY =cancel then
goto fin
end if
' saisie de la nature du trade (Long ou Short)
Style = InputBox("Long ou Short", "Saisie de données", "L ou S" )
if Style =cancel then
goto fin
end if
' saisie du prix d'execution du mouvement
EXEC = InputBox("Entrer le prix d'execution", "Saisie de données", "0000,00" )
if EXEC =cancel then
goto fin
end if
' entrée de la date et de l'heure du jour de l'operation
Day = InputBox("Entrer le jour d'achat", "Saisie de données", Now)
if Day =cancel then
goto fin
end if
Worksheets("sheet1" ).Cells(line, 1).Value = Account
Worksheets("sheet1" ).Cells(line, 2).Value = BBG
Worksheets("sheet1" ).Cells(line, 3).Value = QTY
Worksheets("sheet1" ).Cells(line, 4).Value = Style
Worksheets("sheet1" ).Cells(line, 5).Value = EXEC
Worksheets("sheet1" ).Cells(line, 6).Value = Day
I = MsgBox("Continuer la saisie", vbYesNo)
If I = vbNo Then
testi = False
Else
testi = True
End If
line = line + 1
Loop
fin:
End Sub
Marsh Posté le 11-08-2008 à 15:09:19
Merci de votre aide rapide.
J'avoue qu'étant débutant en VB, j'en apprends un peu plus. Cependant il me reste un problème concernant ce qui a été posté.
La ligne suivante me retourne avec une Run-time error '6' Overflow.
line = Worksheets("sheet1" ).Range("A1" ).End(xlDown).Row + 1
Je ne vois pas quel variable pourrait dépasser la taille requise par son format... Si vous aviez une idée, je vous en remercie d'avance ><
Sinon, pour le dernier poste de 86vomito33, le fait de rajouter des Cancel m'oblige a déclarer une variable supplémentaire pour les utiliser. ne devrais-je pas utiliser vbCancel plutot ?
Marsh Posté le 11-08-2008 à 15:33:30
line = Worksheets("sheet1" ).Range("A55555" ).End(xlup).Row + 1
ca devrait marche
pour le cancel tu peux enlever option explicit
Marsh Posté le 11-08-2008 à 16:41:50
Merci jusqu'ici tout va bien en tout cas, merci grandement pour votre aide.
Je risque d'avoir besoin d'aide sur d'autres choses dans ma macro mais je vais chercher un peu avant de reposter.
Marsh Posté le 19-08-2008 à 12:51:08
Salut tout le monde, j'ai donc finalement réussi a faire un algo qui tourne grâce a vos conseils mais la alors que je touche au but, j'ai un leger probleme.
En lançant la macro de saisie pas de problème pour saisir les données, mais a la fin de la saisie rien, ou plutôt plus rien ne s'affiche, dans mon tableau.
J'ai beau chercher ma ligne je ne sais pas ou se trouve mon entrée, ce qui est légèrement agaçant, je vous l'avoue.
Quelqu'un aurait une idée sur la source du problème?
Marsh Posté le 19-08-2008 à 13:07:54
Sub Equity()
' Equity Macro
' Macro recorded 08/08/2008 by alseidis
'
' Keyboard Shortcut: Ctrl+Alt+213
Dim Account As String
Dim BBG As String
Dim QTY As Integer
Dim Style As String
Dim EXEC As Single
Dim Day As Date
Dim OP As String
Dim I As String
Dim testi As Boolean
Dim line As Integer
testi = True
OP = True
line = Worksheets("blotter" ).Range("A55555" ).End(xlUp).Row + 1
I = MsgBox("Faire une saisie ?", vbYesNo)
If I = vbNo Then
testi = False
Else
testi = True
End If
Do While testi <> False
Account = InputBox("Entrer le nom du compte", "Saisie de données", "Compte" )
If Account = Cancel Then
GoTo fin
End If
BBG = InputBox("Entrer le ticker", "Saisie de données", "Ticker" )
If BBG = Cancel Then
GoTo fin
End If
QTY = InputBox("Entrer la quantité", "Saisie de données", "Quantité" )
If QTY = Cancel Then
GoTo fin
End If
Style = InputBox("Long ou Short", "Saisie de données", "L ou S" )
If Style = Cancel Then
GoTo fin
End If
EXEC = InputBox("Entrer le prix d'execution", "Saisie de données", "0000,00" )
If EXEC = Cancel Then
GoTo fin
End If
Day = InputBox("Entrer le jour d'achat", "Saisie de données", Now)
If Day = Cancel Then
GoTo fin
End If
OP = InputBox("Entrer la position", "Saisie de données", "OPEN / CLOSED" )
If OP = "closed" And Style = "L" Then
QTY = -QTY
Else
If OP = "closed" And Style = "S" Then
QTY = QTY
Else
If OP = "open" And Style = "L" Then
QTY = QTY
Else
If OP = "open" And Style = "S" Then
QTY = -QTY
Else
GoTo fin
End If
End If
End If
End If
Worksheets("blotter" ).Cells(line, 1).Value = UCase$(Account)
Worksheets("blotter" ).Cells(line, 3).Value = UCase$(BBG)
Worksheets("blotter" ).Cells(line, 5).Value = QTY
Worksheets("blotter" ).Cells(line, 6).Value = UCase$(Style)
Worksheets("blotter" ).Cells(line, 7).Value = EXEC
Worksheets("blotter" ).Cells(line, 8).Value = Day
Worksheets("blotter" ).Cells(line, 9).Value = UCase$(OP)
I = MsgBox("Continuer la saisie ?", vbYesNo)
If I = vbNo Then
testi = False
Else
testi = True
End If
line = line + 1
Loop
fin:
End Sub
Voila pour le code
Marsh Posté le 19-08-2008 à 13:45:11
il sert a quoi ton goto fin
je me rapelle plus
en tt cas enleve le ca devrait marche
Marsh Posté le 19-08-2008 à 13:52:51
il faut aussi que tes open et OPEN soit au meme "format" fo choisir les minuscules ou les majuscules
Marsh Posté le 19-08-2008 à 17:52:29
A toute fin utile, le GoTo fin servait a mettre fin a la macro si l'utilisateur appuie sur cancel.
Sinon pourriez vous me suggerez une fonction qui me permettrait de recopier les formules de ma feuille Excel sur la ligne ou se fait la nouvelle entrée, pour eviter de devoir "tirer" vers le bas mes formules après chaque entrée
Marsh Posté le 19-08-2008 à 22:21:58
Sub Equity()
' Keyboard Shortcut: Ctrl+Alt+213
Dim Account As String
Dim BBG As String
Dim QTY As Integer
Dim Style As String
Dim EXEC As Single
Dim Day As Date
Dim OP As String
Dim I As String
Dim testi As Boolean
Dim line As Integer
testi = True
OP = True
line = Worksheets("blotter" ).Range("A55555" ).End(xlUp).Row + 1
I = MsgBox("Faire une saisie ?", vbYesNo)
If I = vbNo Then
testi = False
Else
testi = True
End If
Do While testi <> False
Account = InputBox("Entrer le nom du compte", "Saisie de données", "Compte" )
If Account = cancel Then GoTo fin
BBG = InputBox("Entrer le ticker", "Saisie de données", "Ticker" )
If BBG = cancel Then GoTo fin
QTY = InputBox("Entrer la quantité", "Saisie de données", "Quantité" )
If QTY = cancel Then GoTo fin
Style = InputBox("Long ou Short", "Saisie de données", "L ou S" )
If Style = cancel Then GoTo fin
EXEC = InputBox("Entrer le prix d'execution", "Saisie de données", "0000,00" )
If EXEC = cancel Then GoTo fin
Day = InputBox("Entrer le jour d'achat", "Saisie de données", Now)
If Day = cancel Then GoTo fin
OP = InputBox("Entrer la position", "Saisie de données", "OPEN / CLOSED" )
If OP = "CLOSED" And Style = "L" Then QTY = -QTY
If OP = "CLOSED" And Style = "S" Then QTY = QTY
If OP = "OPEN" And Style = "L" Then QTY = QTY
If OP = "OPEN" And Style = "S" Then QTY = -QTY
If OP = cancel Then GoTo fin
Worksheets("blotter" ).Cells(line, 1).Value = UCase$(Account)
Worksheets("blotter" ).Cells(line, 3).Value = UCase$(BBG)
Worksheets("blotter" ).Cells(line, 5).Value = QTY
Worksheets("blotter" ).Cells(line, 6).Value = UCase$(Style)
Worksheets("blotter" ).Cells(line, 7).Value = EXEC
Worksheets("blotter" ).Cells(line, 8).Value = Day
Worksheets("blotter" ).Cells(line, 9).Value = UCase$(OP)
I = MsgBox("Continuer la saisie ?", vbYesNo)
If I = vbNo Then
testi = False
Else
testi = True
End If
line = line + 1
Loop
Range("B1" ).AutoFill Destination:=Range(Cells(1, 2), Cells(line, 2)), Type:=xlFillDefault
Range("D1" ).AutoFill Destination:=Range(Cells(1, 4), Cells(line, 4)), Type:=xlFillDefault
fin:
End Sub
Marsh Posté le 20-08-2008 à 14:06:54
j'ai recopié le code que tu as mis dans ton post mais quand je finis ma saisie, les colonnes B et D se vide totalement, des données et du formatage des cellules
Marsh Posté le 20-08-2008 à 15:03:14
faut peux etre changer les deux dernieres lignes
tes entetes sont sur quelle ligne ?
Marsh Posté le 20-08-2008 à 15:45:22
ca devrait donc etre
Loop
Range("B6" ).AutoFill Destination:=Range(Cells(6, 2), Cells(line, 2)), Type:=xlFillDefault
Range("D6" ).AutoFill Destination:=Range(Cells(6, 4), Cells(line, 4)), Type:=xlFillDefault
fin:
End Sub
Marsh Posté le 20-08-2008 à 17:18:25
J'ai refait un essai mais avec le même résultat que précédemment.
En fait, il faudrait que la macro reprenne la formule de la dernière ligne remplie pour la recopier pour la nouvelle ligne saisie.
J'espere que mes precisions pourront t'aider. Le code etant en entier tu peux faire le test de ton coté. Merci de ton aide en tout cas
Marsh Posté le 20-08-2008 à 20:56:28
Alseidis a écrit : J'ai refait un essai mais avec le même résultat que précédemment. |
nouvelle essai
Code :
|
si ca marche pas envoie un extrait de ton fichier
Marsh Posté le 21-08-2008 à 09:56:09
Je viens d'essaier et mes formules ne se recopie toujours pas.
Je te mets donc le lien vers un classeur ou il y a une extrait de mon tableau
http://www.cijoint.fr/cjlink.php?f [...] eDB7Nf.xls
Merci d'avance
Marsh Posté le 21-08-2008 à 11:09:23
ah c'est tout de suite plus facile
I = MsgBox("Continuer la saisie ?", vbYesNo)
If I = vbNo Then
testi = False
Else
testi = True
line= line + 1
End If
Loop
Cells(line - 1, 4).AutoFill Destination:=Range(Cells(line - 1, 4), Cells(line, 4)), Type:=xlFillDefault
fais pareil pour les autres colonnes
fin:
End Sub
Marsh Posté le 21-08-2008 à 12:33:19
je dois être vraiment mauvais pour pas réussir a faire marché ton code
j'ai essayé de reprendre la ligne de code
Cells(line - 1, 4).AutoFill Destination:=Range(Cells(line - 1, 4), Cells(line, 4)), Type:=xlFillDefault
pour remplir au moins une colonne mais sans succès...
quelle est la partie a modifier pour reproduire le formule sur les autres colonnes ?
Marsh Posté le 21-08-2008 à 14:00:19
Code :
|
s'applique a la colonne 4 "BBG"
il faut que tu copie cette ligne est que tu change les "4" par "2", "10"a"16" et "18","19"
Marsh Posté le 21-08-2008 à 14:03:35
Ok j'essaie ca tout de suite, et je te dis comment je m'en sors =)
Marsh Posté le 21-08-2008 à 15:00:48
Pour reprendre la fin du code, j'ai fais comme tu m'as dis
I = MsgBox("Continuer la saisie ?", vbYesNo)
If I = vbNo Then
testi = False
Else
testi = True
End If
line = line + 1
Loop
Cells(line - 1, 2).AutoFill Destination:=Range(Cells(line - 1, 2), Cells(line, 2)), Type:=xlFillDefault
Cells(line - 1, 4).AutoFill Destination:=Range(Cells(line - 1, 4), Cells(line, 4)), Type:=xlFillDefault
Cells(line - 1, 10).AutoFill Destination:=Range(Cells(line - 1, 10), Cells(line, 10)), Type:=xlFillDefault
Cells(line - 1, 11).AutoFill Destination:=Range(Cells(line - 1, 11), Cells(line, 11)), Type:=xlFillDefault
Cells(line - 1, 12).AutoFill Destination:=Range(Cells(line - 1, 12), Cells(line, 12)), Type:=xlFillDefault
Cells(line - 1, 13).AutoFill Destination:=Range(Cells(line - 1, 13), Cells(line, 13)), Type:=xlFillDefault
Cells(line - 1, 14).AutoFill Destination:=Range(Cells(line - 1, 14), Cells(line, 14)), Type:=xlFillDefault
Cells(line - 1, 15).AutoFill Destination:=Range(Cells(line - 1, 15), Cells(line, 15)), Type:=xlFillDefault
Cells(line - 1, 16).AutoFill Destination:=Range(Cells(line - 1, 16), Cells(line, 16)), Type:=xlFillDefault
Cells(line - 1, 18).AutoFill Destination:=Range(Cells(line - 1, 18), Cells(line, 18)), Type:=xlFillDefault
Cells(line - 1, 19).AutoFill Destination:=Range(Cells(line - 1, 19), Cells(line, 19)), Type:=xlFillDefault
fin:
End Sub
Mais malheureusement ca ne marche toujours pas... Je commence a desesperer un peu
Marsh Posté le 22-08-2008 à 09:35:10
Bon ben ca marche toujours pas...
Non je rigole, cette fois ca marche nickel =)
MERCI GRANDEMENT a toi 86vomito33 pour le temps que tu as passé a m'aider a me sortir de ma boucle d'algo ><
Merci merci
Marsh Posté le 11-08-2008 à 12:27:13
Bonjour tout le monde,
J'ai un problème (comme beaucoup de monde), je souhaite construire un fichier permettant de suivre des performances de titres boursiers.
Dans ce but, je décide donc de passer par un programme sur Visual Basic. Actuellement mon souci principal, qui risque de ne pas être le dernier mais chaque chose en son temps, est de faire tourner ma boucle tant que la réponse est Oui.
Hors actuellement, si je choisi la réponse Oui ma boucle reste coincé sur ma MsgBox, jusqu'à ce que je choisisse la réponse Non pour quitter.
Le but final étant de faire un fichier de saisie de tableau qui remplirait une ligne après l'autre, ou plutôt qui écrirait sur la dernière ligne vide du tableau.
Voici donc mon code, en espérant que quelqu'un puisse m'aider
Option Explicit
Sub Equity()
'
' Equity Macro
' Macro recorded 08/08/2008 by alseidis
'
' Keyboard Shortcut: Ctrl+e
Dim Account As String
Dim BBG As String
Dim QTY As Integer
Dim Style As String
Dim EXEC As Single
Dim Day As Date
Dim I As String
' saisie du nom du compte client
Account = InputBox("Entrer le nom du compte", "Saisie de données", "Compte" )
With Worksheets("sheet1" ).Range("a2" )
.Value = Account
End With
' saisie du ticker du titre
BBG = InputBox("Entrer le ticker", "Saisie de données", "Ticker" )
With Worksheets("sheet1" ).Range("b2" )
.Value = BBG
End With
' saisie de la quantité de titres
QTY = InputBox("Entrer la quantité", "Saisie de données", "Quantité" )
With Worksheets("sheet1" ).Range("c2" )
.Value = QTY
End With
' saisie de la nature du trade (Long ou Short)
Style = InputBox("Long ou Short", "Saisie de données", "L ou S" )
With Worksheets("sheet1" ).Range("d2" )
.Value = Style
End With
' saisie du prix d'execution du mouvement
EXEC = InputBox("Entrer le prix d'execution", "Saisie de données", "0000,00" )
With Worksheets("sheet1" ).Range("e2" )
.Value = EXEC
End With
' entrée de la date et de l'heure du jour de l'operation
Day = InputBox("Entrer le jour d'achat", "Saisie de données", Now)
With Worksheets("sheet1" ).Range("f2" )
.Value = Day
End With
Do
I = MsgBox("Continuer la saisie", vbYesNo)
If I = vbNo Then
Exit Sub
Else
End If
Loop
End Sub
Merci d'avance
Message édité par Alseidis le 11-08-2008 à 12:35:05