Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 184
Default Generate Subtotal Summary from Sheet1 into Sheet2

Within the same workbook, I want to summarize
by Project the "Detail" worksheet into the "Summary" worksheet.
I probably have a range syntax error, but I cannot detect it.
I have an Overflow error and the Countif that drives the loop is at
zero.
..
I could easily do it with a pivot table, that is not what I want.
I want to process it with VBA as I have attempted below.
Help appreciated.
J.P.
.............................................
Source : "Detail" worksheet
A B C D
E
1. Date Project Activity Force Hours
2. 8/27/2010 Project C T 5 300
3. 8/29/2010 Project C U 10 500
4. 8/26/2010 Project A L 1 50
5. 8/28/2010 Project A M 11 550
6. 8/23/2010 Project K V 4 200
7. 8/25/2010 Project K X 6 300
...........................................
Destination : "Destination" worksheet
Project Force Hours
Project A 12 600
Project C 15 800
Project K 10 500
...........................................
Sub ProjectSummary()
Dim WB As Workbook
Dim SH1 As Worksheet
Dim SH2 As Worksheet
Dim MyPath, Line As String
Dim DestCell As Range
Dim i As Integer: Dim j As Integer: Dim k As Integer
Dim RngD As Range
Dim RngE As Range
Dim RngB As Range
On Error GoTo ErrorCatch
MyPath = "C:\1-Work\TestData\"
Set WB = Workbooks.Open(MyPath & "Omega.xls")
Set SH1 = WB.Worksheets("Detail")
Set SH2 = WB.Worksheets("Summary")
Set DestCell = SH2.Range("A1")
ActiveWorkbook.Sheets("Detail").Select
DestCell = "Project"
DestCell.Offset(0, 1) = "Force"
DestCell.Offset(0, 2) = "Hours"
'------------------------------------------
'Sort rows by Project
SH1.Range("A2").CurrentRegion.Sort Key1:=SH1.Range("B2"),
Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1,
MatchCase:=False, Orientation:=xlTopToBottom
'=================== Probable Error Area =========================
Set RngD = Range(Cells(1, "D"), Cells(Rows.Count, "D").End(xlUp))
Set RngE = Range(Cells(1, "E"), Cells(Rows.Count, "E").End(xlUp))
Set RngB = Range(Cells(1, "B"), Cells(Rows.Count, "B").End(xlUp))
' Calculate Sum for Project
Line = "Do While"
Do While i <= Worksheets("Detail").Range("A100").End(xlUp).Row
j = Application.CountIf(RngB, Cells(i, "B"))
Line = j & " Summary Col. A " 'Error is there : Overflow message
and J = 0
'================================================= ======
Worksheets("Summary").Cells(k, "A") = Cells(i, "B")
Worksheets("Summary").Cells(k, "B") = Application.SumIf(RngB,
Cells(i, "B"), RngD)
Worksheets("Summary").Cells(k, "C") = Application.SumIf(RngB,
Cells(i, "B"), RngE)
k = k + 1: i = i + j
Loop
Exit Sub
ErrorCatch:
MsgBox "ErrorCatch Line : " & Line & " " & Err.Description
Resume Next
End Sub
  #2   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 62
Default Generate Subtotal Summary from Sheet1 into Sheet2

Hello !

I notice two things:

An error of syntax:
replace Cells(1, "B") by Cells(1, 2)
replace Cells(1, "C") by Cells(1, 3)
replace Cells(1, "D") by Cells(1, 4)
replace Cells(1, "E") by Cells(1, 5)

and a logical one:
before using a loop, one should initialize the variable used for staying in
the loop or stopping it.
In your case, i and k are initialized to zero (default value)
You should write:

i = 2
k = 2
Do While i <= Worksheets("Detail").Range("A100").End(xlUp).Row

The modified code:

Sub ProjectSummary()
Dim WB As Workbook
Dim SH1 As Worksheet, SH2 As Worksheet
Dim MyPath, Line As String
Dim DestCell As Range
Dim i As Integer, j As Integer, k As Integer
Dim RngD As Range, RngE As Range, RngB As Range

