Erreur inattendue - Exception de HRESULT

Bonjour à tous,

Je suis confronté à un bug que je n'arrive pas à m'expliquer

Voilà j'ai une procédure "Enregistrement" appelée par un bouton, cette procédure enregistre une copie de fichier et l'exporte en PDF

Lorsque je sors en la procédure "End sub", j'ai ce message qui apparait

2018 04 05 05h08 18

Quelqu'un a-t-il déjà rencontré ce genre de truc ?

A+

Bonjour,

Tu peux poster le code pour que l'on puisse tester ?

Bonjour Bruno,

une piste ici:

https://www.codeproject.com/Questions/470089/Exception-from-HRESULT-x-A-EC-Error

Bonne chance!

Bonjour le fil

@Theze : mettre le code est compliqué car j'ai plusieurs sub qui s'imbriquent

@sabV, merci mais cela ne m'apporte rien

En revanche, j'ai pu déterminer la cause de l'erreur

J'utilise cette fonction pour connaitre le nombre de page qui seront imprimées

Function NbPageDoc()
  NbPageDoc = 0
  NbPageDoc = ExecuteExcel4Macro("Get.Document(50)")
End Function

Cette fonction marche très bien dans un classeur, mais pas dans un autre... ah les mystères de l'informatique

Donc maintenant je suis embêté

A+

Bonjour à tous,

@Bruno,

Est ce que tu utilises cette fonction pour connaitre le nombre de page à imprimer pour une seule feuille ou pour plusieurs feuille ?

re,

une possibilité avec PageBreak pour remplacer Get.Document(50)

fichier pour différent test:

Sub Nombrepage_Feuilles_Sélectionnées()
Dim sh As Worksheet
 For Each sh In ActiveWorkbook.Windows(1).SelectedSheets
   n = n + Nombrepage_Feuille(sh.Name)
 Next
MsgBox "Nombre de page(s): " & n
End Sub
page_Feuille = (nbcol + 1) * (nblig + 1)
End Function

Édit:

J'ai modifié la fonction, j'avais oublié quelque cas,

Function Nombrepage_Feuille(Feuille As String)
Dim ligne As Range, col As Range
Dim nblig As Integer, nbcol As Integer, nLgn As Long, nCol As Integer
 With Sheets(Feuille)

   If Application.CountA(.Cells) > 0 Then
     If .UsedRange.Rows.Count > 0 Then nLgn = 1 Else nLgn = 0
     If .UsedRange.Columns.Count > 0 Then nCol = 1 Else nCol = 0
   Else
     nLgn = 0
     nCol = 0
   End If

    For Each ligne In .UsedRange.Rows
     If ligne.PageBreak <> xlNone Then nblig = nblig + 1
    Next

    For Each col In .UsedRange.Columns
     If col.PageBreak <> xlNone Then nbcol = nbcol + 1
    Next
 End With

 Select Case nblig & nbcol & nLgn & nCol
    Case "0000": Nombrepage_Feuille = 0
    Case "0001": Nombrepage_Feuille = 2
    Case "0010": Nombrepage_Feuille = 1
    Case Else: Nombrepage_Feuille = (nbcol + 1) * (nblig + 1)
 End Select
End Function

ps/ c'est pas encourageant de voir que les fonctions ExecuteExcel4Macro sont délaissée par MS

Salut sabV et un grand merci

Je n'avais pas pensé à cette solution, mais elle ne fonctionne pas en l'état

En effet, alors que je n'ai qu'une page à éditer, ça me dit que j'en ai plusieurs

Le retour pour une page est : 1111 ce qui ne correspond pas à ton SELECT CASE

A+

Bonjour à tous,

@Bruno,

si le case est 1111 il devrait être traité par Case Else

est-que tu l'as tester avec la dernière version ?

Bonjour à tous,

je ne me suis pas penché sur le problème proprement dit, je veux juste attirer l'attention sur un pb potentiel avec UsedRange.

Il ne tient pas compte des lignes laissées vides en haut à gauche.

Si j'écris juste en M80 il annonce 1 colonne et 1 ligne, mais excel imprimera 4 pages par défaut...

D'autre part la zone d'impression peut avoir été imposée. Il faudrait en tenir compte si elle existe.

eric

Salut eriic

Bonjour à tous,

je ne me suis pas penché sur le problème proprement dit, je veux juste attirer l'attention sur un pb potentiel avec UsedRange.

