Résolu Aide VBA

oozenot

Expert
Bonjour,

J'essaie, tant bien que mal, de trouver une solution au problème suivant:

Je dispose d'un tableau Excel dans lequel j'ai une colonne date et une colonne montant (parmi d'autres ^^)

je souhaite que lorsque l'on compare la date de la colonne date avec une date stocké dans y et que la condition est respectée, il retienne la ligne et aille me copier la cellule de la colonne "montant" située sur cette même ligne dans un autre cellule d'une autre feuille.

Suis-je clair ?

j'ai réussi à exprimer la logique via et à donner mes conditions via
Select case....
Case...
...
End select

Mon code ne bug pas... mais il ne copie rien !!!!
un code inutile quoi !!

il y aurais t'il une âme charitable qui veuille bien m'éclairer ?

ci dessous le code
(je pense que ma méthode de copie n'est pas bonne.. mais en utilisant Range, rien ne se passe non plus...du moins, quand c'est moi qui les utilise ^^)


[cpp]
Dim A, D, R As Worksheet
Dim I, J, K, L As Date
Dim g, e, h As Long
Dim iD, iA As Long


Set A = Worksheets("Age Analysis")
Set R = Worksheets("Results")

iA = 1
g = 0
h = 0


I = DateAdd("m", -3, y)
J = DateAdd("m", -6, y)
K = DateAdd("m", -9, y)
L = DateAdd("m", -12, y)

Select Case I & J & K & L
Case ActiveSheet.Cells(iD, 7).Value >= I
Cells(iD, 13).Value.Select
Selection.Copy
A.Cells(iA, 1).Paste
A.Cells(iA, 1).Value = e
g = g e 'g permet de stocker la somme
h = h 1 'compte le nombre d'operations passe entre les dates definies
iA = iA 1
R.Cells(10, 6).Value = g 'affiche la somme dans la cellule de la feuille Results
R.Cells(10, 5).Value = h 'affiche le nombre d'opérations dans la cellulle de la feuille results

Case I > ActiveSheet.Cells(iD, 7).Value >= J
Cells(iD, 13).Value.Select
Selection.Copy
A.Cells(iA, 1).Paste
A.Cells(iA, 1).Value = e
g = g e 'g permet de stocker la somme
h = h 1 'compte le nombre d'operations passe entre les dates definies
iA = iA 1
R.Cells(9, 6).Value = g 'affiche la somme dans la cellule de la feuille Results
R.Cells(9, 5).Value = h 'affiche le nombre d'opérations dans la cellulle de la feuille results

etc....

End Select


Next[/cpp]
 

zeb

Modérateur
Salut,

Ton code est plus qu'inutile, il est faux !
Reposte-le nous, sans les html-entities et avec les caractères qui semblent manquer aux lignes 26, 27, 28, etc.

Il semble y avoir à la fois de très bonnes choses là-dedans, et de très mauvaises.
:o
 

oozenot

Expert
salut zeb,

Il semble y avoir à la fois de très bonnes choses là-dedans, et de très mauvaises.
, je m'en doutais !!! ;)

en effet je n'avais pas vu que mon code avait été modifié lorsque je l'ai posté....

j'ai un peu avancé (enlever quelques trucs horribles tel les .paste !!!)

voici donc le code. (je le poste en entier cette fois ci.. quitte a prendre une page:

[cpp]

Dim A, D, R As Worksheet
Dim I, J, K, L As Date
Dim g, e, h As Long
Dim iD, iA As Long


Set A = Worksheets("Age Analysis")
Set R = Worksheets("Results")

iA = 1
g = 0
h = 0


I = DateAdd("m", -3, y)
J = DateAdd("m", -6, y)
K = DateAdd("m", -9, y)
L = DateAdd("m", -12, y)


Sheets("Debit").Select
For iD = 2 To 65536
Select Case I & J & K & L
Case ActiveSheet.Cells(iD, 7).Value >= I
ActiveSheet.Range(iD & ";" & 13).Copy A.Cells(iA, 1)
e = A.Cells(iA, 1)
g = g + e 'g permet de stocker la somme
h = h + 1 'compte le nombre d'operations passe entre les dates definies
iA = iA + 1
R.Cells(10, 6).Value = g 'affiche la somme dans la cellule de la feuille Results
R.Cells(10, 5).Value = h 'affiche le nombre de date dans la cellulle de la feuille results

Case I > ActiveSheet.Cells(iD, 7).Value >= J
ActiveSheet.Range(iD & ";" & 13).Copy A.Cells(iA, 1)
e = A.Cells(iA, 1)
g = g + e 'g permet de stocker la somme
h = h + 1 'compte le nombre d'operations passe entre les dates definies
iA = iA + 1
R.Cells(9, 6).Value = g 'affiche la somme dans la cellule de la feuille Results
R.Cells(9, 5).Value = h 'affiche le nombre de date dans la cellulle de la feuille results

Case J > ActiveSheet.Cells(iD, 7).Value >= K
ActiveSheet.Range(iD & ";" & 13).Copy A.Cells(iA, 1)
e = A.Cells(iA, 1)
g = g + e 'g permet de stocker la somme
h = h + 1 'compte le nombre d'operations passe entre les dates definies
iA = iA + 1
R.Cells(8, 6).Value = g 'affiche la somme dans la cellule de la feuille Results
R.Cells(8, 5).Value = h 'affiche le nombre de date dans la cellulle de la feuille results

Case K > ActiveSheet.Cells(iD, 7).Value >= L
ActiveSheet.Range(iD & ";" & 13).Copy A.Cells(iA, 1)
e = A.Cells(iA, 1)
g = g + e 'g permet de stocker la somme
h = h + 1 'compte le nombre d'operations passe entre les dates definies
iA = iA + 1
R.Cells(7, 6).Value = g 'affiche la somme dans la cellule de la feuille Results
R.Cells(7, 5).Value = h 'affiche le nombre de date dans la cellulle de la feuille results

Case ActiveSheet.Cells(iD, 7).Value < L
ActiveSheet.Range(iD & ";" & 13).Copy A.Cells(iA, 1)
e = A.Cells(iA, 1)
g = g + e 'g permet de stocker la somme
h = h + 1 'compte le nombre d'operations passe entre les dates definies
iA = iA + 1
R.Cells(6, 6).Value = g 'affiche la somme dans la cellule de la feuille Results
R.Cells(6, 5).Value = h 'affiche le nombre de date dans la cellulle de la feuille results

End Select


Next

[/cpp]


voilà, je pense que cette fois ci le code s'est affiché correctement.
 

zeb

Modérateur
Yep, maintenant, on va pouvoir t'aider. :)

Alors d'abord, ligne 7 et 8, c'est très bien. Ainsi on pourra faire référence à nos deux feuilles. Sauf que ligne 21, au lieu de faire pareil, tu préfères activer la feuille "D" plutôt que de rester sur la même logique. Dommage. A chaque fois que je vois un Selection et/ou un ActiveTruc, ça me hérisse le poil.

Ensuite, entre chaque clause Case, tu réécris la même chose, à une toute petite et légère différence.

Puis il va falloir réviser le fontionnement de Select Case. Mais on verra ça après.

Factorisons ton code :
Code:
Dim A, D, R    As Worksheet
Dim I, J, K, L As Date
Dim g, e, h    As Long
Dim iD, iA     As Long

Dim ligne      As Long
         
Set A = Worksheets("Age Analysis" )
Set R = Worksheets("Results" )
Set D = Worksheets("Debit" )
     
iA = 1
g = 0
h = 0
     
I = DateAdd("m", -3, y)
J = DateAdd("m", -6, y)
K = DateAdd("m", -9, y)
L = DateAdd("m", -12, y)
   
For iD = 2 To 65536
    Select Case I & J & K & L
        Case D.Cells(iD, 7).Value >= I
            ligne = 10
        Case I > D.Cells(iD, 7).Value >= J
            ligne = 9
        Case J > D.Cells(iD, 7).Value >= K
            ligne = 8
        Case K > D.Cells(iD, 7).Value >= L
            ligne = 7
        Case D.Cells(iD, 7).Value < L
            ligne = 6
        Case Else
            ligne = -1
    End Select

    If ligne > -1 Then
        D.Range(iD & ";" & 13).Copy A.Cells(iA, 1).Value
        e = A.Cells(iA, 1).Value
        g = g + e  ' // g permet de stocker la somme
        h = h + 1  ' // compte le nombre d'operations passe entre les dates definies
        iA = iA + 1
        R.Cells(ligne, 6).Value = g ' // affiche la somme dans la cellule de la feuille Results
        R.Cells(ligne, 5).Value = h ' // affiche le nombre de date dans la cellulle de la feuille results
    End IF
Next

Donc c'est factorisé, j'ai ajouté deux/trois bricoles pour faire joli.
Mais ça ne marche toujours pas.

Ben non ! C'est quoi ce massacre au Select Case ?

Tiens, juste pour le plaisir, affiche ta ligne 23 :
Code:
MsgBox I & J & K & L
:pfff:
Voici la bonne syntaxe :
Code:
Select Case D.Cells(iD, 7).Value
    Case Is >= I
        ligne = 10
    Case Is >= J
        ligne = 9
    Case Is >= K
        ligne = 8
    Case Is >= L
        ligne = 7
    Case Is < L
        ligne = 6
    Case Else
        ligne = -1
End Select
A part qu'on voit tout de suite qu'il faut prendre le problème à l'envers :
Code:
Select Case D.Cells(iD, 7).Value
    Case Is < L: ligne = 6
    Case Is >= L: ligne = 7
    Case Is >= K: ligne = 8
    Case Is >= J : ligne = 9
    Case Is >= I: ligne = 10
End Select
Et la clause Case Else disparaît parce qu'on a traité tous les cas.
Ton code devient :
Code:
Dim A, D, R As Worksheet
Dim g, e, h As Long
Dim iD, iA As Long
Dim ligne      As Long
         
Set A = Worksheets("Age Analysis" )
Set R = Worksheets("Results" )
Set D = Worksheets("Debit" )
     
iA = 1
g = 0
h = 0
     
For iD = 2 To 65536
    Select Case CDate(D.Cells(iD, 7).Value)
        Case Is >= DateAdd("m", -12, y): ligne = 7
        Case Is >= DateAdd("m", -9, y): ligne = 8
        Case Is >= DateAdd("m", -6, y): ligne = 9
        Case Is >= DateAdd("m", -3, y): ligne = 10
        Case Else: ligne = 6
    End Select
    e = D.Range(iD & ";" & 13).Value
    A.Cells(iA, 1).Value = e
    g = g + e  ' // g permet de stocker la somme
    h = h + 1  ' // compte le nombre d'operations passe entre les dates definies
    iA = iA + 1
    R.Cells(ligne, 6).Value = g ' // affiche la somme dans la cellule de la feuille Results
    R.Cells(ligne, 5).Value = h ' // affiche le nombre de date dans la cellulle de la feuille results
Next
Et la clause Case Else réapparaît :)
EDIT: relire la ligne 23. [:patch]
 

oozenot

Expert
Ah oui quand même !!!

c'est de la méga factorisation là !!
(merci pour le select case, je ne soupçonnait pas du tout cette erreur !!!)
Et il marche selon le même principe que les If en cascade alors...
merci.

je teste de suite et je reviens ....

Mais en tout cas Merci beaucoup !!!!
 

oozenot

Expert
bon, alors en fait, le debogeur bloque à la ligne 23 de ton dernier programme:

"erreur 1004 définie par l'application ou par l'objet"

Et j'ai bien compris les conditions pour le select case, je te remercie de m'avoir éclairé ^^

pourtant, la variable est bien déclarée.... serai-ce le Range qui bloque ?
 

oozenot

Expert
complément d'information, quand je survole la ligne où il bloque, il me met: e=vide...

oserai-je demander quelques autres conseils éclairé ???
 

oozenot

Expert
merci !!!!

bon, maintenant j'ai voulu remplacer les numeros de colonnes par une variable aui enregistre le resultat d'une imputbox.
le probleme c'est que quand je met la variable a la place du 7 (ligne 15) il me met erreur : 1004, application ou objet non defini !!

j'ai pas de chance avec les erreurs 1004 !!!!

serai-ce parceque Cells() ne peut pas prendre en compte de variables ?
 

oozenot

Expert
et pourrais-je te demander aussi d'expliquer la modification que tu as faite ligne 23... (pourquoi....., toujours pourquoi ^^)

PS: je poste le code complet .. les erreurs sont ligne 56 et 73...

[cpp]

Dim datevaleur, colmontant, numcolonne As String
Dim y As Date
Dim A, D, R, M, C As Worksheet
Dim g, e, h, iD, iA, iC, iM, ligne, vd, aie As Long

Set A = Worksheets("Age Analysis")
Set R = Worksheets("Results")
Set D = Worksheets("Debit")
Set M = Worksheets("Sheet1")
Set C = Worksheets("Credit")

iA = 1
iC = 2
iD = 2
g = 0
h = 0
e = 0

datevaleur = Application.InputBox("Please, write the Value Date of the Age Analysis (dd/mm/yyyy) :", "Date of reference for the Age Analysis ")
If IsDate(datevaleur) Then
y = CDate(datevaleur)
MsgBox "You've written the value date :" & y, vbOKCancel
If VB = yes Then
numcolonne = Application.InputBox("Please enter the date column number for the date comparison :", " Column number's reference")
If FormatNumber(numcolonne) Then
vd = numcolonne
MsgBox "You've entered column :" & vd, vbOKCancel
If VB = yes Then
colmontant = Application.InputBox("Please enter the Amount column number :", " Column number ")
If FormatNumber(colmontant) Then
aie = colmontant
MsgBox "You've entered column :" & aie, vbOKCancel
If VB = yes Then
M.Cells.AutoFilter
M.Cells.EntireColumn.AutoFit
For iM = 1 To 65536
If M.Cells.Text = "Credit" Then
M.Range(iM & ":" & iM).Copy C.Cells(iC, 1)
iC = iC + 1
ElseIf M.Cells.Text = "Debit" Then
M.Range(iM & ":" & iM).Copy D.Cells(iD, 1)
iD = iD + 1
End If
Next

M.Rows("1:1").Copy D.Rows("1:1")
M.Rows("1:1").Copy C.Rows("1:1")
C.Columns("G:G").NumberFormat = "d/m/yyyy"
D.Columns("G:G").NumberFormat = "d/m/yyyy"
C.Cells.AutoFilter
C.Cells.EntireColumn.AutoFit
D.Cells.AutoFilter
D.Cells.EntireColumn.AutoFit

For iD = 2 To 65536
Select Case CDate((D.Cells(iD, vd).Value))
Case Is >= DateAdd("m", -12, y): ligne = 7
Case Is >= DateAdd("m", -9, y): ligne = 8
Case Is >= DateAdd("m", -6, y): ligne = 9
Case Is >= DateAdd("m", -3, y): ligne = 10
Case Else: ligne = 6
End Select
e = D.Range(iD & ";" & aie).Value
A.Cells(iA, 1).Value = e
g = g + e ' // g permet de stocker la somme
h = h + 1 ' // compte le nombre d'operations passe entre les dates definies
iA = iA + 1
R.Cells(ligne, 6).Value = g ' // affiche la somme dans la cellule de la feuille Results
R.Cells(ligne, 5).Value = h ' // affiche le nombre de date dans la cellulle de la feuille results
Next

For iC = 2 To 65536
Select Case CDate((C.Cells(iC, vd).Value))
Case Is >= DateAdd("m", -12, y): ligne = 7
Case Is >= DateAdd("m", -9, y): ligne = 8
Case Is >= DateAdd("m", -6, y): ligne = 9
Case Is >= DateAdd("m", -3, y): ligne = 10
Case Else: ligne = 6
End Select
e = C.Range(iC & ";" & aie).Value
A.Cells(iA, 2).Value = e
g = g + e ' // g permet de stocker la somme
h = h + 1 ' // compte le nombre d'operations passe entre les dates definies
iA = iA + 1
R.Cells(ligne, 6).Value = g ' // affiche la somme dans la cellule de la feuille Results
R.Cells(ligne, 5).Value = h ' // affiche le nombre de date dans la cellulle de la feuille results
Next

Else: MsgBox "You have interrupted the Age Analysis. ", vbExclamation
End If
Else: MsgBox "You have not written a Number !", vbExclamation
End If
Else: MsgBox "You have interrupted the Age Analysis. ", vbExclamation
End If
Else: MsgBox "You have not written a number !", vbExclamation
End If
Else: MsgBox "You have interrupted the Age Analysis. ", vbExclamation
End If
Else: MsgBox "You have not written a date !", vbExclamation
End If

[/cpp]
 

oozenot

Expert
bon, je pense avoir resolu le probleme des variables en changant le format...
j'ai inserer 2 nouvelles variables : ivb et iaie (format nombre)

par contre, autre probleme !!!!!
ca ne finira donc jamais !!!!!
ligne 80 !!! -> je suppose que c'est parceque la variable "e" est utilisee 2 fois de suite ?
 

oozenot

Expert
en fait, ligne 63 aussi !!! donc ce n'est pas un problème de doublons !!!

bon, je re-poste le code....

[cpp]

Dim datevaleur, colmontant, numcolonne, vd, aie As String
Dim y As Date
Dim A, D, R, M, C As Worksheet
Dim g, e, h, iD, iA, iC, iM, ligne, ivd, iaie As Long

Set A = Worksheets("Age Analysis")
Set R = Worksheets("Results")
Set D = Worksheets("Debit")
Set M = Worksheets("Sheet1")
Set C = Worksheets("Credit")

iA = 1
iC = 2
iD = 2
g = 0
h = 0
e = 0

datevaleur = Application.InputBox("Please, write the Value Date of the Age Analysis (dd/mm/yyyy) :", "Date of reference for the Age Analysis ")
If IsDate(datevaleur) Then
y = CDate(datevaleur)
MsgBox "You've written the value date :" & y, vbOKCancel
If VB = yes Then
numcolonne = Application.InputBox("Please enter the date column number for the date comparison :", " Column number's reference")
If FormatNumber(numcolonne) Then
vd = numcolonne
MsgBox "You've entered column :" & vd, vbOKCancel
If VB = yes Then
colmontant = Application.InputBox("Please enter the Amount column number :", " Column number ")
If FormatNumber(colmontant) Then
aie = colmontant
MsgBox "You've entered column :" & aie, vbOKCancel
If VB = yes Then
M.Cells.AutoFilter
M.Cells.EntireColumn.AutoFit
For iM = 1 To 65536
If M.Cells.Text = "Credit" Then
M.Range(iM & ":" & iM).Copy C.Cells(iC, 1)
iC = iC + 1
ElseIf M.Cells.Text = "Debit" Then
M.Range(iM & ":" & iM).Copy D.Cells(iD, 1)
iD = iD + 1
End If
Next

M.Rows("1:1").Copy D.Rows("1:1")
M.Rows("1:1").Copy C.Rows("1:1")
C.Columns("G:G").NumberFormat = "d/m/yyyy"
D.Columns("G:G").NumberFormat = "d/m/yyyy"
C.Cells.AutoFilter
C.Cells.EntireColumn.AutoFit
D.Cells.AutoFilter
D.Cells.EntireColumn.AutoFit
ivd = FormatNumber(vd)
iae = FormatNumber(aie)

For iD = 2 To 65536
Select Case CDate(D.Cells(iD, ivd).Value)
Case Is >= DateAdd("m", -12, y): ligne = 7
Case Is >= DateAdd("m", -9, y): ligne = 8
Case Is >= DateAdd("m", -6, y): ligne = 9
Case Is >= DateAdd("m", -3, y): ligne = 10
Case Else: ligne = 6
End Select
e = D.Range(iD & ";" & iaie).Value
A.Cells(iA, 1).Value = e
g = g + e ' // g permet de stocker la somme
h = h + 1 ' // compte le nombre d'operations passe entre les dates definies
iA = iA + 1
R.Cells(ligne, 6).Value = g ' // affiche la somme dans la cellule de la feuille Results
R.Cells(ligne, 5).Value = h ' // affiche le nombre de date dans la cellulle de la feuille results
Next

For iC = 2 To 65536
Select Case CDate(C.Cells(iC, ivd).Value)
Case Is >= DateAdd("m", -12, y): ligne = 7
Case Is >= DateAdd("m", -9, y): ligne = 8
Case Is >= DateAdd("m", -6, y): ligne = 9
Case Is >= DateAdd("m", -3, y): ligne = 10
Case Else: ligne = 6
End Select
e = C.Range(iC & ";" & iaie).Value
A.Cells(iA, 2).Value = e
g = g + e ' // g permet de stocker la somme
h = h + 1 ' // compte le nombre d'operations passe entre les dates definies
iA = iA + 1
R.Cells(ligne, 6).Value = g ' // affiche la somme dans la cellule de la feuille Results
R.Cells(ligne, 5).Value = h ' // affiche le nombre de date dans la cellulle de la feuille results
Next

Else: MsgBox "You have interrupted the Age Analysis. ", vbExclamation
End If
Else: MsgBox "You have not written a Number !", vbExclamation
End If
Else: MsgBox "You have interrupted the Age Analysis. ", vbExclamation
End If
Else: MsgBox "You have not written a number !", vbExclamation
End If
Else: MsgBox "You have interrupted the Age Analysis. ", vbExclamation
End If
Else: MsgBox "You have not written a date !", vbExclamation
End If

[/cpp]

Merci beaucoup zeb de m'avoir aider jusqu'à présent...
 

zeb

Modérateur
Salut,

Je ne t'ai pas abandonné, je prenais de vraies vacances : 4 jours sans téléphone, ni internet :D

Reprenons.
Code:
Dim datevaleur, colmontant, numcolonne, vd, aie As String
Première ligne, première erreur. VB est un langage très laid, qui incite à faire des erreurs. :pfff:

Si tu ne précises pas le type d'une variable, VB considère que c'est un Variant. Ta ligne, devient explicitement :
Code:
Dim datevaleur As Variant, colmontant As Variant, numcolonne As Variant, vd As Variant, aie As String
Je crois que ce n'est pas ce que tu voulais.

Code:
datevaleur = Application.InputBox("Please, write the Value Date of the Age Analysis (dd/mm/yyyy) :", "Date of reference for the Age Analysis " )
MsgBox "You've written the value date :" & y, vbOKCancel
Les "*Box" sont des fonctions de l'objet Application. Mais tu n'es pas obligé de le préciser. Par contre sois logique. Mets-le partout ou nulle part :
Code:
datevaleur = Application.InputBox("Please, write the Value Date of the Age Analysis (dd/mm/yyyy) :", "Date of reference for the Age Analysis " )
Application.MsgBox "You've written the value date :" & y, vbOKCancel
Code:
datevaleur = InputBox("Please, write the Value Date of the Age Analysis (dd/mm/yyyy) :", "Date of reference for the Age Analysis " )
MsgBox "You've written the value date :" & y, vbOKCancel

Qu'est-ce que cette variable VB que tu mets partout ?

Sinon, ohlala !! que c'est pénible ces indentations à n'en plus finir. C'est très académique (on dirait du PASCAL) mais ça en devient illisible.

Je te propose une autre méthode de programmation. Elimine tous les cas particuliers, puis traite le cas général.
Exemple :
Code:
datevaleur = InputBox("Please, write the Value Date of the Age Analysis (dd/mm/yyyy) :", "Date of reference for the Age Analysis " )
If Not IsDate(datevaleur) Then
    // ' Cas particulier : la date n'est pas bien saisie.
    MsgBox "You have not written a date !"
    Exit Sub
End If
// ' On continue
....

Si tu comptes te servir du résultat d'une MsgBox, programme-le comme suit :
Code:
Dim code_retour As VBMsgBoxResult
' // Pour ne pas t'embêter, tu peux utiliser un Long

' // vbOkCancelAbortRetryIgnoreYesNo n'existe pas !
code_retour = MsgBox "Message", vbOkCancelAbortRetryIgnoreYesNo
If code_retour = vbOk Then
Else ...

' // Mieux que les If Then Else imbriqués
Select Case MsgBox "Message", vbOkCancelAbortRetryIgnoreYesNo
    Case vbOk : ' // C'est Ok
    Case vbCancel : ' // Annulé
....
Pour rappel, il ne faut pas oublier que l'utilisateur peut fermer en cliquant sur la croix, au clavier par [Alt-F4]. Pour ne rien oublier, et parce qu'en général, seule une valeur est intéressante, voici encore une autre façon de faire :
Code:
If MsgBox "Message", vbYesNo <> vbYes Then
    ' // Tu veux pas ?
    ' // Alors on s'en va !
    Exit Sub
End If

----------------

Ligne 47
Code:
M.Rows("1:1" )
M'ouais :/ C'est pas faux. Mais c'est moche !
Essaie Rows("1") ou mieux Rows(1). Pareil pour les deux lignes suivantes.

Ligne 65
Code:
e = D.Range(iD & ";" & iaie).Value
Dis donc, tu sais te servir de Cells() alors ne t'embête pas à reconstruire des adresses pour Range() :pfff:

----------------

Bon, sinon il est où ton problème ? :sol:
 

oozenot

Expert
le tel a la limite mais 4 jours sans internet !!! je sais pas comment tu fait, moi je me sens mal.... :D mais c'est vrai que pour le coup ca fait de vrai vacances !!!

bon, par ou je commence !!!!
pendant ces 4 jours j'avais quand meme avance sur le code notamment remplace les range par des cells (et ca marche tout de suite mieux !!) mais pour cela j'ai du insere une variable vb.
en fait, mes colonnes du tableau ont toujours le meme en-tete mais jamais le meme ordr. du coup je n'ai pas trouver de meilleur solution que de dmander a l'utilisateur de donner le numero de la colonne qui m'interesse (stocke dans vb et aie). et comme j'ai besoins de connaitre 5 colonnes du tableau ... d'ou les imputbox a repetition !!

Je pense les eliminees en faisant un userform complet des le debut. maintenant c'est vrai que si excel pouvait se demerder tout seul pour trouver les bonnes colonnes en fonction des en-tetes ca m'arrangerai. je continue de chercher mais je ne trouve pas de solution... du moins, qui marche !!!

et oui... on dirait du pascal !!! c'est vrai que la logique et les fonctions sont tres proches... et comme j'ai ete initie sur du PASCAL...j'ai des restes !!!!!!

je re travaille le code avec ce que tu m'a indique et je le reposte...
je vais y arriver... si si !!


"dsl pour les accents mais c'est pas pratique ces claviers qwerty ..... " ;)
 

