Résolu erreur 1004 par l'application ou l'objet

encom

Nouveau membre
bonjour a tous,

voila j'ai l'erreur en entete sur le code suivant mais pas dans tout les private sub.
le traitement j'ouvre un fichier banque pour créer un fichier de comptabilisation en piochant des infos dans un fichier de mapping.
merci de votre aide.

Code:
Option Explicit
Dim ADYEN As Worksheet
Dim adyenCpta As Worksheet
Dim Boutiques As Workbook
Dim mag As Worksheet
Dim numMagA As String
Dim numBoutique As String
Dim j As Long
Dim finalrow As Long
Dim i As Long
Dim Nextrowac As Long
Dim finalrowb As Long

Sub ADYEN_CB()

'création feuille2
Set adyenCpta = Worksheets.Add(after:=Worksheets(1))

'renomage feuille 2
adyenCpta.Name = "Comptabilisation"

' initialisation feuille
Set ADYEN = Worksheets(1)
Set adyenCpta = Worksheets(2)
Set Boutiques = GetObject("C:XXXXXXXXXXXX\liste mag.xlsx")
Set mag = Boutiques.Worksheets(1)

'calcul derniere ligne fichier Boutiques
finalrowb = mag.Cells(mag.Rows.Count, 1).End(xlUp).Row
'initialisation compteur
Nextrowac = 1
' calcul du nombre de ligne du fichier adyen
finalrow = ADYEN.Cells(Rows.Count, 1).End(xlUp).Row

For i = finalrow To 2 Step -1

If ADYEN.Cells(i, 38) = "" And ADYEN.Cells(i, 8) = "Balancetransfer" Then
Call report
ElseIf ADYEN.Cells(i, 38) = "" And ADYEN.Cells(i, 8) = "Fee" Then
Call frais
ElseIf ADYEN.Cells(i, 38) = "" And ADYEN.Cells(i, 8) = "MerchantPayout" Then
Call modepayment
ElseIf ADYEN.Cells(i, 38) = "" And ADYEN.Cells(i, 8) = "InvoiceDeduction" Then
Call frais
Else
Call compta
End If
Next i

'Call datevaleur

Set adyenCpta = Nothing
Set ADYEN = Nothing
Set Boutiques = Nothing
Set mag = Nothing

Application.ScreenUpdating = True

End Sub
Private Sub ecriture()

For j = 2 To finalrowb
numBoutique = Boutiques.Sheets(1).Cells(j, 4).Value
numMagA = CStr(ADYEN.Cells(i, 38).Value)
If numMagA = numBoutique Then
Call ecriturecpta

End If
Next j
End Sub

Private Sub compta()

Select Case ADYEN.Cells(i, 5)
Case Is = "wechatpay_pos"
Call ecriture
Case Is = "alipay"
Call ecriture
Case Is = "visa"
Call ecriture
Case Is = "mc"
Call ecriture
Case Is = "diners"
Call ecriture
Case Is = "discover"
Call ecriture
Case Is = "maestro"
Call ecriture
Case Is = "visadankort"
Call ecriture
Case Is = "bijcard"
Call ecriture
Case Is = "amex"
Call ecriture
Case Is = "cup"
Call ecriture
Case Is = "jcb"
Call ecriture

End Select

End Sub

Private Sub frais()
    
Call cptafrais
adyenCpta.Cells(Nextrowac, 22) = " FRAIS ADYEN " & CDate(Mid(ADYEN.Cells(i, 6), 1, 10))
                                      
adyenCpta.Cells(Nextrowac, 9) = "F0050"
'adyenCpta.Cells(Nextrowac, 29) = REF RAPPROCHEMENT

Nextrowac = Nextrowac + 1

End Sub

Private Sub cptafrais()
adyenCpta.Cells(Nextrowac, 5) = Left(ADYEN.Cells(i, 2), 5)
adyenCpta.Cells(Nextrowac, 6) = "627800"
adyenCpta.Cells(Nextrowac, 7) = 0
adyenCpta.Cells(Nextrowac, 8) = 0