On Error GoTo ErrorCatch
MyPath = "C:\1-Work\TestData\"
Set WB = ThisWorkbook ' Workbooks.Open(MyPath & "Omega.xls")
Set SH1 = WB.Worksheets("Detail")
Set SH2 = WB.Worksheets("Summary")
Set DestCell = SH2.Range("A1")
ActiveWorkbook.Sheets("Detail").Select
DestCell = "Project"
DestCell.Offset(0, 1) = "Force"
DestCell.Offset(0, 2) = "Hours"

'Sort rows by Project
SH1.Range("A2").CurrentRegion.Sort Key1:=SH1.Range("B2"), _
Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom

Set RngD = Range(Cells(1, "D"), Cells(Rows.Count, "D").End(xlUp))
Set RngE = Range(Cells(1, "E"), Cells(Rows.Count, "E").End(xlUp))
Set RngB = Range(Cells(1, "B"), Cells(Rows.Count, "B").End(xlUp))
' Calculate Sum for Project
i = 2
k = 2
Do While i <= Worksheets("Detail").Range("A100").End(xlUp).Row
j = Application.CountIf(RngB, Cells(i, 2))
Line = j & " Summary Col. A "
Worksheets("Summary").Cells(k, 1) = Cells(i, 2)
Worksheets("Summary").Cells(k, 2) = Application.SumIf(RngB, _
Cells(i, 2), RngD)
Worksheets("Summary").Cells(k, 3) = Application.SumIf(RngB, _
Cells(i, 2), RngE)
k = k + 1: i = i + j
Loop
Exit Sub

ErrorCatch:
MsgBox Err.Description
End Sub


Does it help ?


  #3   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 62
Default Generate Subtotal Summary from Sheet1 into Sheet2

Errata:

Replace the line:
Set WB = ThisWorkbook ' Workbooks.Open(MyPath & "Omega.xls")
with your initial line:
Set WB = Workbooks.Open(MyPath & "Omega.xls")

And if you want your macro run more than once, you could erase the old
results before the new calculation. Just insert this line:
Range(DestCell, DestCell.End(xlDown).Resize(, 3)).ClearContents
after the line:
Set DestCell = SH2.Range("A1")











"Charabeuh" a écrit dans le message de groupe de
discussion : ...
Hello !

I notice two things:

An error of syntax:
replace Cells(1, "B") by Cells(1, 2)
replace Cells(1, "C") by Cells(1, 3)
replace Cells(1, "D") by Cells(1, 4)
replace Cells(1, "E") by Cells(1, 5)

and a logical one:
before using a loop, one should initialize the variable used for staying
in the loop or stopping it.
In your case, i and k are initialized to zero (default value)
You should write:

i = 2
k = 2
Do While i <= Worksheets("Detail").Range("A100").End(xlUp).Row

The modified code:

Sub ProjectSummary()
Dim WB As Workbook
Dim SH1 As Worksheet, SH2 As Worksheet
Dim MyPath, Line As String
Dim DestCell As Range
Dim i As Integer, j As Integer, k As Integer
Dim RngD As Range, RngE As Range, RngB As Range

On Error GoTo ErrorCatch
MyPath = "C:\1-Work\TestData\"
Set WB = ThisWorkbook ' Workbooks.Open(MyPath & "Omega.xls")
Set SH1 = WB.Worksheets("Detail")
Set SH2 = WB.Worksheets("Summary")
Set DestCell = SH2.Range("A1")
ActiveWorkbook.Sheets("Detail").Select
DestCell = "Project"
DestCell.Offset(0, 1) = "Force"
DestCell.Offset(0, 2) = "Hours"

'Sort rows by Project
SH1.Range("A2").CurrentRegion.Sort Key1:=SH1.Range("B2"), _
Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom

