机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 1295|回复: 3

excel 中BVA 麻烦大佬帮忙解释一下

[复制链接]
发表于 2022-6-6 18:03:11 | 显示全部楼层 |阅读模式
Option Compare Text1 y) O/ M: g, w3 Q
; k$ _6 K1 w; c6 b0 Q/ [
Public Function GSXS(Ref)
9 m. h- K, T2 j
4 {6 C6 I9 ]# p- y+ [+ y    GSXS = Ref.Formula# p# C0 O1 s1 C1 j+ A* [
0 H; T) J: C. ]- w, i( V. M- G' B
End Function% m7 a4 B& l1 c* C# N4 c
/ O# F8 y- s" q+ E' X; t: i
Public Function ZZL(RowHead, ColHead, Dummy)
  b0 O' P/ F1 b0 W- D7 U  k) n0 [
' H# `" a1 E/ M, }: [! ^Dim Values(20) As Variant
/ R" |- Z- H. pDim PrevData(20) As Variant
) e, M- s" H5 _# R3 a- O+ p) }. Q4 ADim LE(20) As Integer; B% |0 [0 ^% t" {! I0 T
- G, k# ~4 |. C& D
On Error GoTo err_handler1. F7 X5 O  B$ e6 U' s, i
' Do the vertical selection from rows
# m  ?3 p4 M7 rIf RowHead.Rows.Count = 1 Then
) K. u( C, T9 ~8 g! j    rindex = RowHead.Row    ' first argument is any cell on the row of possible values
6 U9 Z% g4 g- B9 x' jElse# k# @/ J* X$ q2 b* N3 _$ x- E( l
    ' Store the values to be compared with each column4 j0 Q; E: y! V) o
    For ii = 1 To RowHead.Columns.Count
7 t# u4 Z) z3 }        rngname = RowHead.Cells(1, ii)
; `! k" X% i% @( K        LE(ii) = InStr(rngname, "<="). H$ t, z. m1 N& E. @: O" i4 s
        If LE(ii) > 0 Then6 y9 Q" U& r. k- `1 Y! g
            rngname = Mid(rngname, 1, LE(ii) - 1)
2 h  I% Z$ V- S, d: z  n, z$ v$ B        End If0 `- z; {- z3 _$ \5 R
        Values(ii) = Range(rngname)
5 {. [9 J0 P. H/ y! p3 P        'debug.Print "Variable:" & rngname & " is:" & Values(ii)
; i2 F6 C+ G4 w* ?( c: o        PrevData(ii) = ""   ' initialise
2 p+ d3 h- z  G0 ?# R1 j    Next ii
2 M- S( m" [( \5 g6 Z" y! J/ ?; S8 n9 ~; O
    rindex = 2# W) p8 }4 f1 B; R, w8 ?6 j
    'debug.Print RowHead.Columns.Count
- h( L; U1 f' U& P7 J; w9 B: E    Match = False7 q* W& ]& _2 f% z* T3 q
    For r = rindex To RowHead.Rows.Count
& h7 @& l* p5 U! }        For c = 1 To RowHead.Columns.Count   ' for each dimension3 l1 T' Q( h1 T/ a9 m
            data = RowHead.Cells(r, c)
9 l. {0 K) Y( p2 h( H* a/ T2 V            If data = "" Then
6 h# Q' P7 T8 [                'debug.Print "Empty cell found: using " & PrevData(c)& L- [6 b2 Q) F$ X* v, c" @
                ' use the last valid cell in this column% p1 @& x* ~' n7 J6 I* w+ k. H2 Z
                ' (this is to handle merged cells)
8 |4 {* t' J+ Y* f4 X/ O- u5 @                data = PrevData(c)3 f5 F) g! \; E- H- g4 M! W
            End If$ H9 @+ e, `0 H; C! j9 C, U
            'debug.Print "data:" & data
0 F5 K( l+ q% @* v" {            PrevData(c) = data ' save for use by empty cells
# b+ q5 E5 m; u3 x4 U4 X            If data = Values(c) Or (data > Values(c) And LE(c) > 0) Or data = "*" Then5 [5 X* a4 |( h1 S* c* H
                If c = RowHead.Columns.Count Then   ' All columns match - It's a go) B. d/ N. g$ o) E) b  t9 _
                    Match = True
