Transferts EXCEL vers l\'iseries

  • Auteur de la discussion tigrou22
  • Date de début

tigrou22

Nouveau membre
Bonjour,
je souhaite transférer des données EXCEL vers un AS400.
Je ne suis pas très doué en visual basic et j'aimerais avoir un exemple de macros écrites pour pouvoir le réaliser.
Etape 1 => sélection de données dans une feuille ( récupération de données pouvant être variable suivant le nombre de lignes de la feuille ). En fait je sélectionne toutes les données de la feuille
Etape 2 => transfert vers un fichier userlib d'un AS400
Si vous savez l'écrire, pensez à moi.
MERCI
 

dve

Nouveau membre
Bonjour,

Pour sélectionner l'ensemble des données de la feuille active :
Code:
Cells.select

Pour obtenir les numéros de ligne et colonne de la dernière cellule de la feuille active :
Code:
NumLigne = Cells.SpecialCells(xlCellTypeLastCell).Row
NumColonne = Cells.SpecialCells(xlCellTypeLastCell).Column

Par contre peux tu décrire les caraxctéristiques d'un fichier "userlib" ?

Souhaitant t'avoir apporté une réponse partielle.
 

zeb

Modérateur
Salut,

Mais quelle idée de sélectionner les données ! Ça c'est en Excel, à la souris. Nous, nous allons faire ça en VB.

C'est bien toute la feuille que tu veux mettre dans ton ficher, ou juste une certaine plage ?
 

tigrou44

Nouveau membre
Oui, désolé de répondre si tardivement.
Je souhaite en effet sélectionner une feuille de données EXCEL et l'envoyer dans un AS400.
Il existe plusieurs bibliothèques de travail dans cette AS400 dont une qui est celle des utilisateurs que l'on appelle USERLIB.
Je travaille dans un entrepôt.
En fait, j'extrait de l'AS400 un fichier de travail que je retravaille sur EXCEL - Là pas de soucis, j'utilise l'option transfert de données ISERIES.
Je souhaite ensuite transférer le fichier retravaillé dans un premier dans une bibliothèque utilisateur pour voir si c'est tout est bien retranscris dans l'AS400.
Vous l'aurez compris, au final, il s'agira de remplacer le fichier AS400 initial une fois la procédure verrouillée.
Je sais que cela marche en utilisant la commande "Transfert de données vers l'Iseries" mais je ne peux pas laisser un utilisateur débutant utiliser cette commande, trop dangereux.
Je souhaite donc traduire cette commande en visual basic.
MERCI à tous. Je suis impatient d'avoir la réponse.
@+ :bounce:
 

tigrou22

Nouveau membre
Ah non pas du tout. Ce n'est pas résolu. Cf message au dessus de tigrou 44. Je me suis planté dans l'identifiant, en passant avoir créer 44 au lieu de 22.
J'attends toujours vos réponses avec imptaience.
 

zeb

Modérateur
Je ne connais pas assez le monde AS400 pour avoir la solution, mais on peut la chercher ensemble.

Que fais-tu exactement quand tu transferts des données vers l'Iseries ?
(Environnement, logiciels, commandes, etc.)
 

tigrou22

Nouveau membre
En fait je transfert un fichier EXCEL dans une bibliothèque de l'AS400.
C'est une macro complémentaire qui est installé sur EXCEL.
Voici les macros qui permettent d'importer des fichiers de l'AS400 :
Sub requeteDTF(Dtf As String, destination As String, plage As Range, Optional Entete = False, Optional MiseEnFormeColonne = False)
'

Dim chemin_transfert As String
Dim fichier_transfert As String
Dim lignes As Long
chemin_transfert = "U:\"
fichier_transfert = "transfertDTF.xls"

Application.Cursor = xlWait

Menage destination, plage ' ménage dans la feuille avant le transfert

supprimer_fichier chemin_transfert & fichier_transfert

lignes = transfert(Dtf)

Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FileExists(chemin_transfert & fichier_transfert) Then
charger_fichier destination, plage, chemin_transfert, fichier_transfert, Entete
supprimer_fichier chemin_transfert & fichier_transfert ' ménage après le transfert
Else: MsgBox "Le fichier " & Dtf & " n'est pas correct. Il doit générer le fichier u:\transfertDTF.xls", , "MODIFIER LE FICHIER TRANSFERT DE DONNEES"
End If

