DECALER
#1
Régulier XLPages

Inscription: 31/12/2008

Messages: 55

Système d'exploitation:
PC
Version Excel utilisée:
excel 2003
Posté le : 04-10-2010 00h43
bonjour le forum
j'ai des données dans la cellule de ce type "50+42+34+56+12" j'aimerais qu'a la place du + chaque chiffre soit decale d'une cellule a droite.
ex:en K2 le 50 en L2 le 42 en M2 le 34.....
le code vba ou se trouve le + est:
For j = 0 To bs
  s =s & IIf (i \ (2 ^ j) Mod 2, oDat(j) & "+", "")
Next j
Par quoi faudrait-il remplacer "+","pour décaler d'une colonne vers la droite.
merci

Hors Ligne
Rapport   Haut 

Re: DECALER
#2
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 04-10-2010 00h52
Bonjour jad73,

Pourrais-tu joindre un classeur exemple s'il-te-plaît, comme ça les choses seraient plus claires et plus simples. Pour ce faire consulte la page Composer un message à la rubrique Ajouter une pièce jointe.

Cordialement,

Guy

Hors Ligne
Rapport   Haut 

Re: DECALER
#3
Régulier XLPages

Inscription: 31/12/2008

Messages: 55

Système d'exploitation:
PC
Version Excel utilisée:
excel 2003
Posté le : 04-10-2010 11h17
bonjour le forum,guy
voici le fichier avec en h2 mon souhait
merci
Pièce jointe:
xls jad73_test.xls   [ Taille: 32.50 Ko - Téléchargements: 495 ]
Hors Ligne
Rapport   Haut 

Re: DECALER
#4
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 04-10-2010 12h15
Bonjour jad73,

Vu l'heure à laquelle j'ai parcouru le code (5:10h), je n'ai pas pris la peine d'en faire l'exégèse. Cependant mon petit doigt me dit qu'il y a là vigoureux ménage à faire. Bref.

J'ai modifié la procédure toto_1() ainsi :

- nouvelle variable de type Range
' Plage des résultats
Dim rngPlageRes As Range
 
- modification du caractère de séparation
   For j = 0 To bs
    ' Modification : caractère + remplacé par ;
      s = s & IIf(i \ (2 ^ j) Mod 2, oDat(j) & ";", "")
    Next j
 
- distribution des chaînes résultat dans les cellules
' Si lors de la distribution des valeurs sont inscrites dans les cellules des résultats
' Excel affiche un message d'avertissement pour informer que des valeurs seront écrasées.
' L'affichage de ce message est désactivé, les données sont inscrites sans autre précaution.
 Application.DisplayAlerts = False
       
 ' La plage des résultats est posée
  Set rngPlageRes = .Offset(1, 0).Resize(oColl.Count, 1)
 ' Les données y sont déposées
  rngPlageRes.Value = oDat
 ' Puis les données sont distribuées dans les colonnes adjacentes
 For Each oCel In rngPlageRes.Cells
       
    oCel.TextToColumns Destination:=oCel.Offset(0, 1), DataType:=xlDelimited, consecutivedelimiter:=True, semicolon:=True
         
 Next
 

Plus de détails suivront si tu as besoin d'explications. Pour l'heure ce brouillon devrait être une piste à suivre.

Cordialement,

Guy

P.S. J'ai monté ce classeur avec Excel 2010. M'avertir si il ne s'affiche pas correctement dans une version antérieure, sait-on jamais.


Pièce jointe:
xls jad73_test_Mod.xls   [ Taille: 46.50 Ko - Téléchargements: 459 ]

Hors Ligne
Rapport   Haut 

Re: DECALER
#5
Régulier XLPages

Inscription: 31/12/2008

Messages: 55

Système d'exploitation:
PC
Version Excel utilisée:
excel 2003
Posté le : 05-10-2010 17h40
bonjour guy,le forum
n'étant pas très doué en vba je suppose qu'il fallait recopier les ligne de ton code dans le mien;c'est ce que j'ai fait,j'ai gardé les anciennes lignes avec un ' devant
lorsque je clique sur calcul j'ai un message avec"erreur de compilation,variable non définie",la ligne "bs = -1" est en bleu.
voici le code:
Sub toto_1(cible As Range, data As Range, tmin%, tmax%)
Dim mgPlageRes As Range
'Dim oDat(), v#, n%, dn%, bs%, i&, j%, tmp#, s$, oCel As Range, oColl As New Collection
  bs = -1
  For Each oCel In data
    If Not IsEmpty(oCel) Then bs = bs + 1: ReDim Preserve oDat(bs): oDat(bs) = oCel.Value
  Next oCel
  tmax = WorksheetFunction.Min(bs, Abs(tmax) - bs * (tmax = 0))
  tmin = WorksheetFunction.Min(tmax, WorksheetFunction.Max(1, tmin))
  With cible
    v = Round(cible.Value, 5)
    If Not IsEmpty(.Offset(1, 0)) Then .Offset(1, 0).Resize(.End(xlDown).Row - 1, 1).ClearContents
    If bs > -1 Then
      For i = 0 To bs - 1
        For j = i + 1 To bs
          If oDat(i) < oDat(j) Then tmp = oDat(i): oDat(i) = oDat(j): oDat(j) = tmp
        Next j
      Next i
      For i = 0 To 2 ^ (bs + 1) - 1
        tmp = 0
        n = 0
        For j = 0 To bs
          dn = i \ (2 ^ j) Mod 2
          tmp = tmp + oDat(j) * dn
          n = n + dn
        Next j
        If Round(tmp, 5) = v Then
            If (tmin <= n) * (n <= tmax) Then
            s = "="
            For j = 0 To bs
            s = s & IIf(i \ (2 ^ j) Mod 2, oDat(j) & ";", "")
            's = s & IIf(i \ (2 ^ j) Mod 2, oDat(j) & "+", "")
            Next j
            Application.DisplayAlerts = False
            On Error Resume Next
            'plage des résultats est posée
            Set mgPlageRes = .Offset(1, 0).Resize(oColl.Count, 1)
            'oColl.Add Item:=Left$(s, Len(s) - 1), Key:=Left$(s, Len(s) - 1)
            'les données y sont déposées
             mgPlageRes.Value = oDat
            'les données sont distribuées dans les colonnes adjacentes
             For Each oCel In mgPlageRes.Cells
              oCel.TextToColumns Destination:=oCel.Offset(0, 1), DataType:=xlDelimited, consecutivedelimiter:=True, semicolon:=True
           
            On Error GoTo 0
          End If
        End If
      Next i
      If oColl.Count Then
        ReDim oDat(1 To oColl.Count, 0)
        For i = 1 To oColl.Count
          oDat(i, 0) = oColl(i)
        Next i
        .Offset(1, 0).Resize(oColl.Count, 1).Value = oDat
      End If
    End If
  End With
