MS Excel Automation in Delphi
In this blog I will describe how to read and write data from and to an Excel file. Sometime in our application we use Excel for reporting purpose, for data import / export purpose and for other works. So here I will explain how to access an Excel file and use for data read / write.
For this Excel 2003 or later should have installed in our system.
First use Excel2000 unit to uses clause. This unit comes with Delphi installation it self. You can get the unit in installed path
C:\Program Files (x86)\Embarcadero\RAD Studio\10.0\OCX\Servers
Uses
Excel2000;
Before proceed I would mention an important word LCID which is required at most places. So what it LCID?
LCID = In Microsoft Excel, the LCID indicates the currency symbol to be used when this is an xlListDataTypeCurrency type. Returns 0 (which is the Language Neutral LCID) when no locale is set for the data type of the column.
We can get LCID in Delphi by using GetUserDefaultLCID function..
private
LCID: Cardinal;
.........
//assigned on form create//
LCID := GetUserDefaultLCID;
And now following are the codes used to access, read, write and format an Excel file.
First declare following variables...
private
ExcelApp: TExcelApplication;
myxlBook: TExcelWorkbook;
myxlSheet11: TExcelWorksheet;
myxlSheet12: TExcelWorksheet;
Now write codes using above variables on a Button click or other appropriate event.
1. Create and connect with an Excel Application...
myxlApp := TExcelApplication.Create(Nil);
myxlApp.Connect;
myxlApp.Visible[LCID] := True; // will show newly connected Excel application // most of case not required //
2. Close and Free the Excel application....
myxlApp.Disconnect;
myxlApp.Quit;
FreeAndNil(myxlApp);
3. Add a Workbook
myxlApp.Workbooks.Add(EmptyParam, LCID); //it will also add a default sheet to workbok//
myxlBook := TExcelWorkbook.Create(myxlApp);
myxlBook.ConnectTo(myxlApp.ActiveWorkbook);
4. Disconnect Workbook before close
myxlBook.Close(True,'C:\jitendra\ExcelTest1.xlsx'); //Saves the changes to mentioned file//
myxlBook.Disconnect;
FreeAndNil(myxlBook);
5. Add new Worksheet
myxlSheet11 := TExcelWorksheet.Create(myxlBook);
myxlSheet11.ConnectTo(myxlBook.ActiveSheet as _worksheet); //connecting with the default worksheet//
myxlSheet11.Name := 'Class 11';
6. Disconnect worksheet before close
myxlSheet11.Disconnect;
FreeAndNil(myxlSheet11);
7. Adding a new Worksheet to the Workbook
myxlBook.Worksheets.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam, LCID);
myxlSheet12 := TExcelWorksheet.Create(myxlBook);
myxlSheet12.ConnectTo(myxlBook.ActiveSheet as _worksheet);
myxlSheet12.Name := 'Class 12';
8. Access Sheets by Index or Name
(myxlApp.Worksheets[0] as _Worksheet).Activate(LCID);
Or
(myxlApp.Worksheets['Sheet1'] as _Worksheet).Activate(LCID);
9. Assign values to Cell by using Cell or Range property
myxlApp.Cells.Item[1,1] := 'Value 1'; //with row, col number//
myxlApp.Range['A3','A3'].Value := 'value 2'; //with cell from, to names//
myxlSheet11.Cells.Item[1,5] := 'JITENDRA'; //with row, col number//
myxlSheet11.Range['E3','E3'].Value := '7834911261'; //with cell from, to names//
10. Change font format of an Excel Range
with myxlSheet11.Range['A1', 'B3'] do
begin
Font.Name := 'Verdana';
Font.Size := 15;
Font.Bold := True;
Font.Strikethrough := True;
Font.Color := clRed;
end;
11. Change Background Color of cells
with myxlSheet11.Range['A1', 'A1'].Interior.Color := clYellow;
myxlSheet11.Range['A5', 'D7'].Merge(False);// merge cells and fill color in merged cells//
myxlSheet11.Range['A5', 'D7'].Interior.Color := clRed;
12. Merge Cells in a range
myxlSheet11.Range['A5', 'D7'].Merge(False); //False by default if True it would merge cells row by row//
myxlSheet11.Range['A5', 'D7'].Value := 'Merged data';
13. Change Column width and Row height
myxlSheet11.Range['B5', 'B5'].ColumnWidth := 5; //single column B//
myxlSheet11.Range['J5', 'L8'].ColumnWidth := 15; //multiple column J,K,L//
myxlSheet11.Range['B5', 'B5'].RowHeight := 50; //single row 5//
myxlSheet11.Range['J10', 'J15'].RowHeight := 50; //multiple row 10-15//
14. Open the workbook that already exists:
myxlApp.Workbooks.Open ( 'C:\jitendra\ExcelTest1.xlsx'
EmptyParam , EmptyParam , EmptyParam , EmptyParam ,
EmptyParam , EmptyParam , EmptyParam , EmptyParam ,
EmptyParam , EmptyParam , EmptyParam , EmptyParam , 0 );
15. Copy and Paste Data from one cell to another in same sheet...
a.
myxlSheet11.UsedRange[LCID].Copy(myxlSheet11.Range['J10', 'J10']);
myxlSheet11.Range['A5', 'D7'].Copy(myxlSheet11.Range['J10', 'J10']);
b.
myxlSheet11.UsedRange[LCID].Copy(EmptyParam);
myxlSheet11.Range['J10', 'J10'].PasteSpecial(xlPasteAll, xlPasteSpecialOperationNone, EmptyParam, EmptyParam);
myxlSheet11.Range['A5', 'D7'].Copy(EmptyParam);
myxlSheet11.Range['J10', 'J10'].PasteSpecial(xlPasteAll, xlPasteSpecialOperationNone, EmptyParam, EmptyParam);
16. Copy and Paste Data from one Sheet to another sheet.
a.
myxlSheet11.UsedRange[LCID].Copy(myxlSheet12.Range['J10', 'J10']);
myxlSheet11.Range['A5', 'D7'].Copy(myxlSheet12.Range['J10', 'J10']);
b.
myxlSheet11.UsedRange[LCID].Copy(EmptyParam);
myxlSheet12.Range['J10', 'J10'].PasteSpecial(xlPasteAll, xlPasteSpecialOperationNone,EmptyParam, EmptyParam);
myxlSheet11.Range['A5', 'D7'].Copy(EmptyParam);
myxlSheet12.Range['J10', 'J10'].PasteSpecial(xlPasteAll, xlPasteSpecialOperationNone,EmptyParam, EmptyParam);
17. Insert new columns before b1
myxlSheet11.Range['b1', 'b1'].Columns.Insert(xlShiftToRight); // we can use xlShiftToLeft//
18. Insert new rows above b2
myxlSheet11.Range['b2', 'b2'].Rows.Insert(xlShiftDown); // we can use xlShiftUp//
19. Clear a Selected Range Content or Format
myxlSheet11.Range['b3', 'b10'].ClearContents;
myxlSheet11.Range['b3', 'b10'].ClearFormats;
20.Save, Save as a Sheet / Workbook
myxlSheet11.SaveAs('Filename');
myxlBook.Save;
21. Print Preview / Print of a Sheet / Workbook
myxlSheet11.PrintPreview;
myxlSheet11.PrintOut;
myxlBook.PrintPreview;
myxlBook.PrintOut;
22. Set Sheet PageSetup
myxlSheet11.PageSetup.
A. header:
myxlSheet11.PageSetup.CenterHeader := '' The report shows '' ;
B. footer:
myxlSheet11.PageSetup.CenterFooter := '' The & P '' ;
The C. header into the top margin 2cm:
myxlSheet11.PageSetup.HeaderMargin := 2 / 0.035 ;
D. footer bottom margin 3cm:
myxlSheet11.PageSetup.HeaderMargin := 3 / 0.035 ;
E. top margin 2cm:
myxlSheet11.PageSetup.TopMargin := 2 / 0.035 ;
The bottom edge of the f. from the 2cm:
myxlSheet11.PageSetup.BottomMargin := 2 / 0.035 ;
G. left 2cm:
myxlSheet11.PageSetup.LeftMargin := 2 / 0.035 ;
On the right side of the H. from the 2cm:
myxlSheet11.PageSetup.RightMargin := 2 / 0.035 ;
I. pages horizontally:
myxlSheet11.PageSetup.CenterHorizontally := 2 / 0.035 ;
The J. page vertically:
myxlSheet11.PageSetup.CenterVertically := 2 / 0.035 ;
K. print cell line:
myxlSheet11.PageSetup.PrintGridLines := True ;
23. Auto Fill of Range. Fills value 1-10 in p1:p10
myxlSheet11.Range['p1', 'p1'].Value := 1;
myxlSheet11.Range['p2', 'p2'].Value := 2;
myxlSheet11.Range['p1', 'p1'].AutoFill(myxlSheet11.Range['p1', 'p10'], xlFillSeries);
Other fill options
xlFillCopy
xlFillDays
xlFillDefault
xlFillFormats
xlFillMonths
xlFillSeries
xlFillValues
xlFillWeekdays
xlFillYears
xlGrowthTrend
xlLinearTrend
24. Change Border style of cells in a range
myxlSheet11.Range['p3', 'p4'].Borders.Color := clRed;
myxlSheet11.Range['p3', 'p4'].Borders.LineStyle := xlDouble;
myxlSheet11.Range['p3', 'p4'].Borders.Item[xlEdgeLeft].Color := clBlue;
myxlSheet11.Range['p3', 'p4'].Borders.Item[xlEdgeRight].Color := clBlue;
Other line styles.
xlContinuous
xlDash
xlDashDot
xlDashDotDot
xlDot
xlDouble
xlSlantDashDot
xlLineStyleNone
25. Fill pattern style of cells in a range
myxlSheet11.Range['p3', 'p4'].Interior.Pattern := xlPatternCrissCross;
myxlSheet11.Range['p3', 'p4'].Interior.PatternColor := clBlue;
Other pattern styles
xlPatternAutomatic
xlPatternChecker
xlPatternCrissCross
xlPatternDown
xlPatternGray16
xlPatternGray25
xlPatternGray50
xlPatternGray75
xlPatternGray8
xlPatternGrid
xlPatternHorizontal
xlPatternLightDown
xlPatternLightHorizontal
xlPatternLightUp
xlPatternLightVertical
xlPatternNone
xlPatternSemiGray75
xlPatternSolid
xlPatternUp
xlPatternVertical
26. Add calculation function SUM/AVG/MAX/COUNT etc..
myxlSheet11.Range['k1', 'k1'].Formula := '=Sum(p3:p8)';
myxlSheet11.Range['k3', 'k3'].Formula := '=Avg(p3:p8)';
myxlSheet11.Range['k5', 'k5'].Formula := '=Max(p3:p8)';
myxlSheet11.Range['k7', 'k7'].Formula := '=Count(p3:p8)';
I quickly had to show a friend how to do Excel "automation" in Delphi via type library / ActiveX and I haven't done it in 10+ years... so I found this tutorial and it worked very nicely for me (we got up to step 9 when my friend was finally convinced that this is a workable solution), thank you.
ReplyDelete*Some notes*
With my version of Excel (Office 2010) I had to change something small:
This: myxlApp.Range['A3','A3'].Value := 'value 2';
had to change to: myxlApp.Range['A3','A3'].Value2 := 'value 2';
You can also create the type library (Excel_TLB.pas) yourself in Delphi by going to "Component | Import component", specify "Import a type library" | Next | Select "Microsoft Excel 14.0 Object library" | Next | Next etc and include that in your project.
Another small change: I used the "visual component" TExcelApplication which was created in the previous step: this makes object lifetime / memory management slightly easier.
Ms Excel Automation In Delphi >>>>> Download Now
Delete>>>>> Download Full
Ms Excel Automation In Delphi >>>>> Download LINK
>>>>> Download Now
Ms Excel Automation In Delphi >>>>> Download Full
>>>>> Download LINK d3
Glad to hear that it helped you. And also thanks for the proposed changes you for office 2010 as it will help others lot.
ReplyDeleteExcelent Post, Thanks !!! Very usefull for me.
ReplyDeleteuseful.thanks
ReplyDeleteExcelent written. Thanks.
ReplyDeleteI have been trying to read from Excel and used this information as the basis for a test program.
ReplyDeleteI get an exception class $C00000005 error with access violation at Oxoo62fd0b: read of address 0x000001bc when I use Workbooks.Open. Has anyone else had this and been able to solve it?
The crash occurs in Excel_TLB.pas, which I imported as Donald Klopper suggested.
The crash is at function TExcelApplication.GetDefaultInterface: _Application, at the first line:
if FIntf = nil then
The code that I have written as the test is:
unit ExcelTest;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Excel2010, Vcl.StdCtrls, Vcl.Grids;
type
TForm1 = class(TForm)
OpenExcelFile: TButton;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button3: TButton;
Button4: TButton;
Edit1: TEdit;
Edit2: TEdit;
Column: TLabel;
Label5: TLabel;
FileOpenDialog1: TFileOpenDialog;
procedure FormCreate(Sender: TObject);
procedure OpenExcelFileClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
LCID : Cardinal;
myxlApp : TExcelApplication;
myxlBook : TExcelWorkbook;
myxlSheet11 : TExcelWorksheet;
myxlSheet12 : TExcelWorksheet;
public
{ Public declarations }
end;
var
Form1 : TForm1;
R : Integer;
C : String;
implementation
{$R *.dfm}
procedure TForm1.OpenExcelFileClick(Sender: TObject);
var
f : TextFile; // File handle
SL : TStringList; // String list
TS : string; // Temporary string
OpenFileName : string;
begin
SL := TStringList.Create;
with FileOpenDialog1.FileTypes.Add do
begin
DisplayName := 'Excel files (*.xlsx;*.xls)';
FileMask := '*.xlsx;*.xls';
end;
with FileOpenDialog1.FileTypes.Add do
begin
DisplayName := 'Excel files (*.xls)';
FileMask := '*.xls';
end;
FileOpenDialog1.Title := 'Select file to open';
if FileOpenDialog1.Execute then
begin
AssignFile(f,FileOpenDialog1.FileName);
OpenFileName := FileOpenDialog1.FileName;
{ "EmptyParam" is declared in Unit system and can be used when you don't want to
specify a parameter}
myxlApp.Workbooks.Open(OpenFileName,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,0);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
myxlApp.Disconnect;
myxlApp.Quit;
FreeAndNil(myxlApp);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Label3.Caption := myxlApp.Cells.Item[R,C];
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
LCID := GetUserDefaultLCID;
end;
end.
Forgot to mention that I am using Delphi 10.3.3 and Excel 2016.
ReplyDeleteAny pointers would be appreciated.
how to delete columns ?
ReplyDeletevery nice and provide me informative content thanks for sharing for more information about how to Create new Workbook
ReplyDelete
ReplyDeleteYour blog is very nice and provide me informative content thanks for sharing for more information about Copy Worksheet
Perfect informations!
ReplyDeleteI put this very usefull Web page in my favorite, it is kicker to find at any time...
ReplyDeleteGreat to know that it helped you.
ReplyDelete
ReplyDeleteHi Jitendra.
I'm sorry for my bad English, but I wanted to THANK YOU VERY MUCH for the excellent post.
Finally I found what to do, and how doing it, to manage data in Excel by Delphi.
Thanks to Donald Klopper too for "Value2" way in Office 2010: I would hardly have come up with this solution myself!
Hope some "Delphi brother" :) can find useful my trouble experience, and its solution, trying to connect to an Excel Application using Connect method (in blog post: myxlApp.Connect)
TROUBLE
I use several Delphi versions on my 64 bit Windows 10, where I installed a 64 bit MS-Office version, and tried to connect to Excel following the blog-post instructions, but Delphi raised the following errors
- Old Delphi versions (i.e. Delphi 7) error
"Project ExcelTest.exe raised exception class EOleSysError with message 'Esecuzione del server non riuscito'.
- Recent Delphi versions (i.e. Delphi 10.1 Berlin) errors (two errors, in cascade)
Error #1: "Esecuzione del server non riuscito, ClassID: {00024500-0000-0000-C000-000000000046}."
Error #2: "Access violation at address 006695C6 in module 'ExcelTest.exe'. Read of address 00000000."
SOLUTION
I couldn't understand where the mistake was.
Looking for "EOleSysError" online, I found that one of the possible causes is access to a 64 bit server (my Excel) with a 32 bit module (my Delphi application).
So I tried to change the Delphi target, from WIN32 to WIN64, in Berlin version of the project and recompiled it, without changing anything and ... it worked perfectly! :)
Unfortunately I will not be able to apply the same solution with Delphi 7 because it does not have a 64-bit target, but I am happy to have solved the problem.
Thanks again for explaining the Excel approach with Delphi in a simple way and for the really good Delphi blog.
I have subscribed to your newsletter.
Bye, Sandro
@Sandro that's why I posted my ideas in the comments as well. You've now touched on a touchy subject in respect of "bitness". If the OS is 64 bit (which it usually is these days) then MS Office could be 32 bit or 64 bit (it's often still 32 bit) and Delphi apps could be either as well and if your Delphi app's bitness doesn't match that of Office your automation might fail. Even worse, your users could be using Office 365 "online only" which means that the API's aren't available through COM on the machine at all. A good idea would be to doing a number of bitness tests in your 64-bit "main app" (to evaluate whether you should execute your 32 bit or 64 bit COM utility) and then to ship both 32 and 64 bit utilities with your application to clients, always.
ReplyDeleteRemember if you're stuck with Delphi 7 only, and your app / business doesn't generate a lot of money, you can use the latest Delphi 10 community edition. Please adhere to the rules regarding use of that version.
Using Delphi 10 would allow you to target the various bitness platforms.
You could most likely using Lazarus to target 32 bit and 64 bit in the same way, but I've never done COM level stuff with Lazarus, just "normal" client-dataset type DB apps and reports and such.You might be able to get more info here: https://wiki.freepascal.org/Office_Automation
Thanks Donald for your suggestions, preventive bitness testing is a very good solution!
DeleteIn fact I wouldn't know how to manage my app on machines with online versions of MS-Office but, not having managed it to date even with "physical" versions for the moment my concern is premature :)
With regard Delphi 10 versions, I have an active Delphi Professional subscription, and I own all the versions released to date, but I have never installed nothing after 10.1 (Berlin): from Berlin experience I was expecting at least update 2, but then they announced the 3 and ... for my laziness :) I've not yet installed last two versions 10.2 (Tokyo) and 10.3 (Rio). I'm now waiting for the official release of 10.4 (don't know the name), which is already active in Beta, and will install that.
I'm using Delphi 7 for some old projects that, in spite of myself (swear!), I still can't migrate to new horizons (it's a long story, but it's definitely off-topic compared to this thread and Jitendra, to whom I send my greetings, could throw us out !) :)
Thanks again for everything.
Bye, Sandro
ReplyDeleteAmazon SAP-C01 Dumps are offering the most outrageous accommodating stuff among the aggregate of the materials. It has helped various individuals to evade their evaluations at some point or another on the planet. Your all endeavors without SAP-C01 study material have been incapable so I picked it and aced the test. You will choose it for the sum of the resulting examinations due to the truth it’s much absolutely cheerful for all. To make it basic our gathering of competent teachers from wherever the world has amassed an exceptional report material to pass IT affirmations. The assessment control is outstanding it very well may be said that it contains a fundamental and vast range of questions and answers. Just to guarantee the quality, a freed from cost demo variation is similarly open. We moreover help you with defeating your AWS Certified Professional exam by an unequivocal guarantee methodology. To be more prepared you can moreover benefit from an online test engine for preparing tests. Dumpsprofessor.com worked unquestionably with the guide of using following the total of the recommendations from specialists.
I would not be able to pass my IT exam with so good grades without the use of Microsoft Exam dumps. It was only through this PDF file that I got the real concept of each topic and competently gained a good amount of knowledge of the field. There is no match for Microsoft dumps.
ReplyDeleteHave you ever considered about adding a little bit more than just your articles? I mean, what you say is valuable and all. Nevertheless think about if you added some great photos or videos to give your posts more, "pop"! Your content is excellent but with pics and video clips, this site could undeniably be one of the most beneficial in its field. Awesome blog!
ReplyDeleteweb developer berlin
I have a question. I'm currently doing a project which requires the creation of many sheets withing a workbook. Each sheet requires starting with a template. How can I load the template in to a newly added sheet before I start to load the data?
ReplyDeleteHi Robert
DeleteWhy does your name sound so familiar?
It looks like the solution entails creating a new workbook from the template, and then copying the contents from the resulting sheet to another nominated / new sheet in another workbook. A little clunky, but seems to work.
The way I get decent search results on Excel type-library stuff is to search for "excel new sheet from template vba" or something similar. It's usually trivial to convert the VBA into Delphi code.
This page seems to solve the problem:
https://www.ozgrid.com/forum/index.php?thread/149088-macro-to-create-a-new-sheet-from-a-template-and-name-it-based-on-prompt/
This page discusses the same topic but doesn't seem to get to a solution as quickly:
https://www.mrexcel.com/board/threads/vba-code-to-create-a-new-sheet-from-a-template-and-rename-it-from-a-list.813294/
Donald, I certainly appreciate your quick reply, and I will look into the info you supplied. However, I was wondering if you know whether there are any functions within Excel2000 that do this, or where I could find complete documentation online for the same?
DeleteThanks again,
Bob
Hi Bob
DeleteI hear you.
I don't know what your Delphi / VBA proficiency is, so please forgive me if this is too simple.
As mentioned, the VBA (Visual Basic for Applications) documentation is your best friend, or any sites that focus on VBA. VBA is the language that MS Office records / runs its macros in, and is quite simple to understand / write.
If you can do something in Excel by using the menus or shortcut keys, you can record it as a macro. Then you can inspect the macro. So if it were possible (which it doesn't seem to be) to create a new sheet from a template by using manual actions in Excel, you could just record those actions to a macro and look at the resulting code, and then duplicate the effort in Delphi (it'll be VERY similar but not the same).
The Delphi .PAS file (Excel_TLB.pas) is the Excel ActiveX export for all of the Excel functions accessible programmatically. In my version it's 57000 lines. This isn't actual code, it's just interfaces to possible functionality to "remote control" Excel. In a sense it's self-documenting, since it's all there.
If you knew everything that I've just explained, then my explanation was too simple for you, but someone else might still benefit.
So I don't think you need complete documentation except for the VBA manuals that are available on the web for, MS Office, linked through F1 clicks in the VBA code.
For example, getting F1 help on the Sheet1.Copy function in VBA in Excel navigates to this web page: https://docs.microsoft.com/en-us/office/vba/api/excel.worksheet.copy?f1url=%3FappId%3DDev11IDEF1%26l%3Den-US%26k%3Dk(vbaxl10.chm174074);k(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue
There's another idea around the pattern to create new sheets based on templates... create an "unused" sheet that you open from a template initially, and never use it ... then when you need to create a new sheet based on the template, you just copy that sheet again. So it's the same technique that I mentioned initially, just a little but less clunky.
I await your feedback :-D
Donald,
DeleteThank you so much for taking the time to help me. Your last line is the one that interests me. I have the template created and what I want to do is to load it into a sheet created via Excel2000 (examples 5 and/or 7 above), but I can't seem to find any method that does this. Is it possible?
Bob
I have successfully attempted for Microsoft Office Specialist: Microsoft Excel Expert (Excel and Excel 2019) | Microsoft Office Specialist and it only because of MO-201. I was not having much time to prepare but I was able to cover my whole syllabus only with the help of this dumps material. I say thanks to this material for being so concise and to-the-point in answering the questions. I easily memorized MO-201 which is comprehensive and gives a full understanding of the field.
ReplyDeleteFor More Info Visit: https://www.dumpspool.com/microsoft/mo-201-dumps.html
Thank you so much for providing these accurate Microsoft MO-201 exam dumps. I'm feeling very happy.
ReplyDeleteGreat work. Are there any similar example for MS-Word and MS-Powerpoint
ReplyDeleteMs Excel Automation In Delphi >>>>> Download Now
ReplyDelete>>>>> Download Full
Ms Excel Automation In Delphi >>>>> Download LINK
>>>>> Download Now
Ms Excel Automation In Delphi >>>>> Download Full
>>>>> Download LINK RV
MS Excel Automation in Delphi is a very new idea.
ReplyDeleteWe support this digital effort.
Anyways guys we are.
Digital Marketing Training in Pathanamthitta.
Visit Us
If the excel file is located in a cloud this doenst works!! do you know why?
ReplyDeletegreat post , keep posting Java Course In Pune
ReplyDeleteAmazon PPC & Advertising Management
ReplyDelete
ReplyDeleteInformative post indeed, I’ve being in and out reading posts regularly and I see alot of engaging people sharing things and majority of the shared information is very valuable and so, here’s my fine read. reactjs training in pune
Thanks For Your Blog. Are you looking for the best Excel Automation Services to automate your repetitive tasks? Check Automate Excel Reports Here
ReplyDeleteHi Neeraj.
ReplyDeleteFinally a post consistent with the article in question! :)
Enough advertising posts, I can't take it anymore!
Nice blog article that I have read today. Keep uploading these types of Articles regulerly. Also, refer Data Science Course in Kolhapur
ReplyDeleteUseful post Thanks for sharing it that truly valuable knowledge about similar topic. python training in satara
ReplyDeleteThis comment has been removed by the author.
ReplyDeleteThis comment has been removed by the author.
DeleteThanks for a fantastic article.
ReplyDeleteI have a question regarding Summing a range of cells
Your example: myxlSheet11.Range['k1', 'k1'].Formula := '=Sum(p3:p8)';
However I only want to SUM the range and store the value of the Sum in a variable at runtime without entering a formula somewhere in the spreadsheet.
Something like
MyVariable := myxlSheet11.Range['A1', 'A1'].Sum
I know this is wrong but hoping someone can help. I am not getting any joy from Google.
I know I can iterate the Columns but want a quicker way to do this.