'REPRISE CALCUL AUTO
Application.Calculation = xlCalculationAutomatic
Calculate

Application.Cursor = xlDefault

If MiseEnFormeColonne Then affichage_correct

End Sub


Function transfert(Dtf As String) As Integer
'
' DLL cwbx.dll
' Menu Outils-Références IBM AS/400 iSeries Access for Windows ActiveX Object Library

Dim dt As New cwbx.DatabaseTransfer

On Error Resume Next ' Diffère la gestion d'erreur.
Err.Clear
dt.Transfer Dtf

If Err.Number <> 0 Then
Msg = "LE FICHIER " & Dtf & " N'A PAS GENERE DE RESULTAT" & Chr(13) & Chr(13) & Chr(13) & "L'erreur # " & Str(Err.Number) & " a été générée par " _
& Err.Source & Chr(13) & Err.Description
MsgBox Msg, , "AUCUNE DONNEE EXPLOITABLE POUR LA REQUETE", Err.HelpFile, Err.HelpContext
End If
transfert = dt.TransferResults.RowsTransferred

End Function


Function transfertSQL(systeme As String, SQL As String, format_date As cwbdtDateFormatEnum) As Integer
'
' DLL cwbx.dll
' Menu Outils-Références IBM AS/400 iSeries Access for Windows ActiveX Object Library

Dim as400 As New cwbx.AS400System
Dim dlr As New cwbx.DatabaseDownloadRequest

as400.Define systeme

Set dlr.system = as400

dlr.AS400File = "-"
dlr.pcFile = "U:\TransfertSQL.xls"
dlr.pcFile.FileType = cwbdtBIFF8
dlr.Convert65535 = True
dlr.Format.SetDateFormat format_date
dlr.QueryDataTransferSyntax = False
dlr.Query = SQL

On Error Resume Next ' Diffère la gestion d'erreur.
Err.Clear
dlr.Download

' Vérifie la présence d'erreurs, puis affiche le message.
If Err.Number <> 0 Then
Msg = "LE FICHIER " & Dtf & " N'A PAS GENERE DE RESULTAT" & Chr(13) & Chr(13) & Chr(13) & "L'erreur # " & Str(Err.Number) & " a été générée par " _
& Err.Source & Chr(13) & Err.Description
MsgBox Msg, , "AUCUNE DONNEE EXPLOITABLE POUR LA REQUETE", Err.HelpFile, Err.HelpContext
End If

transfertSQL = dlr.TransferResults.RowsTransferred

End Function

Sub charger_fichier(onglet As String, plage As Range, chemin_transfert As String, fichier_transfert As String, Optional Entete = False)
'
'
' V1 : prise en compte des valeurs vides

Dim colonnes As Long
Dim lig As Long

colonnes = 1

Workbooks.Open Filename:=(chemin_transfert & fichier_transfert)

' le paramètres lignes est parfois incorrect. La DLL retourne 0 lignes alors que plusieurs lignes sont retournées.
' On recalcule le nombre de lignes d'une autre façon.
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
lig = Selection.Rows.Count

While Cells(1, colonnes) <> ""
colonnes = colonnes + 1
Wend

If Entete Then
Range("A1").Select
Range(Selection, Cells(Selection.Row + lig, colonnes - 1)).Select
Else:
lig = Selection.Rows.Count
Range("A2").Select
Range(Selection, Cells(Selection.Row + lig - 1, colonnes - 1)).Select
End If

Selection.Copy
ThisWorkbook.Activate
ThisWorkbook.Sheets(onglet).Cells(plage.Row, plage.Column).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Range("A1").Select

' Le presse papier est désactivé pour ne pas être questionné lors de la fermeture du fichier
Application.CutCopyMode = False
Workbooks(fichier_transfert).Close False

ThisWorkbook.Activate

End Sub

Sub supprimer_fichier(fichier As String)
'
'
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FileExists(fichier) Then fs.deletefile fichier, True

End Sub