If ADYEN.Cells(i, 15) > 0 Then
adyenCpta.Cells(Nextrowac, 17) = ADYEN.Cells(i, 15)
ElseIf ADYEN.Cells(i, 16) > 0 Then
adyenCpta.Cells(Nextrowac, 17) = ADYEN.Cells(i, 16)
End If

adyenCpta.Cells(Nextrowac, 10) = 0

Call Pays

'adyenCpta.Cells(Nextrowac, 12) = mag.Cells(j, 1)

'adyenCpta.Cells(Nextrowac, 13) = mag.Cells(j, 8)

adyenCpta.Cells(Nextrowac, 14) = 0
adyenCpta.Cells(Nextrowac, 15) = 0

Call Devise

End Sub
Private Sub modepayment()

' type ecriture
adyenCpta.Cells(Nextrowac, 5) = Left(ADYEN.Cells(i, 2), 5)
' numero de la societe
Call comptecpta

adyenCpta.Cells(Nextrowac, 7) = 0
adyenCpta.Cells(Nextrowac, 8) = 0
adyenCpta.Cells(Nextrowac, 9) = 0
adyenCpta.Cells(Nextrowac, 10) = 0
Call Pays
adyenCpta.Cells(Nextrowac, 11) = mag.Cells(j, 7)     <----- ici problème
'adyenCpta.Cells(Nextrowac, 12) = mag.Cells(j, 1)
'adyenCpta.Cells(Nextrowac, 13) = mag.Cells(j, 8)
adyenCpta.Cells(Nextrowac, 14) = 0
adyenCpta.Cells(Nextrowac, 15) = 0

Call Devise

If ADYEN.Cells(i, 15) > 0 Then
adyenCpta.Cells(Nextrowac, 17) = ADYEN.Cells(i, 15)
ElseIf ADYEN.Cells(i, 16) > 0 Then
adyenCpta.Cells(Nextrowac, 17) = ADYEN.Cells(i, 16)
End If

adyenCpta.Cells(Nextrowac, 22) = " VIREMENT ADYEN"
'adyenCpta.Cells(Nextrowac, 29) = REF RAPPROCHEMENT

Nextrowac = Nextrowac + 1

End Sub
Private Sub comptecpta()

Select Case Left(ADYEN.Cells(i, 2), 5)
Case Is = "G0006"
adyenCpta.Cells(Nextrowac, 6) = "512140"
Case Is = "G0017"
adyenCpta.Cells(Nextrowac, 6) = "512540"
Case Is = "G0027"
adyenCpta.Cells(Nextrowac, 6) = "512300"
Case Is = "G0035"
adyenCpta.Cells(Nextrowac, 6) = "512100"
End Select

End Sub

Private Sub ecriturecpta()
' type ecriture general pour brut

adyenCpta.Cells(Nextrowac, 5) = Left(ADYEN.Cells(i, 2), 5)

Call ecriturecptacorp

Nextrowac = Nextrowac + 1

If WorksheetFunction.Sum(ADYEN.Range(ADYEN.Cells(i, 17), ADYEN.Cells(i, 21))) <> 0 Then
'type ecriture general pour frais

adyenCpta.Cells(Nextrowac, 5) = Left(ADYEN.Cells(i, 2), 5)
Call fraisbrut
Nextrowac = Nextrowac + 1

End If

End Sub

Private Sub ecriturecptacorp()

adyenCpta.Cells(Nextrowac, 6) = "511300"
adyenCpta.Cells(Nextrowac, 7) = 0
adyenCpta.Cells(Nextrowac, 8) = 0
adyenCpta.Cells(Nextrowac, 7) = 0
adyenCpta.Cells(Nextrowac, 9) = mag.Cells(j, 4)
adyenCpta.Cells(Nextrowac, 10) = 0
adyenCpta.Cells(Nextrowac, 11) = mag.Cells(j, 7)      <-----alors que la ca passe bien
adyenCpta.Cells(Nextrowac, 12) = mag.Cells(j, 1)
adyenCpta.Cells(Nextrowac, 13) = mag.Cells(j, 8)
adyenCpta.Cells(Nextrowac, 14) = 0
adyenCpta.Cells(Nextrowac, 15) = 0

