Here’s my video
Explanation
In Part 1 of this video, the VBA macro gets the value of the selected cell and then presents that value in a message box. Nothing serious at all, just an example.
In Part 2 of the video, I invoke a PyXLL Jupyter pane (CTP), then open a Jupyter notebook.
The notebook has two PyXLL macros. The first executes a rather trivial 'Hello' example. The second executes a PyQt dialog with embedded calculations. These are bona fide structural engineering calculations which provide ASCE (building code) wind loadings on structural members. There is quite a lot of interface and code associated with that interface.
- usual input/output
- tabbed output
- filtering of dropdown
- tabular output of all shape properties
- tabular output of all wind calculations
- output to the windows clipboard (cut and paste)
- drawing cross sections to scale
- user specified elevation datum
- X or Y axis wind direction
- fireproofing
After running the Jupyter notebook cells, I assign the PyXLL macros to Excel objects: 'popup_messagebox2' is assigned to the shape (Ritchie) and 'show_trial_pyside2X' is assigned to the button (show pyqt).
- We can easily build Python macros and use them in Excel
- After the Jupyter pane is dismissed, the macros remain assigned to the objects
As I usually point out, PyXLL code is not written or saved in the Excel worksheets; this means that the code is universally avaiable to all of a user’s worksheets.
PyQT
Jupyter PyXLL Jupyter PyXLL Custom Task Panes (CTP)Sub SomeVBASubroutine() x = Selection.Value MsgBox "Value of selected cell is: " & x End SubJupyter Code
#################################################################### # 1st cell # from pyxll import xl_macro, xlcAlert @xl_macro def popup_messagebox2(): xlcAlert("Hello") #################################################################### # 2nd cell # import sys sys.path.append('E:\my_pyxll_modules') import trial_pyqt_des_exp_wind_2a from PySide2 import QtWidgets _qt_app = None def get_qt_app(): """Returns a QApplication instance. Must be called before showing any dialogs. """ global _qt_app if _qt_app is None: if not QtWidgets.QApplication.instance(): app = QtWidgets.QApplication(sys.argv) else: app = QtWidgets.QApplication.instance() return _qt_app @xl_macro() def show_trial_pyside2X(): _qt_app = None app = None app = get_qt_app() # Create the custom form dlg = trial_pyqt_des_exp_wind_2a.FormTEW() dlg.exec_()