Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Variable variable

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

pascal82

XLDnaute Occasionnel
Bonjour à tous,

J'ai une formule en "X", 2 variables M et N utilisées pour la combinatoire. M allant de -9 à -3 et N de -8 à -2 et enfin 2 variables A et B pour scruter les variables M et N.
Exemple: Lorsque M=-9 je veux que pour la variable A, elle aille chercher la valeur O1 pour le min et O2 pour le max au lieu de données figées For A = -44 To 42
et Lorsque N=-8 je veux que pour la variable B, elle aille chercher la valeur P1 pour le min et P2 pour le max au lieu de données figées For B = -44 To 42.

Pour résumer:
lorsque M=-9 alors For A = "O1" To "O2"
lorsque M=-8 alors For A = "P1" To "P2"
lorsque M=-7 alors For A = "Q1" To "Q2"
etc …
lorsque N=-8 alors For B = "P1" To "P2"
lorsque N=-7 alors For B = "Q1" To "Q2"
lorsque N=-6 alors For B = "R1" To "R2"
etc

Merci par avance
 

Pièces jointes

Re : Variable variable

Bonjour pascal82,

Pas ouvert le fichier, mais vos explications semblent claires, alors :

Code:
'définissez M et N d'abord...

If M >= -9 Then
   For A = [O1].Offset(, M + 9) To [O2].Offset(, M + 9)
     MsgBox A 'pour tester
     '-----
   Next
End If

If N >= -8 Then
   For B = [P1].Offset(, N + 8) To [P2].Offset(, N + 8)
     MsgBox B 'pour tester
     '-----
   Next
End If
A+
 
Re : Variable variable

Bonjour Pascal82, job75,