Call Devise

If ADYEN.Cells(i, 12) > 0 Then
adyenCpta.Cells(Nextrowac, 18) = ADYEN.Cells(i, 12)
ElseIf ADYEN.Cells(i, 11) > 0 Then
adyenCpta.Cells(Nextrowac, 17) = ADYEN.Cells(i, 11)
End If

Select Case ADYEN.Cells(i, 5)
Case Is = "wechatpay_pos"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 10)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "alipay"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 11)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "visa"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 12)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "mc"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 13)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "diners"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 14)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "discover"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 15)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "maestro"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 16)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "visadankort"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 17)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "bijcard"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 18)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "amex"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 19)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "cup"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 20)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "jcb"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 21)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
End Select

If Mid(ADYEN.Cells(i, 4), 5, 1) = "-" Then
adyenCpta.Cells(Nextrowac, 29) = ADYEN.Cells(i, 38) & " " & Left(ADYEN.Cells(i, 4), 10)
Else
adyenCpta.Cells(Nextrowac, 29) = Mid(ADYEN.Cells(i, 4), 6, 8)
End If

End Sub

Private Sub fraisbrut()

adyenCpta.Cells(Nextrowac, 6) = "627800"
adyenCpta.Cells(Nextrowac, 7) = 0
adyenCpta.Cells(Nextrowac, 8) = 0
adyenCpta.Cells(Nextrowac, 9) = mag.Cells(j, 4)
adyenCpta.Cells(Nextrowac, 10) = 0
adyenCpta.Cells(Nextrowac, 11) = mag.Cells(j, 7)
adyenCpta.Cells(Nextrowac, 12) = mag.Cells(j, 1)
adyenCpta.Cells(Nextrowac, 13) = mag.Cells(j, 8)
adyenCpta.Cells(Nextrowac, 14) = 0
adyenCpta.Cells(Nextrowac, 15) = 0

Call Devise

If ADYEN.Cells(i, 12) > 0 Then
If WorksheetFunction.Sum(ADYEN.Range(ADYEN.Cells(i, 17), ADYEN.Cells(i, 21))) > 0 Then
adyenCpta.Cells(Nextrowac, 17) = Abs(WorksheetFunction.Sum(ADYEN.Range(ADYEN.Cells(i, 17), ADYEN.Cells(i, 21))))
Else
adyenCpta.Cells(Nextrowac, 18) = Abs(WorksheetFunction.Sum(ADYEN.Range(ADYEN.Cells(i, 17), ADYEN.Cells(i, 21))))
End If
End If

If ADYEN.Cells(i, 11) > 0 Then
If WorksheetFunction.Sum(ADYEN.Range(ADYEN.Cells(i, 17), ADYEN.Cells(i, 21))) > 0 Then
adyenCpta.Cells(Nextrowac, 18) = Abs(WorksheetFunction.Sum(ADYEN.Range(ADYEN.Cells(i, 17), ADYEN.Cells(i, 21))))
Else
adyenCpta.Cells(Nextrowac, 17) = Abs(WorksheetFunction.Sum(ADYEN.Range(ADYEN.Cells(i, 17), ADYEN.Cells(i, 21))))
End If
End If

Select Case ADYEN.Cells(i, 5)
Case Is = "wechatpay_pos"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 10)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "alipay"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 11)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "visa"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 12)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "mc"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 13)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "diners"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 14)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "discover"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 15)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "maestro"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 16)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "visadankort"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 17)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "bijcard"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 18)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "amex"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 19)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "cup"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 20)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
Case Is = "jcb"
adyenCpta.Cells(Nextrowac, 22) = UCase(mag.Cells(j, 21)) & " " & mag.Cells(j, 4) & " " & mag.Cells(j, 5)
End Select

