wow!
thanks for the compliments!
I'll try to address a couple of questions and comments:
----------------------------------
Counting VBA lines:
----------------------------------
Unfortunately, there's no SIMPLE way of counting the lines.
There IS a VBA "property" (or "method"?) that does though!
Each Workbook can have a VB Project.
Each VBProject has Components
Each Component has a CodeModule
and each CodeModule has a CountOfLines property!
wow... that's a stretch.
So, what I do is open all of the workbooks that I want to count the VBA lines.
Then use this to cycle through all open workbooks:
For Each w In Workbooks
If (UCase(Left(w.Name, Len("Personal.xls"))) <>
UCase("Personal.xls")) Then
Workbooks(w.Name).Activate
rcnt = rcnt + 1
ThisWorkbook.Sheets("VBA Macros").Cells(rcnt,
"A").Value = ActiveWorkbook.Name
ThisWorkbook.Sheets("VBA Macros").Cells(rcnt,
"B").Value = CountAllMacros_Summary
End If
Next w
The CountAllMacros_Summary function looks like:
Public Function CountAllMacros_Summary()
Dim vbaModule 'As VBProject.VBComponents
Dim VBComp, tmp, TTL, lcnt
Set vbaModule = ActiveWorkbook.VBProject.VBComponents
TTL = 0
Application.StatusBar = "Counting Modules..."
Application.EnableEvents = False
For Each VBComp In vbaModule
lcnt =
ActiveWorkbook.VBProject.VBComponents(VBComp.Name).CodeModule.CountOfLines
TTL = TTL + lcnt
Next VBComp
Application.EnableEvents = True
Application.StatusBar = False
CountAllMacros_Summary = TTL
End Function
----------------------------------------------------------
I have a similar option that gives me a detail list of lines in each code module
instead of the total lines for the workbook.
----------------------------------------------------------
You said that you write in TextPad for the line numbers and libraries, then
asked about debugging..
Oh MY!!!
I think once you get really used to the VBEditor, you'll no longer need to use
TextPad!
Here's a couple of tips:
First, right-click on the "Menu bar" and be sure to turn on "Debug", "Edit" and
"Standard".
"Dock" any of these toolbars that are "floating" underneath the rest of the
icons.
There are several of these that REALLY come in handy!
First of all, some of the colors are "configurable", so YOUR VBEditor might look
different than mine.
Bookmarks: Notice the set of blue flags? These are bookmarks. If your cursor is
on a line and you hit the first blue flag, it places a littel blue box in the
left-hand border. Now, whenever you're in another function or module, hitting
the blue flag with the arrow (pointing right or left) will step through each of
your bookmarks.
of course, hitting the flag with the "x" will remove all bookmarks.
Breakpoints: If you want to debug a macro, it is sometimes helpful to run the
macro to a specific point, then halt the execution and step through the macro
one line at a time. Using the "hand" icon, you set a "breakpoint".
It puts a colored circle (mine is maroon) and highlights the line. Now, when
you run your macro, it will PAUSE when it gets to this breakpoint. Instead of
using the icon, you can simply click in the left-border (where the circle
appeared) and either turn on or off the breakpoint. (using the menu
Debug->ClearAllBreakpoints will remove them all, so you don't have to remove
them one at a time)
Watches: If you right-click on one of your variables, you can select to "add
Watch". This will place the variable in a "watch window" and show you the value
of the variable as you step through the macro!
You'll notice that, while the macro is running, the line currently being
"executed" is highlighted in Yellow, with an arrow in the border.
If, after you step through the line, the watch variable doesn't show what you're
expecting, you CAN edit the previous line, then simply "drag" the yellow arrow
back to the previous line (or before) and step through again!
If, for instance, a variable has a value, and you want to change the value for
testing purposes, you can change it in the Watch Window, and continue
executing your macro!
Variable Declaration.
Have you ever set a variable to a value, then later tried to use the variable
and it isn't working, then you discover that you keyed the name wrong?
Like:
Dim NewVariable as String
then:
NewVariabel = "test"
If, at the top of each Module, you enter the line:
Option Explicit
This tells the compiler that all variables have to be declared "Explicitly".
But it ONLY applies to the current code module. So you need this in each
module.
(you can use the menu: Tools->Options and select "Require Variable Declaration"
to set the "default")
By declaring all variables, as you type you can tell if you've miskeyed
something.
for the variable declared as "NewVariable", if you typed: newvariable = "test",
the Editor will automatically change the name to: NewVariable.
also, if you've written your code in separate subs or functions, when you're
USING the function:
(like: Cells(rcnt, "B").Value = CountAllMacros_Summary)
you can right-click on the function name and select "Definition", and it will
take you to the function!
hope this helps...
let me know if you have any more questions (or if I've missed any)
Paul
-----------------------------------------
"Do all the good you can,
By all the means you can,
In all the ways you can,
In all the places you can,
At all the times you can,
To all the people you can,
As long as ever you can." - John Wesley
-----------------------------------------
________________________________
From: Louise Gariépy <garilou@cgocable.ca>
To: ExcelVBA@yahoogroups.com
Sent: Fri, May 3, 2013 2:06:14 AM
Subject: Re: [ExcelVBA] Problem: sort sheets according to two sets of criteria
Hi again, Paul
>
> Glad I could help.
You sure did! As I said, I think about you at least 2 times a day!
It saves me so much time that I sort more often.
>
> As for the "X" in:
>
> If (Sheets("Source").Cells(R, "B").Value & "X" <> "X") Then
>
> I manage nearly 100,000 lines of VBA code spread across several applications!
Hum, how do you count them?
I am not only joking: is there a way the see the line numbers in VBE?
There are still lots of features in the VBE that I do not use because I don't
know what they are for or how they work.
I am sure I would be more efficient if I mastered this.
I write all my subs first in Text Pad, and I do appreciate the line numbers
(and also all the pieces of code that I can store in the libraries)
> As you can imagine, troubleshooting problems can be difficult.
This reminds me of an old question a few years ago, with subject : How do you
debug?
I did not expect so many replies, but there were, and this helped me a lot!
>
> On occasion, I've encountered cases where the "value" in a cell is "null".
.............
> .. unless someone asks...
Well I asked and got a good trick that I will use, because as a matter of fact,
this has happened to me, and I always found workarounds that were time
consuming.
>----------------------------------------------------------
>-
>
> The other "trick" to speed things up is that I turn off screen updating.
As for screen updating turned off, maybe it was not written in the sample book,
but I use this all the time.
It does not only save time, even if it is the main reason, with screen updating
off, you don't see things that I not necessarily pretty (on a hidden sheet for
example). I am glad that I do not work for a client: my pages are not always
good looking.
As well as calculation turned to manual.
When I need to refresh 10 queries per page on 40 pages, if it calculated each
time, not only it would take so long, but some results would present a error if
all the data are not yet in.
>
> --------------------
> Sorting
> --------------------
> What I did was perform what is called a "bubble sort".
I had found "bubble sort" in my long googling hours, but no example helped me
understand how to do it, at least in the case I needed.
The examples were applied to too simplistic tasks.
> I loaded the array with sheet names and values.
> I then cycled through the array from first to last and compared the "value"
>from
>
> one sheet to the next.
> If the values need to be reversed, I load one set of array contents into the
> "bubble" and use this to swap values.
>
> I COULD have combined the array sort and sheet move into one loop.
> However, that means that whenever the "values" require the sheets to be
> "swapped", the actual sheets would be moved, which would take WAY more
> processing time.
>
> ----------------
> To be honest, we COULD have simply combined the data into one sheet, sorted
> it in the sheet, and then used VBA to move the sheets into the proper order.
This was what I was starting to do when I thought I could not do it, but I also
prefer VBA solutions.
What you did - and it did not come to my mind - is that you did it in 2 steps:
First sort all according to criteria 2, and only after bring back the pages I
needed first according to criteria 1.
This made every thing much more simple.
>
> But... I like VBA solutions best!
>
> let us know if you need anything else...
I sure will.
But I really try to find my solutions before I ask.
When I came here first, I knew so little that I did not even know which words to
google for.
Now I am more efficient at finding answers on my own.
But if you saw all my code lines, you would probably want to re write a lot!
>
> Paul
> -----------------------------------------
> "Do all the good you can,
> By all the means you can,
> In all the ways you can,
> In all the places you can,
> At all the times you can,
> To all the people you can,
> As long as ever you can." - John Wesley
> -----------------------------------------
>
I can see that you act - and probably not only on this group - according to the
text that you use as signature.
You are really generous, and a good teacher too.
This is beautiful: another gift from you
Thanks again
Louise
>
>
>
> ________________________________
> From: Louise Gariépy <garilou@cgocable.ca>
> To: "ExcelVBA@yahoogroups.com" <ExcelVBA@yahoogroups.com>
> Sent: Wed, May 1, 2013 10:07:21 PM
> Subject: Fwd: [ExcelVBA] Problem: sort sheets according to two sets of
criteria
>
> Hi again Paul!
>
> Fantastic.
> As expected, it worked perfectly at the first run on the sample book.
>
> Then it took me about 30 minutes to adapt it to the real book.
> I had to change the first sorting, because I needed the sheets to be sorted
>from
>
> the largest number to the smallest.
> Then I understood why you were using
>>> If (Sheets("Source").Cells(R, "B").Value & "X" <> "X") Then.
>
> And I tried:
> If (Sheets("Source").cells(R."B").value > "") then
> ...
> and it worked well
> (I do not have 1000 sheets, and I hope I will never have so many, so the sub
> runs in about 1/2 sec.
> To do this - without mistakes - it took me sometimes up to 10 minutes (and the
> sheets that were not on "Source" were not sorted).
>
> I thank you so much, I wish so much I could do something to thank you.
>
> The only thing that I could offer to you would be to trade stocks for you.
>
> The "A,B,C..." from the sample book are in fact stock tickers.
> Since I came to this group for the first time, I have not stopped refining my
> indicators, and this new book helps me to size the positions so that my
> portfolio is always fully invested with the best performing stocks, and most of
>
> all to quickly catch the day winners, bull or bear market!
> With this new book, I am real good, and beat the markets every day by 0.5% to
> 1.5%.
> I am only joking, but my son has invested a few thousand dollars in my "Fund"
> and he is really pleased.
>
> So every night, when I will reallocate my portfolio, I'll have a good thought
> for you.
>
> Till the next time,
>
> Louise
>
>
>
>
>
>
>
>
> Début du message réexpédié :
>
>> De : Louise Gariépy <garilou@cgocable.ca>
>> Objet : Rép : [ExcelVBA] Problem: sort sheets according to two sets of
> criteria
>> Date : 1 mai 2013 20:19:45 HAE
>> À : ExcelVBA@yahoogroups.com
>> Répondre à : ExcelVBA@yahoogroups.com
>>
>> Hi Paul,
>>
>> First, sorry for the empty message.
>> I am not familiar with this mail program, and I do stupid mistakes.
>>
>> Wow!
>>
>> You did much more then I was asking, (I did not ask for a complete code).
>> But the main reason I asked to the group was to come out of my habits and try
>> to learn something new, here it is!
>> I knew I should sort the array, and I did not know how.
>> I am so glad.
>> Now I have concrete to work with.
>>
>> I am not sure if I understand the "X" in:
>>> If (Sheets("Source").Cells(R, "B").Value & "X" <> "X") Then
>>
>>
>> but let me think a little bit.
>>
>> I will study and try the code and give you feedback.
>>
>> Yes I will remove the sheet "Problem Description", but in the real book, I have
>>
>> 4 sheets before the "A,B,C..." sheets to sort.
>>
>> Thank you so much! Once it is done, it will save me so much time and
> mistakes!
>>
>> Louise
>>
>> Le --01052013 à 11:47, Paul Schreiner <schreiner_paul@att.net> a écrit :
>>
>>> Louise,
>>>
>>> Here's what I came up with.
>>> it's not really "efficient", but it gets the job done.
>>> If I knew that the values in A1 of each sheet were NUMERIC,
>>> and the range of values, then I might be able to make it run more
> efficiently.
>>>
>>> Even so, I created some test data (1000 sheets) and it ran in about 5
> seconds.
>>>
>>> Here's what I came up with:
>>> The premise is to load the sheet names and values from (A1) into an array and
>
>
>>> sort the array based on the A1 values.
>>> Skipping sheets with the name "Source" and "Problem Description".
>>>
>>> Then, move the sheets to the "end" of the workbook based on this array.
>>> Next, move the sheets in your "special" list to the front. (in reverse
order)
>>>
>>> Note: I used .Move After:=Sheets(2)
>>> which would put them after the 2nd sheet, which is "Problem Description"
>>> If you remove that sheet, and want the sheets to appear after the first sheet,
>>
>>
>>> then change Sheets(2) to Sheets(1).
>>>
----------------------------------------------------------
>>> Option Explicit
>>> Sub SortSheets()
>>> Dim R, nRows, sht, inx
>>> Dim ShtArray(1500, 1)
>>> Dim SortFlag, LoopCnt
>>> Dim tmpval0, tmpval1
>>> On Error GoTo 0
>>> '------------------------------------------------------
>>> ' Load Sheet Names and Values (from Cell A1) into array
>>> '------------------------------------------------------
>>> inx = -1
>>> For Each sht In Sheets
>>> If ((UCase(sht.Name) <> UCase("Source")) _
>>> And (UCase(sht.Name) <> UCase("Problem description"))) Then
>>> inx = inx + 1
>>> ShtArray(inx, 0) = sht.Name
>>> ShtArray(inx, 1) = sht.Cells(1, 1).Value
>>> End If
>>> Next
>>> '---------------------------------------
>>> ' Sort Array by Values
>>> '---------------------------------------
>>> SortFlag = True
>>> LoopCnt = 0
>>> While SortFlag And LoopCnt < 1000000
>>> LoopCnt = LoopCnt + 1
>>> SortFlag = False
>>> For inx = 0 To UBound(ShtArray) - 1
>>> If ((ShtArray(inx, 0) <> "") And (ShtArray(inx + 1, 0) <> ""))
> Then
>>> If (ShtArray(inx, 1) > ShtArray(inx + 1, 1)) Then
>>> tmpval0 = ShtArray(inx, 0)
>>> tmpval1 = ShtArray(inx, 1)
>>> ShtArray(inx, 0) = ShtArray(inx + 1, 0)
>>> ShtArray(inx, 1) = ShtArray(inx + 1, 1)
>>> ShtArray(inx + 1, 0) = tmpval0
>>> ShtArray(inx + 1, 1) = tmpval1
>>> SortFlag = True
>>> Exit For
>>> End If
>>> End If
>>> Next inx
>>> Wend
>>> '----------------------
>>> ' Move Sheets
>>> '----------------------
>>> Application.ScreenUpdating = False
>>> For inx = 0 To UBound(ShtArray)
>>> If (ShtArray(inx, 0) <> "") Then
>>> Sheets(ShtArray(inx, 0)).Move After:=Sheets(Sheets.Count)
>>> Else
>>> Exit For
>>> End If
>>> Next inx
>>> '-----------------------------------------------
>>> ' Move first sheets from "First" list to front
>>> '-----------------------------------------------
>>> nRows = Sheets("Source").Cells(1, 1).SpecialCells(xlLastCell).Row
>>> For R = nRows To 1 Step -1
>>> If (Sheets("Source").Cells(R, "B").Value & "X" <> "X") Then
>>> ' Sheets(Sheets("Source").Cells(R, "B").Value).Move
>>> Before:=Sheets(1)
>>> Sheets(Sheets("Source").Cells(R, "B").Value).Move
After:=Sheets(2)
>>> End If
>>> Next R
>>> Application.ScreenUpdating = True
>>> Sheets("Source").Select
>>> MsgBox "Finished"
>>> End Sub
>>>
>>>
----------------------------------------------------------
>>> Paul
>>> -----------------------------------------
>>> "Do all the good you can,
>>> By all the means you can,
>>> In all the ways you can,
>>> In all the places you can,
>>> At all the times you can,
>>> To all the people you can,
>>> As long as ever you can." - John Wesley
>>> -----------------------------------------
>>>
>>>
>>>
>>>
>>> ________________________________
>>> From: Louise Gariépy <garilou@cgocable.ca>
>>> To: ExcelVBA@yahoogroups.com
>>> Sent: Wed, May 1, 2013 7:05:35 AM
>>> Subject: Re: [ExcelVBA] Problem: sort sheets according to two sets of
> criteria
>>>
>>>
>>> Hi, David,
>>> Thank you for trying.
>>> But this does not solve my problem.
>>> Or in other words, yes this list that you suggest was generated in the sheet
>>> "Problem description". (Columns M and N)
>>>
>>> I was hoping to find a method to go directly from the columns B and C,
>>> (Criteria
>>>
>>> 1) and E and F (criteria 2) to the sheet sorting process.
>>> I guess if the whole cannot be done in one step, I will keep on with my not too
>>>
>>>
>>> elegant program that I have started, generating all columns that were
>>> illustrated in that sheet.
>>>
>>> From there on, it will not be too difficult with the:
>>> sheets(s).move after.
>>> to move the sheets with the largest numbers to the end.
>>>
>>> I guess that if I could not find the solution while googling for so long, it
>>> was
>>>
>>> because there was no way to do it.
>>> Thanks anyway.
>>> This gave me the opportunity to say hello to everyone ;-)
>>>
>>> Louise
>>>
>>> Le --27042013 à 20:29, David Grugeon <yahoo@grugeon.com.au> a écrit :
>>>
>>>> Hi Louise
>>>>
>>>> I think the easiest way to do this is to create a list of the sheet names
>>>> in order, then step through this list in order moving each sheet to the
>>>> end. I think you would use something like
>>>>
>>>> Sheets(s).move after:=Sheets(Sheets.Count)
>>>>
>>>> Put this in a loop which picks up the next sheetname as s.
>>>>
>>>>
>>>> On 28 April 2013 09:27, garilou <garilou@cgocable.ca> wrote:
>>>>
>>>>> Hi group, and all the genius programmers!
>>>>>
>>>>> I have not been asking much for quite a long time, but I keep programming
>>>>> almost every day.
>>>>>
>>>>> David has put on the group page a sample sheet that I have prepared to
>>>>> better explain what I am trying to do.
>>>>> As I told David, I have Googled for days, and all what I found were
>>>>> programs to sort alphabetically, which is not what I need.
>>>>> ==============================
>>>>>
>>>>> I have a workbook with more almost 40 data sheets.
>>>>>
>>>>> I must rearrange those sheets at least once a day: when there were only 5
>>>>> to 10, I made it manually, but it took a long time, and I made so many
>>>>> mistakes that the rest of the tasks did not work.
>>>>>
>>>>> The sheets must be ordered according to 2 sets of criteria.
>>>>>
>>>>> Between 1 and maximum 10 sheets must be ordered first, in an order
>>>>> determined on another sheet (« source »). (Criteria 1)
>>>>>
>>>>> The other ones must be ordered according to a number (between 20 and 100)
>>>>> that I have set in cell A1 from every sheet of the sample book. (Criteria
> 2)
>>>>>
>>>>> For the sake of this sample, I have created those values with a random
>>>>> formula.
>>>>>
>>>>> "In real life", this could be more complicated, because some sheets could
>>>>> have the same value in cell A1, but those could be placed side by side,
>>>>> with no special order.
>>>>>
>>>>> The names on sheet «Source » are different every day, as well as the value
>>>>> in Cell A1 of the other sheets.
>>>>>
>>>>> I do not expect any one to write the whole program for me, but if I could
>>>>> get some methods to follow, steps to go through, some keywords that I
could
>>>>> Google that would help me find a solution.
>>>>>
>>>>> Then I might try and come back with more specific questions.
>>>>>
>>>>> Thank you to all who will be so kind to look at this.
>>>>>
>>>>> Louise
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> ------------------------------------
>>>>>
>>>>> ----------------------------------
>>>>> Be sure to check out TechTrax Ezine for many, free Excel VBA articles! Go
>>>>> here: http://www.mousetrax.com/techtrax to enter the ezine, then search
>>>>> the ARCHIVES for EXCEL VBA.
>>>>>
>>>>> ----------------------------------
>>>>> Visit our ExcelVBA group home page for more info and support files:
>>>>> http://groups.yahoo.com/group/ExcelVBA
>>>>>
>>>>> ----------------------------------
>>>>> More free tutorials and resources available at:
>>>>> http://www.mousetrax.com
>>>>>
>>>>> ----------------------------------Yahoo! Groups Links
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> [Non-text portions of this message have been removed]
>>>>
>>>>
>>>>
>>>> ------------------------------------
>>>>
>>>> ----------------------------------
>>>> Be sure to check out TechTrax Ezine for many, free Excel VBA articles! Go here:
>>>>
>>>>
>>>> http://www.mousetrax.com/techtrax to enter the ezine, then search the ARCHIVES
>>>
>>>
>>>> for EXCEL VBA.
>>>>
>>>>
>>>> ----------------------------------
>>>> Visit our ExcelVBA group home page for more info and support files:
>>>> http://groups.yahoo.com/group/ExcelVBA
>>>>
>>>> ----------------------------------
>>>> More free tutorials and resources available at:
>>>> http://www.mousetrax.com
>>>>
>>>> ----------------------------------Yahoo! Groups Links
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>>
>>> [Non-text portions of this message have been removed]
>>>
>>>
>>>
>>> ------------------------------------
>>>
>>> ----------------------------------
>>> Be sure to check out TechTrax Ezine for many, free Excel VBA articles! Go here:
>>>
>>> http://www.mousetrax.com/techtrax to enter the ezine, then search the ARCHIVES
>>
>>> for EXCEL VBA.
>>>
>>>
>>> ----------------------------------
>>> Visit our ExcelVBA group home page for more info and support files:
>>> http://groups.yahoo.com/group/ExcelVBA
>>>
>>> ----------------------------------
>>> More free tutorials and resources available at:
>>> http://www.mousetrax.com
>>>
>>> ----------------------------------Yahoo! Groups Links
>>>
>>>
>>>
>>
>>
>>
>> ------------------------------------
>>
>> ----------------------------------
>> Be sure to check out TechTrax Ezine for many, free Excel VBA articles! Go here:
>>
>> http://www.mousetrax.com/techtrax to enter the ezine, then search the ARCHIVES
>
>> for EXCEL VBA.
>>
>>
>> ----------------------------------
>> Visit our ExcelVBA group home page for more info and support files:
>> http://groups.yahoo.com/group/ExcelVBA
>>
>> ----------------------------------
>> More free tutorials and resources available at:
>> http://www.mousetrax.com
>>
>> ----------------------------------Yahoo! Groups Links
>>
>>
>>
>
>
>
> [Non-text portions of this message have been removed]
>
>
>
> ------------------------------------
>
> ----------------------------------
> Be sure to check out TechTrax Ezine for many, free Excel VBA articles! Go here:
>
> http://www.mousetrax.com/techtrax to enter the ezine, then search the ARCHIVES
> for EXCEL VBA.
>
>
> ----------------------------------
> Visit our ExcelVBA group home page for more info and support files:
> http://groups.yahoo.com/group/ExcelVBA
>
> ----------------------------------
> More free tutorials and resources available at:
> http://www.mousetrax.com
>
> ----------------------------------Yahoo! Groups Links
>
>
>
> [Non-text portions of this message have been removed]
>
>
>
> ------------------------------------
>
> ----------------------------------
> Be sure to check out TechTrax Ezine for many, free Excel VBA articles! Go here:
>http://www.mousetrax.com/techtrax to enter the ezine, then search the ARCHIVES
>for EXCEL VBA.
>
>
> ----------------------------------
> Visit our ExcelVBA group home page for more info and support files:
> http://groups.yahoo.com/group/ExcelVBA
>
> ----------------------------------
> More free tutorials and resources available at:
> http://www.mousetrax.com
>
> ----------------------------------Yahoo! Groups Links
>
>
>
------------------------------------
----------------------------------
Be sure to check out TechTrax Ezine for many, free Excel VBA articles! Go here:
http://www.mousetrax.com/techtrax to enter the ezine, then search the ARCHIVES
for EXCEL VBA.
----------------------------------
Visit our ExcelVBA group home page for more info and support files:
http://groups.yahoo.com/group/ExcelVBA
----------------------------------
More free tutorials and resources available at:
http://www.mousetrax.com
----------------------------------Yahoo! Groups Links
[Non-text portions of this message have been removed]
Reply via web post | Reply to sender | Reply to group | Start a New Topic | Messages in this topic (4) |
Be sure to check out TechTrax Ezine for many, free Excel VBA articles! Go here: http://www.mousetrax.com/techtrax to enter the ezine, then search the ARCHIVES for EXCEL VBA.
----------------------------------
Visit our ExcelVBA group home page for more info and support files:
http://groups.yahoo.com/group/ExcelVBA
----------------------------------
More free tutorials and resources available at:
http://www.mousetrax.com
----------------------------------
Tidak ada komentar:
Posting Komentar