Option Compare Text
% l! d9 w$ a' u% H4 C' U s
a6 d! P3 F6 W* g( |. h$ kPublic Function GSXS(Ref)5 j% S. i/ l3 k e5 T! o
8 B% P" K0 t* k" O GSXS = Ref.Formula
# W; \9 k6 q& o ^7 m+ h1 K$ d$ H0 Q$ G4 x
End Function& O2 v1 q( G6 T' {& ^6 v
' o: F( H* X$ E6 @5 f! u9 wPublic Function ZZL(RowHead, ColHead, Dummy): l2 p* m E- G
& i) w4 g5 j, E) D( ?0 e/ M6 J
Dim Values(20) As Variant9 M4 g8 h# `% d0 A
Dim PrevData(20) As Variant0 g9 ~- t: L: s) v' G( w1 E8 ]
Dim LE(20) As Integer- \# c0 b: ^% z8 G* J
# A: v Y/ q, P* l X1 @7 AOn Error GoTo err_handler19 I: H- y% J% M! J2 f3 l
' Do the vertical selection from rows
* y. y6 P7 d. M! d; TIf RowHead.Rows.Count = 1 Then* `& g# D; T% [ u1 l' ?0 M
rindex = RowHead.Row ' first argument is any cell on the row of possible values
8 b7 X: M# r; t, HElse S: V4 o$ \" ~: E
' Store the values to be compared with each column0 x: j5 E. H' u& V, f
For ii = 1 To RowHead.Columns.Count
0 ^& S6 ~0 H9 j) z rngname = RowHead.Cells(1, ii)
2 H+ G( n# |! m+ n, ~ LE(ii) = InStr(rngname, "<=")- V1 o3 _6 J1 {" G8 l) J; E
If LE(ii) > 0 Then
/ |& Z- [3 E8 b6 L- Z6 x1 q rngname = Mid(rngname, 1, LE(ii) - 1)
; u- A; i, @, N6 g1 H9 p End If6 o( s0 r! B3 M
Values(ii) = Range(rngname)
: e& j; \( |6 U7 } 'debug.Print "Variable:" & rngname & " is:" & Values(ii)
- p8 `1 M0 S i PrevData(ii) = "" ' initialise
7 \2 J1 E, u" e$ k3 y% r Next ii
) s5 f, {- C3 R$ |( w6 O$ k' l
- X; R9 `9 ?" I3 { rindex = 2
" @: m2 ~6 Z0 ]9 w 'debug.Print RowHead.Columns.Count1 o* S" q3 u# j& I& N
Match = False; m+ U% [/ {* {
For r = rindex To RowHead.Rows.Count
6 [- g5 I+ j7 @0 }5 z B0 A For c = 1 To RowHead.Columns.Count ' for each dimension
6 n! g% G3 V3 D0 j( p$ ~( h- ?& K data = RowHead.Cells(r, c)# k6 ~/ J7 F( k0 O( ~* d
If data = "" Then
* T& D' a: I# R% r# Y 'debug.Print "Empty cell found: using " & PrevData(c); U' G! F6 i; E8 b$ u
' use the last valid cell in this column+ {6 `$ \ }7 N: Q& S4 `3 c$ p R! W
' (this is to handle merged cells), U1 H ]; i9 d
data = PrevData(c)6 I' x' a3 y9 G7 M; V4 v5 s
End If
1 |" H8 p. {: R8 d2 y 'debug.Print "data:" & data: W1 ^# F2 x+ D
PrevData(c) = data ' save for use by empty cells! Z; d/ F( \2 v5 ~
If data = Values(c) Or (data > Values(c) And LE(c) > 0) Or data = "*" Then8 c/ X: J- A+ k3 m, i- G
If c = RowHead.Columns.Count Then ' All columns match - It's a go
* a5 y$ J2 U5 Z" k( X# d8 U* D Match = True$ A( n9 t" O& c, F5 S- D8 r' N9 D
End If& k6 v$ Y- l7 s3 x/ y4 t1 K. B
Else ' This column doesn't match - go to the next row- d1 Q* T6 J. u& J5 b; W
Match = False
: S; N: z8 ~3 r' Q5 e$ c7 K Exit For
( M6 e- W! v# u2 o0 y8 m End If
) ^" A. h' f" q7 [* G Next c
, ]& V2 P) V5 ?/ g+ A) e1 B' o, |+ Z If Match = True Then ' Don't search any more rows4 q! I9 i" a2 j( D; s
rindex = r: c$ E4 N* V7 B' o5 q; N6 a* G
Exit For4 [' C: F, P: {& D* k8 `* ?' R+ e
End If
+ h- [" t$ g4 m2 E1 F3 S Next r
9 q$ G3 k+ t0 h u( e
7 ~) V% s" h9 ~7 i4 A If Match = False Then ' Didn't find a matching set of values
' Q6 R; }) x1 K) B4 n" f ZZL = "No match for rows"
Z, v) G$ H# e; l4 n) F6 U/ I Exit Function# {' g8 o( q8 R# d5 p7 Y6 {& U
End If
$ E- p6 O% e$ s' X1 m) b$ S0 e( a; |, b! Z7 k% a$ K7 r
rindex = rindex + RowHead.Row - 1 ' make absolute index
( d2 q2 Q$ D) a3 ~5 G& ?End If k8 A: y+ w5 h& G* p
* N* p* k1 n9 D' Do the horizontal selection from columns
4 ~! y" X) H" C8 K8 G' ^If ColHead.Columns.Count = 1 Then4 w8 f( W, ^ {3 C# m2 y: n8 W
cindex = ColHead.Column* }' U; k. o- x8 l$ i
Else/ p8 G1 _/ I$ [, W. I2 y3 L, i
' Store the values to be compared with each row of the header
* b4 \8 ^6 o8 x! L% O5 x* L For ii = 1 To ColHead.Rows.Count4 i, T- u0 p' T1 m; U; E% I
rngname = ColHead.Cells(ii, 1)
$ ^- B* H: O5 i/ p( J! o LE(ii) = InStr(rngname, "<=")
1 i. a. g! N4 m/ j" Q, F6 d If LE(ii) > 0 Then
( x6 S5 o6 D, C" X5 O" b' }/ T' m rngname = Mid(rngname, 1, LE(ii) - 1)
~' B% p/ X) a End If. W% u w' v. ]3 G' i) {
Values(ii) = Range(rngname)' O% }* R9 M) ?, Y' J4 e) |3 s7 f1 Q5 a
'debug.Print "Variable:" & rngname & " is:" & Values(ii)0 J7 D6 D9 `) |# Z
PrevData(ii) = "" ' initialise0 r6 H# p" d! o* R
Next ii
( C8 A `" b4 ?# @- P! {2 H
' G# x( N8 K: ]8 B cindex = 2
0 j$ ^4 y, m* O$ u& r( [( {7 e. W 'debug.Print ColHead.Columns.Count, U( b( W' |" J- }: l1 u
Match = False- [$ Q M2 H! M% O ~% q
For c = cindex To ColHead.Columns.Count
. R) O% v* b5 K0 C3 J For r = 1 To ColHead.Rows.Count ' for each dimension1 c, v& |# x, R9 J0 k1 b
data = ColHead.Cells(r, c)
. a+ n% C" a/ x( ^) _5 B3 J If data = "" Then* h7 j$ x+ r ~$ }9 e! \# r( Q
'debug.Print "Empty cell found: using " & PrevData(r)4 _" [7 o9 @% i! }
' use the last valid cell on this row
7 j6 t3 g+ g' U' H6 v& ]$ o0 _ ' (this is to handle merged cells)- c1 k6 P8 m, U8 Y
data = PrevData(r)( g4 F3 f$ `% I2 W1 c# q0 ?, [
End If
- o3 T& a# J& a6 `4 k$ ]6 N2 `; V 'debug.Print "data:" & data
4 {8 d0 A# R4 X PrevData(r) = data ' save for use by empty cells7 Y* Q% c+ Q/ X' t+ C$ Y* W6 r* Z4 l
If data = Values(r) Or (data > Values(r) And LE(r) > 0) Or data = "*" Then( ? Y5 z3 E' }3 B8 Q0 o5 J2 T
If r = ColHead.Rows.Count Then ' All rows match - It's a go
. n$ P; F7 S! k2 }* A7 z) p) @2 p" ~ Match = True: C, Z/ P& e, P) Y
End If
v8 X) {! n& f3 q! C Else ' This row doesn't match - go to the next column; E8 [ A; }. [& W2 B
Match = False( Q% }( v1 v2 r2 H! Z! U2 ?
Exit For
' O3 X" n' ]1 i; h8 E5 | End If" \0 s* i- d$ R# S2 p
Next r
( Q! q4 c) Y$ p4 E L If Match = True Then ' Don't search any more columns8 C8 Y: |# V5 Y7 V
cindex = c8 X: e# J9 V. e$ Z' F
Exit For
) G. k$ ~, H) g$ W# B1 v6 i6 d% d End If
# i# g5 S8 y4 b6 k% f Next c
" {; l1 n# y; e) R
5 k6 q( S) @1 G9 N7 E: l5 p If Match = False Then ' Didn't find a matching set of values
8 y8 L: I; F+ r& i ZZL = "No match for columns" z9 W4 H* B# T7 z0 H! f; K% ^
Exit Function
& O( G5 ?' c, C ]; B/ w End If( V2 b2 _, b: m) Y5 d; f
$ {; i& Y8 E: `8 t4 ?5 |0 p( D cindex = cindex + ColHead.Column - 16 T4 z& N, h5 @! _/ T. X9 P
End If* q2 U# L; B) J
% u& q5 X) J' f' P' E5 T1 L
' Return the cell value from Table
( ~) w( B# \& u& ^'debug.Print "Answer is in (R,C): " & rindex, cindex- v7 K8 s0 E# x* R$ ^" y
ZZL = ActiveSheet.Cells(rindex, cindex)$ r4 R1 t0 L, R% Y
'debug.Print "Answer is : " & ZZL" Q' ^5 _$ l; \; `
Exit Function, i, X2 N1 W2 x* W
+ g% q) S2 Q$ K) _, I: U
err_handler1:
1 Z! ?3 i) u' c/ D: F, GZZL = "Error on range '" & rngname & "'"+ a, H9 @# U* r$ k; A
# M) L) J% P' E* s. M6 j3 F
End Function
4 o7 K+ F; M0 L7 |" ^( M' M M
( m& A- s8 {) k5 @* ` P |