Le module complémentaire Macro Converter automatise la majeure partie du processus de conversion, mais vous devrez peut-être ajuster certaines API et d'autres éléments pour finaliser votre code.
Utilisez ce guide pour comprendre les fichiers Apps Script (fichiers GS) ajoutés à votre projet, interpréter les différents types d'erreurs et apprendre à les corriger.
Comprendre les fichiers Apps Script ajoutés à votre projet
Des fichiers GS supplémentaires sont ajoutés à votre projet Apps Script pour vous aider:
- Définissez des constantes et des valeurs VBA qui n'existent pas dans Apps Script.
- Implémentez les API non converties.
- Résolvez les variantes.
Les fichiers GS suivants sont ajoutés à votre projet Apps Script:
Library.gs
Unimplemented_constructs.gs
Variant_resolutions.gs
Library.gs
En règle générale, vous n'avez rien à modifier dans le fichier library.gs
.
Le fichier library.gs
définit des fonctions et des constantes qui étaient utilisées dans votre code VBA et qui n'existent pas dans Apps Script. Cela permet au nouveau code Apps Script de mieux ressembler à votre code VBA. De plus, vous n'avez pas besoin de répéter les définitions chaque fois que des fonctions ou des constantes du fichier library.gs
sont utilisées.
Unimplemented_constructs.gs
Le fichier unimplemented_constructs.gs
adresse les constructions ou les API qui n'ont pas pu être converties par Macro Converter. Vous devrez probablement modifier ce fichier pour que votre code fonctionne comme prévu.
Exemple : Window.Activate()
Voici un exemple d'API non prise en charge appelée Window.Activate()
.
Le convertisseur de macro crée une fonction Apps Script portant un nom similaire et la définit dans le fichier unimplemented_constructs.gs
. Étant donné que la fonction VBA n'est pas prise en charge, la nouvelle fonction Apps Script génère une exception.
La nouvelle fonction est ajoutée au code Apps Script converti partout où l'API d'origine était utilisée dans le code VBA.
Si vous trouvez un moyen de recréer le comportement de l'API d'origine, il vous suffit de mettre à jour la définition de la fonction dans le fichier unimplemented_constructs.gs
. Une fois la fonction définie, elle s'applique partout où elle apparaît dans votre projet Apps Script.
Voici l'exemple en code:
Code VBA d'origine
Window.activate()
Code Apps Script converti, ajouté en ligne
_api_window_activate();
Définition de fonction ajoutée au fichier unimplemented_constructs.gs
/** * Could not convert window.activate API. Please add relevant code in the * following function to implement it. * This API has been used at the following locations in the VBA script. * module1 : line 3 * * We couldn't find an equivalent API in Apps Script for this VBA API. Please * reconsider if this function call is critical, otherwise consider implementing * it in a different way. */ function _api_window_activate(CallingObject) { ThrowException("API window.activate not supported yet."); }
Variant_resolutions.gs
Le fichier variant_resolutions.gs
est ajouté à votre projet Apps Script si le type d'un objet ne peut pas être déterminé. Cela peut se produire pour plusieurs raisons, par exemple si une API possède plusieurs types de retour ou si l'objet est déclaré comme une variante.
Macro Converter ajoute une nouvelle fonction à ce fichier appelée __handle_resolve_<api>()
qui remplace l'API en question et aide à déterminer le type d'objet.
Dans certains cas, vous devrez peut-être mettre à jour la fonction __handle_resolve_<api>()
pour déclarer manuellement le type d'objet. Consultez la section Type d'objet non compatible.
Exemple : name()
De nombreux types d'objets dans VBA définissent une API name()
. En général, l'équivalent Apps Script est getName()
, mais pas pour tous les types d'objets. Plusieurs cas de figure peuvent se produire:
- L'API équivalente de l'objet est appelée différemment de
getName()
. - L'objet ne dispose pas d'API Apps Script pour obtenir son nom.
- Il n'existe pas d'objet Apps Script équivalent.
Lorsque le type d'objet n'est pas déterminé, Macro Converter crée une fonction appelée __handle_resolve_name
dans le fichier variant_resolutions.gs
.
Voici l'exemple en code:
Code VBA d'origine
a = Selection.name
Dans ce cas, l'API name()
est appelée sur la sélection actuelle. La sélection peut être un objet Sheet ou un objet Shape. S'il s'agit d'un objet Feuille, la traduction est getName()
, mais s'il s'agit d'un objet Forme, il n'existe pas d'équivalent dans Apps Script.
Code Apps Script converti, ajouté en ligne
a = __handle_resolve_name({}, getActiveSelection(), {});
La fonction __handle_resolve_name()
ci-dessous est ajoutée au fichier variant_resolution.gs
pour résoudre différents types d'objets. La fonction vérifie le type d'objet, puis utilise getName()
si elle est compatible, ou génère une erreur si getName()
n'est pas compatible.
Définition de fonction ajoutée au fichier variant_resolution.gs
function __handle_resolve_name(ExecutionContext, CallingObject, params_map) { var found_api_variant = false; var return_value; if (String(CallingObject) == "Sheet") { if (!ExecutionContext.isLhs) { return_value = CallingObject.getName(); found_api_variant = true; } } if (CallingObject instanceof ChartInSheet) { if (!ExecutionContext.isLhs) { return_value = CallingObject.getName(); found_api_variant = true; } } if (!found_api_variant) { ThrowException("API.name not supported yet." ); } return return_value; }
Rechercher des erreurs
Lorsque vous rencontrez une erreur dans le code Apps Script converti, le message spécifie le type d'erreur et son emplacement. Le format du message d'erreur dépend du moteur d'exécution Apps Script que vous utilisez.
Si vous utilisez l'environnement d'exécution V8 par défaut, un message d'erreur semblable à celui-ci s'affiche:
_api_windows_active (unimplemented_constructs:2:3)
Cela signifie que l'erreur se trouve dans le fichier unimplemented_constructs.gs
à la ligne 2, au caractère 3.
Si vous utilisez l'environnement d'exécution Rhino obsolète, un message d'erreur semblable à celui-ci s'affiche:
unimplemented_constructs:2 (_api_windows_active)
Cela signifie que l'erreur se trouve dans le fichier unimplemented_constructs.gs
à la ligne 2.
Types d'erreurs
Vous pouvez corriger la plupart des erreurs que vous rencontrez dans les fichiers unimplemented_constructs.gs
et variant_resolution.gs
décrits ci-dessus.
Voici les types d'erreurs que vous pouvez rencontrer:
- API non implémentée
- Construction de langage non implémentée
- API partiellement compatible
- Travail manuel nécessaire
- Erreur intentionnelle
API non implémentée
Une API non implémentée est une API que Macro Converter ne peut pas convertir de VBA vers Apps Script. Il n'existe pas de solution de contournement connue pour cette API.
Les API non implémentées sont généralement ajoutées au fichier unimplemented_constructs.gs
en tant que fonctions vides, parfois avec des signatures vides. Si le type d'objet n'a pas pu être déterminé, l'API non implémentée peut être ajoutée au fichier variant_resolution.gs
.
Dans le rapport de compatibilité que vous avez généré avant la conversion, cette API est associée à la mention Nécessite plus d'investigations.
Si vous ne corrigez pas ce type d'API dans votre code VBA avant de convertir votre fichier, voici comment il apparaît dans le projet Apps Script:
/** * Could not convert. Please add relevant code in the following * function to implement it. * This API has been used at the following locations in the VBA script. *: * We couldn't find an equivalent API in Apps Script for this VBA API. Please * reconsider if this function call is critical, otherwise consider implementing * it in a different way. * @param param1 {} * @param param2 {} * ... * @return {} */ function _api_<API_name>(param1, param2, ....) { ThrowException("APInot supported yet." ); }
Corriger les erreurs d'API non implémentées
Définissez l'API non implémentée avec des API Apps Script ou des bibliothèques JS existantes. Pour ce faire, procédez comme suit :
- Ouvrez le code Apps Script converti à l'emplacement de l'erreur. Consultez la section Rechercher des erreurs.
- Au-dessus de la fonction, lisez le commentaire ajouté. Dans certains cas, le commentaire suggère comment implémenter l'API dans Apps Script.
- Si vous ne trouvez pas de moyen d'implémenter l'API dans Apps Script, envisagez de la supprimer de votre code.
- Si vous ne trouvez pas de solution de contournement ou si vous ne parvenez pas à supprimer cette API de votre code et que votre macro génère cette erreur, vous ne pouvez pas la convertir.
Exemples d'erreurs d'API non implémentées
Voici des exemples de scénarios d'API non implémentés et comment les résoudre:
- Il n'existe pas d'équivalent Apps Script : affiche une solution de contournement indirecte pour
Chart.Protect
, une API qui n'existe pas dans Apps Script. - Type d'objet inconnu: explique comment gérer un type d'objet qui est une variable et comment implémenter un type d'objet non compatible qui peut être recréé dans Apps Script.
Exemple 1: Aucun script Apps Script équivalent ou API inconnue
Dans cet exemple, Chart.Protect
n'a pas été converti automatiquement, car il n'existe aucun moyen de protéger un graphique dans Google Sheets.
/** * Could not convert chart.protect API. Please add relevant code in the following * function to implement it. * * This API has been used at the following locations in the VBA script. * sheet1 : line 3 * You can use the following Apps Script APIs to convert it. * * Comments : Auto conversion of Chart.Protect is not supported yet. If the API is * critical for the workflow the user can implement the unimplemented handler * method in the generated code, else comment out the throw statement. * * @param {Object} CallingObject represents the parent object using which the API * has been called. * @param {string} Password * @param {boolean} DrawingObjects * @param {boolean} Contents * @param {boolean} Scenarios * @param {boolean} UserInterfaceOnly * */ function _api_chart_protect( CallingObject, Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly) { ThrowException('API chart.protect not supported yet.'); }
Un exemple d'implémentation de la protection de la plage est présenté ci-dessous:
/** * Could not convert chart.protect API. Please add relevant code in the following * function to implement it. * This API has been used at the following locations in the VBA script. * sheet1 : line 3 * * You can use the following Apps Script APIs to convert it. * Comments : Auto conversion of Chart.Protect is not supported yet. If the API * is critical for the workflow the user can implement the unimplemented handler * method in the generated code, else comment out the throw statement. * * @param {Object} CallingObject represents the parent object using which the API * has been called. * @param {string} Password * @param {boolean} DrawingObjects * @param {boolean} Contents * @param {boolean} Scenarios * @param {boolean} UserInterfaceOnly */ function _api_chart_protect( CallingObject, Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly) { var ranges = CallingObject.getChart().getRanges(); for (var i = 0; i < ranges.length; i++) { // Note that this does not lock the range for the document owner. ranges[i].protect(); } }
Exemple 2: Type d'objet non compatible
Lorsque le type d'objet est inconnu, l'erreur d'API non implémentée est ajoutée au fichier variant_resolution.gs
. L'exemple suivant complète l'exemple d'API name()
VBA ci-dessus. Consultez variant_resolution.gs
.
Dans cet exemple, vous allez apprendre:
- Conversion de l'API
name()
en nouvelle fonction dans le fichiervariant_resolution.gs
- Comment la nouvelle fonction est appelée dans le code converti
- Comment créer une solution de contournement pour
CommandBar
, un type d'objet non compatible, dans Apps Script
1. Comme le code converti ne peut pas déterminer le type d'objet exact sur lequel name()
est appelé, le convertisseur de macro crée une nouvelle fonction appelée __handle_resolve_name
, comme illustré ci-dessous.
function __handle_resolve_name(ExecutionContext, CallingObject, params_map) { var found_api_variant = false; var return_value; if (String(CallingObject) == "Sheet") { if (!ExecutionContext.isLhs) { return_value = CallingObject.getName(); found_api_variant = true; } } if (CallingObject instanceof ChartInSheet) { if (!ExecutionContext.isLhs) { return_value = CallingObject.getName(); found_api_variant = true; } } if (!found_api_variant) { ThrowException('API.name not supported yet.' ); } return return_value; }
2. Supposons que le code VBA définisse une fonction PrintName()
qui appelle l'API name()
. Le code VBA est indiqué ci-dessous:
‘Defining a function that prints the name of the object in parameter Sub PrintName(obj as Variant) Debug.Print obj.Name End Sub
function PrintName(obj) { Logger.log(_handle_resolve_name(obj)); }
3. Supposons que votre code VBA appelle la fonction PrintName()
sur le type d'objet CommandBar
. Le code VBA est indiqué ci-dessous:
PrintName Application.CommandBars.item("Standard")
CommandBar
n'est pas compatible avec Apps Script. Par conséquent, les deux méthodes utilisées dans le code VBA ci-dessus ne sont pas non plus compatibles.
Application.CommandBars()
: en VBA, cette valeur renvoie la liste de tous les objetsCommandBar
.CommandBars.item()
: en VBA, cette valeur renvoie un objetCommandBar
spécifique.
_api_application_commandbars()
_api_commandbars_item()
PrintName(_api_commandbars_item(_api_application_commandbars(), "Standard"))) Here’s how the new functions are added to the unimplemented_construct.gs file: function _api_application_commandbars(CallingObject) { ThrowException('API application.commandbars not supported yet.'); } function _api_commandbars_item(CallingObject, index) { ThrowException('API commandbars.item not supported yet.'); }
Pour que les nouvelles fonctions fonctionnent, procédez comme suit:
3.1 Définissez un nouveau type d'objet qui crée les fonctionnalités de CommandBars
et une nouvelle collection de CommandBars
semblable à celle qui existe dans VBA.
3.2 Ajoutez une méthode getName()
pour le nouveau type d'objet.
Les étapes 3.1 et 3.2 sont illustrées dans le code ci-dessous. Les objets de menu sont créés en tant que nouveau type d'objet qui imite le comportement de CommandBars
.
// Our Implementation of CommandBar using Menu objects. function CommandBar(name) { this.name = name; // Create a menu object to represent the commandbar. this.menu = SpreadsheetApp.getUi().createMenu(name); // Create methods for retrieving or updating the name of the object this.getName = function() { return this.name; }; this.updateName = function(name) { this.name = name; }; // ======================================================================== // Implement other methods of CommandBar objects that are used in the script. // ===================================================================== return this; } // Our implementation of the collection of CommandBars that exists in VBA function CommandBars() { this.commandBars = []; this.getCommandBar = function(name) { for (var i = 0; i < this.commandBars.length; i++) { if (!this.commandBars[i].getName() == name) { return this.commandBars[i]; } } // No commandBar with the name exists, create a new one and return. var commandBar = new CommandBar(name); this.commandBars.push(commandBar); return commandBar; }; return this; } // Create a global object that represents CommandBars collection. var GlobalCommandBars = new CommandBars();
3.3 Modifiez la fonction __handle_resolve_name
dans le fichier variant_resolution.gs
pour gérer le nouveau type d'objet. Ajoutez une section à la fonction, comme indiqué ci-dessous:
function __handle_resolve_name(ExecutionContext, CallingObject, params_map) { var found_api_variant = false; var return_value; if (String(CallingObject) == "Sheet") { if (!ExecutionContext.isLhs) { return_value = CallingObject.getName(); found_api_variant = true; } } if (CallingObject instanceof ChartInSheet) { if (!ExecutionContext.isLhs) { return_value = CallingObject.getName(); found_api_variant = true; } } // New section added below // ======================================================================== if (CallingObject instanceof CommandBar) { objectExtend(params_map, {VALUETOSET: params_map.param0}); if (ExecutionContext.isLhs) { // Call the setter method. CallingObject.updateName(params_map.VALUETOSET); found_api_variant = true; } else { // Getter is called, return the commandbar name, return_value = CallingObject.getName(); found_api_variant = true; } } // ======================================================================== // New section added above if (!found_api_variant) { ThrowException('API.name not supported yet.' ); } return return_value; }
3.4 Définissez les deux fonctions créées dans le fichier unimplemented_constructs.gs
(_api_application_commandbars()
, _api_commandbars_item()
). Cette étape permet de s'assurer que les appels d'origine de la fonction fonctionnent.
//This is straightforward based on the implementation of a CommandBar and the // CommandBars collection above: function _api_application_commandbars(CallingObject) { return GlobalCommandBars; } function _api_commandbars_item(CallingObject, index) { return CallingObject.getCommandBar(index); }
Constructions de langage non implémentées
Un construct est un élément du langage de code qui contrôle le flux d'exécution ou l'affichage des données. Par exemple, des boucles, des libellés, des événements et des sauts. Voici la liste de toutes les constructions VBA.
Les constructions que le convertisseur de macro ne peut pas convertir sont considérées comme des constructions de langage non implémentées.
Lorsque le convertisseur de macro détermine qu'un construct de langage non implémenté existe, il insère un commentaire TODO
.
Les constructions VBA suivantes ne sont pas compatibles:
- AddressOf
- Déclarer
- DefType
- GoSub
- GoTo
- Implémente
- Lset
- Ouvrir
- RaiseEvent
- Nom
- Reprendre
- Rset
- TypeOf
- Cours
- Modules de cours
Correction des erreurs de construction de langage non implémentées
- Modifiez votre code afin que votre logique ne repose pas sur la construction de langage non prise en charge.
- Ouvrez le code Apps Script converti à l'emplacement de l'erreur. Consultez Rechercher des erreurs.
- En fonction de la logique du code, mettez-le à jour de manière à ne pas nécessiter la construction de langage non prise en charge.
- Si vous ne trouvez pas de moyen de réécrire votre code sans la construction de langage non prise en charge, vous ne pouvez pas convertir cette macro.
Exemples d'erreurs de construction de langage non implémentées
L'une des constructions de langage non implémentées les plus courantes est une instruction GoTo
.
Vous pouvez remplacer certaines instructions GoTo
VBA par des boucles. Vous trouverez ci-dessous deux exemples d'utilisation de boucles au lieu d'instructions GoTo
.
Exemple 1: Remplacez GoTo
par While Loop
Code VBA d'origine
Sub Test() a = 0 start: Debug.Print a While a < 100 a = a + 1 If a Mod 3 == 0 Goto start End If Wend End Sub
function test() { var a = 0; start: do { console.log(a); while (a < 100) { a = a + 1; if (a % 3 == 0) { continue start; } } break start; } while (true); }
Exemple 2: Remplacer GoTo par une boucle For
Code VBA d'origineSub Test() a = 0 For i = 1 to 100 For j = 1 to 10 a =a a + 1 If i + j > 50 GoTo endLoop End If Next j Next i endLoop: MsgBox a End Sub
function test() { var a = 0; endLoop: for (var i = 1; i <= 100; i++) { for (var j = 0; j <=10; j++) { If (i + j > 50) { break endLoop; } } } Browser.msgBox(a); } break start; } while (true); }
API partiellement compatible
Pour les API partiellement compatibles, certains paramètres d'entrée sont compatibles avec Apps Script et d'autres ne le sont pas.
Par exemple, l'API VBA legend_position
permet de définir la légende dans un graphique Excel. Il accepte plusieurs types de valeurs d'entrée, y compris les suivants:
xlLegendPositionBottom
: place la légende en bas du graphique.xlLegendPositionCorner
: place la légende dans un coin du graphique.xlLegendPositionCustom
: place la légende à des positions personnalisées sur le graphique.
Apps Script dispose d'un code équivalent qui n'accepte que certaines de ces valeurs. Les valeurs suivantes ne sont pas acceptées:
xlLegendPositionCorner
xlLegendPositionCustom
Pour signaler les valeurs non prises en charge des API partiellement compatibles dans votre code converti, une condition de validation est ajoutée au fichier library.gs
qui vérifie ces valeurs. Exemple :
if (position == xlLegendPositionCorner || position == xlLegendPositionCustom) { position = _handle_legend_position_error(position); }
Si la condition de validation trouve l'une des valeurs non prises en charge, une fonction de gestionnaire d'erreur, _handle_<API_name>_error
, est créée dans le fichier unimplemented_constructs.gs
.
La fonction génère une erreur utilisateur et ne remplace pas la valeur par une valeur compatible. Exemple :
/** * Throw error message for unsupported legend position. * The VBA API Legend.Position which can take values xlLegendPositionTop, * xlLegendPositionLeft, xlLegendPositionBottom, xlLegendPositionRight, * xlLegendPositionCorner, xlLegendPositionCustom. It is partially supported in * Apps Scripts that supports only a subset of the values (does not support * xlLegendPositionCorner and xlLegendPositionCustom). * @param {string} position */ function _handle_legend_position_error(position) { // Please comment the throw statement and return a supported position value // instead. // Values that are supported here are xlLegendPositionTop, // xlLegendPositionLeft, xlLegendPositionBottom, xlLegendPositionRight. throw new Error( 'Google Sheets does not support legend position: ' + position); }
Corriger les erreurs d'API partiellement compatibles
Définissez la fonction _handle_<API_name>_error
pour remplacer les valeurs non prises en charge par une solution de contournement acceptable pour vos besoins.
- Ouvrez le code Apps Script converti à l'emplacement de l'erreur. Consultez la section Rechercher des erreurs.
- Lisez le commentaire au-dessus de la fonction pour comprendre quelles valeurs sont acceptées et lesquelles ne le sont pas.
- Pour les valeurs non acceptées, déterminez quelles valeurs acceptées peuvent servir de remplacement approprié.
- Modifiez la fonction
_handle_<API_name>_error
pour qu'elle renvoie plutôt une valeur compatible. - Si vous ne trouvez pas de moyen de remplacer la valeur non prise en charge, vous ne pouvez pas convertir cette macro.
Exemple d'erreur d'API partiellement compatible
L'exemple suivant développe l'API VBA legend_position
mentionnée ci-dessus.
Consultez la section API partiellement compatible.
Vous trouverez ci-dessous un exemple de code VBA d'origine qui utilise une valeur non prise en charge, xlLegendPositionCustom
.
Charts(1).Legend.Position = xlLegendPositionCustom
Macro Converter ajoute la fonction ci-dessous au fichier unimplemented_constructs.gs
:
/** * Throw error message for unsupported legend position. * The VBA API Legend.Position which can take values xlLegendPositionTop, * xlLegendPositionLeft, xlLegendPositionBottom, xlLegendPositionRight, * xlLegendPositionCorner, xlLegendPositionCustom. It is partially supported in * Apps Scripts that supports only a subset of the values (does not support * xlLegendPositionCorner and xlLegendPositionCustom). * @param {string} position */ function _handle_legend_position_error(position) { // Please comment the throw statement and return a supported position value // instead. // Values that are supported here are xlLegendPositionTop, // xlLegendPositionLeft, xlLegendPositionBottom, xlLegendPositionRight. throw new Error( 'Google Sheets does not support legend position: ' + position); }
Travail manuel nécessaire
Travail manuel nécessaire signifie que l'API VBA peut être convertie en Apps Script, mais qu'une solution de contournement est nécessaire.
Dans le rapport de compatibilité que vous avez généré avant la conversion, ce type d'API est marqué comme Compatible avec des solutions de contournement.
Si vous ne corrigez pas ce type d'API dans votre code VBA avant de convertir votre fichier, voici comment il apparaît dans le projet Apps Script:
/** * Could not convertAPI. Please add relevant code in the following * function to implement it. * This API has been used at the following locations in the VBA script. *: * * You can use the following Apps Script APIs to convert it. * Apps Script APIs :* Apps Script documentation links : * * @param param1 { } * @param param2 {} * ... * @return {} */ function _api_<API_name>(param1, param2, ....) { ThrowException("APInot supported yet." ); }
Corriger les erreurs nécessitant une intervention manuelle
Implémentez un correctif pour que l'API fonctionne comme prévu. 1. Ouvrez le code Apps Script converti à l'emplacement de l'erreur. Consultez la section Rechercher des erreurs. 1. Lisez le commentaire au-dessus de la fonction pour identifier les API pouvant être utilisées pour contourner le problème. 1. Si vous ne trouvez pas de solution de contournement appropriée, envisagez de supprimer l'API de votre code. 1. Si vous ne trouvez pas de solution de contournement ou si vous ne parvenez pas à supprimer cette API de votre code et que votre macro génère une erreur, vous ne pouvez pas la convertir.
Exemples d'erreurs nécessitant une intervention manuelle
Voici des exemples d'API qui génèrent des erreurs "Travail manuel requis" et comment les résoudre:
Implement a workaround for Autocorrect.Addreplacement
.Implement a workaround for workbook.open()
. Cet exemple montre comment ouvrir des fichiers dans Google Drive avec Apps Script.
Exemple 1: Autocorrect.Addreplacement
Dans l'exemple suivant, l'API VBA Autocorrect.Addreplacement
peut être convertie, mais nécessite une solution de contournement. Le convertisseur de macro suggère comment implémenter la fonction dans les commentaires de code.
/** * Could not convert autocorrect.addreplacement API. Please add relevant code in * the following function to implement it. * This API has been used at the following locations in the VBA script. * sheet1 : line 3 * You can use the following Apps Script APIs to convert it. * Apps Script APIs : FindReplaceRequest , onEdit * Apps Script documentation links : * https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onedit * https://developers.google.com/sheets/api/eap/reference/rest/v4/spreadsheets/request?hl=en#findreplacerequest * Comments : AutoCorrect.AddReplacement was not converted, but there is an * equivalent option you can implement manually. Use onEdit and FindReplaceRequest * APIs instead, see https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onedit * and https://developers.google.com/sheets/api/eap/reference/rest/v4/spreadsheets/request?hl=en#findreplacerequest. * For more information on API manual implementation, see * https://developers.google.com/apps-script/guides/macro-converter/fix-conversion-errors. * @param {Object} CallingObject represents the parent object using which the API * has been called. * @param {string} What * @param {string} Replacement * @return {string} */ function _api_autocorrect_addreplacement(CallingObject, What, Replacement) { ThrowException('API autocorrect.addreplacement not supported yet.'); }
L'implémentation de l'API Autocorrect.Addreplacement
est présentée ci-dessous:
var AUTO_CORRECTIONS = "AUTO_CORRECTIONS"; // Need to get the autocorrections set in previous sessions and use them. var savedAutoCorrections = PropertiesService.getDocumentProperties().getProperty(AUTO_CORRECTIONS); var autoCorrections = savedAutoCorrections ? JSON.parse(savedAutoCorrections) : {}; function onEdit(e) { autoCorrect(e.range); } function autoCorrect(range) { for (key in autoCorrections) { // Replace each word that needs to be auto-corrected with their replacements. range.createTextFinder(key) .matchCase(true) .matchEntireCell(false) .matchFormulaText(false) .useRegularExpression(false) .replaceAllWith(autoCorrections[key]); } } /** * Could not convert autocorrect.addreplacement API. Please add relevant code in * the following function to implement it. * This API has been used at the following locations in the VBA script. * sheet1 : line 3 * * You can use the following Apps Script APIs to convert it. * Apps Script APIs : createTextFinder , onEdit * Apps Script documentation links : https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onedit , createTextFinder * Comments : AutoCorrect.AddReplacement was not converted, but there is an * equivalent option you can implement manually. Use onEdit and FindReplaceRequest * APIs instead, see https://developers.google.com/apps-script/reference/script/spreadsheet-trigger-builder#onedit * and createTextFinder. For more information on API manual implementation, see * https://developers.google.com/apps-script/guides/macro-converter/fix-conversion-errors. * * @param {Object} CallingObject represents the parent object using which the API has been called. * @param {string} What * @param {string} Replacement * * @return {string} */ function _api_autocorrect_addreplacement(CallingObject, What, Replacement) { autoCorrections[What] = Replacement; // Store the updated autoCorrections in the properties so that future executions use the correction. PropertiesService.getDocumentProperties().setProperty(AUTO_CORRECTIONS, JSON.stringify(autoCorrections)); }
Exemple 2: Workbook.open()
L'API VBA workbook.open()
ouvre un fichier local en fonction d'un chemin d'accès.
Supposons que deux fichiers soient ouverts par workbook.open()
dans le code VBA:
- Fichier 1:
C:\Data\abc.xlsx
- Fichier 2:
C:\Data\xyz.xlsx
L'exemple ci-dessous montre comment Macro Converter remplace Workbook.open()
par Apps Script partout où Workbook.open()
est utilisé pour ouvrir le fichier 1:
var spreadSheetId = _handle_mso_excel_get_google_spreadsheet_id("C:\Data\abc.xlsx"); var spreadSheet = SpreadsheetApp.openById(spreadSheetId);
unimplemented_constructs.gs
du projet Apps Script:
/** * Method to return the spreadsheet id manually. * * @param {string} FileName ID of the spreadsheet to be opened. * @return {string} return the spreadsheet id. */ function _handle_mso_excel_get_google_spreadsheet_id(FileName) { // Upload the Excel files being opened by the API to Google Drive and convert // them to Google Sheets. // Determine the spreadsheet ID of the Google Sheets file created. // Implement this method to return the corresponding spreadsheet ID when given //the original file path as parameter. throw new Error('Please return the spreadsheet ID corresponding to filename: ' + FileName); return '' ; }
Comme indiqué dans les commentaires de l'exemple ci-dessus, vous devez convertir les fichiers cibles en fichiers Google Sheets dans Google Drive.
Les ID de feuille de calcul Google correspondants sont en gras ci-dessous:
- Fichier 1:
C:\Data\abc.xlsx
devienthttps://docs.google.com/spreadsheets/d/abc123Abc123Abc123abc
- Fichier 2:
C:\Data\abc.xlsx
devienthttps://docs.google.com/spreadsheets/d/xyz456Xyz456xYz456xyZ
Modifiez ensuite le code de la fonction Apps Script pour ouvrir les fichiers par ID, comme indiqué ci-dessous:
/** * Method to return the spreadsheet id manually. * * @param {string} FileName ID of the spreadsheet to be opened. * @return {string} return the spreadsheet id. */ function _handle_mso_excel_get_google_spreadsheet_id(FileName) { // Upload the Excel files being opened by the API to Google Drive and convert //them to Google Sheets. // Determine the spreadsheet ID of the Google Sheets file created. // Implement this method to return the corresponding spreadsheet ID when given //the original file path as parameter if (Filename.indexOf("abc.xlsx") >= 0) { return "abc123Abc123Abc123abc"; } else if (Filename.indexOf("xyz.xlsx") >= 0) { return "xyz456Xyz456xYz456xyZ"; }
Erreur intentionnelle
Des erreurs intentionnelles sont ajoutées à votre code converti pour imiter le comportement d'erreur de votre code VBA d'origine. Vous n'avez pas besoin de modifier ces erreurs.
Exemple d'erreur intentionnelle
Si vous essayez d'accéder à un élément au-delà des limites d'un tableau en VBA, le code génère une exception. Dans Apps Script, le code renvoie "undefined".
Pour éviter les résultats inattendus, le convertisseur de macro ajoute du code Apps Script qui génère une exception si vous essayez d'accéder à des éléments en dehors des limites d'un tableau.
Cet exemple est illustré dans le code ci-dessous:
Code VBA d'origineDim arr arr = Array("apple", "orange") MsgBox arr(5) Will throw the following error: Subscript out of range
var arr; arr = ["apple", "orange"]; Browser.msgBox(arr[5]); Will return this value and not throw an error: undefined
/** * Extend the regular JS array to support VB style indexing with a get method. * @returns{*} value at the index */ Array.prototype.get = function() { var curr_res = this; for (var i = 0; i < arguments.length; i++) { if (!Array.isArray(curr_res) || curr_res.length < arguments[i]) { throw new Error(‘Converted VBA Error (Intentional Error): Subscript out of range’); } curr_res = curr_res[arguments[i]]; } return curr_res; }; var arr; arr = ["apple", "orange"]; Browser.msgBox(arr.get(5));
Articles associés
- Présentation du module complémentaire Macro Converter
- Déterminer si les macros VBA sont compatibles
- Convertir des macros VBA en Apps Script
- Résoudre les problèmes courants
- Regarder des tutoriels sur Macro Converter
- Liste des API VBA compatibles