none
Wpf Recherche de valeur dans une feuille Excel avec une boucle "Do" "While" ne se termine jamais RRS feed

  • Discussion générale

  • Bonjour voici un code qui permet de rechercher des valeurs dans une feuille de calcul Excel.

    FindNumLotRange = Recherche une valeur dans la colonne B. Cette valeur à été saisie par l'utilisateur dans un TextBox (UCPesee1NumLotTextBox).

    Si la valeur est trouvée, le code va recherché dans un Range bien défini (OkNokRangeStart, OkNokRangeEnd) de la colonne K

    la 1ere occurrence de la valeur "NOK". Si elle est trouvée, un messagebox apparaît. En réponse à ce message, le code va effectuer une boucle dans le Range défini ( OkNokRangeStart, OkNokRangeEnd) pour trouver les autres occurrences potentielles de la valeur "NOK".

    Et c'est la mon soucis, la boucle ne se termine jamais , le curseur de la feuille Excel est bloqué sur "Wait" et il ne se passe plus rien. Noté que je n'ai aucune erreur d'execution de code.

    Voici le code est la feuille Excel :

     string LotToSearch;
            string MotToSearch;
            string sFirstAdress = null;
            string RapportLotNokPath = "RappportLots.txt";
            string RapportLotFullPath;
            Excel.Application XlApp = null;
            Excel.Workbooks oWbs = null;
            Excel.Workbook oWb = null;
            Excel.Worksheet oSheetProduits, oSheetPesees, oSheetEtiquette, oSheetIntegrationStk, oSheetFicheClient,
                oSheetFDReprise, oSheetListPalACompleter,oSheetLotsNOK = null;
            Excel.Range FindNumLotRange, ColumnLotRange, XlUsedRange, QuantiteEntreeRange, QRestante, OkNokRange, FindNok,CopyLotFindNok,TargetRange,
                OkNokRangeEnd,OkNokRangeStart,FullokNokRange= null;
            object miss = Type.Missing;
            List<int> FoundRows = new List<int>();
    		 private void SearchNumLot()
            {
                var selectedProduit = ProduitCB.Text;
                oSheetProduits = oWb.Sheets[selectedProduit];
                oSheetProduits.Activate();
                XlUsedRange = (Excel.Range)oSheetProduits.UsedRange;
                LotToSearch = UCPesee1NumLotTextBox.Text.ToString();
                ColumnLotRange = (Excel.Range)XlUsedRange.Columns["B"];
                FindNumLotRange = ColumnLotRange.Find(LotToSearch, miss, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,
                    Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, miss, miss, miss);
                if (FindNumLotRange != null)
                {
                    FindNumLotRange.Select();
                    OkNokRangeEnd = FindNumLotRange.Offset[-1, 9];
                    OkNokRangeStart = oSheetProduits.Range["K2"];
                    FullokNokRange = oSheetProduits.Range[OkNokRangeStart, OkNokRangeEnd];
                    FullokNokRange.Select();
                    MotToSearch = "NOK";
                    FindNok = FullokNokRange.Find(MotToSearch, miss, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,
                    Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, miss, miss, miss);
                    if (FindNok==null)
                    {
                        QuantiteEntreeRange = FindNumLotRange.Offset[0, 1];
                        QRestante = FindNumLotRange.Offset[0, 8];
                        QEntreeTB.Text = QuantiteEntreeRange.Value2.ToString();
                        LotRestantTB.Text = QRestante.Value2.ToString();
                        DateTime d = new DateTime((int)AnneeCongelCB.SelectedItem, 1, 1);
                        DateCongelTB.Text = d.AddDays(Convert.ToInt32(UCPesee1NumLotTextBox.Text) - 1).ToString("dd/MM/yyyy");
                        UCPesee1ValidNumLotBtn.IsEnabled = false;
                        UCPesee1PNetTxtBox.IsEnabled = true;
                        UCPesee1PNetTxtBox.Focus();
                        UCPesee1AnnulBtn.IsEnabled = true;
                    }
                    else
                    {
                        FindNok.Select();
                        sFirstAdress = FullokNokRange.Address;
                        FoundRows.Add(FindNok.Row);
                        MessageBox.Show("ATTENTION des lots plus anciens n'ont pas étés produits.\nCliquez sur OK pour voir la liste des lots."
                            , "Gestion des lots", MessageBoxButton.OK, MessageBoxImage.Exclamation, MessageBoxResult.OK);
                        do
                        {
                            FindNok = FullokNokRange.FindNext(FindNok);
                            if (FindNok.Address != sFirstAdress)
                            {
                                FoundRows.Add(FindNok.Row);
                            }
                        }
                        while (!(FindNok.Address == sFirstAdress));
                        if (FoundRows.Count > 0)
                        {
                            int cnt = 1;
                            foreach (int nrow in FoundRows)
                            {
                                CopyLotFindNok = (Excel.Range)XlUsedRange.Rows[nrow];
                                CopyLotFindNok.Select();
                                oSheetLotsNOK = oWb.Sheets["LotsNOK"];
                                CopyLotFindNok.Copy();
                                TargetRange = (Excel.Range)oSheetLotsNOK.Cells[cnt, 1];
                                TargetRange.PasteSpecial(Excel.XlPasteType.xlPasteValues, Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone,
                                    miss, miss);
                                cnt += 1;
                                oSheetLotsNOK.Activate();
                                FileStream fs = null;
                                RapportLotFullPath = System.IO.Path.Combine(DossierDocument, RapportLotNokPath);
                                if (!File.Exists(RapportLotFullPath))
                                {
                                    using (fs = File.Create(RapportLotFullPath))
                                    {
    
                                    }
    
                                }


    JF Collombet ® CreateSpecificCulture

    lundi 14 août 2017 16:25

Toutes les réponses

  • Précision :

    A l'aide des points d'arrêts, je me suis rendu compte que le "Bug" survient au moment de l'execution de la partie du code :

    while (!(FindNok.Address == sFirstAdress));


    JF Collombet ® CreateSpecificCulture

    lundi 14 août 2017 16:30