zeb

Modérateur
A te lire.

Pour les accents, c'est moche. Mais si tu as une excuse recevable (je n'ai pas dit acceptable :o ), c'est Ok ;)
 

oozenot

Expert
ouf... :D

ah, j'ai aussi oublie de preciser que bien qu'ayant retravailler mon code, jusqu'a present, il n'affiche pas le resultat. enfin si, il affiche les 65536 et des de la boucle for et fait la somme de toute les cases de la colonne indiquee meme si ell contiennent un 0.. ce qui fait que ca rame a mort !!!!
je suis oblige de liberer la memoire a chaque essai !

bref, je commence par simplifier le code, le userform et on vera ce probleme la apres... :cry:
que de patience pour un petit programme de rien du tout :heink:

 

zeb

Modérateur
J'attends de voir ton prochain code :D
Parce que j'ai des choses à te proposer pour sa simplification.
Par exemple, t'es-tu rendu compte que tu parcours 2 fois ta feuille avec les boucles For des lignes 57 et 74, alors que la différence est minime. Y'a du boulot de factorisation énorme à faire ;)
 

oozenot

Expert
oui j'avais vu....
pas etonnant que ca rame... (en meme temps, les ordis du boulo... :sweat: )

pour les factorisation.... suis nul.
je ne connait pas assez le code pour arriver a en faire...
je vais essayer tiens....

