Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 18
Default FUNCTION SYNTAX


Using ExcHi All,
I am trying to calculate the area of a polygon, (using a function
kindly posted by somebody on this newsgroup) .
I am not very familiar with the required syntax ofarrays and
functions. The function should be executed under a forms commandbutton
as follows:

Sub area()
Range("AD5:AE5").Select
Range("a5").Value = AreaByCoordinates((Selection())) ' THIS IS WHERE
THE PROBLEM LIES
End Sub

Function AreaByCoordinates(Xcoord() As Double, _
Ycoord() As Double) As Double
Dim I As Long
Dim Xold As Double
Dim Yold As Double
Dim Yorig As Double
Dim ArrayUpBound As Long
ArrayUpBound = UBound(Xcoord)
Xold = Xcoord(ArrayUpBound)
Yorig = Ycoord(ArrayUpBound)
Yold = 0#
For I = LBound(Xcoord) To ArrayUpBound
x = Xcoord(I)
y = Ycoord(I) - Yorig
AreaByCoordinates = AreaByCoordinates + _
(Xold - x) * (Yold + y)
Xold = x
Yold = y
Next
AreaByCoordinates = Abs(AreaByCoordinates) / 2
End Function

I get the message "Type mismatch: Array or userdefined type expected"

(Using Excel 2003)

Can anybody assist please?
Thanks very much.
Pierre Henning
  #2   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 108
Default FUNCTION SYNTAX

Well, what I see is that you're calling the function with a single argument,
but the function is expecting two arguments, each a type Double. I'm sure
what happened is that you believed 1) Selection() was the right way to refer
to the two cells that you already created, and 2) a range object containing
two cells would be the syntactic equivalent of the values of those two cells
separately. The first may be true, I'm not sure; I always specify the parent
object, say ActiveSheet.Selection. But I'm certain the second is a mistake.
If the X and Y coordinates are contained in AD5 and AE5, you're going to have
to make the call this way:

Range("A5").Value = AreaByCoordinates(Range("AD5"), Range("AE5"))

But even then I'm not sure of the default parent; are you sure you don't
have to specify one? I would do it like this:

With ActiveSheet
.Range("A5").Value = AreaByCoordinates(.Range("AD5"), .Range("AE5"))
End With

That passes two cell objects to AreaByCoordinates, which is expected not
Cells but Doubles, so even that may not be exact enough, but anyway it's
closer to what AreaByCoordinates has been told to demand.

--- "Pierre" wrote:
I am trying to calculate the area of a polygon, (using a function kindly posted by
somebody on this newsgroup). I am not very familiar with the required syntax
of arrays and functions. The function should be executed under a forms
commandbutton as follows:

Sub area()
Range("AD5:AE5").Select
Range("a5").Value = AreaByCoordinates((Selection())) ' THIS IS WHERE
THE PROBLEM LIES
End Sub

Function AreaByCoordinates(Xcoord() As Double, _
Ycoord() As Double) As Double
Dim I As Long
Dim Xold As Double
Dim Yold As Double
Dim Yorig As Double
Dim ArrayUpBound As Long
ArrayUpBound = UBound(Xcoord)
Xold = Xcoord(ArrayUpBound)
Yorig = Ycoord(ArrayUpBound)
Yold = 0#
For I = LBound(Xcoord) To ArrayUpBound
x = Xcoord(I)
y = Ycoord(I) - Yorig
AreaByCoordinates = AreaByCoordinates + _
(Xold - x) * (Yold + y)
Xold = x
Yold = y
Next
AreaByCoordinates = Abs(AreaByCoordinates) / 2
End Function

I get the message "Type mismatch: Array or userdefined type expected"

  #3   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 1
Default FUNCTION SYNTAX

I may be wrong, but when calculating an area with x & y coord,
I was expecting to see a Sqrt function somewhere.
Are you sure your equation is correct? Again, I may be wrong.

AreaByCoordinates = AreaByCoordinates + (Xold - x) * (Yold + Y)


Basically, the function itself is breaking the figure (formed by the nodes)
down into polygons formed by dropping perpendiculars from adjacent nodes
down to the X-axis, calculating the area of those polygons and then summing
them up.

Rick

  #4   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 1
Default FUNCTION SYNTAX