! E* O: p, F+ [% e* S                End If- I. R9 B& g/ ?1 ?; i
            Else    ' This column doesn't match - go to the next row9 w  c9 ^% h9 |5 D, [# Q- Z
                Match = False( N& }& b- `& ~$ ~" ~& C' `0 }
                Exit For
* z' k2 l9 J! y* D/ B            End If/ o+ m4 c' ~8 D+ X- x  i# V
        Next c
! }& [) A( v, H5 v4 j/ Z        If Match = True Then    ' Don't search any more rows
2 r, o: }, E- x            rindex = r, T# r5 m4 @* g: L5 m1 g
            Exit For
- P8 Z8 |# g: R9 g# P! d$ A' m        End If+ \8 N, j9 U/ t) \( @
    Next r$ ]8 g. a% g% W9 Y8 o+ ^" ]
! p" `0 T* A  _! f, O/ t5 X" E: L
    If Match = False Then   ' Didn't find a matching set of values
3 l, u7 e6 [# Z4 V. a) y        ZZL = "No match for rows"/ l( x9 b& \) k2 X2 S  @0 l& t+ A
        Exit Function4 X5 x' c0 D" L
    End If9 h1 u5 L9 M) C4 d/ @

, s0 j4 P$ N& k6 L& z' t    rindex = rindex + RowHead.Row - 1   ' make absolute index
0 J: z* R7 h5 s* A& d( Z% A6 ~End If
) k( S: p" [3 L; }. v2 Q5 Q# m8 H. `2 Y& O8 K, s0 _/ U
' Do the horizontal selection from columns
. U5 C# i7 K; i& U- u3 x' J+ r- }5 kIf ColHead.Columns.Count = 1 Then
$ m7 m8 c) ^& o2 }2 o$ u, j* d    cindex = ColHead.Column
) o* X. \! Q  u3 KElse
. p5 D) d9 {+ X8 q9 ^) y    ' Store the values to be compared with each row of the header5 |; u: \* m/ j3 e. a" H: Z; B
    For ii = 1 To ColHead.Rows.Count6 W* C+ C0 f: z1 u* j; I
        rngname = ColHead.Cells(ii, 1)
1 y" t1 |$ u6 N1 L- e* D$ _- P        LE(ii) = InStr(rngname, "<=")
4 A. G  Q! n; p( S. Y: e        If LE(ii) > 0 Then) Q/ }; B; Q  ?, L& h
            rngname = Mid(rngname, 1, LE(ii) - 1)
