Undocumented Matlab
  • SERVICES
    • Consulting
    • Development
    • Training
    • Gallery
    • Testimonials
  • PRODUCTS
    • IQML: IQFeed-Matlab connector
    • IB-Matlab: InteractiveBrokers-Matlab connector
    • EODML: EODHistoricalData-Matlab connector
    • Webinars
  • BOOKS
    • Secrets of MATLAB-Java Programming
    • Accelerating MATLAB Performance
    • MATLAB Succinctly
  • ARTICLES
  • ABOUT
    • Policies
  • CONTACT
  • SERVICES
    • Consulting
    • Development
    • Training
    • Gallery
    • Testimonials
  • PRODUCTS
    • IQML: IQFeed-Matlab connector
    • IB-Matlab: InteractiveBrokers-Matlab connector
    • EODML: EODHistoricalData-Matlab connector
    • Webinars
  • BOOKS
    • Secrets of MATLAB-Java Programming
    • Accelerating MATLAB Performance
    • MATLAB Succinctly
  • ARTICLES
  • ABOUT
    • Policies
  • CONTACT

COM/ActiveX tips & tricks

July 28, 2010 6 Comments

Matlab’s COM/ActiveX interface has been supported and well-documented for many releases. However, there are still some aspects that are either not detailed, or that escape the casual documentation reader.

Accessing collection items

COM collections is a COM interface for sets of similar objects such as the worksheets in an Excel file or the images in a PowerPoint document. The items in a collection can be accessed using a numeric index (starting at 1) or the item’s string name.
The “normal” way to access collection items is using the Item() method that accepts a numeric index or the item’s name (a string).
Since collections are so common, Microsoft devised a short-cut of passing the parameter directly to the collection. For example, in our Excel VB code, instead of using Worksheets.Item(2) or Worksheets.Item(‘Sheet2’), we could write Worksheets(2) or Worksheets(‘Sheet2’). This shortcut is so common that the “normal” way of using Item() is rarely seen.
Unfortunately, Matlab’s implementation of the COM interface does not recognize this shortcut. Instead, we must use the more verbose way of using the Item():

% Invalid - shortcut is not recognized by Matlab
>> hSheet = hWorkbook.Worksheets(2);
??? Index exceeds matrix dimensions
% Valid
>> hSheet = hWorkbook.Worksheets.Item(2);
>> hSheet = hWorkbook.Worksheets.Item('Sheet2')
hSheet =
	Interface.Interface.Microsoft_Excel_11.0_Object_Library._Worksheet

% Invalid - shortcut is not recognized by Matlab >> hSheet = hWorkbook.Worksheets(2); ??? Index exceeds matrix dimensions % Valid >> hSheet = hWorkbook.Worksheets.Item(2); >> hSheet = hWorkbook.Worksheets.Item('Sheet2') hSheet = Interface.Interface.Microsoft_Excel_11.0_Object_Library._Worksheet

Note that the dot-notation used above only works on recent Matlab 7 releases. Earlier releases (for example, Matlab 6.0 R12) have bugs that prevent it from functioning properly. The workaround is to use the following even-more-verbose way, which work on all Matlab releases:

hSheet = invoke(get(hWorkbook,'Worksheets'),'Item',2);

hSheet = invoke(get(hWorkbook,'Worksheets'),'Item',2);

Matlab’s documentation actually has a short section describing the valid way to access COM collection. IMHO, a special warning about the invalid but widely-used short-cut would have been useful. In any case, the issue of accessing collection items has often appeared on CSSM (for example, here and here), so I guess many programmers have overlooked this.

Using enumerated values

When setting COM property values, Matlab supports some enumerated (constant) values but not all (read here). In practice, this can be very frustrating since the VB code and documentation almost always refers to the enumerated values only. Without the ability to set enumeration values, some properties become unusable in Matlab.
Well, not really. There’s a workaround: Since every enumerated COM value hides a numeric value, we can pass the numeric values rather than the enumerated (string) value when setting such properties. The numeric values are seldom documented, but can often be easily found online (use Google!). Quite often, they appear in C header-files that #define the enumerated values as pre-processor items with the required numeric value. For example, the numeric value for xlXYScatterLines is easily found to be 74.
Some of the enumerated constants are harder to find in this manner. You can use one of the following resources to search for your requested constant: Excel, PowerPoint (or here), OLE/Office (includes Word, Access and Internet Explorer), and an even larger list.
Again, old Matlab versions have problems understanding string enumerations, but the numeric values are always accepted and so are backward-compatible. If your application needs to support old Matlab versions, always use the numeric values (add a comment with the enumerated name, for maintainability).

Office 2010

