Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Actualisation formule écrite via macro en liaison avec une BBD

vynmarius

XLDnaute Nouveau
Bonjour,

Depuis que je suis passé d'Excel 2010 ou 2013, vers 365, je rencontre un problème avec ma macro.

le fichier excel est une passerelle entre deux logiciels, je convertis les valeurs de l'un avec le "formalisme" de l'autre. cet extrait de code est dans une boucle (for)

le problème porte sur la ligne:
VB:
Cells(j - 1, 5).FormulaR1C1 = "=IF(ISNA(VLOOKUP(RC[-4],Tableau_dernière_revision_technique,2,FALSE))=TRUE, """",VLOOKUP(RC[-4],Tableau_dernière_revision_technique,2,FALSE))"

- RC[-4] contient la valeur que je cherche dans la base de donnée (format texte de chaque coté pour concerver les zéros en début de terme, exemple 002510).
- Tableau_dernière_revision_technique est la base de donnée déportée de mon ERP, c'est le nom de la zone ou est collée la BBD.
- Dans la cellule Cells(j - 1, 5) je renvoie la valeur à droite du terme recherché dans la BDD, en lien avec le '2' de la fonction VLOOKUP.
- Si je ne trouve rien je renvoie la valeur "A" (ligne suivante)

or depuis 365, la formule ne s'active pas dans la cellule Cells(j - 1, 5), et donc je ne renvois que des "A".
J'ai fait du pas à pas pour vérifier l'exécution, lorsque la formule est collée, je rentre dans la cellule RC[-4] et je valide sa valeur, à ce moment la formule s'active et renvois la bonne valeur. j'ai essayé plein de manipulation de données, couper, copier, collé, FormulaR1C1 = 'cell.value' , etc. rien n'y fait.

Auriez vous une idée pour actualiser la recherche? (je précise que dans les options d'excel, l'actualisation des formules est activée).

VB:
            Cells(j - 1, 5).FormulaR1C1 = "=IF(ISNA(VLOOKUP(RC[-4],Tableau_dernière_revision_technique,2,FALSE))=TRUE, """",VLOOKUP(RC[-4],Tableau_dernière_revision_technique,2,FALSE))"
            '                             "=IF(ISNA(VLOOKUP(RC[-4],Tableau_dernière_revision_technique[#All],2,FALSE))=TRUE, """",VLOOKUP(RC[-4],Tableau_dernière_revision_technique[#All],2,FALSE))"
            If Cells(j - 1, 5).Value = "" Then Cells(j - 1, 5).Value = "A"



Voici le code complet pour comprendre ce que je fais :

la zone de données est copiée sur le tableau à convertir puis coller et traité par la macro lors de sont exécution En 1ere colonne la référence de l'article, deuxième colonne la quantité en mètre, et 3ème colonne la quantité de 'pièce'. La dimension de cette zone est indéterminée sur la hauteur, mais fait toujours 3 colonnes de large, et sont type n'est pas forcément figé, d’où le changement du format des cellules au format texte.

VB:
Sub mise_en_forme()

Dim LVL_Line, i, j, k, l As Integer, Insertion_Colonne As String, ColorCode

