Boucle If V.s. For
Bonjour,
J’ai un petit soucis par rapport à la programmation VBA !
Est-ce qu’on a le droit de programmer comme suivant :
[/code]
For i=1 to 10
If
Instruction A
NEXT
else
Instruction B
end if
[/code]
en gros c'est ca l'idée de mon programme, sauf que ca marche pas.
est ce qu'il y a un autre moyen de faire le meme programme avec autre instruction.
merci d'avance.
Bonjour,
Tu ne peux pas faire commencer un If dans une boucle, et le terminer en dehors de la boucle, ton cas s'écrirait plus:
Sub test()
For i = 1 To 10
If True Then
'Instruction A
Else
'Instruction B
End If
Next i
End Sub
justement j'en ai besoin au milieu de la premiere boucle.
est ce que je peux faire autrement ?
Re,
Je ne comprends pas bien, pourquoi dois tu faire sortir ton test de ta première boucle? j'imagine que tu ne peux pas nous mettre ton vrai code pour qu'on voit ce que tu essayes de faire?
Bonjour, salut Ausecour !
Je me permet d'intervenir car ce sujet fait écho à celui-ci :
https://forum.excel-pratique.com/viewtopic.php?f=2&t=127320&p=780611#p780611
Je rejoins les commentaires de @Ausecour, il serait judicieux de détailler ce que tu souhaites faire. Tu ne peux pas imbriquer les 2 structures tel que dans ton premier message...
Edit : ce serait plutôt quelque chose du genre ?
If Condition1 Then
For i=1 to 10
Instruction A
Next i
Else
Instruction B
End if
Merci pour vos reponses multiples,
je souhaite depuis un logiciel de 3D, verifier grace à ce programme VBA si la reference generée existe deja dans la base de donnée :
si oui incrementer de 1 et verifier egalement s'elle existe aussi
si non enregistrer la reference non existante dans la base de donées.
voila le code :
Sub test_incrementation_ref()
'-----------------------------------------------------------------------------------declaration des variables pour la connexion avec la BBD'
Dim cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim SQLStr As String
Dim rs As ADODB.Recordset
cout_estime = 100
'-----------------------------------------------------------------------------------declaration des variables fde test pour la reference
projet = 3659
gabarit = 5
ref_incomplete = projet & " " & gabarit
'-------------------------------------------------------------------------------Boucle de recherche des references existantes dans la BDD
For i = 0 To 999
If i Like "##" Then
ref = ref_incomplete & "0" & i & "_V0"
ElseIf i Like "#" Then
ref = ref_incomplete & "00" & i & "_V0"
End If
numero = ref
'********* Requet SQL *********'
SQLStr = "select* from table01 where Numero = '" & numero & "'"
Server_Name = "127.0.0.1"
Database_Name = "base"
User_ID = "root"
Password = "m02pas"
Set rs = New ADODB.Recordset
Set cn = New ADODB.Connection
'*** connexion ***
cn.Open "Driver={MYSQL ODBC 8.0 Unicode Driver};Server=" & Server_Name & ";Database=" & Database_Name & ";Uid=" & User_ID & ";Pwd=" & Password & ";Trusted_Connection=yes;"
rs.Open SQLStr, cn, adOpenStatic
'--------------------------------------------------------------------------------------------si la ref existe dans la BDD / table01
If Not rs.EOF Then
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
Next
Else
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
GoTo InsertRef
End If
'--------------------------------------------------------------------------------------si la ref n'existe pas dans la BDD / table01
Exit Sub
InsertRef:
Set rs = New ADODB.Recordset
Set cn = New ADODB.Connection
'********* Requet SQL *********'
SQLStr = "insert into table01 (Numero,Cout_estime) values('" & numero & "','" & cout_estime & "')"
'*** connexion ***
cn.Open "Driver={MYSQL ODBC 8.0 Unicode Driver};Server=" & Server_Name & ";Database=" & Database_Name & ";Uid=" & User_ID & ";Pwd=" & Password & ";Trusted_Connection=yes;"
rs.Open SQLStr, cn, adOpenStatic
'rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
MsgBox "mise à jour reussit" & ref & "ajoutée à la base table01"
End Sub
merci d'avance
Personnellement, je ne comprends pas grand chose à ton code, je pense que la présence d'espaces à tout va et les soucis d'indentation ne facilitent pas le lecture.
En faisant abstraction de ça, tu peux interrompre une boucle FOR avant d'atteindre le dernier élément. Exemple :
For i = 1 To 1000
If Elément(i) = ElémentCherché Then
Trouvé = True
Exit For
End If
Next i
If Trouvé Then InstructionA
je testerai ta solution Pedro22 et je te tiens au courant.
merci
Re,
si je ne me trompe pas, son code corrigé donne:
Print
Sub test_incrementation_ref()
'-----------------------------------------------------------------------------------declaration des variables pour la connexion avec la BBD'
Dim cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim SQLStr As String
Dim rs As ADODB.Recordset
Dim fin As Boolean
cout_estime = 100
'-----------------------------------------------------------------------------------declaration des variables fde test pour la reference
projet = 3659
gabarit = 5
ref_incomplete = projet & " " & gabarit
'-------------------------------------------------------------------------------Boucle de recherche des references existantes dans la BDD
For i = 0 To 999
If i Like "##" Then
ref = ref_incomplete & "0" & i & "_V0"
ElseIf i Like "#" Then
ref = ref_incomplete & "00" & i & "_V0"
End If
numero = ref
'********* Requet SQL *********'
SQLStr = "select* from table01 where Numero = '" & numero & "'"
Server_Name = "127.0.0.1"
Database_Name = "base"
User_ID = "root"
Password = "m02pas"
Set rs = New ADODB.Recordset
Set cn = New ADODB.Connection
'*** connexion ***
cn.Open "Driver={MYSQL ODBC 8.0 Unicode Driver};Server=" & Server_Name & ";Database=" & Database_Name & ";Uid=" & User_ID & ";Pwd=" & Password & ";Trusted_Connection=yes;"
rs.Open SQLStr, cn, adOpenStatic
'--------------------------------------------------------------------------------------------si la ref existe dans la BDD / table01
fin = rs.EOF
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
'--------------------------------------------------------------------------------------si la ref n'existe pas dans la BDD / table01
If fin Then
Set rs = New ADODB.Recordset
Set cn = New ADODB.Connection
'********* Requet SQL *********'
SQLStr = "insert into table01 (Numero,Cout_estime) values('" & numero & "','" & cout_estime & "')"
'*** connexion ***
cn.Open "Driver={MYSQL ODBC 8.0 Unicode Driver};Server=" & Server_Name & ";Database=" & Database_Name & ";Uid=" & User_ID & ";Pwd=" & Password & ";Trusted_Connection=yes;"
rs.Open SQLStr, cn, adOpenStatic
'rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
MsgBox "mise à jour reussit" & ref & "ajoutée à la base table01"
End If
Next i
End Sub
Ce n'est peut-être pas ce que tu veux, mais ça correspond à ce que tu as écris, ce que je ne comprends pas d'ailleurs, c'est que, si tu atteins la fin du fichier, tu fermes tout, si tu n'atteins pas la fin du fichier, tu fermes tout...
Merci à vous tous
vos commentaires m'ont trop aidé.
finalement c'etait le exit for qui me fallait.
voila le code qui fonctionne :
Sub test_incrementation_ref()
'-----------------------------------------------------------------------------------declaration des variables pour la connexion avec la BBD'
Dim cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim SQLStr As String
Dim rs As ADODB.Recordset
'-----------------------------------------------------------------------------------declaration des variables fde test pour la reference
projet = 3659
gabarit = 5
ref_incomplete = projet & " " & gabarit
'-------------------------------------------------------------------------------Boucle de recherche des references existantes dans la BDD
For i = 0 To 999
If i Like "##" Then
ref = ref_incomplete & "0" & i & "_V0"
ElseIf i Like "#" Then
ref = ref_incomplete & "00" & i & "_V0"
End If
numero = ref
'********* Requet SQL *********'
SQLStr = "select* from table01 where Numero = '" & numero & "'"
Server_Name = "127.0.0.1"
Database_Name = "base"
User_ID = "root"
Password = "m02pas"
Set rs = New ADODB.Recordset
Set cn = New ADODB.Connection
'*** connexion ***
cn.Open "Driver={MYSQL ODBC 8.0 Unicode Driver};Server=" & Server_Name & ";Database=" & Database_Name & ";Uid=" & User_ID & ";Pwd=" & Password & ";Trusted_Connection=yes;"
rs.Open SQLStr, cn, adOpenStatic
'--------------------------------------------------------------------------------------------si la ref existe dans la BDD / table01
If Not rs.EOF Then
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
Else
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
'--------------------------------------------------------------------------------------si la ref n'existe pas dans la BDD / table01
Set rs = New ADODB.Recordset
Set cn = New ADODB.Connection
'********* Requet SQL *********'
SQLStr = "insert into table01 (Numero,Cout_estime) values('" & numero & "','" & cout_estime & "')"
'*** connexion ***
cn.Open "Driver={MYSQL ODBC 8.0 Unicode Driver};Server=" & Server_Name & ";Database=" & Database_Name & ";Uid=" & User_ID & ";Pwd=" & Password & ";Trusted_Connection=yes;"
rs.Open SQLStr, cn, adOpenStatic
'rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
MsgBox "mise à jour reussit" & ref & "ajoutée à la base table01"
Exit For
End If
Next
End Sub