Moi j'ai eu le malheur de tester et 30 minutes plus tard, après avoir suspendu la macro qui tournerait encore, ma proposition qui fonctionne est proche de celle de job. La voici :
VB:
Sub Combinatoire_2_termes()
    Dim A As Integer, B As Integer
    Dim M As Integer, N As Integer
    Dim strFormuleA As String, strOps As String
    Dim tStart As Double, tEnd As Double
    tStart = Time
    Application.ScreenUpdating = False
    Range("Z2:AO5000").ClearContents
    For M = -9 To -3
        Cells(1, 31) = M
            For N = (M + 1) To -2
            Cells(1, 32) = N
            strFormuleA = "=IF(AND(RC[" & M & "]=R1C26,RC[" & N & "]=R1C27),RC[-12],"""")"
            Range("X3:X14002").FormulaR1C1 = strFormuleA
            For A = Range("X1").Offset(0, M) To Range("X2").Offset(0, M) 'si M=-9 alors A de -26 à 42 si M=-8 alors A de -30 à 36, etc
                Cells(1, 26) = A
                For B = Range("X1").Offset(0, N) To Range("X2").Offset(0, N) 'si N=-8 alors B de -30 à 36 si N=-8 alors B de -35 à 38 etc
                    Cells(1, 27) = B
                    StsBar strOps & "  M=" & M & "   N=" & N & "  A=" & A & "   B=" & B
                    If Cells(1, 37) > 35 Or Cells(1, 37) < 20 Then
                        Range("Z5000").End(xlUp)(2).Resize(1, 16).Value = Range("Z1:AO1").Value
                        Application.ScreenUpdating = True
                        Application.ScreenUpdating = False
                    End If
                Next
            Next
        Next
    Next
    tEnd = Time
    Cells(1, 43) = Format(tEnd - tStart, "HH:MM:SS")
    ActiveWorkbook.Save
    Application.ScreenUpdating = True
End Sub

A+
 
Re : Variable variable

Bojour job75, Fred0o

Un grand merci à vous deux, j'ai passé plusieurs jours sur ce problème sans trouver une solution.
Désolé, j'ai oublié de prévenir que le temps de traitement de la macro était voisin d'un heure sur mon micro et l'objectif ma demande était de réduire le temps de traitement par réduction des données testées.

Encore un grand merci à vous deux.
 
Re : Variable variable

Bonsoir tout le monde

J'ai eu des soucis avec certains de mes fichiers qui avaient des tableaux énormes.
Depuis, j'essaye de traiter le problème en mémoire en travaillant avec des tableaux mémoires...

Si mon approche vous intéresse, pouvez vous mettre un bout de fichier à dispo?
 
Re : Variable variable

Bonjour tbft,

Il est évident que je m'intéresse à tout ce qui ferait baisser le temps de traitement. Cependant je débute en VBA et j'aime bien "maitriser" les commandes car plus facile a modifier en fonction des demandes. Par contre le traitement par tableaux va très vite devenir une priorité car je traite des fichiers qui comporte entre 14000 et 35000 lignes et le temps de traitement est forcement très, très , très long. C'est pourquoi j'accepte très volontiers ta proposition, je ne peux t'envoyer le fichier de travail > 5Mo mais dans le fichier joint au post1, le code VBA traite toutes mes lignes.

Cordialement
 
Dernière édition:
Re : Variable variable

Bonjour

Je viens de regarder la macro Combinatoire_2_termes.
Je ne comprends pas comment elle fonctionne...snif....snif

Je suis pourtant sur et certain que l'on puisse la faire travailler tout en mémoire.
Serait il possible de me donner un coup de main, svp??
 
Re : Variable variable

Je vais tenter quelques explications.

les colonnes "O" à "V" sont scrutées, la sélection de la colonne est réalisée par les variables M et N.
En colonne "X" une formule sera lancée après chaque changement de variables M ou N, l'objectif de cette formule (qui est un test) est d'afficher une donnée de la colonne "L" uniquement si le test est valide. (les données de la colonne "L" sont binaires: 0 et 1)
Les variables "A" et "B" permettent de scruter tous les chiffres compris entre le min et max de chaque colonne ("O" à "V"), toutes les combinaisons de nombres sont donc explorer avec cette méthode.
En AH1, une formule permet de compter le nombre de 0 de la colonne "X"
En AI1, compte le nombre de 1 de la colonne "X"
En AK1 le % de 1
Enfin un autre test permet d'écrire uniquement les données si le % est soit >45% ou <20%.

J'espère avoir répondu pour le fonctionnement.
A+
 
Re : Variable variable

Dans ton fichier
AH1 : =NB.SI(L3:L14001;0)
AK1 : =NB.SI(L3:L14001;1)

Ils ne travaillent pas sur la colonne X

Qui dit vrai ton explications ou ton fichier??

Voici une version issue de ton fichier...
 

Pièces jointes

Re : Variable variable

Bonjour,

Je viens de tester ta macro, le temps de traitement est presque divisé par 3, c'est phénoménal. Cependant par 2 fois le débogueur c'est arrêté sur la même ligne et ne sachant comment fonctionne les tableaux, je suis donc incapable de la modifier. Si tu avais la gentillesse d'y regarder ce serait sympas.

Merci

VB:
 Sub Combinatoire_2_termes()
Dim A As Integer, B As Integer, i As Integer, J As Integer
Dim M As Integer, N As Integer
Dim strFormuleA As String, strOps As String
Dim tStart As Double, tEnd As Double

Dim Table_Entree As Variant, Table_Entree_2 As Variant
Dim Table_X() As Variant
Dim lig As Long, nb_lig As Long
Dim Table_Res(), nb_res As Long, col As Integer, nb_col As Integer

  tStart = Time
  
  'mise en memoire des tables d'entrée
  Table_Entree = Worksheets("1").Range("L1:V14002").Value
  Table_Entree_2 = Worksheets("1").Range("Z1:AK1").Value
  'creation des tables temporels
  nb_col = UBound(Table_Entree_2, 2)
  nb_lig = UBound(Table_Entree) - 2
  ReDim Table_X(nb_lig) '-2 pour commencer à la ligne 03

  Range("Z2:AO5000").ClearContents
     
'  For M = -9 To -3
  For M = 1 To 7
'    For N = (M + 1) To -2
    For N = (M + 1) To 9
'      strFormuleA = "=IF(AND(RC[" & M & "]=R1C26,RC[" & N & "]=R1C27),RC[-12],"""")"
'      Range("X3:X14002").FormulaR1C1 = strFormuleA
      For A = -44 To 42 'si M=-9 alors A scrute de -26 à 42 (-26 est en situé en O1 et 42 en O2)