Sub appel_SQL(systeme As String, cellule As Range, destination As String, plage As Range, Optional Entete = False, Optional MiseEnFormeColonne = False)

Dim SQL As String
Dim chemin_transfert As String
Dim fichier_transfert As String
Dim format_date As cwbdtDateFormatEnum

If systeme = "" Then systeme = Worksheets("SQL").Cells(cellule.Row, cellule.Column + 1).Value
SQL = Worksheets("SQL").Cells(cellule.Row, cellule.Column).Value

Select Case Worksheets("SQL").Cells(cellule.Row, cellule.Column + 2).Value
Case "EUR"
format_date = cwbdtDateFmtEUR
Case "ISO"
format_date = cwbdtDateFmtISO
Case "YrMonDay"
format_date = cwbdtDateFmtYrMonDay
Case "DayMonYr"
format_date = cwbdtDateFmtDayMonYr
Case "USA"
format_date = cwbdtDateFmtUSA
Case Else
MsgBox "Le format date de la requête n'est pas correct."
SQL = ""
End Select

If SQL <> "" Then
pointeur = Application.Cursor
chemin_transfert = "U:\"
fichier_transfert = "transfertSQL.xls"

Application.Cursor = xlWait

Menage destination, plage ' ménage dans la feuille avant le transfert

supprimer_fichier chemin_transfert & fichier_transfert ' ménage avant le transfert

lignes = transfertSQL(systeme, SQL, format_date)

Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FileExists(chemin_transfert & fichier_transfert) Then
charger_fichier destination, plage, chemin_transfert, fichier_transfert, Entete
supprimer_fichier chemin_transfert & fichier_transfert ' ménage après le transfert
End If

'REPRISE CALCUL AUTO
Application.Calculation = xlCalculationAutomatic
Calculate

Application.Cursor = xlDefault

If MiseEnFormeColonne Then affichage_correct

Else: MsgBox "Pas de requête appelée dans l'onglet SQL"
End If

End Sub

Sub Menage(destination As String, plage As Range)

Dim existe As Boolean
Dim i As Integer
existe = False
i = 1

While i < Sheets.Count + 1 And Not existe ' Test de l'existance de la feuille
a = Sheets(i).Name
If StrConv(Sheets(i).Name, vbUpperCase) = StrConv(destination, vbUpperCase) Then existe = True
i = i + 1
Wend

If existe Then
Sheets(destination).Select 'ARRET DU CALCUL AUTO
Application.Calculation = xlCalculationManual

If Sheets(destination).FilterMode = True Then 'ENLEVER LES FILTRES
Selection.AutoFilter Field:=1, Criteria1:=310
ActiveSheet.ShowAllData
End If
'EFFACER LES DONNEES
Range(Cells(plage.Row, plage.Column), Cells(plage.Row + plage.Rows.Count, plage.Column + plage.Columns.Count - 1)).ClearContents
Range("A1").Select
Else
Sheets.Add After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = destination
End If

End Sub


Sub affichage_correct()

Cells.Select
Cells.EntireColumn.AutoFit
Range("A1").Select

End Sub

Reste maintenant à exporter
 

zeb

Modérateur
Salut. Reste surtout à respecter le règlement ! [:zeb:6]
Va lire le règlement pour savoir présenter ton code !
 

tigrou22

Nouveau membre
désolé je suis novice et je cherche surtout a trouver la solution d'exportation
 

zeb

Modérateur
Va lire le règlement pour savoir comment présenter ton code. Ensuite, modifie ton message précédent. Je ne me cogne pas la lecture de tant de lignes de code sans que tu ne fasses l'effort de correctement les présenter, novice ou pas.
 

chonos

Helper
tigrou22,

tu dit que tu bosse dans un entrepot sous AS400 le nom du soft ne serait il pas Prolog (pas le langage)

a+
 

Azdinou

Nouveau membre
Bonjour à tous,