Microsoft Office 2010 has apparently changed its COM interface, so accessing it from Matlab cannot easily be done. Luckily, Samuel Foucher has posted a workaround to this problem on CSSM yesterday. The trick is basically to have both an older Office and Office 2010 installed at the same time. As Samuel notes, “This is far from an optimal solution but it seems to work so far“.

Related posts:

  1. Some Matlab performance-tuning tips – Matlab can be made to run much faster using some simple optimization techniques. ...
  2. Controlling plot data-tips – Data-tips are an extremely useful plotting tool that can easily be controlled programmatically....
  3. Tips for accelerating Matlab performance – My article on "Tips for Accelerating MATLAB Performance" was recently featured in the September 2017 Matlab newsletter digest. ...
  4. Draggable plot data-tips – Matlab's standard plot data-tips can be customized to enable dragging, without being limitted to be adjacent to their data-point. ...
  5. A few parfor tips – The parfor (parallel for) loops can be made faster using a few simple tips. ...
  6. Running VB code in Matlab – Matlab does not natively enable running VB code, but a nice trick enables us to do just that...
ActiveX COM Pure Matlab
Print Print
« Previous
Next »
6 Responses
  1. Jason July 28, 2010 at 11:40 Reply

    Hi Yair,

    Two comments here. First, there actually is a way to use the VB syntax via the verbose get and set. To use the context of your example:

    hSheet = get(hWorkbook,'Worksheets',2);

    hSheet = get(hWorkbook,'Worksheets',2);

    Secondly, I have found the Microsoft developer resources pretty useful for finding enumerated values. Most of the time, they will list the numeric value next to the enumerated name. It’s pretty well laid out, except for using links instead of a tree view. Here is the link to the one for Excel:

    http://msdn.microsoft.com/en-us/library/bb149081.aspx

  2. Jaideep January 17, 2017 at 15:37 Reply

    How do i stack an activeX control(Windows Media player) behind an axes?
    I want my axes to appear on top of my activex control i.e. windows media player in my case? My guide however is not allowing me to do this inspite of selecting ‘Bring to front’ or ‘Send to Back’ option. The axes is always stuck behind my active x control.
    Thank you in advance.

  3. Manju January 22, 2018 at 06:21 Reply

    Hi,
    How do we click on a excel user form using matlab actxserver? Using workbooks.Worksheet.Item(userformName) is not working…

    • Yair Altman January 22, 2018 at 11:01 Reply

      @Manju – you can start the Excel Macro Recorder, then do whatever you want in Excel, then stop the recording, view the resulting VB code (using Alt-F8 or the Macros menu), and then convert that VB code into corresponding Matlab code (a process called “Matlabization”).

  4. Gary Roth February 6, 2018 at 21:23 Reply

    I tried to follow the “well documented” link (https://www.mathworks.com/help/matlab/matlab_external/brd4at8.html) and received the message “The page you were looking for does not exist. Use the search box or browse topics below to find the page you were looking for.”

    • Yair Altman February 7, 2018 at 22:05 Reply

      @Gary – MathWorks constantly change their website without bothering to redirect the old webpages to their new URLs. This is yet another example of this. I fixed the link that you mentioned to the new URL (hopefully it will not be changed again in the near future, but who know). Unfortunately, all the other links in the article that lead to MathWorks webpage are also broken, and I have not fixed them. If anyone has time to search for the new URLs and email me, then I will update them.

Leave a Reply
HTML tags such as <b> or <i> are accepted.
Wrap code fragments inside <pre lang="matlab"> tags, like this:
<pre lang="matlab">
a = magic(3);
disp(sum(a))
</pre>
I reserve the right to edit/delete comments (read the site policies).
Not all comments will be answered. You can always email me (altmany at gmail) for private consulting.

Click here to cancel reply.

Useful links
  •  Email Yair Altman
  •  Subscribe to new posts (email)
  •  Subscribe to new posts (feed)
  •  Subscribe to new posts (reader)
  •  Subscribe to comments (feed)
 
Accelerating MATLAB Performance book
Recent Posts

Speeding-up builtin Matlab functions – part 3

Improving graphics interactivity

Interesting Matlab puzzle – analysis

Interesting Matlab puzzle

Undocumented plot marker types

Matlab toolstrip – part 9 (popup figures)

Matlab toolstrip – part 8 (galleries)

Matlab toolstrip – part 7 (selection controls)

Matlab toolstrip – part 6 (complex controls)

Matlab toolstrip – part 5 (icons)

Matlab toolstrip – part 4 (control customization)

Reverting axes controls in figure toolbar

Matlab toolstrip – part 3 (basic customization)

Matlab toolstrip – part 2 (ToolGroup App)

Matlab toolstrip – part 1

Categories
  • Desktop (45)
  • Figure window (59)
  • Guest bloggers (65)
  • GUI (165)
  • Handle graphics (84)
  • Hidden property (42)
  • Icons (15)
  • Java (174)
  • Listeners (22)
  • Memory (16)
  • Mex (13)
  • Presumed future risk (394)
    • High risk of breaking in future versions (100)
    • Low risk of breaking in future versions (160)
    • Medium risk of breaking in future versions (136)
  • Public presentation (6)
  • Semi-documented feature (10)
  • Semi-documented function (35)
  • Stock Matlab function (140)
  • Toolbox (10)
  • UI controls (52)
  • Uncategorized (13)
  • Undocumented feature (217)
  • Undocumented function (37)
Tags
ActiveX (6) AppDesigner (9) Callbacks (31) Compiler (10) Desktop (38) Donn Shull (10) Editor (8) Figure (19) FindJObj (27) GUI (141) GUIDE (8) Handle graphics (78) HG2 (34) Hidden property (51) HTML (26) Icons (9) Internal component (39) Java (178) JavaFrame (20) JIDE (19) JMI (8) Listener (17) Malcolm Lidierth (8) MCOS (11) Memory (13) Menubar (9) Mex (14) Optical illusion (11) Performance (78) Profiler (9) Pure Matlab (187) schema (7) schema.class (8) schema.prop (18) Semi-documented feature (6) Semi-documented function (33) Toolbar (14) Toolstrip (13) uicontrol (37) uifigure (8) UIInspect (12) uitools (20) Undocumented feature (187) Undocumented function (37) Undocumented property (20)
Recent Comments
  • Jianfei (31 days 2 hours ago): I have tried the MathWorks CheckBoxList in Matlab 2015b. For whatever the reason, I can’t change the font properties. I can change the font color, but changing font properties...
  • Donato Coppola (36 days 21 hours ago): Hi Yair, I have a problem with the double format. When I run the treeTable function, the numbers in double format cells are displayed with comma as decimal separator. How can...
  • Kim (42 days 12 hours ago): Yair, the following didn’t work for me either: jh.setBorderPainted(false); Regards, Kim
  • Adil (44 days 13 hours ago): Thank you for the blog, it was useful for me. I have a file named App_project.mlapp.zip and when I extract it through Winzip it gives all the files exactly as you described above. I...
  • Mr Ashley Trowell (46 days 23 hours ago): Thank you so much for this analysis. Also, I find it somewhat horrifying. The take away seems to be to use && / || and NOT and / or. Thanks a bunch! ~Ashley
  • Matt (52 days 0 hours ago): Late reply I know, but you can call custom shortcuts with alt-#. Hold down Alt to see what number is assigned to the shortcuts you’ve created. Now if there was a way to create a...
  • James (59 days 19 hours ago): Is there a way to change the location of the window? They pop up at random locations and the user has to chase them down.
  • Robin (60 days 3 hours ago): Hi Yair, This has been a great help. With the removal of com.mathworks sometime in the future (as announced in R2020b), is there an alternative? For me, just getting a preference...
  • Eric Dziekonski (82 days 1 hour ago): This is fantastic! Thanks everyone! To get access to CEF on 2019b, I had to take the advise of Jeffery Devereux and Xiangrui Li. warning off MATLAB:structOnObject % suppress...
  • Yair Altman (82 days 7 hours ago): jPanel1.setParent(jPanel2) will reparent jPanel1 (and similarly any Java component/container) inside jPanel2 (any Java container). While this might work, it seems to me to be an...
  • Eivind (82 days 22 hours ago): Hi, Thanks for a great function! I was trying to put the main panel of my figure into a scrollable panel with the goal of zooming into the panel using shift+scroll and scrolling up...
  • Yair Altman (97 days 8 hours ago): There is no direct way to replicate the CW in a GUI window, you’ll need to display the text in the GUI using your program logic. Here is one possible implementation that...
  • Sunki Reddy Gunugu (99 days 5 hours ago): hi 1.i would like to know how the error in command window of matlab is captured and displayed in the GUI with the same color in CW 2. Is their any way to replicate the...
  • Matthias Brenneis (102 days 0 hours ago): Hi, thank you so much for the inspiring work and comments! My issue is: As soon as the panel gets an axes, the panel is no longer transparent: f =...
  • Collin (121 days 22 hours ago): Yair, In 2020a Mathworks added this semi-useful class matlab.ui.internal.JavaMigrati onTools Which contains static methods to call javacomponent, actxcontrol or to get an...
Contact us
Undocumented Matlab © 2009 - Yair Altman
Scroll to top