# y3 Y$ D0 V5 ~        End If
2 C( M3 z6 ^/ O3 [        Values(ii) = Range(rngname)5 s5 \/ V9 I: ^9 s( Q; F6 S
        'debug.Print "Variable:" & rngname & " is:" & Values(ii)4 z% ^- E% D" m2 `
        PrevData(ii) = ""   ' initialise
% o( T" s; `9 f7 Z3 O1 Q    Next ii; O2 b1 ?& i* T) @) o' R

, }$ X$ A; {/ |! W( |+ Q    cindex = 20 F+ v. b6 K7 Z2 P' m7 A
    'debug.Print ColHead.Columns.Count2 v6 e; u/ I/ J, {/ o4 c! J
    Match = False/ M( Y/ s3 D( H& h$ T
    For c = cindex To ColHead.Columns.Count
* J  S% T9 j7 m, S" D        For r = 1 To ColHead.Rows.Count   ' for each dimension
6 m; S# h; i6 T8 k$ C            data = ColHead.Cells(r, c)
) g7 a) G0 V. o" S" W& Y% U. O            If data = "" Then1 N0 K" M5 M% V2 K9 h9 D9 c9 f1 h
                'debug.Print "Empty cell found: using " & PrevData(r)0 X' _0 Y* [7 b) s  X3 L
                ' use the last valid cell on this row
% s+ F3 c1 C. ~) {- B$ o$ C" D                ' (this is to handle merged cells)- C2 K, `! {/ G6 m
                data = PrevData(r)( M# P4 S4 v1 M+ _
            End If. {3 n- ~( ?( h( G' q$ {3 F/ u
            'debug.Print "data:" & data3 I" X' v  ~0 f6 o7 W( I) M
            PrevData(r) = data ' save for use by empty cells+ S8 y3 t  {8 n9 a& e5 Z$ ?
            If data = Values(r) Or (data > Values(r) And LE(r) > 0) Or data = "*" Then: S- u; m) Z+ o- E, b
                If r = ColHead.Rows.Count Then   ' All rows match - It's a go
6 b7 h& V+ j0 R% v# m                    Match = True; d# R# p8 D3 O) I' k0 s: W8 }
                End If) j+ U1 c8 m" i: i
            Else    ' This row doesn't match - go to the next column
3 l7 U0 l2 J$ v& T7 a( R1 V8 N% E                Match = False) Y# {& R1 L. q% n' ^7 Z, [
                Exit For
  v4 k$ B5 g" c- R  b* d            End If- G5 z6 B# C* Z' s0 v
        Next r! \. c! Y( N/ [" ]# d7 t
        If Match = True Then    ' Don't search any more columns2 R# g, m  K1 z- s' c3 K$ E- Q5 w) c% x
            cindex = c: Q2 V2 f7 E* Y3 f# L9 l+ Q$ T; R' _
            Exit For
5 j6 I/ y# H5 n  ]        End If: d. d: _# Z2 R$ v) g
    Next c
: D% L- i8 P4 |  I7 ]
5 G3 e0 l4 u% P* O5 `& z, Y    If Match = False Then   ' Didn't find a matching set of values
7 }6 L- u$ ^+ d) w        ZZL = "No match for columns"
& c0 i' m% j" J( o+ h$ h# o5 E        Exit Function
7 N  X5 i7 g$ p7 O8 B    End If# L/ E. u. h8 C# O# ?8 A

  m: \1 W; g' w( S7 K    cindex = cindex + ColHead.Column - 1! S+ }" m8 Q4 h* L$ k
End If% s) e7 [' n) V- B; O4 b
+ @9 M$ f3 j& C# n, z
' Return the cell value from Table
4 [: W3 P* G# v; W4 N'debug.Print "Answer is in (R,C):  " & rindex, cindex
" x# s6 ~  R" Z6 e3 w! [0 uZZL = ActiveSheet.Cells(rindex, cindex)  g6 T& q  z4 D
'debug.Print "Answer is : " & ZZL6 J! \% z( Z4 y0 X& w( s2 [
Exit Function. n( u2 G' O1 G  \. d9 Y; b% ?9 A
- N0 [" z- @, b+ o  c* Z
err_handler1:
" R6 t& R# G* YZZL = "Error on range '" & rngname & "'"
6 n- r! r. C& a# h, }6 _, u6 h1 p* u  \5 o$ e
End Function
! f: n5 }% z9 V# a: j1 x& x
, H2 X9 a& I, H0 ?, A; ~4 d1 b4 x
回复

使用道具 举报

 楼主| 发表于 2022-6-6 18:04:26 | 显示全部楼层
本人是小白,想请教大佬,如何能看懂以上信息
回复 支持 反对

使用道具 举报

发表于 2022-6-6 19:17:09 | 显示全部楼层
微软官方的bbs里是有专业的VBA教程和API端口说明能检索的(全英文)
回复 支持 反对

使用道具 举报

发表于 2022-6-7 08:52:01 | 显示全部楼层
上excel论坛问问看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

小黑屋|手机版|Archiver|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2024-11-26 15:17 , Processed in 0.062182 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表