' insertion V5
    Sheets("MEF").Select
    Range("A5").Select
    ActiveSheet.Paste
   
    Application.CutCopyMode = False
    ActiveWorkbook.Worksheets("MEF").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("MEF").Sort.SortFields.Add Key:=Range("A5"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("MEF").Sort
        .SetRange Range("A5:C600")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
TypeConversion = MsgBox("Révision Article(OUI) ou Structure du Produit(NON) ?", vbYesNo, "Type ce conversion")

If TypeConversion = vbYes Then
    Cells(2, 1).Value = "!IFS.COPYOBJECT"
    Cells(3, 1).Value = "$LU=EngPartStructure"
    Cells(4, 1).Value = "$VIEW=ENG_PART_STRUCTURE_EXT"
ElseIf TypeConversion = vbNo Then
    Cells(2, 1).Value = "!IFS.COPYOBJECT"
    Cells(3, 1).Value = "$LU=ProdStructure"
    Cells(4, 1).Value = "$VIEW=PROD_STRUCTURE"
End If
' supression colonne A (lINE)
'   Columns("B:C").Delete Shift:=xlToLeft
   
' format texte colonne
    Range("D:E").NumberFormat = "00.0"

   
'conversion , en . pour avoir des nombres décimaux au lieu de mots au format 'string'
'    Columns("G:G").Select
'    Selection.Replace What:=",", Replacement:=".", lookat:=xlPart, _
'        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
'        ReplaceFormat:=False

' définition hauteur et largeur du tableau
    Range("A1").Select
    Selection.End(xlDown).Select
    Hauteur_Tableau = ActiveCell.Row
   
     
' calcul LVL_MAX et conversion des nombre 4 chiffres
'    LVL_Max = 0
'    For i = 2 To Hauteur_Tableau
'        If Cells(i, 1).Value > LVL_Max Then LVL_Max = Cells(i, 1).Value
'        If Len(Cells(i, 3).Value) < 5 Then
'            Cells(i, 3).Value = "0" & Cells(i, 3).Value
'        End If
'    Next i
'    LVL_Max = Val(LVL_Max)
     
' mise en forme tableau largeur hauteur cellule ajustées et bandeau 1ere ligne fixe
    Rows("1:1").Select
    With ActiveWindow
        .SplitColumn = 0
        .SplitRow = 1
    End With
    ActiveWindow.FreezePanes = True

    Cells.Select
    Cells.EntireColumn.AutoFit
    Columns("I:I").Select
    Selection.ColumnWidth = 50
    Cells.EntireRow.AutoFit
    Columns("A:Z").Select
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
    End With
    Cells(1, 1).Select
    Cells(1, 1).ColumnWidth = 60
    Cells(1, 1).RowHeight = 150
   
        'Cells(2, 8).Value = Hauteur_Tableau
' mise en forme données SEE

If TypeConversion = vbYes Then
    For i = 5 To Hauteur_Tableau
        j = Hauteur_Tableau - i + 6
       
            If Len(Cells(j - 1, 1).Value) = 4 Then
                Cells(j - 1, 1).Value = "0" & Cells(j - 1, 1).Value
            End If
           
            If Left(Cells(j - 1, 1).Value, 1) = "x" Or Left(Cells(j - 1, 1).Value, 1) = "X" Or Cells(j - 1, 1).Value = "N/A" Then
                MsgBox ("Attention référence en XXXXX et/ou N/A, à codifier dans IFS et mettre à jour dans SEE")
                initialisation
                Exit Sub
            End If

            Rows("" & j & ":" & (j + 4) & "").Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Cells(j - 1, 4).Select
            ActiveCell.FormulaR1C1 = "=IF(RC[-2]=""0"",RC[-1],RC[-1]*RC[-2]/1000)"
           
            Cells(j, 1).Value = "$RECORD=!"
            Cells(j + 1, 1).Value = "-$2:SUB_PART_NO=" & Cells(j - 1, 1).Value
            Cells(j - 1, 5).FormulaR1C1 = "=IF(ISNA(VLOOKUP(RC[-4],Tableau_dernière_revision_technique,2,FALSE))=TRUE, """",VLOOKUP(RC[-4],Tableau_dernière_revision_technique,2,FALSE))"
            '                             "=IF(ISNA(VLOOKUP(RC[-4],Tableau_dernière_revision_technique[#All],2,FALSE))=TRUE, """",VLOOKUP(RC[-4],Tableau_dernière_revision_technique[#All],2,FALSE))"
            If Cells(j - 1, 5).Value = "" Then Cells(j - 1, 5).Value = "A"
            Cells(j + 2, 1).Value = "-$3:SUB_PART_REV=" & Cells(j - 1, 5).Value
            Cells(j + 3, 1).Value = "-$6:POS=" & (i - 4)
            Cells(j + 4, 1).Value = "-$7:QTY=" & Cells(j - 1, 4).Value
            Rows("" & (j - 1) & ":" & (j - 1) & "").Select
            Selection.Delete Shift:=xlUp
    Next i
ElseIf TypeConversion = vbNo Then
    For i = 5 To Hauteur_Tableau
        j = Hauteur_Tableau - i + 6
       
            If Len(Cells(j - 1, 1).Value) = 4 Then
                Cells(j - 1, 1).Value = "0" & Cells(j - 1, 1).Value
            End If
           
            If Left(Cells(j - 1, 1).Value, 1) = "x" Or Left(Cells(j - 1, 1).Value, 1) = "X" Or Cells(j - 1, 1).Value = "N/A" Then
                MsgBox ("Attention référence en XXXXX et/ou N/A, à codifier dans IFS et mettre à jour dans SEE")
                initialisation
                Exit Sub
            End If
            Rows("" & j & ":" & (j + 4) & "").Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Cells(j - 1, 4).Select
            ActiveCell.FormulaR1C1 = "=IF(RC[-2]=""0"",RC[-1],RC[-2]/1000)"
            Cells(j, 1).Value = "$RECORD=!"
            Cells(j + 1, 1).Value = "-$6:COMPONENT_PART=" & Cells(j - 1, 1).Value
            Cells(j + 2, 1).Value = "-$11:QTY_PER_ASSEMBLY=" & Cells(j - 1, 4).Value
            Rows("" & (j - 1) & ":" & (j - 1) & "").Select
            Selection.Delete Shift:=xlUp
    Next i
End If

        Range("A2:A" & 5 * (Hauteur_Tableau - 4) + 4 & "").Select
        Range("A2:A" & 5 * (Hauteur_Tableau - 4) + 4 & "").Copy
        MsgBox ("Les données sont disponibles pour l'ERP")
   
End Sub

Merci d'avance
 

vynmarius

XLDnaute Nouveau
Bonjour,

Personne n'a rencontré de problème d'actualisation d'un formule, lors de l'injection de cette formule dans un tableur via une macro?

En PJ l'exemple du fichier si ça peut aider. le fichier est lourd (BDD de 3mo) je passe par un lien externe. Fichier Excel
J'ai supprimé l'accès à la BDD distante, il reste juste l'image de la BDD en local, suffisante pour tester.

Bonne journée
 

vynmarius

XLDnaute Nouveau
piste de recherche, j'ai édité une cellule du fichier à convertir, sur l'onglet SOLID, juste en rentrant dans la cellule et en validant sa valeur. Cela m'a affiché une 'erreur' de type. du coup sur cette valeur la formule s’exécute normalement avec la macro, alors que tout les formats de cellules sont bien identiques, au format texte.
 

Discussions similaires

Réponses
4
Affichages
426
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…