Il ne tient pas compte des lignes laissées vides en haut à gauche.

Si j'écris juste en M80 il annonce 1 colonne et 1 ligne, mais excel imprimera 4 pages par défaut...

D'autre part la zone d'impression peut avoir été imposée. Il faudrait se baser sur elle.

eric

Alors pour UsedRange, il ne devrait pas y avoir de problème, car les modifications ne se font que dans une zone bien déterminée

Sinon, effectivement la zone d'impression est imposée, je pourrais me baser dessus

A+

Re sabV

Bonjour à tous,

@Bruno,

si le case est 1111 il devrait être traité par Case Else

est-que tu l'as tester avec la dernière version ?

nombre de pages à imprimer (ver3).xlsm

Voilà le problème avec un fichier joint, cela me dit 2 pages alors que je n'en ai qu'une

A+

Là je viens de me surprendre

Je suis arrivé à ça :

Sub test()
    ActiveSheet.PageSetup.PrintArea = "B8:Z100"
    Debug.Print nbPages(ActiveSheet)
    ActiveSheet.PageSetup.PrintArea = ""
    Debug.Print nbPages(ActiveSheet)
End Sub

Function nbPages(sh As Worksheet) As Long
    nbPages = (sh.VPageBreaks.Count + 1) * (sh.HPageBreaks.Count + 1)
End Function

Qqq chose me dit qu'il doit y avoir une faille mais je ne vois pas.

