Page 1 sur 1
[Ex] Isolation de références + comptage de quantités (Excel)
Posté : mer. 13 oct. 2010 14:47
par GhostLine
Bon, donc voilà mon dernier script, encore fait pour le taf, encore dans une nouvelle boite
Son but est simple : me permettre de connaitre les quantités à dupliquer par référence dans un grand tableau de préparation de commande. Chaque cellule contient une et une seule référence, qui peut être répétée sans limite.
Voili voilou ! Si vous avez des axes d'amélioration, je suis preneur
► Afficher le texteCode
Code : Tout sélectionner
; *************************************************************
; * COMPTAGE QUANTITES - ECRIT PAR GHOST LINE - 2010 *
; *************************************************************
; * Ce programme compte le nombre d'occurences d'une valeur *
; * dans un tableau donné et reporte valeurs et quantités *
; * dans un autre tableau. *
; *************************************************************
#include <ExcelCOM_UDF.au3>
$sFilePath1 = InputBox ("Calcul CD déstockage","Veuillez entrer le chemin d'accès complet au fichier de déstockage :",@DesktopDir&"\DestockageS")
If @error = 1 Then
Exit
EndIf
; reste à lancer automatique l'impression et à faire une mise en page potable et à faire une case à cocher en bout de ligne
$sFilePath2 = "c:\fichier_commande.xls"
$oFichierDestockage = _ExcelBookOpen($sFilePath1)
$oFichierCommande = _ExcelBookOpen($sFilePath2)
$colonne_debut_destockage = 18
$colonne_fin_destockage = 26
_ExcelSheetDelete($oFichierDestockage, 1)
_ExcelRowDelete($oFichierDestockage, 1, 2)
; On compte le nombre de lignes du tableau de destockage
Local $nb_ligne_destockage = $oFichierDestockage.ActiveSheet.UsedRange.Rows.Count
Local $nb_ligne_commande = 1
For $z = $colonne_debut_destockage to $colonne_fin_destockage
$colonne_destockage =$z
; on checke chaque cellule par colonne
For $i=1 to $nb_ligne_destockage
$sCellValue_destockage = _ExcelReadCell($oFichierDestockage, $i, $colonne_destockage)
; on vérifie que si cette valeur existe dans l'autre tableau
$valeur_existe = 0
For $j=1 to $nb_ligne_commande
$sCellValue_commande = _ExcelReadCell($oFichierCommande, $j, 1)
If $sCellValue_commande = $sCellValue_destockage and $sCellValue_commande <> "" Then
_ExcelWriteCell($oFichierCommande,(_ExcelReadCell($oFichierCommande, $j, 2))+1,$j, 2)
$valeur_existe = 1
EndIf
Next
; si elle n'existe pas, on la créé en fin de tableau
If $valeur_existe = 0 and $sCellValue_destockage <> "" Then
_ExcelWriteCell($oFichierCommande, $sCellValue_destockage,($j-1), 1)
_ExcelWriteCell($oFichierCommande, "1",($j-1), 2)
$nb_ligne_commande = $nb_ligne_commande +1
EndIf
Next
Next
_ExcelRowInsert($oFichierCommande, 1, 1)
$oFichierCommande.Application.Activesheet.Range("A1:C1").MergeCells = True
_ExcelWriteCell($oFichierCommande,$sFilePath1,1)
_ExcelPrintSheet($oFichierCommande, "Feuil1", 1, "", False)
_ExcelBookClose($oFichierCommande,0)
_ExcelBookClose($oFichierDestockage,0)
Re: [Ex] Isolation de références + comptage de quantités (Excel)
Posté : mer. 13 oct. 2010 18:23
par GhostLine
Ci joint les fichiers nécessaires pour faire les tests. Le fichier fichier_commande.xls est prévu dans le code pour être à la racine de C: , et le fichier destockage... .xls où vous voulez, mais de préférence sur le bureau. Ce fichier a été débarrassé de tout ce qu'il pourrait contenir de confidentiel, d'où son aspect dépouillé.
Re: [Ex] Isolation de références + comptage de quantités (Ex
Posté : ven. 07 déc. 2012 09:32
par GhostLine
Et la nouvelle version (merci Mikel

), compatbile Windows 7 :
► Afficher le texte
Code : Tout sélectionner
#include <ExcelCOM_UDF.au3>
#include <array.au3>
$sFilePath1 = InputBox("Calcul CD déstockage", "Veuillez entrer le chemin d'accès complet au fichier de déstockage :", @DesktopDir & "\DestockageS")
If @error = 1 Then
Exit
EndIf
$sFilePath2 = "c:\fichier_commande.xls"
$oFichierDestockage = _ExcelBookOpen($sFilePath1, 0)
$oFichierCommande = _ExcelBookOpen($sFilePath2,0)
_ExcelSheetDelete($oFichierDestockage, 1)
_ExcelRowDelete($oFichierDestockage, 1, 2)
_ExcelColumnDelete($oFichierDestockage, 1, 17)
_ExcelColumnDelete($oFichierDestockage, 10, 3)
$array = _ExcelReadSheetToArray($oFichierDestockage)
$oFichierDestockage.Application.DisplayAlerts = False
$oFichierDestockage.Application.WorkBooks.Close
$oFichierDestockage.Application.DisplayAlerts = True
$oFichierDestockage.Application.Quit
$oFichierDestockage.Quit
;========================
$nb_lignes = UBound($array)
$nb_colonnes = UBound($array, 2)
Dim $res[1] ; on construit une array 1D à partir de l'array 2D
$n = 0
For $i = 0 to $nb_lignes-1
Redim $res[UBound($res)+$nb_colonnes]
For $j = 0 to $nb_colonnes-1
If StringStripWS($array[$i][$j], 8) = "" Then
Continueloop
Else
$n += 1
$res[$n-1] = $array[$i][$j]
EndIf
Next
Next
Redim $res[$n]
_ArraySort($res)
$res2 = _count($res)
$i = 0
for $i = 2 to UBound($res2)-1
_ExcelWriteCell($oFichierCommande,($res2[$i][0]),$i-1,1)
_ExcelWriteCell($oFichierCommande,($res2[$i][1]),$i-1,2)
Next
_ExcelRowInsert($oFichierCommande, 1, 1)
$oFichierCommande.Application.Activesheet.Range("A1:C1").MergeCells = True
_ExcelWriteCell($oFichierCommande,$sFilePath1,1)
$oFichierCommande.ActiveWorkbook.PrintOut
$oFichierCommande.Application.DisplayAlerts = False
$oFichierCommande.Application.WorkBooks.Close
$oFichierCommande.Application.DisplayAlerts = True
$oFichierCommande.Application.Quit
$oFichierCommande.Quit
_ExcelBookClose($oFichierCommande,0)
;==========================================
Func _count($array)
Local $array2[1][2] = [[$array[0], 1]], $n = 1
For $i = 1 to UBound($array)-1
If $array[$i] = $array[$i-1] Then
$array2[$n-1][0] = $array[$i]
$array2[$n-1][1] += 1
Else
$n += 1
Redim $array2[$n][2]
$array2[$n-1][0] = $array[$i]
$array2[$n-1][1] = 1
EndIf
Next
Return $array2
EndFunc
Re: [Ex] Isolation de références + comptage de quantités (Ex
Posté : ven. 07 déc. 2012 14:01
par mikell
Hé, je t'avais dit qu'il fallait *adapter* à ton script
_ExcelReadSheetToArray : Returned array has row count in [0][0] and column count in [0][1]
L'adaptation n'est pas indispensable à ton script mais c'est quand même plus propre
► Afficher le texte
Code : Tout sélectionner
#include <array.au3>
#include <excel.au3>
$oExcel = _ExcelBookOpen(@scriptdir &"\test.xls", 0)
$array = _ExcelReadSheetToArray($oExcel)
_ExcelBookClose($oExcel)
_ArrayDisplay($array)
Dim $res[1]
$n = 0
For $i = 1 to $array[0][0] ; <<< nb de lignes
Redim $res[UBound($res)+$array[0][1]]
For $j = 1 to $array[0][1] ; <<< nb de colonnes
If StringStripWS($array[$i][$j], 8) = "" Then
Continueloop
Else
$n += 1
$res[$n-1] = $array[$i][$j]
EndIf
Next
Next
Redim $res[$n]
_ArrayDisplay($res)
_ArraySort($res)
$res2 = _count($res)
_ArrayDisplay($res2)
;==========================================
Func _count($array)
Local $array2[1][2] = [[$array[0], 1]], $n = 1
For $i = 1 to UBound($array)-1
If $array[$i] = $array[$i-1] Then
$array2[$n-1][1] += 1
Else
$n += 1
Redim $array2[$n][2]
$array2[$n-1][1] = 1
EndIf
$array2[$n-1][0] = $array[$i]
Next
Return $array2
EndFunc
Re: [Ex] Isolation de références + comptage de quantités (Ex
Posté : ven. 07 déc. 2012 14:36
par GhostLine
Je suis devenu tout fou depuis qj'ai découvert uboud(), c'est pour ça

merci pour la correction !