J'aimerai savoir si ce problème est résolu, et si finalement Tigrou22 a réussi à faire une Macro VB qui fonctionne.
Moi, de mon côté, j'avais dévloppé une Macro VB ous excel qui fonctionnait trés bien :
- Excel formate les données sous format d'un macro exécutable sous Client Access Expres, en utilisant le bouton Macro et exécutant le fichier crée via excel, une simulation de la sisier se fait (c'est à dire, je tappe d'abord le nom de la transaction + Return l'écran se positionne dessus, je tappe 1 pour la lancer, j'arrive au 1.er masque de saisie, et je commence à remplir les champs un aprés l'autre ...et à la fin, je supprime la Fichier Macro....).
On ne peut pas dire que c'est pour les feneants car quan il s'agit de l'interface des Mvts comptables de la paye d'une société, environ 700 ligne de saisie, c'est un gain de temps enorme.
Or je viens de rencontrer une limitation dans Cliet Access Express, une Macro ne peut dépasser 749 lignes, et là c'est la panique !
Donc, je suhaite modifier mon Excel actuel , de façon à écrire directement dans un ficchier AS400, en envoyant une commande du style "ClearPfm" pour vider le fichier d'interface, puis rajouter mes Mvts dedans etc ...
Si vous pouvez me donner juste les commandes VB, le reste n'est pas un problème.
Merci à tous (et à charge de revanche, si je peux aider à mon tour).
Addresse mail : xxxxxxxxx.dadi@fr.xxxxxxxxxxx.com
Merci par avance
 

zeb

Modérateur
Salut,

Si tu cherches à condenser du code VBA/Excel, je pense pouvoir t'aider.
Mais je t'invite à créer ton propre sujet (où il faudra réécrire tout ça).
Et où tu indiqueras aussi comment tu veux qu'on t'aide.
 

Azdinou

Nouveau membre
Bonjour Zeb,
Tout d'abord merci d'avoir pris la peine de répondre aussi rapidemenT.
En réalité, je visais via mon mail, Tigrou22, qui avait essayé de solutionner le même cas de figure. Je vouslais récupérer son dernier script, et essayer d'aller plus loin.
Mon objectif est le suivant :
- Je récupère un fichier de type.CSV comportant les Mvts comptables de la paye (traitée à l'exterieur par Sage).
- J'ai fait une feuille Excel avec 3 boutons :
1* Integration du fichier CSV dans la feuille depuis un répertoire PC (toujours le même, et le fichier porte le même nom tous les mois).
Les Mvts sont controlés, je retire les lignes dont la valeut est = 0, ainsi que les lignes de totalisation par service.
2* Le second Bouton copie le résultat dans un autre onglet où la sequence des champs est alignée avec la structure du Fichier AS400 (en terme format des dates, taille des libellés etc ...)
Le service du personnel attache le fichier à ce stade et l'envoi aux comptables.
3* Les comptables l'ouvrent et utilise le 3ème Bouton pour créer une Macro.
Ensuite, ils vont sur la session AS400 ouverte, exécutent cette Macro qui saisie automatiquement les données dans un masque de Saisie AS400.

Sachant qu'il y'a une limitation en nombre de lignes dans l'execution d'une Macro-AS400, jai envisagé de changer ma façon de faire, en charchant les commandes VB qui permettent de travailler directement sur un Fichier AS400.
J'éspère que vous voyez mieux l'objectif que je souhaite atteindre.


Merci de votre aide
 

Azdinou

Nouveau membre
[Bonjour,

Avez-vous réussi à résoudre ce problème ?
J'ai à peu prés le même, et votre experience serait la bienvenue.

Merci
 

zeb

Modérateur
(Désolé, mais la politique de ce site est de ne pas laisser les problèmes se traiter en privé par mail. C'est pourquoi je l'ai retiré de ton message. 1° ça te protège du spam, 2° c'est que tu es venu chercher : il faut que la question et les réponses soient au même endroit. Si la question reste ici mais que les réponses sont dans ta boîte aux lettres, l'intérêt de ce forum disparaît)
 
G

Guest

Invité
Moi j'utilise des macros complémentaires.

Outils-->Macros complémentaires --> parcourir : Program Files --> IBM --> Client Access --> Shared
et choisir cwbtfxla.xll

ça affiche deux boutons, un pour transférer à partir de l'AS400 vers Excel et l'autre pour faire l'inverse.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 152
Messages
6 718 432
Membres
1 586 425
Dernier membre
momo1612
Partager cette page
Haut