Suspendre l'execution de la macro+problème de stockage.

arnaud95000 Messages postés 46 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 18 décembre 2007 - 23 août 2007 à 11:33
arnaud95000 Messages postés 46 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 18 décembre 2007 - 24 août 2007 à 12:22
Bonjour, je réalise des tests sur un échantillon important, suite au lancement de ma macro je depasserai certainement les 256 colonnes et les 65636 lignes.
J'aurai aimé savoir comment je peux augmenter le nombre de colonne et ensuite comment je peux stpper l'execution du programme lorsque l'affichage arrive a 65636 pour pouvoir réaliser mes tests puis la relancer d'ou je me suis arreter pour afficher les nouveau resultats et realiser les nouveaux tests et ainsi de suite.
Merci d'avance et bonne journée.

<!-- / message -->

5 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
23 août 2007 à 13:50
Augmenter le nombre de lignes ou les colonnes tu ne peux pas avec Excel 2003 ou inférieur. Par pour Excel 2007 ces limites ont été repoussées. Je ne connais pas les nouvelles limites mais c'est bien au delà.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 août 2007 à 15:12
salut,
(salut Casy)

bah la dernière fois j'ai donné le nombre approximatif de lignes, là j'ai moins la flemme donc j'ai ouvert XL 2007 :
Nb de lignes : 1 048 576
Nb de Colonnes : 16 384

Avec les versions inférieures, pas d'autres choix que de travailler sur plusieurs onglets !

@++

