Cooling-Masters
Connexion · INSCRIPTION · Site Recevoir à nouveau l'e-mail de validation


visual basic sous exel

Ajouter ou retirer ce sujet de vos favoris  ·  Suivre ce sujet  ·  Imprimer ce sujet
Page précédente    Page suivante 
oksaux


Descartes' club membre
Messages : 3711

lundi 22 décembre 2008 à 03:36:13     
voila je fait un TD de prog sur un log pour résoudre les sudoku

j'ai un problème avec des variable globale qui se comporte comme non déclaré quand je les utilise dans le module concerné

mais comme je suis loin d'être un pro en prog et encore moins dans ce langage en carton patte
j'ai besoin d'un peu d'aide

worksheet Sudoku
CODE :



Option Explicit
Dim Index As Integer, NbreValeur
Dim Sdk As Range
Dim Np As Range




'*****************************************
'      Lien  Interface Public
'*****************************************
Private Sub CB_Manuel_Click()
   Frm_initialisation.Visible = True
   Frm_Resolution.Visible = False
   If Index <> 0 Then
       Sdk.Item(Index) = TB_Manuel
   End If
End Sub

Private Sub CB_Swap_Click()
If ActiveSheet.Name = "Pile" Then
   Sheets("Sudoku").Select
   CB_Swap.Caption = "Voir Feuil Pile"
Else
   Sheets("Pile").Select
   CB_Swap.Caption = "Voir Feuil Sudoku"
End If
Call SB_Ligne_Change
End Sub



Private Sub Frm_Resolution_Click()

End Sub

Private Sub SB_Ligne_Change()

 Select Case ActiveSheet.Name
  Case "Pile":
    Index = SB_Ligne.Value
    ActiveSheet.Cells(Index, 1).Select
  Case "Sudoku":
    'Call NoCadre(Sdk.Item(Index))
    'Call NoCadre(Np.Item(Index))
    Call BordureSudoku(Sdk)
    Call BordureSudoku(Np)
    Index = SB_Ligne.Value
    Call Encadre(Sdk.Item(Index), 7)
    Call Encadre(Np.Item(Index), 7)
 End Select
End Sub
Private Sub UserForm_Initialize()

 Dim Sudoku, Pil

 Set Sudoku = Sheets("Sudoku")
 Set Pil = Sheets("Pile")
 Set Sdk = Sudoku.Range(Sudoku.Cells(1, 1), Sudoku.Cells(9, 9))
 Set Np = Sudoku.Range(Sudoku.Cells(1, 15), Sudoku.Cells(9, 23))

 OB_Singlette.Visible = False
 CkB_PasaPas = True
 Index = 0
 NbreValeur = 81
 Frm_Resolution.Visible = False
 Frm_Pile.Visible = False
 Frm_initialisation.Visible = False
End Sub
'*****************************************
'   TP 2
'*****************************************




'*****************************************
'      Prive
'*****************************************
Sub NoCadre(r As Range)
   r.Borders(xlDiagonalDown).LineStyle = xlNone
   r.Borders(xlDiagonalUp).LineStyle = xlNone
   r.Borders(xlEdgeLeft).LineStyle = xlNone
   r.Borders(xlEdgeTop).LineStyle = xlNone
   r.Borders(xlEdgeBottom).LineStyle = xlNone
   r.Borders(xlEdgeRight).LineStyle = xlNone
   r.Borders(xlInsideVertical).LineStyle = xlNone
   r.Borders(xlInsideHorizontal).LineStyle = xlNone
End Sub
Sub Encadre(r As Range, COULEUR As Integer)
  ' r.Borders(xlDiagonalDown).LineStyle = xlNone
  ' r.Borders(xlDiagonalUp).LineStyle = xlNone
 
  'COULEUR = 7
   With r.Borders(xlEdgeLeft)
       .LineStyle = xlContinuous
       .Weight = xlMedium
       .ColorIndex = COULEUR
   End With
   With r.Borders(xlEdgeTop)
       .LineStyle = xlContinuous
       .Weight = xlMedium
       .ColorIndex = COULEUR
   End With
   With r.Borders(xlEdgeBottom)
       .LineStyle = xlContinuous
       .Weight = xlMedium
       .ColorIndex = COULEUR
   End With
   With r.Borders(xlEdgeRight)
       .LineStyle = xlContinuous
       .Weight = xlMedium
       .ColorIndex = COULEUR
   End With
End Sub

Sub BordureSudoku(zone As Range)
 Dim r As Range, i As Integer, j As Integer
 Call NoCadre(zone)
 For i = 1 To 7 Step 3
   For j = 1 To 7 Step 3
     Set r = zone.Range(Cells(i, j), Cells(i + 2, j + 2))
     Call Encadre(r, 1)
   Next j
 Next i
End Sub
'*****************************************
'   TP 2
'*****************************************

'Outils de transfert'

Public Sub Copyfeuil(Source As String, Cible As String)

 Sheets(Source).Activate
 Sheets(Source).Range(Cells(1, 1), Cells(9, 9)).Copy

 Sheets(Cible).Activate
 Sheets(Cible).Cells(1, 1).Select
 Sheets(Cible).PasteSpecial

End Sub

Private Sub CB_Import_Click()
Dim Source As String

   Source = InputBox("feuille à importer", "Import", "Ex 1")
   Call Copyfeuil(Source, "Sudoku")
   Frm_Pile.Visible = True

End Sub

Private Sub CB_Export_Click()

 Dim Cible As String

 Cible = InputBox("feuille dans laquelle exporter", "Export", "Ex 1")
 Call Copyfeuil("Sudoku", Cible)
   