Set RngD = Range(Cells(1, "D"), Cells(Rows.Count, "D").End(xlUp))
Set RngE = Range(Cells(1, "E"), Cells(Rows.Count, "E").End(xlUp))
Set RngB = Range(Cells(1, "B"), Cells(Rows.Count, "B").End(xlUp))
' Calculate Sum for Project
i = 2
k = 2
Do While i <= Worksheets("Detail").Range("A100").End(xlUp).Row
j = Application.CountIf(RngB, Cells(i, 2))
Line = j & " Summary Col. A "
Worksheets("Summary").Cells(k, 1) = Cells(i, 2)
Worksheets("Summary").Cells(k, 2) = Application.SumIf(RngB, _
Cells(i, 2), RngD)
Worksheets("Summary").Cells(k, 3) = Application.SumIf(RngB, _
Cells(i, 2), RngE)
k = k + 1: i = i + j
Loop
Exit Sub

ErrorCatch:
MsgBox Err.Description
End Sub


Does it help ?


  #4   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 184
Default Generate Subtotal Summary from Sheet1 into Sheet2

Sorry, I still have the Overflow error.
However, I agree with you for the i & k not being initialized,
after I posted my code, I deleted unnecessary comments,
and that line was deleted by mistake.
I am still scratching my head, because I have used that code before.
J.P.
  #5   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 62
Default Generate Subtotal Summary from Sheet1 into Sheet2

Hello !

It is very strange.
By me, with your code and with the initialization of i and k and without any
other change, your code is working perfectly. Did you run your code step by
step and check before executing the line where the error occurs all the
values of the different variables (i,j,k;Cells(i, "B")...etc) ?



"u473" a écrit dans le message de groupe de discussion :
...
Sorry, I still have the Overflow error.
However, I agree with you for the i & k not being initialized,
after I posted my code, I deleted unnecessary comments,
and that line was deleted by mistake.
I am still scratching my head, because I have used that code before.
J.P.




  #6   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 184
Default Generate Subtotal Summary from Sheet1 into Sheet2

Thank you for your response.
I am still debugging step by step.
  #7   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 184
Default Generate Subtotal Summary from Sheet1 into Sheet2

After testing, this is what I have found do far :

1. The execution of this code is launched from : C:\1-Work\TestData
\P1\ReOrg.xls
2. Everything works fine thru currentregion.sort
3. However, when I try to test the value of Cells(Rows.Count,
"D").End(xlUp) for RngD
I find that it is counting rows in ReOrg book instead of SH1
4. So far my various attempts to activate SH1 or
WB.Worksheets("Detail") have been unsuccesful
I do not understand why just before the Set RngD, the sorting
works well in the "Detail" sheet
and then it switches reference to ReOrg book.
I understand I am doing something wrong in my referencing, but I
have not found where yet.
  #8   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 62
Default Generate Subtotal Summary from Sheet1 into Sheet2

What about using the "With ... End With" statement ?
The code :

Sub ProjectSummary()

Dim WB As Workbook
Dim SH1 As Worksheet, SH2 As Worksheet
Dim MyPath, Line As String
Dim DestCell As Range
Dim i As Integer, j As Integer, k As Integer
Dim RngD As Range, RngE As Range, RngB As Range

On Error GoTo ErrorCatch

MyPath = "C:\1-Work\TestData\"
Set WB = Workbooks.Open(MyPath & "Omega.xls")

Set SH1 = WB.Worksheets("Detail")
Set SH2 = WB.Worksheets("Summary")
Set DestCell = SH2.Range("A1")

DestCell = "Project"
DestCell.Offset(0, 1) = "Force"
DestCell.Offset(0, 2) = "Hours"

'Sort rows by Project
With SH1
.Range("A2").CurrentRegion.Sort Key1:=.Range("B2"), _
Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom

Set RngD = .Range(.Cells(1, "D"), .Cells(.Rows.Count, "D").End(xlUp))
Set RngE = .Range(.Cells(1, "E"), .Cells(.Rows.Count, "E").End(xlUp))
Set RngB = .Range(.Cells(1, "B"), .Cells(.Rows.Count, "B").End(xlUp))

' Calculate Sum for Project
i = 2: k = 2
Do While i <= .Range("A100").End(xlUp).Row
j = Application.CountIf(RngB, .Cells(i, "B"))
SH2.Cells(k, "A") = .Cells(i, "B")
SH2.Cells(k, "B") = Application.SumIf(RngB, .Cells(i, "B"), RngD)
SH2.Cells(k, "C") = Application.SumIf(RngB, .Cells(i, "B"), RngE)
k = k + 1: i = i + j
Loop
End With
SH2.Select
Exit Sub

