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:
- 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).
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.
Merci d'avance
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