End Sub

Private Sub CommandButton1_Click()
  'Syntaxe :
  'toto_1 Cellule contenant le nombre à atteindre, Zone des données, Nb.minimum de termes, Nb.maximum de termes
  toto_1 [J1], Range("A5:H6"), [B2], [B3]
End Sub

'Private Sub Worksheet_Change(ByVal Target As Range)
'  If Target.Address(0, 0) = "N1" Then toto
'End Sub

merci



Hors Ligne
Rapport   Haut 

Re: DECALER
#6
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 05-10-2010 23h46
Bonjour jad73,

Quelques points importants :
  1. Pourrais-tu utiliser l'éditeur de code soit le petit icône Excel ci-haut juste à côté du smiley sourire
  2. Tu as copié le code mais de travers. Je vois bien que tu n'es pas familier avec VBA alors allons doucement. N'utilise pas ton fichier original en y copiant le code mais plutôt le classeur que je t'ai envoyé. Les choses tomberont en place plus facilement. Ainsi l'erreur
    bs = -1
causée par le masquage de la déclaration
'Dim oDat(), v#, n%, dn%, bs%, i&, j%, tmp#, s$, oCel As Range, oColl As New Collection
ne devrait pas avoir eu lieu. Donc n'utilise que le classeur envoyé, pas de copier/coller sinon ce sera la galère. Fais rouler jad73_test_Mod.xls pas autre chose et si tu modifies, modifie ce fichier. On s'y retrouvera plus facilement.


Enfin, pourrais-tu expliquer avec des mots ce que ta procédure bricole au juste

Cordialement,

Guy





Hors Ligne
Rapport   Haut 

Re: DECALER
#7
Régulier XLPages

Inscription: 31/12/2008

Messages: 55

Système d'exploitation:
PC
Version Excel utilisée:
excel 2003
Posté le : 06-10-2010 16h01
bonjour guy,le forum
milles excuses guy,je n'avais pas fait attention au fichier joint,je l'ai ouvert et c'est parfait,juste ce qu'il me fallait,merci.
quand au but du programme c'est a partir d'une serie de chiffres(A5:H6) obtenir des combinaisons qui totalise la somme du critere(J1) avec pour longueur les criteres(B2 a B3).Les combinaisons étant en K2 je peux maintenant essayer d'adapter d'autres programmes pour éliminer les doublons,supprimer les combinaisons qui ont suivant leur longueur 4,5 ou 6 chiffres identiques.
Merci encore

Hors Ligne
Rapport   Haut 

Re: DECALER
#8
Régulier XLPages

Inscription: 31/12/2008

Messages: 55

Système d'exploitation:
PC
Version Excel utilisée:
excel 2003
Posté le : 06-10-2010 22h11
bonjour guy,le forum
j'ai un petit problème c'est que quand je fais un deuxieme calcul avec des combinaisons de longueur différentes, les anciennes données ne sont pas éffacees.
Que faut-il ajouter dans le code.
merci

Hors Ligne
Rapport   Haut 

Re: DECALER
#9
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 07-10-2010 00h12
Bonjour jad73,

Il aurait été indiqué de me fournir un petit classeur exemple mais, bon, j'y ai été au pifomètre avec quelques hypothèses. À savoir :
  • La cellule I2 sous le bouton est libre
  • Il n'y aura pas plus de 9 colonnes occupées par les données primaires (A:H)
J'ai donc codé en littéral Range("I2") entre autres alors si tu déplaces ou modifies le nombre de colonnes il faudra modifier le code en conséquence. En passant j'aurais pu nommer I2 et ainsi t'épargner des corrections dans le code. Je te laisse le plaisir de découvrir qu'une plage nommée se déplace automatiquement à tout ajout de lignes ou de colonnes. Excel se charge sans peine de garder les références au bon endroit.

Alors voilà un petit classeur où la plage des résultats est effacée à chaque calcul.

Cordialement,

Guy

Pièce jointe:
xls Classeur_Modifié_bis.xls   [ Taille: 45.00 Ko - Téléchargements: 520 ]
Edité par Guy le 07/10/2010 01:27:54

Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes