Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
j'ai trouvé un morceau de code sur votre forum qui permets de compter le nombre de ligne d'une feuille excel ouverte à partir d'un lien OLE
ll_nbrlignes = lole_excel.application.workbooks(ls_file).worksheets(1).UsedRange.Rows.Count
mais j'ai lemessage suivant : Error calling external object function workbooks at lin50 ( ci dessus )
Auriez vous une idée ?
Merci d'avance ...
Dernière modification par ggjedi54 (04-02-2010 09:33:12)
Hors ligne
Bonjour, as-tu d'abord ouvert le fichier ?
lo_ole = CREATE oleobject lo_ole.ConnectToNewObject("excel.application") lo_ole.workbooks.open(ls_file)
Hors ligne
oui j'ai repris une fonction que j'ai trouvé sur le forum ...
j'ai verifié pour l'initialisation et l'ouvertre du fichier cela semble correcte..
pourtant le probléme persiste ...
J'ai essayé ça :
lole_sheet = CREATE oleobject lole_sheet.ConnectToNewObject("excel.application") lole_sheet.workbooks.open(ls_docname) lole_sheet.application.workbooks(ls_docname).worksheets(ls_docname).UsedRange.Rows.Count
code de la fonction troué sur le forum :
long ll_nbrlignes, ll_nbrcols, ll_nbrsheet, ll_nbrclasseur long ll_i, ll_j string ls_waitmsg, ls_path, ls_file, ls_range, ls_columnname any ls_columncontent[] s_filedata lstr_filedata[] OLEObject lole_excel lole_excel = CREATE OLEObject IF lole_excel.ConnectToObject( as_filename ) = 0 THEN // Récupération informations sur le fichier excel // Remarque : Il faut préciser nominativement le nom du classeur (workbooks) et non mettre l'indice 1 // En cas d'instance d'excel ouverte avec un fichier, on importe ce fichier et non celui désiré // Nombre de colonneslole_sheet = lole_excel_taux.application.workbooks(1).worksheets(1) ll_nbrcols =10 // Nombre de lignes ll_nbrlignes = lole_excel.application.workbooks(as_filename).worksheets(1).UsedRange.Rows.Count IF ll_nbrcols = 0 OR ll_nbrlignes = 0 THEN lole_excel.DisconnectObject() DESTROY lole_excel RETURN -4 // Feuille de calcul vide END IF FOR ll_j = 1 TO ll_nbrcols // Nom de la colonne sous la forme : $A:$A ls_columnname = lole_excel.application.workbooks(ls_file).worksheets(1).Columns(ll_j).Address // Extraction de la dénomination alphabétique uniquement de la colonnne : $A:$A => A ls_columnname = Mid( ls_columnname, 2, Pos(ls_columnname, ':') - 2) // Construction de la plage de données à extraire de la colonne => ex : "A1:A3300" ls_range = ls_columnname + '1:' + ls_columnname + string(ll_nbrlignes) // Extraction du contenu de la colonne ls_columncontent = lole_excel.application.workbooks(ls_file).worksheets(1).Range(ls_range).Value FOR ll_i = 1 TO ll_nbrlignes lstr_filedata[ll_i].ss_data[ll_j] = trim(string(ls_columncontent[ll_i])) // Cas particulier de l'import du plan comptable API // Colonne contenant la valeur VRAI ou FAUX => EXCEL l'interprète comme la valeur logique // En lecture, on obtient les valeurs true ou false et non la chaîne VRAI ou FAUX CHOOSE CASE lower(lstr_filedata[ll_i].ss_data[ll_j]) CASE "false" lstr_filedata[ll_i].ss_data[ll_j] = "0" CASE "true" lstr_filedata[ll_i].ss_data[ll_j] = "1" END CHOOSE IF IsNull(lstr_filedata[ll_i].ss_data[ll_j]) THEN lstr_filedata[ll_i].ss_data[ll_j] = "" NEXT NEXT lole_excel.DisconnectObject() ELSE RETURN -1 END IF DESTROY lole_excel astr_filedata = lstr_filedata RETURN (1)
Dernière modification par ggjedi54 (04-02-2010 09:32:51)
Hors ligne
Chez moi ceci fonctionne bien :
ll_nb_ligne = l_ole.Application.ActiveSheet.UsedRange.Rows.Count
Hors ligne
Aloneg a écrit:
Chez moi ceci fonctionne bien :
ll_nb_ligne = l_ole.Application.ActiveSheet.UsedRange.Rows.Count
Genial sa fonctionne !!!
MErci beaucoup pour l'info
Hors ligne
Hors ligne
c'est fais ...
Hors ligne
ggjedi54 a écrit:
oui j'ai repris une fonction que j'ai trouvé sur le forum ...
j'ai verifié pour l'initialisation et l'ouvertre du fichier cela semble correcte..
pourtant le probléme persiste ...
J'ai essayé ça :Code: pb
lole_sheet = CREATE oleobject lole_sheet.ConnectToNewObject("excel.application") lole_sheet.workbooks.open(ls_docname) lole_sheet.application.workbooks(ls_docname).worksheets(ls_docname).UsedRange.Rows.Countcode de la fonction troué sur le forum :
L'erreur dans la partie supérieure est que le fichier (workbook) et la feuille (worksheet) ne s'appellent surement pas pareil.Code: pb
long ll_nbrlignes, ll_nbrcols, ll_nbrsheet, ll_nbrclasseur long ll_i, ll_j string ls_waitmsg, ls_path, ls_file, ls_range, ls_columnname any ls_columncontent[] s_filedata lstr_filedata[] OLEObject lole_excel lole_excel = CREATE OLEObject IF lole_excel.ConnectToObject( as_filename ) = 0 THEN // Récupération informations sur le fichier excel // Remarque : Il faut préciser nominativement le nom du classeur (workbooks) et non mettre l'indice 1 // En cas d'instance d'excel ouverte avec un fichier, on importe ce fichier et non celui désiré // Nombre de colonneslole_sheet = lole_excel_taux.application.workbooks(1).worksheets(1) ll_nbrcols =10 // Nombre de lignes ll_nbrlignes = lole_excel.application.workbooks(as_filename).worksheets(1).UsedRange.Rows.Count IF ll_nbrcols = 0 OR ll_nbrlignes = 0 THEN lole_excel.DisconnectObject() DESTROY lole_excel RETURN -4 // Feuille de calcul vide END IF FOR ll_j = 1 TO ll_nbrcols // Nom de la colonne sous la forme : $A:$A ls_columnname = lole_excel.application.workbooks(ls_file).worksheets(1).Columns(ll_j).Address // Extraction de la dénomination alphabétique uniquement de la colonnne : $A:$A => A ls_columnname = Mid( ls_columnname, 2, Pos(ls_columnname, ':') - 2) // Construction de la plage de données à extraire de la colonne => ex : "A1:A3300" ls_range = ls_columnname + '1:' + ls_columnname + string(ll_nbrlignes) // Extraction du contenu de la colonne ls_columncontent = lole_excel.application.workbooks(ls_file).worksheets(1).Range(ls_range).Value FOR ll_i = 1 TO ll_nbrlignes lstr_filedata[ll_i].ss_data[ll_j] = trim(string(ls_columncontent[ll_i])) // Cas particulier de l'import du plan comptable API // Colonne contenant la valeur VRAI ou FAUX => EXCEL l'interprète comme la valeur logique // En lecture, on obtient les valeurs true ou false et non la chaîne VRAI ou FAUX CHOOSE CASE lower(lstr_filedata[ll_i].ss_data[ll_j]) CASE "false" lstr_filedata[ll_i].ss_data[ll_j] = "0" CASE "true" lstr_filedata[ll_i].ss_data[ll_j] = "1" END CHOOSE IF IsNull(lstr_filedata[ll_i].ss_data[ll_j]) THEN lstr_filedata[ll_i].ss_data[ll_j] = "" NEXT NEXT lole_excel.DisconnectObject() ELSE RETURN -1 END IF DESTROY lole_excel astr_filedata = lstr_filedata RETURN (1)
Hors ligne
Effectivement c'est une erreur suite à un copier/coller ...
Mais j'ai une erreur même avec cette correction
Merci quand même
Hors ligne