'        Cells(1, 26) = A 'si M=-8 alors A scrute de -30 à 36 (-30 est en situé en P1 et 36 en P2)
        Table_Entree_2(1, 1) = A 'si M=-8 alors A scrute de -30 à 36 (-30 est en situé en P1 et 36 en P2)
        For B = -44 To 42 'si N=-8 alors B de -30 à 36 (-30 est en situé en P1 et 36 en P2)
'          Cells(1, 27) = B  'si N=-7 alors B de -35 à 38 (-35 est en situé en Q1 et 38 en Q2)
          Table_Entree_2(1, 2) = B   'si N=-7 alors B de -35 à 38 (-35 est en situé en Q1 et 38 en Q2)
          Table_Entree_2(1, 9) = 0  'comptage des 0
          Table_Entree_2(1, 10) = 0 'comptage des 1
          For lig = 1 To nb_lig
            If (Table_Entree(lig + 2, M) = Table_Entree_2(1, 1)) And (Table_Entree(lig + 2, N) = Table_Entree_2(1, 2)) Then
              Table_X(i) = Table_Entree(lig + 2, 1)
              Table_Entree_2(1, 10) = Table_Entree_2(1, 10) + Table_X(i)
              Table_Entree_2(1, 9) = Table_Entree_2(1, 9) + (1 - Table_X(i))
            Else
              Table_X(i) = ""
            End If
          Next lig
          Table_Entree_2(1, 11) = Table_Entree_2(1, 9) + Table_Entree_2(1, 10)
          If Table_Entree_2(1, 11) = 0 Then Table_Entree_2(1, 12) = 0 Else Table_Entree_2(1, 12) = 100 * Table_Entree_2(1, 10) / Table_Entree_2(1, 11)
'          If Cells(1, 37) > 35 Or Cells(1, 37) < 20 Then
'            Range("Z5000").End(xlUp)(2).Resize(1, 16).Value = Range("Z1:AO1").Value
'          End If
          If Table_Entree_2(1, 12) > 35 Or Table_Entree_2(1, 12) < 20 Then
            nb_res = nb_res + 1
            ReDim Preserve Table_Res(nb_col, nb_res)
            For col = 1 To nb_col
              Table_Res(col, nb_res) = Table_Entree_2(1, col)
            Next col
          End If
        Next
      Next
    Next
  Next
  
Arret du débogeur sur cette ligne  [B][COLOR="red"]Table_Res = WorksheetFunction.Transpose(Table_Res)[/[/COLOR]B]
  Worksheets("1").Range("Z3:AO" & CStr(nb_res)).Value = Table_Res
  tEnd = Time
  Cells(1, 43) = Format(tEnd - tStart, "HH:MM:SS")
'  ActiveWorkbook.Save
'  Application.ScreenUpdating = True
End Sub [/highlight ]
 
Dernière édition:
Re : Variable variable

Coucou

Cette fonction permet d'inverser sur un tableau les lignes et les colonnes.
je pense qu'une petite modification arrangera
VB:
If nb_res<>0 Then
  Table_Res = WorksheetFunction.Transpose(Table_Res)[/B]
  Worksheets("1").Range("Z3:AO" & CStr(nb_res)).Value = Table_Res
endif
[/highlight ] 

Tiens moi au courant
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Export données
Réponses
4
Affichages
906
Réponses
5
Affichages
664
Réponses
7
Affichages
831
Réponses
2
Affichages
436
Réponses
9
Affichages
884
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…