ErrorCatch:
MsgBox Err.Description
End Sub


  #9   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 184
Default Generate Subtotal Summary from Sheet1 into Sheet2

Merci, Merci, Merci. You made my day.
That was a great lesson. It works fine.
If possible, I'd like to refer to you in the future.
J.P.
  #10   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 184
Default Generate Subtotal Summary from Sheet1 into Sheet2

Last stretch...
the above code works perfect.
Now, I am trying Rows Total and Columns Totals
....
....
Loop
End With
SH2.Select
SH2.Cells(k, "A") = "Grand Total": Rows("1:1").Font.Bold = True:
Range("B1:D1").HorizontalAlignment = xlRight
'Place row totals in Column D. Reference Error there
-----------------------------------------------------------------------------
For i = 2 To k
'SH2.Cells(i, "D").Value = Application.Sum(Range(Cells(i, "B"),
Cells(i, "C")))
Next i
'Place Columns totals in row k.
-------------------------------------------
For i = 2 To 4
SH2.Cells(k, i).Value = Application.Sum(Range(Cells(2, i), Cells(k,
i)))
Next i
Row(k).Font.Bold = True ' Error . How do I refer to the whole row with
a variable ?
Exit Sub


  #11   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 62
Default Generate Subtotal Summary from Sheet1 into Sheet2

Try this:
....
....
Loop
End With

With SH2
.Cells(k, "A") = "Grand Total"
.Rows("1:1").Font.Bold = True
.Range("B1:D1").HorizontalAlignment = xlRight

For i = 2 To k
.Cells(i, "D").Value = Application.Sum(Range(.Cells(i, "B"),
..Cells(i, "C")))
Next i

For i = 2 To 4
.Cells(k, i).Value = Application.Sum(Range(.Cells(2, i), .Cells(k,
i)))
Next i
.Rows(k).Font.Bold = True
End With

SH2.Activate
Exit Sub

It is not a good thing to format an entire row if it is not useful
= it could increase the necessary ressources to manage your excel file.

You can replace .Rows("1:1").Font.Bold = True
with: .Range("A1:D1").Font.Bold = True

and replace .Rows(k).Font.Bold = True
with .Range("A" & k & ":D" & k).Font.Bold = True





  #12   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 184
Default Generate Subtotal Summary from Sheet1 into Sheet2

We are getting closer, but we have two similar errors in the summing:
First : Method 'Range' of object '_worksheet' failed
Second = Application-defined or object-defined error
..
I tried : .Cells(i, "D").Formula = "=Sum(Range(.Cells(i,
'B'), .Cells(i, 'C')))"
.Cells(i, "D").Value =
Application.worksheet.Sum(Range(.Cells(i, "B"), .Cells(i, "C")))
without success. do I have to change anything in the
Reference Library ?
..
For i = 2 To k - 1 ' k-1 since k is the Total Row itself
.Cells(i, "D").Value = Application.Sum(Range(.Cells(i,
"B"), .Cells(i, "C")))
Next i
For i = 2 To 4
.Cells(k, i).Value = Application.Sum(Range(.Cells(2,
i), .Cells(k - 1, i))) ' k-1 again
Next i
Thank you again for your help. where are you located ?
  #13   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 62
Default Generate Subtotal Summary from Sheet1 into Sheet2

The following code is working by me:
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''''''''''''''''
For i = 2 To k - 1
..Cells(i, "D").Value = Application.Sum(Range(.Cells(i, "B"), .Cells(i,
"C")))
'or
..Cells(i, "D").Formula = "=Sum(" & Range(.Cells(i, "B"), .Cells(i,
"C")).Address(False, False) & ")"
Next i

For i = 2 To 4
..Cells(k, i).Value = Application.Sum(Range(.Cells(2, i), .Cells(k - 1, i)))
'or
..Cells(k, i).Formula = "=Sum(" & Range(.Cells(2, i), .Cells(k - 1,
i)).Address(False, False) & ")"
Next i
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''''''''''''''''