(à part si l'utilisateur a choisi une option comme Imprimer le classeur entier ou Imprimer la sélection)

eric

Bonjour à tous,

@Eric,

C'est bien vu, c'est pas facile de voir tous les cas de figures,

voici pour la correction avec ces cas ajoutés.

Function Nombrepage_Feuille(Feuille As String)
Dim ligne As Range, col As Range
Dim pbLig As Integer, pbCol As Integer, nLgn As Long, nCol As Integer
 With Sheets(Feuille)
  If .PageSetup.PrintArea <> "" Then
    Set plg = .Range(.PageSetup.PrintArea)
  Else
    Set plg = .Range("A1:" & .Range("A1").SpecialCells(xlCellTypeLastCell).Address)
  End If

   If Application.CountA(plg) > 0 Then
    If plg.Rows.Count > 0 Then nLgn = 1 Else nLgn = 0
    If plg.Columns.Count > 0 Then nCol = 1 Else nCol = 0
   Else
    nLgn = 0
    nCol = 0
   End If

    For Each ligne In plg.Rows
     If ligne.PageBreak <> xlNone Then pbLig = pbLig + 1
    Next

    For Each col In plg.Columns
     If col.PageBreak <> xlNone Then pbCol = pbCol + 1
    Next
 End With

 Select Case pbLig & pbCol & nLgn & nCol
    Case "0000": Nombrepage_Feuille = 0
    Case "0001": Nombrepage_Feuille = 2
    Case "0010": Nombrepage_Feuille = 1
    Case Else: Nombrepage_Feuille = (pbLig + 1) * (pbCol + 1)
 End Select
End Function

@Bruno et Eric,

voici une nouvelle version tenant compte de la page Devis de Bruno,

s.v.p. dites-moi si vous trouvez d'autre cas

@+

Function Nombrepage_Feuille(Feuille As String)
Dim ligne As Range, col As Range
Dim pbLig As Integer, pbCol As Integer, nLgn As Long, nCol As Integer
 With Sheets(Feuille)
  If .PageSetup.PrintArea <> "" Then
    Set plg = .Range(.PageSetup.PrintArea)
  Else
    Set plg = .Range("A1:" & .Range("A1").SpecialCells(xlCellTypeLastCell).Address)
  End If

   If Application.CountA(plg) > 0 Then
    If plg.Rows.Count > 0 Then nLgn = 1 Else nLgn = 0
    If plg.Columns.Count > 0 Then nCol = 1 Else nCol = 0
   Else
    nLgn = 0
    nCol = 0
   End If

    For Each ligne In plg.Rows
     If ligne.PageBreak <> xlNone Then
      If Application.CountA(Range("A1:" & Cells(ligne.Row - 1, ligne.Column).Address)) > 0 Then pbLig = pbLig + 1
     End If
    Next

    For Each col In plg.Columns
     If col.PageBreak <> xlNone Then
      If Application.CountA(Range("A1:" & Cells(col.Row - 1, col.Column).Address)) > 0 Then pbCol = pbCol + 1
     End If
    Next
 End With

 Select Case pbLig & pbCol & nLgn & nCol
    Case "0000": Nombrepage_Feuille = 0
    Case "0001": Nombrepage_Feuille = 2
    Case "0010": Nombrepage_Feuille = 1
    Case Else: Nombrepage_Feuille = (pbLig + 1) * (pbCol + 1)
 End Select
End Function

Tu as vu ma proposition en 1 ligne ?

J'ai peut-être oublié qq chose mais quoi ?

Tu as vu ma proposition en 1 ligne ?

si la zone d'impression est déjà défini, il n'y a plus de problème pour créer les pdf,

mais comment définir cette plage en vba,

j'ai essayé ce code sur la page Devis de Bruno mais le résultat n'est pas correct,

la plage commence à B2 au lieu de A2

Sub Test_PrintArea()
Set plg1 = Range("A1").SpecialCells(xlCellTypeConstants, 23)
Set plg2 = Range("A1").SpecialCells(xlCellTypeFormulas, 23)
Set plg = Union(plg1, plg2)
ActiveSheet.PageSetup.PrintArea = Range(Cells(plg(0).Row, plg(0).Column), plg.SpecialCells(xlCellTypeLastCell)).Address
End Sub

Ca sort de la question de départ ça non ? Le nombre de pages à imprimer.

Je pense qu'il doit connaitre facilement sa plage d'impression avec les nombre de lignes de commande.

En la définissant au départ et en insérant le nombre de lignes nécessaires, ce qui étendra la plage automatiquement.

Mais bon, j'avoue ne pas avoir tout lu en détail...

Salut à tous,

@Bruno,

si tu crées le Nom "NbrPages" avec la formule =LIRE.DOCUMENT(50)

est-ce que n = Evaluate("NbrPages") fonctionne ?

Bonjour le fil,

Je vois que le sujet passionne

si la zone d'impression est déjà défini, il n'y a plus de problème pour créer les pdf,

mais comment définir cette plage en vba,

j'ai essayé ce code sur la page Devis de Bruno mais le résultat n'est pas correct,

la plage commence à B2 au lieu de A2

Sub Test_PrintArea()
Set plg1 = Range("A1").SpecialCells(xlCellTypeConstants, 23)
Set plg2 = Range("A1").SpecialCells(xlCellTypeFormulas, 23)
Set plg = Union(plg1, plg2)
ActiveSheet.PageSetup.PrintArea = Range(Cells(plg(0).Row, plg(0).Column), plg.SpecialCells(xlCellTypeLastCell)).Address
End Sub

Non le problème n'est pas là et pas si simple

En fait je veux calculer le nombre de pages pour savoir si l'utilisateur veut faire une impression en réduction (1 page) ou normal (plusieurs)

Dans le 2ème cas, je dois insérer la ligne d'en-tête du tableau sur chaque page

Voilà le code adapté selon vos idées

Function NbPageDoc(Feuille As String)
  Dim ligne As Range, col As Range
  Dim NbLig As Integer, NbCol As Integer, nLgn As Long, nCol As Integer
  With Sheets(Feuille)
    If Application.CountA(.Cells) > 0 Then
      If .UsedRange.Rows.Count > 0 Then nLgn = 1 Else nLgn = 0
      If .UsedRange.Columns.Count > 0 Then nCol = 1 Else nCol = 0
    Else
      nLgn = 0: nCol = 0
    End If
    For Each ligne In .UsedRange.Rows
      If ligne.PageBreak <> xlNone Then NbLig = NbLig + 1
    Next
    For Each col In .UsedRange.Columns
      If col.PageBreak <> xlNone Then NbCol = NbCol + 1
    Next
  End With
  NbPageDoc = NbCol * NbLig
End Function

Edit, je viens de voir ta fonction @eriiic

Function nbPages(sh As Worksheet) As Long
    nbPages = (sh.VPageBreaks.Count + 1) * (sh.HPageBreaks.Count + 1)
End Function

Pourquoi chercher plus compliqué

A+

Bonjour,

Dans le 2ème cas, je dois insérer la ligne d'en-tête du tableau sur chaque page

Je suppose que tu as simplifié mais au cas où... : dans l'onglet Feuille de Mise en page, tu as Lignes à répéter en haut.

eric

Rechercher des sujets similaires à "erreur inattendue exception hresult"