![]()
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 Sub
Jupyter 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_()

