I'm interested in making an Excel cell formatting macro that allows me to scroll through different options (different font/cell colors, different border types, etc.). I know that I could accomplish this by checking conditions -- if I'm changing font colors, then I can just "scroll" by using conditional logic (if color1, then change to color2; if color2, then change to color 3; etc.). I was wondering if there might be a more elegant way to accomplish this -- specifically, is there a way to store custom attributes for cells in VBA?
For example, if I set cell B3 to a certain border style (thin line for top,left,right but double line for bottom), is there a way to create and set a VBA attribute of Cell.CustomBorderStyle = 1? Otherwise, I believe I would have to build logic into my macro for the precise formatting (if top,left,right = thin and bottom = double then change to second style, etc.). I'm not sure if creating a custom class in VBA would allow me to do this, or if there's any way at all to do this.
Please let me know if my question is unclear -- thanks!
if you only want the cell attribute to be available within this VBA session then I would use a collection or dictionary with a key of the cell address (Sheet_Row_Column) to store the attribute(s).
If you want to persist this information within an Excel workbook then it would probably be best done using custom xml.
Related
I have a 3D model loaded into a vtkActor and I need to be able to color specific vtkCells of this actor after selecting (clicking on those vtkCells). I know how to retrieve the selected cells from the vtkUnstructuredGrid but have no idea of how to set color to them. I've read a bit about vtkLookUpTables and think that might be it but I don't understand how it works, or if it really is what I need.
Thanks.
You can use vtkExtractCells to fetch all special cells and form a vtkDataObject, then create vtkDataSetMapper and vtkActor objects to color and shot it.
I think the image attached describes better than I can in words the functionality I am trying to locate within excel.
Is there a way to auto group based on the contents within the columns as shown? This is achievable for the example shown, but when there are up to say 30 Groups and many sub group types, I am wondering whether excel can auto-detect and work its way through the list, grouping as shown as it goes.
You can get a similar result using conditional formatting. select the whole table and create a new conditional format rule and choose formula and enter =A1=A2 set the format font to white (I've used very light grey to show that the data is still there)
To get the borders, do the same again and this time enter the formula =A1<>A2 and make the top border black.
It's not exactly the same as yours but it's close.
I've some problems with Apache POI, some help would be nice!!
I would like to remove the colors in a subpart of an Excel sheet.
To do so, the first thing I tried is to render the cells I want to clean (let say the one of the first row only) and to set their color to white:
cell.getCellStyle().setFillForegroundColor(IndexedColors.WHITE.index);
But if i do that, the color of some cells that are not rendered (let say the one of the second row) are also changed to white cells. It's strange, because the cells that are changed do not have the same foreground color, so I thought they would have different styles ...
Therefore, I've tried another way:
CellStyle style = workbook.createCellStyle();
style.setFillForegroundColor(IndexedColors.WHITE.index);
cell.setCellStyle(style);
The idea, is to avoid changing a style that may be common to different cells in the Excel sheet. Actually, it solves the color problem, but if I do that, I loose the different styles in the Excel sheet, while I only want to remove some colors...
I'm using a generic Workbook, and I'm reading a xlsx (same problem with a xls)
Do you know how to do it ?
Thx a lot,
regards,
If you want to remove the colors, then probably it makes sense to change the fill pattern to NO_FILL rather than setting the color to white as follows:
style.setFillPattern(CellStyle.NO_FILL)
Back to your main question, you've got 2 options of dealing with the cell style amendment:
By modifying style viaCellUtil.setCellStyleProperty method
CellUtil.setCellStyleProperty(cell, workbook, CellUtil.FILL_PATTERN, CellStyle.NO_FILL)
By cloning styles from the existing style and modifying the property
The example code shown below:
CellStyle oldStyle = cell.getCellStyle();
CellStyle newStyle = workbook.createCellStyle();
newStyle.cloneStyleFrom(oldStyle);
newStyle.setFillPattern(CellStyle.NO_FILL);
cell.setCellStyle(newStyle);
However in the 2nd case you're going to create a new cell style for every cell and you might probably consider reusing some of the already updated cell styles and implementing some kind of caching (as otherwise it might lead to performance issues and reaching allowed styles limit).
I asked this question on the LiveCode email list. No response, so I figure it must not be possible. I know about editing the template graphic that enables alternating row colors. That doesn't help me.
This lesson is the closest to what I have found, but it only sets the overlay color to empty cells. It also had an unwanted affect, where any data that was present in the grid no longer shows up.
http://lessons.runrev.com/s/lessons/m/datagrid/l/7327-how-do-i-override-the-default-behavior-for-rendering-data-to-a-cell
As a little experiment, since the data became invisible (note that I'm on WinXP), I tried placing an opaque graphic over the column I wish to colorize. I set the ink of the graphic to AddMax or AddOver, and it looked nice, but the text in the cells disappeared. Then I tried setting the ink to AddMin, and it still looks good, but the test shows through!!!!
So, I think this will work fine visually, but how can I pass a double-click through this graphic to the cell underneath (to allow cell editing only within this column)?
Yes, you can do this.
This suggestion comes from Trevor DeVore at http://www.bluemangolearning.com/
Create a custom column template using the property inspector. From there you can edit the behavior of the column to colorize the background color of the field for that column or just edit the field in the template group to change the color.
The background color will only show up in rows that have data, however.
In Dynamics AX 2012, is there a way to change the background color of multiple cells to different colors?
Order Status Ship Status Order ID
[green] [red] SO-1234
[green] [green] SO-1235
[red] [red] SO-1236
I've written a displayOption override that can change the color of one cell, but it seems to apply all the changes at the end, so whatever the last color you specify is the one that gets applied to all cells.
_options.backColor(46080); //green
_options.affectedElementsByControl(OrderStatus.id());
//is there anyway to apply the first change, so I can make a second one?
_options.backColor(255); //red
_options.affectedElementsByControl(ShipStatus.id());
In the code listed above, both cell background colors would be red.
Any suggestions?
Thanks
I had a similar task to accomplish, and I did not find a way to do it in Ax (well, techinically you could try Table control, but I strongly encourage you NOT to do so - you will end up swearing out aloud).
What I did is implemented a WPF user control and used this post as a template.
This is a small tutorial (found in Answer #7) which shows how to implement a cell background converter in built-in WPF data grid control, to accomplish the task.
After you have it implemented you can populate your datagrid by using LINQ (if using AX 2012 R2), web services, or passing a temporary table - there are many ways to access AX data.
It may not be the ultimate solution, but it works.
I did it using a table control ( although Maciej advised you not to do ).
It works without problems.
You need to add a table control which gets your data and set the property
ColorScheme to RGB
Then, override the FormControl editControl(int column, int row)
You can access each value by value = data.cell(column, row).data(); whereby data is the name of the table control.
Beware, that you have to add a control with the correct datatype to the table control and give it a name. Also set the ColorScheme property to RGB.
If you got RGB values for your desired background color, setting this color can be done by
RealEdit.backgroundColor(WinAPI::RGB2int(real2int(R),real2int(G),real2int(B)));
RealEdit is the name of the added control.
I've done this to display a matrix filled with values between 0 and 1 and to display a color gradient overlay with a range from green to red. See this link, if you like more information about the color conversion.