From: John on
In article <0E69B8F1-9DA8-4190-A37A-0E682AAF47A8(a)microsoft.com>,
Tom Ogilvy <TomOgilvy(a)discussions.microsoft.com> wrote:

> Hrllo John
> > Look at help for Subtotal in Excel itself for all options.
> I didn't say the object browser or VBA help. Subtotal is a worksheet
> function being used in VBA. And note this is the Worksheet Function
> Subtotal, not the method Subtotal which is found under the Data menu.
>
> Subtotal(3,Range) counts numbers in the range, so the column would need to
> contain numbers. Subtotal(3,range) counts non-empty cells, so the column
> would need to not be empty. If you want to get an accurate count.
>
> Excel has a group and outline capability which can be found under the Data
> menu in Excel itself. I don't know if that adds anything to what you are
> trying to do.
>
> Note that all my examples in the previous post were performed on a single
> column. In this way, rng.count gives the number of visible rows. It also
> started in A2 so that the header row was excluded in the count.
>
>
> s.UsedRange.AutoFilter Field:=SrtCol, Criteria1:=""
> produces an Autofilter which displays only the rows that have blanks in
> column SrtCol, so subtotal applied to that column would return nothing - see
> the previous discussion
>
> from the immediate window:
> \
> SrtCol = 2
> set s = Activesheet
> s.UsedRange.AutoFilter Field:=SrtCol, Criteria1:=""
> Set Rng = s.UsedRange.SpecialCells(xlCellTypeVisible)
> ? Rng.count
> 42
>
> so I got a count, but it doesn't mean much because it is all visible cells
> in the usedrange.
>
> ? intersect(rng,columns(1)).Count
> 7
>
> so looking at a single column tells me 7 rows are visible (including the
> header row).
>
> --
> Regards,
> Tom Ogilvy

Tom,
First of all, no the group and outline functions in Excel will NOT do
what I need.

I guess I must have a different picture of what "visible" means. When my
filter is applied to a file with 67 rows, it produces a selected set of
6 rows. Using the Set Rng = s.usedrange.specialcells(xlCellTypeVisible)
should then give a row count of 6 since those are the only "visible"
rows in the used range. Obviously my concept of "visible" is wrong. Oh
well.

Let me get back to my original question. Yes I did ask how to get a
count of rows in a filter but I also asked how to loop through only the
rows found by the filter. The specific thing I need is to activate the
first row in the filtered set (not the filter header row), so that I can
insert my group label row ahead of it.

John
>
>
>
> "John" wrote:
>
> > In article <4FB30EC2-4891-4B6F-BBA8-F38E74AD2554(a)microsoft.com>,
> > Tom Ogilvy <TomOgilvy(a)discussions.microsoft.com> wrote:
> >
> > > use the subtotal worksheet function
> > >
> > > if application.Subtotal(3,Range("A2:A500"))
> > >
> > >
> > > where Column A holds numbers. Look at help for Subtotal in Excel itself
> > > for
> > > all options.
> > >
> > > Subtotal only counts the visible cells in the filtered range.
> > >
> > > Dim rng as Range
> > > On Error Resume Next
> > > set rng = Range("A2:A500").SpecialCells(xlVisible)
> > > On Error goto 0
> > > if not rng is nothing then
> > > for each cell in rng
> > >
> > > --
> > > Regards,
> > > Tom Ogilvy
> >
> > Tom,
> > Thanks for the quick reply. The process for doing what I want is
> > obviously less elegant than doing the same thing in Project. I guess
> > that is because Excel always has 256 columns and 65K rows whether there
> > is data in them or not. In Project the task collection object, for
> > example, is only as big as the number of tasks entered by the user.
> >
> > I took a look at the Subtotal worksheet function description in the
> > object browser. That has got to be one of the least comprehensible
> > descriptions I've read. At the Worksheet Object level, there is
> > absolutely no explanation of what the arguments are for and the example
> > only covers the Range Object level, which does have a decent description
> > of the arguments. I should complain, I have found many places in the
> > Project object browser descriptions that are either flat out wrong,
> > misleading or confusing.
> >
> > The SpecialCells Method for the Range object looks more promising. I
> > doubt I would have found that obscure method during my own search of
> > Excel's object model. Basically what I am doing is replicating the
> > grouping function available in MS Project. The overall macro I'm writing
> > exports selected data from Project to Excel. One subroutine finds rows
> > with columns containing certain data. It then adds a row above that
> > group for a group label.
> >
> > Unfortunately either I'm not understanding something or the SpecialCells
> > Method doesn't work as advertised. My worksheet consists of 67 rows by 9
> > columns (i.e. the UsedRange). The following code snippet is part of the
> > above mentioned subroutine (s is my worksheet object and SrtCol is a
> > variable defining a particular column). In this case, I'm looking for no
> > data in the SrtCol. In other cases I'm looking for non-blank data so I
> > use the Find Method after the autofilter and that works fine.
> >
> > s.UsedRange.AutoFilter Field:=SrtCol, Criteria1:=""
> > On Error Resume Next
> > Set Rng = s.UsedRange.SpecialCells(xlCellTypeVisible)
> >
> > I stepped through the code. The autofilter finds 6 rows that meet the
> > criteria. That works fine. However when I use the Count property on the
> > rows of the Rng object, it only counts one row. That's not right, or at
> > least, it is not what I need. I need it to set the Rng object as the 6
> > found rows.
> >
> > Your further insight would be appreciated.
> >
> > John
> > >
> > >
> > >
> > > "John" wrote:
> > >
> > > > People,
> > > > I have an Excel worksheet and I have applied an autofilter to a
> > > > particular column. The result is a filtered set of rows. Using VBA,
> > > > what
> > > > is the easiest way to,
> > > > a) tell if any rows with data are in the filtered set (i.e. did the
> > > > filter find anything that met the criteria)?
> > > > b) get a count of how many rows with data, are shown in the filtered
> > > > set?
> > > > c) loop through rows/columns/cells in the filtered set?
> > > >
> > > > A bit of background. I write VBA for Project and in Project all one
> > > > needs to do to determine if a filter shows anything is to check for an
> > > > activeselection > 0. Looping is very simple - just loop through all
> > > > tasks/resources in the activeselection.
> > > >
> > > > John
> > > > Project MVP
> > > >
> >
First  |  Prev  | 
Pages: 1 2
Prev: Excel 2007 used with Oracle ADI
Next: rename message