je compte sur ta correction et tes conseils !!!
 

oozenot

Expert
bon, je suis de retour...
j'ai un petit peu travailler sur le code.

le voici:

[cpp]

Dim datevaleur As String
Dim colmontant As String
Dim numcolonne As String
Dim debitcred As String
Dim vd As String
Dim aie As String
Dim e As String
Dim y As Date
Dim D As Worksheet
Dim R As Worksheet
Dim M As Worksheet
Dim C As Worksheet
Dim g As Long
Dim h As Long
Dim iD As Long
Dim iC As Long
Dim iM As Long
Dim ligne As Long
Dim ivd As Long
Dim iaie As Long
Dim dc As Long


Set R = Worksheets("Results")
Set D = Worksheets("Debit")
Set M = Worksheets("Sheet1")
Set C = Worksheets("Credit")

iC = 2
iD = 2
g = 0
h = 0
e = 0

datevaleur = InputBox("Please, write the Value Date of the Age Analysis (dd/mm/yyyy) :", "Date of reference for the Age Analysis ")
If Not IsDate(datevaleur) Then ' Cas particulier : la date n'est pas bien saisie.
MsgBox "You have not written a date !"
Exit Sub
End If
numcolonne = InputBox("Please enter the date column number for the date comparison :", " Column number's reference")
If Format(numcolonne) <> Number Then
MsgBox "You have not written a number !"
Exit Sub
End If
colmontant = InputBox("Please enter the Amount column number :", " Column number ")
If Format(colmontant) <> Number Then
MsgBox "You have not written a number !"
Exit Sub
End If
debitcred = InputBox("Please enter the D/C column number :", " Column number ")
If Format(colmontant) <> Number Then
MsgBox "You have not written a number !"
Exit Sub
End If

