Dépassement de capacité

Résolu
freizetagada Messages postés 16 Statut Membre -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai trois colonnes (SI1, SI2, SI3). J'ai une procédure qui me calcule la répartition en poucentage.
Voici mon code :
Dim NewSheet16 As Worksheet  
Set NewSheet16 = Worksheets.Add  
NewSheet16.name = "PSI"  
req = "SELECT details.COUNTRY, CEDANTNAME, LOB, CRESTA, SUM(SI1) AS SI1, SUM(SI2) AS SI2, SUM(SI3) AS SI3 FROM DETAILS INNER JOIN CEDANT ON details.CEDANTID = cedant.CEDANTID INNER JOIN OCCUPANCY ON details.OCCID = occupancy.OCCID WHERE details.COUNTRY = '" & country & "' AND CEDANTNAME = '" & cedant & "' AND LOB = '" & lob & "' GROUP BY details.COUNTRY, CRESTA, CEDANTNAME, LOB"  
Call data(req, "PSI")  
Call percent(5, "PSI", Total(5, "PSI"))  
Call percent(6, "PSI", Total(6, "PSI"))  
Call percent(7, "PSI", Total(7, "PSI"))  
Call percent(8, "PSI", Total(8, "PSI"))


Et maintenant voici ma fonction total et ma procédure percent :

Public Function Total(ByVal j As Integer, ByVal sheet As String) As Double  
      
    Dim tem As String  
    Dim i As Integer  
    Dim tot As Double  
      
    i = 2  
    tem = Range("A2").Value  
    tot = 0  
      
    Do While tem <> ""  
        tot = tot + Worksheets(sheet).Cells(i, j).Value  
        i = i + 1  
        tem = Range("A" & i).Value  
    Loop  
      
    Total = tot  
      
End Function  

Public Sub percent(ByVal j As Integer, ByVal sheet As String, ByVal Total As Double)  
      
    Dim tem As String  
    Dim i As Integer  
      
    i = 2  
    tem = Range("A2").Value  
      
    Do While tem <> ""  
        Worksheets(sheet).Cells(i, j).Value = Worksheets(sheet).Cells(i, j).Value / Total  
        i = i + 1  
        tem = Range("A" & i).Value  
    Loop  
      
End Sub


Le problème c'est que lorsque que la colonne SI3 est vide, l'erreur 6 dépacement de capacité se produit au moment de l'exécution de la procédure percent. Auriez-vous une idée pour pallier ce problème ?
Merci !

3 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    comme tu n'as pas mis la fonction data, difficile de dire son résultat si SI3 est vide... et je n'ai pas vu son implication avec les fonction Total ou percent....
    alors peut-^tre...en excluant SI3 au départ ??

    à tout hasard
    as tu essayé de mettre la condition SI3 dans la requete ?

    where.... and SI3<>"" par ex
    0
  2. freizetagada Messages postés 16 Statut Membre
     
    Si je rajoute cette condition cela ne me sélectionnera pas les lignes où SI3 est vide or sur ces lignes là SI1 et SI2 ne le sont pas. Il y a toujours au moins une des trois valeurs qui n'est pas vide.

    Voici ma procédure data qui me permet de récupérer les données sur la nouvelle feuille Excel:

    Public Sub data(ByVal req As String, ByVal sheet As String)
        
        Set cnn = New ADODB.Connection
        Set rs = New ADODB.Recordset
        
        cnn.Open "DRIVER=SQL Server;SERVER=xxxxxx;UID=xxxxx;APP=2007 Microsoft Office system;WSID=xxxxx;DATABASE=XXXXX;Trusted_Connection=Yes"
        rs.Open Source:=req, ActiveConnection:=cnn, CursorType:=adOpenDynamic, LockType:=adLockReadOnly, Options:=adCmdText
        
        Worksheets(sheet).Range("A1").Activate
            
        With ActiveSheet.QueryTables.Add(Connection:=rs, Destination:=Range("A1"))
            .Name = "Querry"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = True
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .PreserveColumnInfo = True
            .Refresh BackgroundQuery:=False
        End With
        
        rs.Close
        cnn.Close
        
    End Sub
    0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    re,

    lorsque SI3=0 , la fonction Total(7, "PSI") renvoie 0

    et dans la fonction percent(7, "PSI", Total(7, "PSI")) Total(7, "PSI") est égal à zéro
    et donc dans
    Worksheets(sheet).Cells(i, j).Value / Total , tu divises par zéro

    ce que je ne comprend pas , c'est "dépassement de capacité alors que sous l'essai ci dessous j'ai "division par zéro"

    Function xxxx(nbre)
    xxxx = 2 / nbre
    End Function

    Sub test()
    xxxx (0)
    End Sub

    donc, je sèche ! pour ma part j'essaierais de prendre en compte la valeur zéro
    dans le genre if total=0 mais ce n'est qu'un avis
    Désolé de ne pouvoir pas mieux t'aider

    une petite remarque au passage sur la fonction data
    comme tu instancie par new, il faut que tu supprimes la requete et la connexion
    par
    set rs=nothing
    set cnn=nothing
    sinon elles existent toujours en mémoire

    Quant à la restitution dans "PSI",
    j'aurais écris
    ActiveSheet.range("A1").CopyFromRecordset rs
    au lieu d'utiliser querytable
    pareil, ce n'est qu'un avis !

    Michel
    0
    1. freizetagada Messages postés 16 Statut Membre
       
      J'ai rajouté une condition au calcul du pourcentage si total <> 0 et je n'ai plus d'erreur.
      Je ne comprends pas non plus pourquoi j'avais l'erreur dépassement de capacité au lieu de division par 0 car même si la colonne était totalement vide lorsque j'affichais le résultat de la fonction total dans un msgbox j'obtenais 0..

      Une petite question pour le set rs et set cnn je doit le mettre avant ou après les instructions rs.close et cnn.close ?

      Je ne connaissais pas la méthode CopyFromRecordset mais je vais l'appliquer !

      Merci pour ces remarques :)

      Et j'ai une autre question si ça ne vous dérange pas, j'ai des numéros de départements et le problème c'est que pour les départements 1 à 9 il n'y a pas le 0 devant. Or pour plus tard j'aurai besoin du 0 devant pour faire un lien avec un logiciel de cartographie. Sauf que quand je fais

      If Worksheets(sheet).Cells(i, j).Value = "1" Then Worksheets(sheet).celss(i, j).Value = "01"


      J'ai ensuite dans mon fichier Excel uniquement la valeur "1" qui apparait au format nombre (à l'origine la cellule est au format text) comment faire pour conserver le format et qu'apparaisse donc "01" ?
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      re,
      nothing après close

      pour l'éternelle histoire du zéro devant
      sur un classeur, tu fais une tite maquette
      Sub xxxx()
      Range("B4") = "'" & Format(Range("B4"), "00") lire "guillemet-apostrophe-guillemet
      End Sub


      tu auras en B4 '07
      et pour tester
      dans une cellule 07 sans l'apostrophe
      =(B4="07") te retourne "vrai"
      et
      ,=nbcar(B4) retourne 2
      0