End Sub
 

drul

Obscur pro du hardware
Staff
Met un point d'arrêt ou ça plante et essaye de voir ce qu'il y a dans mag et Nextrowac

Comme ça c'est dur d'analyser d'ou pourrait venir le problème, la macro est assez complexe
 

magellan

Modérâleur
Staff
A ce que je lis déjà... la variable J est utilisée de partout et pourtant elle n'est pas déclarée ni même alimentée. ça me semble difficile d'avoir une variable qui détermine une position dans un tableau sans qu'elle soit en amont alimentée.

Code:
Private Sub ecriturecptacorp()

adyenCpta.Cells(Nextrowac, 6) = "511300"
adyenCpta.Cells(Nextrowac, 7) = 0
adyenCpta.Cells(Nextrowac, 8) = 0
adyenCpta.Cells(Nextrowac, 7) = 0
adyenCpta.Cells(Nextrowac, 9) = mag.Cells(j, 4)
adyenCpta.Cells(Nextrowac, 10) = 0
adyenCpta.Cells(Nextrowac, 11) = mag.Cells(j, 7)      <-----alors que la ca passe bien
adyenCpta.Cells(Nextrowac, 12) = mag.Cells(j, 1)
adyenCpta.Cells(Nextrowac, 13) = mag.Cells(j, 8)
adyenCpta.Cells(Nextrowac, 14) = 0
adyenCpta.Cells(Nextrowac, 15) = 0

où est le "j" de ça -> mag.Cells(j, 4)
 

drul

Obscur pro du hardware
Staff
i et j sont des variables globales (oui c'est atroce :D ), c'est pour ça que tu trouves pas ...
 

encom

Nouveau membre
j'ai compris mon erreur je fait appel a une variable qui n'est pas initialisé a ce moment du programme. je les ai mis en globale car comme j'appel les variables dans les sous prog si il sont pas en globale je vais me prendre un warning variable non définit. :) le code est pourri je vais faire un gros refactoring. la surcharge en vb ca marche ?
merci pour l'aide de vous lire mais donné la solution ;) comme quoi on peut aider sans donner de solution :-D
du coup je me suis rendu compte que cette partie est fausse car dans mon fichier de donnée appelée j'ai plein de pays europe et us :unsure: donc soit j’étoffe le sous prog ce qui vas être très lourd soit je revois mon fichier mapping.
 
Dernière édition:

magellan

Modérâleur
Staff
j'ai compris mon erreur je fait appel a une variable qui n'est pas initialisé a ce moment du programme. je les ai mis en globale car comme j'appel les variables dans les sous prog si il sont pas en globale je vais me prendre un warning variable non définit. :) le code est pourri je vais faire un gros refactoring. la surcharge en vb ca marche ?
merci pour l'aide de vous lire mais donné la solution ;) comme quoi on peut aider sans donner de solution :-D
du coup je me suis rendu compte que cette partie est fausse car dans mon fichier de donnée appelée j'ai plein de pays europe et us :unsure: donc soit j’étoffe le sous prog ce qui vas être très lourd soit je revois mon fichier mapping.
Quand je vois des globales je fais des ulcères. C'est une horreur en debug, cela génère des anomalies improbables, et à corriger bonjour l'angoisse.

Dans ton cas c'est cool que tu aies trouvé la piste grâce à ma remarque ^^
 

encom

Nouveau membre
tu fait comment sans variable globale pour des variables que tu appel dans des sous programmes pour pas avoir de warning variable non définie. je vois pas ou est le problème pour les suivres en pas a pas avec une option explicit. mais si il y a plus simple je prend.

merci d'avance
 

drul

Obscur pro du hardware
Staff
Une sous-fonctions utilises des paramètres d'entrée, pas des variables globales.
 

svoglimacci

check memory failed but no bug detected
Une sous-fonctions utilises des paramètres d'entrée, pas des variables globales.
Je souscris, d'autant qu'on en avait parlé ailleurs, mais je me pose tout de même la question : lorsqu'une sous-fonction ne sert que dans une fonction (j'espère ne pas me tromper dans le vocabulaire VBA), qu'elle ne sera jamais utilisée ailleurs (genre dans une librairie partagée) et que la sous-fonction se retrouve avec un nombre de paramètres énorme, augmentant trop la taille du code et nuisant fortement à la lisibilité, je me demande si on ne pourrait pas faire des exceptions :)
Les noms "i" et "j", peu parlants, m'ont toutefois choqués.
 

