Excel macro ne fonctionne pas après la mise à niveau vers Office 2013
Mon entreprise utilise excel pour produire réseau configs qui vont à l'ensemble de nos magasins. les configs sont à peu près identiques à l'exception de quelques variables qui se entrés dans une variable feuille dans Excel. L'utilisateur puis cliquez sur un bouton de commande et le tour est joué, les variables sont mis dans la config et une nouvelle fiche est créée dans le classeur. C'était pour nous depuis des années. Toutefois, nous avons récemment mis à niveau vers Office 2013 et présent, aucun de nos config modèles de travail. Il n'y a pas beaucoup pour le code, alors cela pourrait être relativement facile, mais je ne suis pas un programmeur. Voici le code:
Public Sub ReplaceValues(OriginalSheetName As String, VariableSheetName As String, NewSheetName As String)
Dim iVariableRowCounter As String
Dim sSearchValue As String
Dim sReplacementValue As String
Dim iControlCounter As Integer
ThisWorkbook.Sheets(OriginalSheetName).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = NewSheetName
For iControlCounter = ThisWorkbook.Sheets(NewSheetName).Shapes.Count To 1 Step -1
If ThisWorkbook.Sheets(NewSheetName).Shapes(iControlCounter).Type = msoOLEControlObject Then
ThisWorkbook.Sheets(NewSheetName).Shapes(iControlCounter).Delete
End If
Next
iVariableRowCounter = 2
While ThisWorkbook.Sheets(VariableSheetName).Cells(iVariableRowCounter, 1).Value <> ""
sSearchValue = ThisWorkbook.Sheets(VariableSheetName).Cells(iVariableRowCounter, 1).Value
sReplacementValue = ThisWorkbook.Sheets(VariableSheetName).Cells(iVariableRowCounter, 2).Value
ThisWorkbook.Sheets(NewSheetName).UsedRange.Replace what:=sSearchValue, replacement:=sReplacementValue, searchorder:=xlByColumns, MatchCase:=False, lookat:=xlPart
iVariableRowCounter = iVariableRowCounter + 1
Wend
End Sub
Public Function GenerateNewWorksheetName(OriginalSheetName As String) As String
Dim sNewSheetName As String
Dim iIncrement As Integer
Dim iSheetCounter As Integer
Dim bGoodName As Boolean
Dim bSheetFound As Boolean
iIncrement = 1
bGoodName = False
While Not bGoodName
sNewSheetName = OriginalSheetName & " - " & iIncrement
bSheetFound = False
For iSheetCounter = 1 To ThisWorkbook.Sheets.Count
If ThisWorkbook.Sheets(iSheetCounter).Name = sNewSheetName Then
bSheetFound = True
Exit For
End If
Next
If Not bSheetFound Then
bGoodName = True
End If
iIncrement = iIncrement + 1
Wend
GenerateNewWorksheetName = sNewSheetName
End Function
Toute aide est grandement appréciée. Merci.
- Ce qui ne fonctionne pas? Des valeurs erronées ou avez-vous des erreurs? Quelque chose d'autre?
- Désolé, ça pourrait aider. Quand je clique sur le bouton de commande à l'entrée les variables, j'obtiens une erreur d'Exécution '1004': la méthode Copy de la classe Worksheet a échoué. Je reçois un bouton et un bouton de Débogage. lorsque je clique sur le bouton debug, il met en évidence cette ligne : ThisWorkbook.Feuilles(OriginalSheetName).Copie d'après:=ThisWorkbook.Feuilles(ThisWorkbook.Les draps.Le comte)
- Quelle est la ligne de code qui appelle ce code? Après avoir cliqué sur le Débogage, si vous passez votre souris sur
OriginalSheetName
ce que la petite pop-up de dire? Et est-ce un nom à l'un de la feuille de calcul dans le classeur 3 qui est en cours d'exécution du code? - Vous pouvez poster votre classeur - avec les données supprimées si nécessaire?
Dim iVariableRowCounter As String
doit sûrement être unInteger
au lieu d'unString
?- est votre classeur protégé? Est votre feuille de calcul protégée? Sont-il caché des feuilles de calcul?
- Une astuce utile, après l'appui sur le bouton Debug, est de mettre en évidence une partie de la ligne et appuyez sur Maj + F9 pour créer une "montre". Cela permet de garder la trace d'une variable ou d'une expression et d'afficher la valeur dans la mémoire à l'instant. Vous pouvez créer autant de montres que vous le souhaitez. Je voudrais créer une alerte pour
ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
et voir si c'est une feuille de calcul valide ou pas.
Vous devez vous connecter pour publier un commentaire.
D'avoir une erreur lorsque vous mettez à niveau me fait penser que votre code peut être à l'aide de la liaison anticipée (bien que les seules références que je vois sont des constantes comme
msoOLEControlObject
etxlByColumns
, et je ne sais pas pourquoi ceux qui serait la cause de la Copie à l'échec). Vous pourriez avoir besoin de vérifier les références dans VBA, ou regarder dans la conversion de la liaison tardive. Malheureusement, ceux qui sont un peu complexes à couvrir ici.L'autre possibilité est que la Copie a changé dans la nouvelle version de VBA (toujours en 2007 sur moi-même). Vous devriez être en mesure d'appuyer sur F1 lorsque le curseur est sur le mot Copie pour savoir comment il est censé travailler.
De toute façon vous êtes probablement à l'apprentissage d'un peu de programmation! 😉