Consultez l'article selon lequel Qiita peut exécuter Python avec Excel VBA à l'aide d'une bibliothèque appelée xmlwings et rédigez un petit supplément Quick Start +. J'écris habituellement sur mon blog, donc je pense que c'est une bonne idée d'écrire un supplément sur Qiita.
Il semble que xlwings a considérablement changé depuis la v0.9, et comme il ne fonctionne pas avec le code actuel, j'ai ajouté à propos de la v0.9 ou plus
Il n'y a rien de spécial, il suffit d'installer avec pip
pip install xlwings
Dans mon environnement, il est installé à l'emplacement suivant. Emplacement auquel se référer lors de l'importation ultérieure de fichiers depuis Excel C:\Python27\Lib\site-packages\xlwings
Module Python appelé depuis Excel
mymodule.py
import numpy as np
from xlwings import Workbook, Range
def rand_numbers():
""" produces standard normally distributed random numbers with shape (n,n)"""
wb = Workbook.caller() # Creates a reference to the calling Excel file
n = int(Range('Sheet1', 'B1').value) # Write desired dimensions into Cell B1
rand_num = np.random.randn(n, n)
Range('Sheet1', 'C3').value = rand_num
Référence: https://docs.xlwings.org/en/stable/migrate_to_0.9.html
mymodule.py
import numpy as np
import xlwings as xw
def rand_numbers():
""" produces standard normally distributed random numbers with shape (n,n)"""
wb = xw.Book.caller() # Creates a reference to the calling Excel file
n = int(wb.sheets['Sheet1'].range('B1').value) # Write desired dimensions into Cell B1
rand_num = np.random.randn(n, n)
wb.sheets['Sheet1'].range('C3').value = rand_num
Code VBA écrit côté Excel
Avant la v0.9, il pouvait être utilisé même s'il ne s'agissait pas d'une chaîne de caractères RAW, mais dans la version actuelle après la v0.9, si vous utilisez \
, utilisez une chaîne de caractères RAW ou définissez le délimiteur de chemin sur /
Si vous ne le définissez pas sur, une erreur se produira.
ExcelVBA
Sub RandomNumbers()
RunPython ("sys.path.append('C:\Temp'); import mymodule; mymodule.rand_numbers()")
End Sub
ExcelVBA
Sub RundomNumbers()
RunPython ("sys.path.append(r'C:\Temp'); import mymodule; mymodule.rand_numbers()")
' RunPython ("sys.path.append('C:/Temp'); import mymodule; mymodule.rand_numbers()")
End Sub
Dans cet exemple de code VBA
Il dit RunPython (" import mymodule; mymodule.rand_numbers () ")
, mais je me demande si c'est un petit piège dans le tutoriel.
Il indique où placer le fichier mymodule.py, mais peu importe où vous le mettez si vous ajoutez un chemin arbitraire avant ʻimport de
RunPython. Cette fois, j'ai mis
mymodule.py dans
C: \ Tempqui n'est pas dans le chemin. Excel lui-même devrait être enregistré dans
C: \ Users \ h_oki \ Documents \ book en tant que
test.xlsm`, et je voulais conserver les modules dans un emplacement différent, mais assurez-vous qu'ils peuvent être lus de n'importe où pour les tests. Je voulais le faire comme ci-dessus.
Peu importe qu'il s'agisse de VBA ou d'Excel, il s'agit simplement d'exécuter le code Python, vous pouvez donc le charger dans n'importe quel module que vous avez en définissant le chemin après cela.
ʻImport sysest lu par lui-même dans xlwings, vous n'avez donc pas besoin de le saisir. Dans l'exemple de code, il ne peut être lu que s'il est placé dans le chemin ou directement sous celui-ci, mais si vous voulez le placer dans un chemin, mettez
sys.path.append ('/ votre / vers / chemin')avant
import mon moduleTout ce que vous avez à faire est de l'écrire. De plus, même si vous n'ajoutez pas
sys.path.append ('/ votre / vers / chemin'), il ne semble y avoir aucun problème si l'emplacement est défini dans la variable d'environnement
PYTHONPATH`.
Je n'ai pas pu télécharger l'image pour une raison quelconque, veuillez donc l'omettre.
Cependant, j'ai pu exécuter mymodule.py
(le code de démarrage rapide lui-même) placé n'importe où.
Utilisez xlwings J'ai exécuté un script Python à partir d'Excel et joué avec xlwings, qui peut représenter graphiquement les résultats dans Excel.
officiel de xlwings Quickstart
Recommended Posts