Get Currently-selected Excel Cells (for subsequent Revit Action)

hello
a solution using COM Interface Interop.Excel

import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

#import Revit API
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *

clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *
from Autodesk.Revit.UI.Selection import *


clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
uidoc = uiapp.ActiveUIDocument

import System
from System.Collections.Generic import List
clr.AddReferenceByName('Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' )
from Microsoft.Office.Interop import Excel
from System.Runtime.InteropServices import Marshal

refreshBoolean = IN[0]

def checkInteger(val):
    try:
        check = int(val)
        return True
    except: return False 
    
class OpenFileException(Exception):
    pass

class Lst_Xls():
    def __init__(self):
        try:   
            ex = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application")
        except: 
            ex = Excel.ApplicationClass()   
        ex.Visible = True
        self.app = ex 
        self.error = None
        self.data = []  
        self.workbook = ex.ActiveWorkbook
        ws = ex.ActiveSheet
        selectRange = ex.Selection   
        for r in selectRange:
            self.data.append(r.Value2)
            
    def closeProperly(self):
        if self.workbook is not None:
            Marshal.ReleaseComObject(self.workbook)
        if self.app is not None:
            Marshal.ReleaseComObject(self.app)     
        self.workbook = None        
        self.app = None
            
        
objxls = Lst_Xls()  
if objxls.error is None:
    iLstId = List[ElementId]()
    outElem = []
    for val in objxls.data:
        if checkInteger(val):
            elemId = ElementId(int(val))
            elem = doc.GetElement(elemId)
            if elem is not None:
                outElem.append(elem)
                iLstId.Add(elem.Id)
    uidoc.Selection.SetElementIds(iLstId)           
    OUT = outElem
    
else: 
    OUT = "Error "
objxls.closeProperly()  
7 Likes