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
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-ErrorBonne 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 FunctionCette 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 Functionps/ c'est pas encourageant de voir que les fonctions ExecuteExcel4Macro sont délaissée par MS
Salut sabV
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 FunctionQqq 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 FunctionTu 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 SubCa 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 FunctionEdit, je viens de voir ta fonction @eriiic
Function nbPages(sh As Worksheet) As Long
nbPages = (sh.VPageBreaks.Count + 1) * (sh.HPageBreaks.Count + 1)
End FunctionPourquoi 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ù...
eric