if you write:
.Cells(i, "D").Formula = "=Sum(Range(.Cells(i,'B'), .Cells(i, 'C')))"

1- The result is the string: =Sum(Range(.Cells(i,'B'), .Cells(i, 'C')))
This string is not a valid formula.

2- if you want to insert a " into a litteral string you must double it ""
ex: A="cells(i,""B"")" not A="cells(i,"B")" and not A="cells(i,'B')"

The parameter of a sum formula is the address of the range of the values to
sum.
Something like: =SUM(B2:C2)

To build the string of the formula, you can use:
Formula = "SUM(" & Address of MyRange & ")"

To get the address of the range, you can use:
Asolute address ==MyRange.Address
or relative address ==MyRange.Address(False,False)

So the you can write:
Formula =
"SUM(" & MyRange.Address(False,False) & ")"

3- you wrote:
.Cells(i, "D").Value =
Application.worksheet.Sum(Range(.Cells(i, "B"), .Cells(i, "C")))

Sum is not a method of a worksheet. Prefer :
Application.WorksheetFunction.Sum(Range(.Cells(i, "B"), .Cells(i, "C")))
or
Application.Sum(Range(.Cells(i, "B"), .Cells(i, "C")))











  #15   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 184
Default Generate Subtotal Summary from Sheet1 into Sheet2

Ok, I was careful in copy/pasting and testing those 3 syntaxes in
Debug mode,
a .Cells(i, "D").Value = Application.Sum(Range(.Cells(i,
"B"), .Cells(i, "C")))
b .Cells(i, "D").Formula = "=Sum(" & Range(.Cells(i, "B"), .Cells(i,
"C")).Address(False, False) & ")"
c .Cells(i, "D").Value =
Application.WorksheetFunction.Sum(Range(.Cells(i, "B"), .Cells(i,
"C")))
..
Each time I keep getting this error on either of these syntaxes :
Method 'Range' of object '_worksheet' failed
This Error message puzzles me.
I use Excel 2003 and the execution is launched from an external
workbook.
I repeat, would I have to change anything in the Reference Library ?
Execution goes perfect until I hit those summing lines, and I checked
that I am within the With SH2 / End With structure.
Next, I will try to replace for testing purpose, the variables with
hard values/

1:00 AM Monday Morning in Texas. Have a Good Day.
J.P.



  #16   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 82
Default Generate Subtotal Summary from Sheet1 into Sheet2

Try putting a dot qualifier (.) in front of Range, just like you have
for Cells.

  #17   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 184
Default Generate Subtotal Summary from Sheet1 into Sheet2

Wooowwww !!!! That did it. For me that was an extremely vicious error.
I will remember it.
Thank you, thank you both. You made my day.
Now, I will embark on a new quest, to have the same module with :
1. data sorted by date and a running total and cumulated percentage
2. being able to answer the question :
a. At what date will I reach Amount X ?
b. What cumulated percentage will a reach at date X ?
I will try to resolve this by myself,
if not, I will generate a new post titled "At what date will I reach
running total X ?
Thank you again,
J.P.



Reply
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules

Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
sheet2 = sheet1 DA[_2_] Excel Programming 4 April 12th 10 09:14 PM
copy data from sheet2 to sheet1 when sheet2 has variable # of rows Anne Excel Discussion (Misc queries) 6 February 27th 09 09:48 PM
A1 Sheet2 is linked to A1 sheet1 so that user enters value(abc123) a1 sheet1 and A1 sheet2 is updated pano[_3_] Excel Programming 2 October 28th 07 02:32 PM
how do copy "sheet1!A1+1 in sheet2 to sheet 3 and get "sheet2!A1+ Dany Excel Discussion (Misc queries) 5 April 16th 07 03:27 AM
[=Sheet1!A1] - if i use Column A1 ('Sheet1') / A2 ('Sheet2') Lawrence C H Tan Excel Worksheet Functions 0 January 19th 07 08:29 PM


All times are GMT +1. The time now is 10:38 PM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Copyright ©2004-2025 ExcelBanter.
The comments are property of their posters.
 

About Us

"It's about Microsoft Excel"