Rick it is your code that I used when I searched in the Google group 3
days ago. I am delighted that you responded


About two years ago, I moved my online volunteering over from the compiled
VB newsgroups to the Excel newsgroups which is why I saw your question. I
pretty much always remember the larger code procedures I develop, so I
recognized the AreaByCoordinates function the instant I saw it.

What I do is (shortly) the following. I receive PDF files of drawings
from Architects. I then insert the PDF drawing onto an Excel Sheet and
measure floor areas, wall lengths, etc. for costing purposes. (At least
that is the intention) Accuracy is quite acceptable. So, the "polygon"
is actually a floor area of varying shapes(curved lines excluded)

My X coordinates are pasted to cells AD 5 downwards, and the Y
coordinates are pasted AE5 downwards. Hence the Range of AD5:AE5
Maybe I should have mentioned that earlier. The "lineal" measuring works
well, its only the area that's a problem.

<<<< Combined from your follow-up posting
Just spotted a mistake. The range should begin at cell AD5 (X
coordinate) and end at AE ?? Y coordinate- whatever the number
of Nodes there were, clicked sequentially clockwise.


Okay, in place of your Area subroutine, give this one a try...

Sub Area()
Dim X As Long
Dim Xcoord() As Double
Dim Ycoord() As Double
Const StartRow As Long = 5
Const StartCol As String = "AD"
Const AreaOutputAddress As String = "A5"
Dim LastRow As Long
With Worksheets("Sheet7")
LastRow = .Cells(Rows.Count, StartCol).End(xlUp).Row
ReDim Xcoord(0 To LastRow - StartRow)
ReDim Ycoord(0 To LastRow - StartRow)
For X = 0 To LastRow - StartRow
Xcoord(X) = .Cells(StartRow, StartCol).Offset(X, 0).Value
Ycoord(X) = .Cells(StartRow, StartCol).Offset(X, 1).Value
Next
.Range(AreaOutputAddress).Value = AreaByCoordinates(Xcoord(), Ycoord())
End With
End Sub

One final note. I see I omitted two Dim statements from my AreaByCoordinates
function. Please add these to the rest of the Dim statements...

Dim X As Double
Dim Y As Double

Rick

  #5   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 18
Default FUNCTION SYNTAX

On Aug 13, 3:31*pm, "Rick Rothstein \(MVP - VB\)"
wrote:
Rick it is your code that I used when I searched in the Google group 3
days ago. I am delighted that you responded


About two years ago, I moved my online volunteering over from the compiled
VB newsgroups to the Excel newsgroups which is why I saw your question. I
pretty much always remember the larger code procedures I develop, so I
recognized the AreaByCoordinates function the instant I saw it.

What I do is (shortly) the following. I receive PDF files of drawings
from Architects. I then insert the PDF drawing onto an Excel Sheet and
measure floor areas, wall lengths, etc. for costing purposes. (At least
that is the intention) *Accuracy is quite acceptable. So, the "polygon"
is actually a floor area of varying shapes(curved lines excluded)


My X coordinates are pasted to cells AD 5 downwards, and the Y
coordinates are pasted AE5 downwards. Hence the Range of AD5:AE5
Maybe I should have mentioned that earlier. The "lineal" measuring works
well, its only the area that's a problem.


* * *<<<< Combined from your follow-up posting
Just spotted a mistake. The range should begin at cell AD5 (X
coordinate) and end at AE ?? Y coordinate- whatever the number
of Nodes there were, clicked sequentially clockwise.


Okay, in place of your Area subroutine, give this one a try...

Sub Area()
* Dim X As Long
* Dim Xcoord() As Double
* Dim Ycoord() As Double
* Const StartRow As Long = 5
* Const StartCol As String = "AD"
* Const AreaOutputAddress As String = "A5"
* Dim LastRow As Long
* With Worksheets("Sheet7")
* * LastRow = .Cells(Rows.Count, StartCol).End(xlUp).Row
* * ReDim Xcoord(0 To LastRow - StartRow)
* * ReDim Ycoord(0 To LastRow - StartRow)
* * For X = 0 To LastRow - StartRow
* * * Xcoord(X) = .Cells(StartRow, StartCol).Offset(X, 0).Value
* * * Ycoord(X) = .Cells(StartRow, StartCol).Offset(X, 1).Value
* * Next
* * .Range(AreaOutputAddress).Value = AreaByCoordinates(Xcoord(), Ycoord())
* End With
End Sub

