XL 2010 Excel VBA

Konte94

XLDnaute Junior
Salut tout le monde, svp qui peut m'aider à écrire un programme vba qui me permettra d'obtenir un carré magique d'ordre impair avec l'algorithmique de Bachet:

Indication : le nombre 1 doit se placer tout juste en dessous de la cellule centrale.
A chaque fois on descend d'une cellule puis on décale d'une à droite et on met le chiffre consécutif, si on trouve un chiffre là-bas on remonte et on descend de deux cellules et on met le chiffre consécutif ainsi de suite

Exemple
4 9 2
3 5 7
8 1 6

La Somme des lignes, des colonnes et des diagonales est égale.
 

Dranreb

XLDnaute Barbatruc
Ce n'est pas la fonction qu'il faut renommer ce sont les plages sur lesquelles elle doit s'appyuer qu'il faut définir par ces noms. "Coté" pour la cellule qui contiendra le nombre de valeurs souhaitées par coté et "LeCarréMagique" pour la plage qui devra recueillir le résultat.
 

Dranreb

XLDnaute Barbatruc
Bien sûr qu'on pourrait figer les emplacements dans la macro mais comme vous n'avez jamais dit où vous voulez tout ça ni jamais joint de classeur pour qu'on puisse le voir …
Le nom "LeCarréMagique" sera toutefois crée par la macro elle même quand même.
 

Konte94

XLDnaute Junior
Bien sûr qu'on pourrait figer les emplacements dans la macro mais comme vous n'avez jamais dit où vous voulez tout ça ni jamais joint de classeur pour qu'on puisse le voir …
Le nom "LeCarréMagique" sera toutefois crée par la macro elle même quand même.
Si c'était possible d'utiliser les InputBox. Si on exécute sa nous demande automatiquement la taille souhaité. Je pense que ce sera mieux.
 

Dranreb

XLDnaute Barbatruc
VB:
Option Explicit
Sub ProduireCarréMagique()
   Dim Coté As Long, RngCM As Range
   On Error Resume Next
   Coté = InputBox("Combien de nombres par coté ?")
   If Err Then Exit Sub
   Set RngCM = ActiveSheet.[LeCarréMagique]
   If Err Then Set RngCM = Selection
   On Error GoTo 0
   RngCM.ClearContents
   Set RngCM = RngCM.Resize(Coté, Coté)
   RngCM.Value = CarréMagique(Coté)
   RngCM.Worksheet.Names.Add "LeCarréMagique", RngCM
   End Sub
Function CarréMagique(ByVal Coté As Long) As Variant()
   CalculCarréMagique CarréMagique, Coté
   End Function
Sub CalculCarréMagique(T(), ByVal Coté As Long)
   Dim M As Long, Y As Long, X As Long, L As Long, C As Long, N As Long
   ReDim T(1 To Coté, 1 To Coté)
   M = Coté \ 2
   For Y = -M To M: For X = -M To M
      N = N + 1
      L = X + Y + M + Coté
      C = X - Y + M + Coté
      T(L Mod Coté + 1, C Mod Coté + 1) = N
      Next X, Y
   End Sub
 

Konte94

XLDnaute Junior
VB:
Option Explicit
Sub ProduireCarréMagique()
   Dim Coté As Long, RngCM As Range
   On Error Resume Next
   Coté = InputBox("Combien de nombres par coté ?")
   If Err Then Exit Sub
   Set RngCM = ActiveSheet.[LeCarréMagique]
   If Err Then Set RngCM = Selection
   On Error GoTo 0
   RngCM.ClearContents
   Set RngCM = RngCM.Resize(Coté, Coté)
   RngCM.Value = CarréMagique(Coté)
   RngCM.Worksheet.Names.Add "LeCarréMagique", RngCM
   End Sub
Function CarréMagique(ByVal Coté As Long) As Variant()
   CalculCarréMagique CarréMagique, Coté
   End Function
Sub CalculCarréMagique(T(), ByVal Coté As Long)
   Dim M As Long, Y As Long, X As Long, L As Long, C As Long, N As Long
   ReDim T(1 To Coté, 1 To Coté)
   M = Coté \ 2
   For Y = -M To M: For X = -M To M
      N = N + 1
      L = X + Y + M + Coté
      C = X - Y + M + Coté
      T(L Mod Coté + 1, C Mod Coté + 1) = N
      Next X, Y
   End Sub
Je parle de sa mais le côté doit être Supérieur à 2 et impair. Je veux si c'est pair que sa n'affiche rien
 

Discussions similaires

Réponses
9
Affichages
394
Réponses
4
Affichages
413

Statistiques des forums

Discussions
314 491
Messages
2 110 177
Membres
110 690
dernier inscrit
Zeppelin