(
0
arnaud95000 Messages postés 46 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 18 décembre 2007
23 août 2007 à 15:15
Niveau colonnes avec excel 2007 çà ira largement mais niveau ligne moins sur.lol.Car je réalise sur des combinaisons donc n!/(p!*(n-p)!) çà monte vite.
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 août 2007 à 15:19
Excel n'est pas une base de données à l'origine mais un tableur.
Utilise Access pour ce genre de besoin

@++

(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
arnaud95000 Messages postés 46 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 18 décembre 2007
24 août 2007 à 12:22
Il serait peut être possible d'ajouter une feuille à chaque fois que la macro arrive à la dernière ligne, amis en même temps je suis un peu perdu dans les commandes car je suis débutant en VBA.
Voici ma macro

'1. En A1, écrire c ou p ; (Combinaison ou Permutation)
  '2. En A2, écrire la valeur de p ;(p tirés parmi N)
  '3. Sous A2, écrire la liste des N éléments ;
  '4. Sélectionner A1 et activer la procédure.


'Exemple:
'A1 c
'A2 3
'A3 1
'A4 2
'A5 Excel
'A6 4
'A7 *
'A8 6
'
'La procédure donne alors la liste de toutes les combinaisons
'possibles de 3 éléments choisis parmi 6.




Option Explicit


Dim vAllItems As Variant
Dim Buffer() As String
Dim BufferPtr As Long
Dim Results As Worksheet


                         
                             




Sub ListPermutations()
Worksheets("combinaisons").Select
Range("A1").Select
  Dim Rng As Range
  Dim PopSize As Integer
  Dim SetSize As Integer
  Dim Which As String
  Dim N As Double
  Dim message As Integer
  Dim nom As String
  Dim sh As Worksheet, trouvé As Boolean
  trouvé = False
 
  message = InputBox("nombre d'éléments p?", "Combinaison des élements p parmi N", 3)
  Range("A2") = message
  Const BufferSize As Long = 65535


  Set Rng = Selection.Columns(1).Cells
  If Rng.Cells.Count = 1 Then
    Set Rng = Range(Rng, Rng.End(xlDown))
  End If


  PopSize = Rng.Cells.Count - 2
  If PopSize < 2 Then GoTo DataError


  SetSize = Rng.Cells(2).Value
  If SetSize > PopSize Then GoTo DataError


  Which = UCase$(Rng.Cells(1).Value)
  Select Case Which
  Case "C"
    N = Application.WorksheetFunction.Combin(PopSize, SetSize)
  Case "P"
    N = Application.WorksheetFunction.Permut(PopSize, SetSize)
  Case Else
    GoTo DataError
  End Select
  If N > Cells.Count Then GoTo DataError


  Application.ScreenUpdating = False




 
  nom = "résultats"
  Set Results = Worksheets.Add
  On Error Resume Next
  Application.DisplayAlerts = False
  Sheets("résultats").Delete
  Application.DisplayAlerts = True
  Results.Name = nom


  vAllItems = Rng.Offset(2, 0).Resize(PopSize).Value
  ReDim Buffer(1 To BufferSize) As String
  BufferPtr = 0


  If Which = "C" Then
    AddCombination PopSize, SetSize
  Else
    AddPermutation PopSize, SetSize
  End If
  vAllItems = 0


  Application.ScreenUpdating = True
  Exit Sub


DataError:
  If N = 0 Then
    Which = "Enter your data in a vertical range of at least 4 cells. " _
      & String$(2, 10) _
      & "Top cell must contain the letter C or P, 2nd cell is the number" _
      & "of items in a subset, the cells below are the values from which" _
      & "the subset is to be chosen."
  Else
    Which = "This requires " & Format$(N, "#,##0") & _
      " cells, more than are available on the worksheet!"
  End If
  MsgBox Which, vbOKOnly, "DATA ERROR"
  Exit Sub
End Sub


Private Sub AddPermutation(Optional PopSize As Integer = 0, _
  Optional SetSize As Integer = 0, _
  Optional NextMember As Integer = 0)


  Static iPopSize As Integer
  Static iSetSize As Integer
  Static SetMembers() As Integer
  Static Used() As Integer
  Dim i As Integer


  If PopSize <> 0 Then
    iPopSize = PopSize
    iSetSize = SetSize
    ReDim SetMembers(1 To iSetSize) As Integer
    ReDim Used(1 To iPopSize) As Integer
    NextMember = 1
  End If


  For i = 1 To iPopSize
    If Used(i) = 0 Then
      SetMembers(NextMember) = i
      If NextMember <> iSetSize Then
        Used(i) = True
        AddPermutation , , NextMember + 1
        Used(i) = False
      Else
        SavePermutation SetMembers()
      End If
    End If
  Next i


  If NextMember = 1 Then
    SavePermutation SetMembers(), True
    Erase SetMembers
    Erase Used
  End If


End Sub  'AddPermutation


Private Sub AddCombination(Optional PopSize As Integer = 0, _
  Optional SetSize As Integer = 0, _
  Optional NextMember As Integer = 0, _
  Optional NextItem As Integer = 0)


  Static iPopSize As Integer
  Static iSetSize As Integer
  Static SetMembers() As Integer
  Dim i As Integer


  If PopSize <> 0 Then
    iPopSize = PopSize
    iSetSize = SetSize
    ReDim SetMembers(1 To iSetSize) As Integer
    NextMember = 1
    NextItem = 1
  End If


  For i = NextItem To iPopSize
    SetMembers(NextMember) = i
    If NextMember <> iSetSize Then
      AddCombination , , NextMember + 1, i + 1
    Else
      SavePermutation SetMembers()
    End If
  Next i


  If NextMember = 1 Then
    SavePermutation SetMembers(), True
    Erase SetMembers
  End If


End Sub  'AddCombination


Private Sub SavePermutation(ItemsChosen() As Integer, _
  Optional FlushBuffer As Boolean = False)


  Dim i As Integer, sValue As String
  Dim j As Integer, w As Long, k As Long
  Dim message As Integer
  Dim ChaineASeparer


 
  Static RowNum As Long, ColNum As Long


  If RowNum 0 Then RowNum 1  If ColNum 0 Then ColNum 1


  If FlushBuffer True Or BufferPtr UBound(Buffer()) Then
    If BufferPtr > 0 Then
      If (RowNum + BufferPtr - 1) > Rows.Count Then
        RowNum = 1
        ColNum = ColNum + 1
        If ColNum > 256 Then Exit Sub
      End If


    '
    For k = 1 To BufferPtr
      ChaineASeparer = Split(Buffer(k), ",")
        If (RowNum + BufferPtr - 1) > Rows.Count Then
          RowNum = 1
          ColNum = Range("A1").End(xlToRight).Column + 1
        End If
        For w = 0 To UBound(ChaineASeparer)
          Results.Cells(RowNum + k - 1, ColNum + w).Value _
            = ChaineASeparer(w)
      Next
    Next
      'Results.Cells(RowNum, ColNum).Resize(BufferPtr, 1).Value _
        = Application.WorksheetFunction.Transpose(Buffer())
      'RowNum = RowNum + BufferPtr
    End If


    BufferPtr = 0
    If FlushBuffer = True Then
      Erase Buffer
      RowNum = 0
      ColNum = 0
      Exit Sub
    Else
      ReDim Buffer(1 To UBound(Buffer))
    End If


  End If
  'construct the next set
  For i = 1 To UBound(ItemsChosen)
  j = 1
  sValue = sValue & ", " & vAllItems(ItemsChosen(i), 1)
  'and save it in the buffer
  Next i
  BufferPtr = BufferPtr + 1
  Buffer(BufferPtr) = Mid$(sValue, 3)
  End Sub

Merci beaucoup
0
Rejoignez-nous