One final note. I see I omitted two Dim statements from my AreaByCoordinates
function. Please add these to the rest of the Dim statements...

* Dim X As Double
* Dim Y As Double

Rick


Thanks Rick. I will try tonight.

Dana, I calculate the direct (or slanted) distance betweeen Nodes
using our friend Pythagoras' (spelling??) Theorem in yet another sub-
routine.


  #6   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 18
Default FUNCTION SYNTAX

On Aug 13, 3:55*pm, Pierre wrote:
On Aug 13, 3:31*pm, "Rick Rothstein \(MVP - VB\)"





wrote:
Rick it is your code that I used when I searched in the Google group 3
days ago. I am delighted that you responded


About two years ago, I moved my online volunteering over from the compiled
VB newsgroups to the Excel newsgroups which is why I saw your question. I
pretty much always remember the larger code procedures I develop, so I
recognized the AreaByCoordinates function the instant I saw it.


What I do is (shortly) the following. I receive PDF files of drawings
from Architects. I then insert the PDF drawing onto an Excel Sheet and
measure floor areas, wall lengths, etc. for costing purposes. (At least
that is the intention) *Accuracy is quite acceptable. So, the "polygon"
is actually a floor area of varying shapes(curved lines excluded)


My X coordinates are pasted to cells AD 5 downwards, and the Y
coordinates are pasted AE5 downwards. Hence the Range of AD5:AE5
Maybe I should have mentioned that earlier. The "lineal" measuring works
well, its only the area that's a problem.


* * *<<<< Combined from your follow-up posting
Just spotted a mistake. The range should begin at cell AD5 (X
coordinate) and end at AE ?? Y coordinate- whatever the number
of Nodes there were, clicked sequentially clockwise.


Okay, in place of your Area subroutine, give this one a try...


Sub Area()
* Dim X As Long
* Dim Xcoord() As Double
* Dim Ycoord() As Double
* Const StartRow As Long = 5
* Const StartCol As String = "AD"
* Const AreaOutputAddress As String = "A5"
* Dim LastRow As Long
* With Worksheets("Sheet7")
* * LastRow = .Cells(Rows.Count, StartCol).End(xlUp).Row
* * ReDim Xcoord(0 To LastRow - StartRow)
* * ReDim Ycoord(0 To LastRow - StartRow)
* * For X = 0 To LastRow - StartRow
* * * Xcoord(X) = .Cells(StartRow, StartCol).Offset(X, 0).Value
* * * Ycoord(X) = .Cells(StartRow, StartCol).Offset(X, 1).Value
* * Next
* * .Range(AreaOutputAddress).Value = AreaByCoordinates(Xcoord(), Ycoord())
* End With
End Sub


One final note. I see I omitted two Dim statements from my AreaByCoordinates
function. Please add these to the rest of the Dim statements...


* Dim X As Double
* Dim Y As Double


Rick


Thanks Rick. I will try tonight.

Dana, I calculate the direct (or slanted) distance betweeen Nodes
using our friend Pythagoras' (spelling??) Theorem in yet another sub-
routine.- Hide quoted text -

- Show quoted text -


Fantastic! Thanks, Rick. I am as always greatfull.
Pierre Henning South Afr.
  #7   Report Post  
Posted to microsoft.public.excel.programming
external usenet poster
 
Posts: 1
Default FUNCTION SYNTAX

Fantastic! Thanks, Rick. I am as always greatfull.

My pleasure... I'm glad everything worked out for you.

Rick
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
Indirect function syntax Matt Excel Discussion (Misc queries) 4 October 9th 08 10:43 PM
Syntax for IF function Sarah New Users to Excel 1 July 31st 06 01:57 PM
Shell Function - Syntax bill_morgan Excel Programming 2 September 15th 05 02:03 AM
NetWorkDays Function Syntax Lamar Excel Worksheet Functions 2 April 12th 05 10:02 AM
VBA Function syntax Forrest[_3_] Excel Programming 5 December 17th 03 02:14 AM


All times are GMT +1. The time now is 11:19 AM.

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"