End Sub
'interface pour suprimer toute la BDD'
Private Sub CB_DeleteAllPile_Click() '
 Pile.Delete_All_Pile
 Np.ClearContents
End Sub
'interface qui remplit tout le BDD'
Private Sub CB_Crea_Pile_Click()
 Dim i As Integer
 For i = 1 To Np.Count
   Np.Item(i) = Pile.Init_New_Pile(9)
 Next i
 Frm_Pile.Visible = False
 Frm_initialisation.Visible = True
 Sheets("sudoku").Activate
End Sub

'Next case pleine'

Public Function Next_Case_Pleine() As Boolean 'recherche une case pleine et renvois qu'il a trouvé'
 
 Next_Case_Pleine = True
 Do
   Index = Index + 1
 Loop Until Not IsEmpty(Sdk.Item(Index)) Or Index > 81
 
 'cache et affiche des zones'
 Frm_Resolution.Visible = True
 Frm_initialisation.Visible = False
 
 If Index > 81 Then
    Next_Case_Pleine = False
    Index = 0
 End If

End Function


'Purge zone'

Public Sub purge_zone() 'à pour fonction de suprimer la valeur de la case dans toutes les zones concernées'

 Sheets("Pile").Activate
 Dim Valeur As Integer
 Dim i As Integer
 Dim j As Integer
 Dim ii As Integer
 Dim jj As Integer
 Dim z As Range


 i = Int(Index / 9) + 1 'ordonné de la case'
 j = Index - (i - 1) * 9 'absice de la case'
 ii = (Int((i - 1) / 3) * 3) + 1 'absice de la casse haute gauche du carré'
 jj = (Int((j - 1) / 3) * 3) + 1 'ordonné de la casse haute gauche du carré'

 Valeur = Sdk.Item(Index) 'valeur a oter des zones'
 
 Call Pile.Vide_Pile(Index)
 
 Set z = Np.Range(Cells(i, 1), Cells(i, 9)) 'définit et calcule z comme ligne contenant la cellule'
 Call Sudoku.purge_une_zone(z, Valeur)
 
 Set z = Np.Range(Cells(1, j), Cells(9, j)) 'définit et calcule z comme collone contenant la cellule'
 Call Sudoku.purge_une_zone(z, Valeur)
 
 Set z = Np.Range(Cells(ii, jj), Cells(ii + 2, jj + 2)) 'définit et calcule z comme carre contenant la cellule'
 Call Sudoku.purge_une_zone(z, Valeur)

End Sub




'Purge une zone'

Public Sub purge_une_zone(zozo As Range, Valeur As Integer) 'suprime la veleur dans UNE zone'

 Dim NumP As Integer
 Dim i As Integer

 For i = 1 To zozo.Count
   NumP = zozo.Item(i)
   Call Pile.Depile_Valeur(NumP, Valeur)
 Next i

End Sub
 


'Initialisation Sudoku'

Public Sub Initialisation_SDK()
 Dim boucle As Boolean
 boucle = False '
 Do While Next_Case_Pleine And Not boucle
   Call purge_zone
   boucle = CkB_PasaPas
 Loop
End Sub


Private Sub CB_ExecInit_Click()

 Call Initialisation_SDK

End Sub



worksheet pile
CODE :


Option Explicit
Dim Index As Integer, NbreValeur, Sdk As Range, Np As Range


'declaration '
Dim New_ligne As Integer

'initialisation de new line'

Private Sub UserForm_Initialize()

New_ligne = 1

Do While Not IsEmpty(Sheets("Pile").Cells(New_ligne, 1))
  New_ligne = New_ligne + 1
Loop
End Sub


'programme new pile'
'crée une pile à la suite avec une taile de pille egale à T'

Public Function Init_New_Pile(T As Integer) As Integer

Dim i As Integer
Sheets("Pile").Cells(New_ligne, 1) = T

For i = 1 To T
   Sheets("Pile").Cells(New_ligne, i + 1) = i
Next i

Init_New_Pile = New_ligne

New_ligne = New_ligne + 1 'incremente new_ligne qui sert à savoir ou créer la prochaine pile'


End Function


'programme nettoie tout'
'vide tout la BDD'
Public Sub Delete_All_Pile()
Dim zone_a_effacer As Range
Sheets("Pile").Activate
Set zone_a_effacer = Sheets("Pile").Range(Cells(1, 1), Cells(New_ligne, 10))
zone_a_effacer.ClearContents
New_ligne = 1
End Sub


'Programme vide pile'
'sert à vider une pile et à metre son nombre de posibilitée à 0'
Public Sub Vide_Pile(blabla As Integer)
Dim zone_a_effacer As Range

Set zone_a_effacer = Sheets("Pile").Range(Cells(blabla, 2), Cells(blabla, 10))
zone_a_effacer.ClearContents
Sheets("Pile").Cells(blabla, 1) = 0
End Sub


'Programme Depile Valeur'
'sert à suprimer une valeur Vl à une pile NumP'
Public Sub Depile_Valeur(NumP As Integer, Vl As Integer)

Dim i As Integer
Dim j As Integer
i = 2
Do While (Int(Vl) <> Sheets("Pile").Cells(NumP, i))
i = i + 1

Loop


For j = i To Sheets("Pile").Cells(TB_Vide_Pile, 1) + 1
Sheets("Pile").Cells(NumP, j) = Sheets("Pile").Cells(NumP, j + 1)

Next j

Sheets("Pile").Cells(NumP, 1) = Sheets("Pile").Cells(NumP, 1) - 1

End Sub



Message édité par oksaux le lundi 22 décembre 2008 à 03:38:55
Google




     
Page précédente    Page suivante