scoolup

Modérateur
Staff
Salut à tous. :)

"i et j sont des variables globales (oui c'est atroce)"

Je suis très inquiet pour elles... :cry:
 

magellan

Modérâleur
Staff
Je souscris, d'autant qu'on en avait parlé ailleurs, mais je me pose tout de même la question : lorsqu'une sous-fonction ne sert que dans une fonction (j'espère ne pas me tromper dans le vocabulaire VBA), qu'elle ne sera jamais utilisée ailleurs (genre dans une librairie partagée) et que la sous-fonction se retrouve avec un nombre de paramètres énorme, augmentant trop la taille du code et nuisant fortement à la lisibilité, je me demande si on ne pourrait pas faire des exceptions :)
Les noms "i" et "j", peu parlants, m'ont toutefois choqués.
Si trop de paramètres=fonction mal conçue... Donc de fait, si tu as 25 paramètres, révise ta fonction ou crée une structure/objet à passer en paramètre
 

svoglimacci

check memory failed but no bug detected
Si trop de paramètres=fonction mal conçue... Donc de fait, si tu as 25 paramètres, révise ta fonction ou crée une structure/objet à passer en paramètre
Oui, ça c'est vrai. J'essaie d'y repenser pour le programme de l'autre fois (tu te souviens ?) voir si il aurait existé des structures cohérentes, mais je pense effectivement que oui.
Merci :)
 

encom

Nouveau membre
lol merci de développé je suis pas expert du tout en vba je commence. si je suis bien je crée des fonctions et en parametre mes variables ? codé variables je pensai avoir utilisé le minimum. ou alors je fais un range pour les source mapping une pour les données que je copie dans ma feuille de destination ?
 

encom

Nouveau membre
hello je veux bien une explication "Une sous-fonctions utilises des paramètres d'entrée, pas des variables globales. " sachant que j'ai un fichier A avec des données que je comprare certaine avec le fichier B pour constituer un fichier C. je prend des données de A et B pour faire ce fichier C. comment vous faites ? merci de votre retour.
 

drul

Obscur pro du hardware
Staff
Meilleure réponse
Salut, exemple de programme et sous programme avec des paramètres:
Code:
Option Explicit
Sub MainProg()
Dim i As Long
For i = 1 To 10
    sousProg i, ActiveSheet
Next
msgbox Add2Long(2, 3)

End Sub
Sub sousProg(aLigne As Long, aSheet As Worksheet)
    aSheet.Cells(aLigne, 1).EntireRow.Delete
End Sub

Function Add2Long(aVal1 As Long, aVal2 As Long) As Long
    Add2Long = aVal1 + aVal2
End Function

Le sous programme n'utilise aucune donnée globale, ceci le rend réutilisable dans tes codes futurs. Cela rend aussi le debug et la lecture bien plus aisé, Cela permet de bien structuré ses fonctions, afin d'éviter de faire tous et n'importe quoi n'importe où ...

Note également la différence entre function et sub:
1 - une fonction (Function) doit obligatoirement retourner une valeur ;
2 - une procédure (Sub) exécute une action et n'a pas de valeur de retour.
 
Dernière édition:
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 065
Membres
1 586 286
Dernier membre
petitangebleu1977
Partager cette page
Haut