'UserForm1.Show
MsgBox "You've written the value date :" & y, vbOKCancel
MsgBox "You've entered column :" & vd, vbOKCancel
MsgBox "You've entered column :" & aie, vbOKCancel
MsgBox "You've entered column :" & dc, vbOKCancel

M.Cells.AutoFilter
M.Cells.EntireColumn.AutoFit

For iM = 1 To 65536
If M.Cells(iM, dc).Text = "Credit" Then
M.Range(iM & ":" & iM).Copy C.Cells(iC, 1)
iC = iC + 1
ElseIf M.Cells(iM, dc).Text = "Debit" Then
M.Range(iM & ":" & iM).Copy D.Cells(iD, 1)
iD = iD + 1
End If
Next

M.Rows(1).Copy D.Rows(1)
M.Rows(1).Copy C.Rows(1)
C.Columns("vd:vd").NumberFormat = "d/m/yyyy"
D.Columns("vd:vd").NumberFormat = "d/m/yyyy"
C.Cells.AutoFilter
C.Cells.EntireColumn.AutoFit
D.Cells.AutoFilter
D.Cells.EntireColumn.AutoFit
ivd = FormatNumber(vd)
iaie = FormatNumber(aie)

For iD = 2 To 65536
Select Case CDate(D.Cells(iD, ivd).Value & C.Cells(iC, ivd).Value)
Case Is >= DateAdd("m", -12, y): ligne = 7
Case Is >= DateAdd("m", -9, y): ligne = 8
Case Is >= DateAdd("m", -6, y): ligne = 9
Case Is >= DateAdd("m", -3, y): ligne = 10
Case Else: ligne = 6
End Select
If Cells(iD, iaie).Text <> "" Then
e = D.Cells(iD, iaie).Value
g = g + e ' // g permet de stocker la somme
h = h + 1 ' // compte le nombre d'operations passe entre les dates definies
R.Cells(ligne, 6).Value = g ' // affiche la somme dans la cellule de la feuille Results
R.Cells(ligne, 5).Value = h ' // affiche le nombre de date dans la cellulle de la feuille results
End If
If Cells(iC, iaie).Text <> "" Then
e = C.Cells(iC, iaie).Value
g = g + e ' // g permet de stocker la somme
h = h + 1 ' // compte le nombre d'operations passe entre les dates definies
R.Cells(ligne, 6).Value = g ' // affiche la somme dans la cellule de la feuille Results
R.Cells(ligne, 5).Value = h ' // affiche le nombre de date dans la cellulle de la feuille results
End If
Next

R.PrintPreview
C.PrintPreview
D.PrintPreview
M.PrintPreview

Set wordApp = Nothing 'libère la mémoire

[/cpp]
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 129
Messages
6 717 853
Membres
1 586 373
Dernier membre
https://forum.tomshardwar
Partager cette page
Haut