From 879fd2ef5117a5724d00bed6d89cc596ad2c1d66 Mon Sep 17 00:00:00 2001 From: IRBorisov <8611739+IRBorisov@users.noreply.github.com> Date: Fri, 7 Jun 2024 20:27:50 +0300 Subject: [PATCH] Initial commit --- VBAMake.txt | 37 +++ VERSION | 1 + distr/Excel.docx | Bin 0 -> 136800 bytes script/manifest.txt | 93 ++++++ skeleton/CONCEPT.xlsm | Bin 0 -> 10717 bytes src/AddinOptions.cls | 31 ++ src/CellProcessor.cls | 84 +++++ src/Declarations.bas | 47 +++ src/DevHelper.bas | 20 ++ src/LinksOutput.cls | 36 +++ src/LinksRelocator.cls | 76 +++++ src/Main.bas | 295 ++++++++++++++++++ src/MainImpl.bas | 168 ++++++++++ src/ParametersSearch.cls | 20 ++ src/PublicFunctions.bas | 639 +++++++++++++++++++++++++++++++++++++++ src/RelocateDlg.frm | 78 +++++ src/RelocateDlg.frx | Bin 0 -> 3608 bytes src/SearchDlg.frm | 96 ++++++ src/SearchDlg.frx | Bin 0 -> 4632 bytes src/SearchEngine.cls | 267 ++++++++++++++++ src/WordDlg.frm | 55 ++++ src/WordDlg.frx | Bin 0 -> 3608 bytes src/z_UIMessages.bas | 84 +++++ src/z_UIRibbon.bas | 42 +++ ui/.rels | 2 + ui/customUI.xml | 140 +++++++++ 26 files changed, 2311 insertions(+) create mode 100644 VBAMake.txt create mode 100644 VERSION create mode 100644 distr/Excel.docx create mode 100644 script/manifest.txt create mode 100644 skeleton/CONCEPT.xlsm create mode 100644 src/AddinOptions.cls create mode 100644 src/CellProcessor.cls create mode 100644 src/Declarations.bas create mode 100644 src/DevHelper.bas create mode 100644 src/LinksOutput.cls create mode 100644 src/LinksRelocator.cls create mode 100644 src/Main.bas create mode 100644 src/MainImpl.bas create mode 100644 src/ParametersSearch.cls create mode 100644 src/PublicFunctions.bas create mode 100644 src/RelocateDlg.frm create mode 100644 src/RelocateDlg.frx create mode 100644 src/SearchDlg.frm create mode 100644 src/SearchDlg.frx create mode 100644 src/SearchEngine.cls create mode 100644 src/WordDlg.frm create mode 100644 src/WordDlg.frx create mode 100644 src/z_UIMessages.bas create mode 100644 src/z_UIRibbon.bas create mode 100644 ui/.rels create mode 100644 ui/customUI.xml diff --git a/VBAMake.txt b/VBAMake.txt new file mode 100644 index 0000000..2883fb9 --- /dev/null +++ b/VBAMake.txt @@ -0,0 +1,37 @@ +# == Properties Section == +# configuration properties +# use .ini format to define properties +# mandatory properties: name, artifact_home, source_home + +id = ExcelHelper +name = ExcelHelper +description = Надстройка КОНЦЕПТ для Excel +artifact_home = Addins +source_home = ExcelAI +install_home = \\fs1.concept.ru\projects\04 Направления деятельности\60 КИВТ\21 Надстройки\EXCEL + +%% +# === Build section === +# Available commands: +# build LOCAL_MANIFEST +# copy LOCAL_SOURCE -> [LOCAL_ARTIFACT] +# save_as LOCAL_ARTIFACT -> LOCAL_ARTIFACT +# run LOCAL_SOURCE.bat + +build script\manifest.txt +save_as CONCEPT.xlsm -> CONCEPT.xlam +copy distr\Excel.docx + +%% +# === Install section == +# Available commands: +# install LOCAL_ARTIFACT -> [INSTALL_PATH] +# add_template LOCAL_ARTIFACT -> [LOCAL_TEMPLATE] +# run LOCAL_ARTIFACT.bat <- [PARAMETERS] +# run APPLICATION <- [PARAMETERS] + +install CONCEPT.xlam +install CONCEPT.xlam -> \\fs1.concept.ru\Exchange\ConceptDistr\data\Add-ins\Excel\CONCEPT.xlam + +install Excel.docx +install Excel.docx -> \\fs1.concept.ru\projects\10 Автоматизация деятельности\02 Офисная автоматизация\!Надстройки\Excel.docx \ No newline at end of file diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..88c5fb8 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.4.0 diff --git a/distr/Excel.docx b/distr/Excel.docx new file mode 100644 index 0000000000000000000000000000000000000000..eb72bb4d4be26679b39b7ff014caa10eab4a0682 GIT binary patch literal 136800 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%0DCY5KuMWMWYPKL$4u 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⪚rd;&vn#!i~VeuEO!J`(>tdK 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 " delimiter +# First component is a path relative to SourceHome\ui folders +# Second component is internal path inside project file + +.rels -> _rels\.rels +customUI.xml -> customUI\customUI.xml + +%% +# === References Section === +# List dependencies in one of the formats +# global : GLOBAL_NAME +# guid : {REGISTERED_GUID} +# file : PATH_TO_LIBRARY + +global : Scripting +global : MSForms +global : Word +global : Shell32 +global : ADODB +global : IWshRuntimeLibrary \ No newline at end of file diff --git a/skeleton/CONCEPT.xlsm b/skeleton/CONCEPT.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..23e947bc951100515e1ccdfc2bf5c4a8e684deec GIT binary patch literal 10717 zcmeHN1y@{4wr(6ka0^awcZc9^L4vz`cjFKU5G**s-5UrlL4v!xy9IYkaCzj;%)56o zGrwS_daYB{tLxjR&#C>@wo;adfyD;E0}ufKz-vH}W^0Zi6aa7z0{~zF5TSL&K|p77 zptIpS53sqDKC`>M9a#=6G;J0D`g#8U+JEsID2W|Z>SRTiypp*W-((71t`b4yI)Wa+ zY@j7II+VqlX7N~xd3=L)_4=b6GJPuLi2HFp2T2rlI#)LVdF_h2T^~XTpr8r3oMQsI z*g4O@NrFsHxFg^!0;>A2Z*4eNVcYzwh&4)N=>!o!7C|vY-vJ`YYoau$b$S93RhhP+ zyN-;&G;wZ7dh}}L?LE0PU$zDyCJW;yrLl*yMYhp# zoV4eoxQlZq@yhK|2*bE~luxD1+0a_B=i^!T2knMmpE}$eKg49>?&<3=W~&+Tasxti z3v)90Z-BlgRW6>NXk_@XB)w65KHe`pPRzO#i+I*lO*u!t_M6fkB3RLkX&t?majqge zzi>p>-hPQb*#mfVs?i-+Gqagwy!GYG#duU&MKjLShsX3w(%}tXuM`(Tw{Br!#=9ki zh>{wId71WRKC9Hz6AVE4pLi*Oz@bg_%*)AV+95yl($LY|&WVNj*Y$sV{4XZqUmm?A zM)4OPrLJU_UZ1xlV~YkVPXf_ZT@h;#z(=w+T$fsx*fEQy=y2qD*~qSs_^lqdJ%cWm zi-$PkoSSlNqsYp<#J* z9Crx5UoNf8hx&8ndAQ&h`0T}D42t~i(1D>QQ0qM6CGbNf6M2a78DVylcT+bY?&%tp zYngqk@iQ6ZR~nR6FHs!n8gN%=iCiT<2_hlCa?`#qKz0pR%FVd>?D)b?wQ5x?Wy*;^ zlB_wCy`gbw*X!IUIxm4yRHe;2Gb)rWdyzwI=8H(Q%?QqXIbXQquGJbxl9g*d*V2uR(7e!2Gg=uJPaLggRRywDWIAVc!|0mamijZ0cY;vTY`dRO&O)7aG~wnLKN|Xc_N_8BU~*Z7Lbnh z(Y1E9WnPC>NZ8!23`&Fh^lE10a%#O^EzorHaF^&2z0)%hD=+cobABlT8bdC|eX^v{BZ zLT}C4eaTZv;rM_Ztr-0T`HFS98Cxbz(-Z2KFUyEyKvY|>mpF6C5U~&n(#%j8My%3J zYu}(pvsWZfxaRC4!$Y0? zWpNiDQby9OmpfES(>!K$R{AP|1HK)W7^1JUq0ke_lA3b(C38qupgk;yjq!RC(T-;yWd(*k(y z`4^^VOGE%bgnA~=-;B{;DfAD+1oiAFK3lE-?p6{#X!D1o6!_?$^x=)`i@dnL`8cuK z?gzl@DAKNk0E?IzAH#LOWf2+fdBigKWhY8|H{p#eCG7euCGqI3tUhhStFq}+^$&v0 zekN>X-2QG5WAY&Vo9l`PNV^Pwmp-Xh9&RrIfAnckUv2Ibd={uz*WxXJU37j1z)|dNP@Kto^pH$Q%F#28kKb0 z;PvpEvzUxPjawoIgD_jv?l;6O9|XbDl*PSO-Mnvc@dfWT&+-19r;?8nsSA154Q@C9 z;MMcO|9x|HvNAV!c4GOXWBawsrp2}c7g=8hoxoh8`W=Tb@*v?-D5+%a&d9TsEWXz; z(#EsrceYQF;4x zT&P4~zt@h)yMEa^#?dOINiqBe3hZN|pi*0^^@RZgerV58 zGPwIqH5rT%W?BsC%)Td`35buhRcBSQyOyO6T>YmQu}3_68REkylEBAR1T;U zukjJqW*)YSOdtgErFM3WstA{@(~C%UqBe;#Qlj|!E_=U=de~MyFds7cn$#TYKB;d7 zp_tTlaSvAO{PEdV0TxZ#Ds^^FWmQ^cnIQ&v_R^tv zZ2Fgqn6ag*^!ln{v1%7`cJVKNge$}!+Qo>561NxG$A`!L$R;0oMPAlNek-Dju8|yL z6yNw-hHFfPtXMgsGJw$32JT(JYE(P?jz2*P!E~D`Fry`@==n#WOpR6K7 zr8@f*3IE+HT%Z_~0IlvPHF_L-~V~7AK6-Gr*@g=$qiu>;_`6kip=NHfah*BYKnr z>}rq$COK+(KdrFL7|AY*b;~qJZLzpavf@6M%~3rdGwU2(zfi0SXufdcTjZ?Pej;E%)8R;N z(biM`1E%lohgTjpVMUYnGbv1Nk?JCQxuR~x6ZCjoO*ySiCQh9=tpo;sst+SCS|-oh z!+wpMY)@tLHU<6|*7=oV6EGFztW(iuQ7&kU;^~zivPd-syfkev4w%&|P@@};x1{Y0 zGOrC`4sz%kP4Rr)fJH-$j_!x;fT``p-y=TtN#Y8FsyRR_)eKvNJW>Ul!-_fXMY8IKHhizhK52FkM8%=nNdO<8_A(hKR==Qc-$7^Bl-_Fo!(#guVxSl zK7G$!ZS^$s<-wd%Ti3@lvC!}KoQdEKsFY>dP1rCvcf?!zWHd=#=~&J?z_lt3ZMC|%jo5fZ#m^_HPs-c}3cN!AvNB`(A#$7HAqx-;GVLR#o@oz`Tiu-P7<-1uw>tm!jOpCiO?W?SCkDy&HYj5-**k@1J~Ht4 zdde!sr%0T9zM~@PNcK+?t`faaDVo^vLu%hB$Mg8k?e}1|?1e1AyG6*J6e>nfF4J$C z-yx6EL6WBxBGe_OIb-(@7|ui0wK1kkP zwVLEQ{l4y$Hdya`BU2V!PhYDuk6?ZOU7bO=k9br^g$(yVA^G~eR-$=0*wf8dPzTH` zn4Q+I+_5a-XEdIe!C6oZrMAhOS&p&ZpF#-%t}=W>>1C<+E>m_{ASqdzB~KdU)qeTi*a{X6iw@jhKg=11%dh z#eC(vcYM7Jh!@2*dfjyK1WI`-_5u-i7v?X+1@ofnS=yQ>%6_&!Tf2WvH~}8%Uj2A> zJVXM?xYUbS=yyLF1*s`yRn3M zz9V%a+aoxZ-!za{t3?`Vo3 zm@U|H$RuvRhYu{$xxlHoJCSj#PMLifBca zL{;mmHIbUjPn6;{!V^$MKObXy?siGq*-Powld#%c)Kx0Nh4KX)Xqfv^Wqj`iDTSSz z*J!VFgt4r5ZQl2mc=3k3pi&HEuStOKg3YOgozyK9>Ywti8sVl7DH`341fO2dDds3R zYJ9W&9aS&>tw_oSGAPm>zjN|+efx&SXKd|LDa?@ZP>*UuTw6A*y z=;A#|f=|HajX|X3dN+v8ZDqM?CznN;eW#N|eM~wougL9DMuJPX?9k>NQY*6gOJ@npt#HP8%BB1XKWBJItjb9FQP{N>k?|~CjBWG_r{vyO zD+x>;D*+O&7GbkMMsL#6?&EgUEUhQBu>G7)pLT1Bff&#TudbZvA~j5hw6A}G+5EUQ z)M{zB-+nbdPUEF*D8Ty4#`E2LnN%OQO?cgEoiNEUX^XwjnqrhsTX%<0T#>YNb4o_9P+j%2UwKd zhqshhfv;KKHSzn;cD#+1{Jd2`+N|XrAtb34?OjhL{!=eYUUE}QL4p7!g4=d4&NTf1 z>$wdQA*T_KvXeTj$r!YPAf$ohCEFU!FDG!(Mt6ynOU;#K}6&)Wa5^!Q+VHg5k+ z9G_>3U_3{`W*}2#M-bSF#T4Xd{`V@$|AOD=eZwoJU8#eWsON;brE}tL#>MxuMYseC zjjTeKRTI|{sn$|MUMV!s2Uw6$(E6riMs`#5GCbnAyIt$a)4|olq zC1Nx}3?6y>q)-Df+5^dXwXteN$>%X?`7x`{X&GHjkS1ktX((o#tf*%sCD)cY>2Nq5 zT~Ep=nI%6Mb+1b{+tFf4MbV-Enj#fCvg7pSj!}|P(E5wrL{IVsa=2BBL7Mn!Ks%e+ zXMawDSl>0$a;W$NVFa74w&Vf}?FOaAZ=dYi2^~%hcAY_KqdVb>9_q!v>BJP>i65^tJ^n; zuOz+aE|BnJxsRN!B~XI}L{xW#9@+bO{s@D9k5}@lzYE4a>nQefsuTUMI%*6C|4&7q zU)kSVT1-0-iw!;KM5d{8;HoFpj~?4YKO1`rCRj$+leFn;NZ@Sk;U4`uye7#7R(E6x)(pFr)EG54s{+rXHwY7ZL@2By>djX zVYUzFfjW8UY|-6%;DFKiIgIYWxcS41Kta>_uM+`N&lKB1KQ@7 z@(B9$eD>1|zMWJE2k?4QRGA3-xY>paFYE?%T&j1+lw~Aq4L$4=bFN?Fd#1@be`a(y zDOus>7C$n{hmiURJ@R`Ccnd!&$DnM0X$w}Y?F|oZjMly{%^`%7F{V)f8Tp1XQ*bD6 z5zf5i1X;tIcEUF*)wwAWogy?}K)^mtfFZ*1tXo3sWua+Tjz-RyyWjvo8m zkEiV+?^TnQTd}UTZ ztPz?OezdZ%2!b8bpuc$EU8%S&cN9Ht(ZQvV->JmmL{dIWtcx{qx>>bTU7T+z<78_9 zB1kZ5kcx$<;GOyR5E}Yc57-5A>wK;q;~MqQS(yoLOsT3F>i< zsEfeW#Tscc0CEoG?_JkUakW47ZMzJf>c|FH3D~Q-S+412T0fE^+Qp!=L{b22-RFwZg+}s-D zw=qAgYf@+7z&eKOMwLmfSG#TZB=_l^0ENhr&sMTDhUNl8q27*%RdoH8^zp0Zi>YQ> ztWgF8+1CRm8uoLzqmEc4z80%(i&Qqa&MK>DAE6i{gmc9TSohSgnfh8tDv7gyLYDqw#@I{=coH^bP@e_ykxfAs(@Da7J@aLm3P=o7JdKYmlv47a>h$hDm=M+O@iR?+C{NyRN|UYEZjHDh&g7L+(e^*f{YBJQ@$ zHoriBDd*?AD1CHky(j;oy7;s)I0xZ%=u)tmvm-5|KrMFaP|e!m4?$wgvTpN;qXCHr zALUI3o#056-VSj?I)Z_Nn*<|X^-Djx4@=|}Hh`tqF;%L^m^Bbyz(>t5=GRp$nY>KA z)7W7iIuY$82$pTVw`|Cv7YfJF0}^P3+Ih z7;oP1gtmY>J0DJYN+bwXBWYd8t%BGu=s z&XQiML0wT;$yLHKLpi{Hi%xa+yC5f*F@EF#I4Q|SE&X^fb2I@3d?bRH8}h5Kyzkg& zsP(nSoTe80DzjK*4Vn94dH$IC5kj)HZR(hOik zun)j?w5MVIc)QI+oqOn&qaHpa9$L!?U*soup#6>@P#V#o!=!gTjOf(|LyWe!O?<>W zbcx0!&g@9AKGfnl98W-8j?o@FgQM2$_I~2q`!H(hR$-OBJOm|2U#O4Hk3R}O8yt|x z`AgRrM%r4t$BMFiuiV$f?eSbjCpB6Q-8g1)`l2^sugGJ#A%#mnP?)%j0BMXLg; z-acdv9CB7ihN@Y2(6vzE58vY~H(-GZ=8xZQ(aSS_l;V(#=f;_YzsCVd>*wg$m0P;~$RjaMW>Ax00)bxSA9cX|pf z^;FuR!n+YjzUfwkqxeF8sUU1c3W+WS>072M&Aq{TdWj%mebw9<`IgWSEMdk4g2jNH z19l!UBReV?<)kJxE@(dUZVb$Ml>x4=>2cFGovzRo8baSVsu~E?t5hsVSN3}!(HP)9 zn#KlS9HbztOa@aqv|hWb1?K(|a@cRg!28g^!qFSG^2D=4)7TmLIVqdJj4zUlX$P@> zAUvoK>*B5tsgOl5Ki2tsSe>p-ynf{PB;gW7S>6in^f*?>O|nt}@!DZI&%#?L(00t& ze<4Aj#P_L;Zm2-jQ>2Xv+cH5CBPbC{ZV~B7fV0JRXi04A>)8Wx41Q$`ef%CS z*9W!*cm)5HP=(XaOCR*i{Kr!Sr@bFx=V@Dr8fck;tAL=yU_Rq(50?iOVYk9!i2DP+ z>l{Ko$Bsv(T_;C|_A=ij97~HBimu^i&{j3Izmo`$6&wLs7)>c!q!sIrJ-Jn}zy~~O7rNe={4UE&0v#?cz`xt^r9@^M0 zBiQZk=PWy`)JdC;g!t;qAyOy;`pRH9*M1P6equ3Mab>M-d#eer)%;hbApQ3!j{!Ke z**AQuMj8ZYi`Q&o%ZS-^ zv+$*_CiXAQ+jnri+jM;staKSamKJtmPjmPxDvP9`a;cODRa zs#HQ+L_03@=pN5Ko?4aVp`e)n|LGjvKRnHU^#A5m-R}ba`M}RVfWP{rXLtTD$A5kY z{(iXOPw3Wj?c%qi4!?u{xw!i$6aXN9@dx-nlzM-c^Lr8SPf21g|Nl??OG)r|DZdw7 z{**%WTy=VWl;6uQzYF+1iS?%dB-}p){F&1F9s17!{+~bqfEFJB_?K}1clbZYUVnuT r5&i}K_ekt_^zZ)epZEll|KR;9%fme{F97i3`SbBPDIrDk>)ZbUEp6Z~ literal 0 HcmV?d00001 diff --git a/src/AddinOptions.cls b/src/AddinOptions.cls new file mode 100644 index 0000000..d8fe90b --- /dev/null +++ b/src/AddinOptions.cls @@ -0,0 +1,31 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True +END +Attribute VB_Name = "AddinOptions" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +Option Explicit + +Public data_ As Scripting.Dictionary + +Private Sub Class_Initialize() + Set data_ = New Scripting.Dictionary + Dim nItem& + For nItem = TWordAddin.[_First] To TWordAddin.[_Last] Step 1 + data_.Item(nItem) = False + Next nItem +End Sub + +Public Function CheckProductEnabled(sProduct$) As Boolean + Dim nItem& + For nItem = TWordAddin.[_First] To TWordAddin.[_Last] Step 1 + If sProduct = ProductNameFromID(nItem) Then + CheckProductEnabled = data_.Item(nItem) + Exit Function + End If + Next nItem + CheckProductEnabled = True +End Function diff --git a/src/CellProcessor.cls b/src/CellProcessor.cls new file mode 100644 index 0000000..b272fa0 --- /dev/null +++ b/src/CellProcessor.cls @@ -0,0 +1,84 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True +END +Attribute VB_Name = "CellProcessor" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +Option Explicit + +Public countAll_ As Long +Public countInvalid_ As Long + +Private fso_ As Scripting.FileSystemObject + +Public Function Init() + countAll_ = 0 + countInvalid_ = 0 + Set fso_ = New Scripting.FileSystemObject +End Function + +Public Function TrimCell(target As Excel.Range) + target = TrimWhitespace(target.Text) +End Function + +Public Function TrimCellPunctuation(target As Excel.Range) + target = TrimEndPunctuation(target.Text) +End Function + +Public Function SubstituteWS(target As Excel.Range) + target = SubstituteWhitespace(target.Text) +End Function + +Public Function CreateHyperlink(target As Excel.Range) + Call XLUpdateHyperlink(target, target.Text) +End Function + +Public Function SplitTextIntoColumn(target As Excel.Range) + Dim vWords As Variant: vWords = VBA.Split(target.Text, " ") + If VBA.VarType(vWords) < vbArray Or VBA.VarType(vWords) > vbArray + vbByte Then _ + Call Err.Raise(1000, Description:=vWords) + + Dim output As Excel.Range: Set output = target + Dim sWord As Variant + For Each sWord In vWords + Set output = output.Offset(1, 0) + output = CStr(sWord) + Next sWord +End Function + +Public Function ValidateHyperlink(target As Excel.Range) + If target.Hyperlinks.Count = 0 Then _ + Exit Function + + countAll_ = countAll_ + 1 + If IsValidHyperlink(target) Then + target.Interior.ColorIndex = xlNone + Else + target.Interior.Color = VBA.RGB(253, 233, 217) + countInvalid_ = countInvalid_ + 1 + End If +End Function + +Public Function FixServerLink(target As Excel.Range) + countAll_ = countAll_ + 1 + + Dim iPath As New API_Path: Call iPath.FromString(target.Text).GlobalToServer + If iPath.Text = target.Text Then _ + Exit Function + + target = iPath.Text + Call XLUpdateHyperlink(target, iPath.Text) + countInvalid_ = countInvalid_ + 1 +End Function + +' ====== +Private Function IsValidHyperlink(target As Excel.Range) As Boolean + Dim sFile$: sFile = target.Hyperlinks(1).Address + Dim iPath As New API_Path: Call iPath.FromString(sFile).ToGlobal(target.Parent.Parent.Path) + IsValidHyperlink = iPath.GlobalExists +End Function + + diff --git a/src/Declarations.bas b/src/Declarations.bas new file mode 100644 index 0000000..80e0b0c --- /dev/null +++ b/src/Declarations.bas @@ -0,0 +1,47 @@ +Attribute VB_Name = "Declarations" +Option Private Module +Option Explicit + +Public Const APP_HELP = "\\fs1.concept.ru\projects\10 \02 \!\Excel.docx" + +Public Const CONCEPT_LOCAL_HOME = ".concept" +Public Const CONCEPT_SERVER_HOME = "\\fs1.concept.ru\projects\10 \!Concept" + +Public Const CONCEPT_BANNED_WORDS = "banned-words.txt" + +Public Const SERVER_TEMPLATES_FOLDER = "\\fs1.concept.ru\Data\Templates" +Public Const LOCAL_TEMPLATES_FOLDER = "Microsoft\" + +Public Const PROJECTS_FIRST_ROW = 2 +Public Const VISIO_DEFAULT_GAP = 0.254 + +' Matching mode +Public Enum TMatchMode + T_MM_DEFAULT = 1 + T_MM_SPACE_LEFT = 2 + T_MM_SPACE_RIGHT = 3 + T_MM_SPACE_BOTH = 4 +End Enum + +' Word Addins +Public Enum TWordAddin + [_First] = 1 + + T_WA_CONCEPT = 1 + T_WA_NPA = 2 + T_WA_MARKUP = 3 + T_WA_PARSERS = 4 + T_WA_MAKET = 5 + + [_Last] = 5 +End Enum + +Public Function ProductNameFromID(nID As TWordAddin) As String + Select Case nID + Case T_WA_CONCEPT: ProductNameFromID = "WordHelper" + Case T_WA_NPA: ProductNameFromID = "Concept-NPA" + Case T_WA_MARKUP: ProductNameFromID = "Concept-Markup" + Case T_WA_PARSERS: ProductNameFromID = "Concept-Mining" + Case T_WA_MAKET: ProductNameFromID = "Concept-Maket" + End Select +End Function diff --git a/src/DevHelper.bas b/src/DevHelper.bas new file mode 100644 index 0000000..f26d7d8 --- /dev/null +++ b/src/DevHelper.bas @@ -0,0 +1,20 @@ +Attribute VB_Name = "DevHelper" +Option Explicit + +Public Function Dev_PrepareSkeleton() + ' Do nothing +End Function + +Public Sub Dev_ManualRunTest() + Dim sSuite$: sSuite = "s_UndoWrapper" + Dim sTest$: sTest = "t_BasicUndo" + Dim sMsg$: sMsg = Dev_RunTestDebug(sSuite, sTest) + Debug.Print sMsg + Call MsgBox(sMsg) +End Sub + +Public Function Dev_GetTestSuite(sName$) As Object + Select Case sName + ' Case "s_ParseDate": Set Dev_GetTestSuite = New s_ParseDate + End Select +End Function diff --git a/src/LinksOutput.cls b/src/LinksOutput.cls new file mode 100644 index 0000000..5196f76 --- /dev/null +++ b/src/LinksOutput.cls @@ -0,0 +1,36 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True +END +Attribute VB_Name = "LinksOutput" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +Option Explicit + +Private out_ As Excel.Range +Private mask_ As String + +Public countAdded_ As Long +Public countAll_ As Long + +Public Function Init(iOut As Excel.Range, sMask$) + Set out_ = iOut + countAdded_ = 0 + countAll_ = 0 + mask_ = sMask +End Function + +Public Function ProcessFile(iFile As Scripting.File) + countAll_ = countAll_ + 1 + If Not iFile.Path Like mask_ Then _ + Exit Function + + Dim iCell As Excel.Range: Set iCell = out_.Offset(countAdded_, 0) + iCell = iFile.Path + + On Error Resume Next + Call iCell.Hyperlinks.Add(iCell, iFile.Path) + countAdded_ = countAdded_ + 1 +End Function diff --git a/src/LinksRelocator.cls b/src/LinksRelocator.cls new file mode 100644 index 0000000..9881efd --- /dev/null +++ b/src/LinksRelocator.cls @@ -0,0 +1,76 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True +END +Attribute VB_Name = "LinksRelocator" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +Option Explicit + +Private fso_ As Scripting.FileSystemObject +Private prefix_ As String +Private destination_ As String +Private home_ As String +Private removeSource_ As Boolean + +Public countAll_ As Long +Public countRelocated_ As Long + +Public Function Init(sDestination$, sPrefix$, sHome$, bRemoveSource As Boolean) + Set fso_ = New Scripting.FileSystemObject + prefix_ = sPrefix + destination_ = sDestination + home_ = sHome + removeSource_ = bRemoveSource + + countAll_ = 0 + countRelocated_ = 0 +End Function + +Public Function ProcessCell(target As Excel.Range) + If target.Hyperlinks.Count = 0 Then _ + Exit Function + + countAll_ = countAll_ + 1 + Dim iPath As New API_Path: Call iPath.FromString(target.Value).ToGlobal(home_) + Dim iRelativePath As API_Path: Set iRelativePath = iPath.Clone.ToLocal(prefix_) + If iRelativePath.Text = iPath.Text Then _ + Set iRelativePath = GenerateLocalPath(iPath.FileName) + + If Not iPath.GlobalExists Then _ + GoTo MARK_FAILURE + + Dim iDestination As API_Path: Set iDestination = iRelativePath.Clone + Call iDestination.ToGlobal(destination_) + + If removeSource_ Then + If Not MoveFileOrFolder(iPath.Text, iDestination.Text, fso_) Then _ + GoTo MARK_FAILURE + Else + If Not CopyFileOrFolder(iPath.Text, iDestination.Text, fso_) Then _ + GoTo MARK_FAILURE + End If + + target = iDestination.Text + Call XLUpdateHyperlink(target, iDestination.Text) + target.Interior.ColorIndex = xlNone + countRelocated_ = countRelocated_ + 1 + Exit Function + +MARK_FAILURE: + target.Interior.Color = VBA.RGB(253, 233, 217) +End Function + +' ====== +Private Function GenerateLocalPath(sName$) As API_Path + Dim iPath As New API_Path: Call iPath.FromString(sName) + Call iPath.ToGlobal(destination_) + Dim nCopy&: nCopy = 1 + Do While iPath.GlobalExists + Call iPath.FromString(Fmt("{1}_{2}.{3}", iPath.BaseName, nCopy, iPath.Extension)) + Call iPath.ToGlobal(destination_) + Loop + Set GenerateLocalPath = iPath +End Function diff --git a/src/Main.bas b/src/Main.bas new file mode 100644 index 0000000..2041dce --- /dev/null +++ b/src/Main.bas @@ -0,0 +1,295 @@ +Attribute VB_Name = "Main" +Option Explicit +Option Private Module + +Public Sub CC_RunGroupByRank() + Dim iSelection As Excel.Range: Set iSelection = ActiveWorkbook.Application.Selection + Dim nRow&: nRow = 1 + Dim sTxt$ + Do + sTxt = iSelection.Cells(nRow, 1) + If sTxt = vbNullString Then _ + Exit Do + If IsNumeric(sTxt) Then _ + iSelection.Rows(nRow).OutlineLevel = CLng(sTxt) + nRow = nRow + 1 + Loop +End Sub + +Public Sub CC_RunGroupByID() + Dim iSelection As Excel.Range: Set iSelection = ActiveWorkbook.Application.Selection + Dim nRow&: nRow = 1 + Dim lastID$: lastID = vbNullString + Dim curID$ + Do + curID = iSelection.Cells(nRow, 1) + If curID = vbNullString Then _ + Exit Do + iSelection.Rows(nRow).OutlineLevel = IIf(lastID = curID, 2, 1) + lastID = curID + nRow = nRow + 1 + Loop +End Sub + +Public Sub CC_RunClearFormatting() + Dim iSelection As Excel.Range: Set iSelection = ActiveWorkbook.Application.Selection + Do While iSelection.FormatConditions.Count > 0 + Call iSelection.FormatConditions.Item(1).Delete + Loop +End Sub + +Public Sub CC_RunTrimCells() + Call XLForEachNonEmptyCell( _ + target:=ActiveWorkbook.Application.Selection, _ + oCallback:=New CellProcessor, _ + sFuncName:="TrimCell") +End Sub + +Public Sub CC_RunTrimPunctuation() + Call XLForEachNonEmptyCell( _ + target:=ActiveWorkbook.Application.Selection, _ + oCallback:=New CellProcessor, _ + sFuncName:="TrimCellPunctuation") +End Sub + +Public Sub CC_RunSubstituteWhitespace() + Call XLForEachNonEmptyCell( _ + target:=ActiveWorkbook.Application.Selection, _ + oCallback:=New CellProcessor, _ + sFuncName:="SubstituteWS") +End Sub + +Public Sub CC_RunLinksCreate() + Call XLForEachNonEmptyCell( _ + target:=ActiveWorkbook.Application.Selection, _ + oCallback:=New CellProcessor, _ + sFuncName:="CreateHyperlink") +End Sub + +Public Sub CC_RunSplitText() + Call XLForEachNonEmptyCell( _ + target:=ActiveWorkbook.Application.Selection, _ + oCallback:=New CellProcessor, _ + sFuncName:="SplitTextIntoColumn") +End Sub + +Public Sub CC_RunLinksScan() + Dim sMask$: sMask = UserInteraction.PromptInput(" ", sInitial:="*.*") + If sMask = vbNullString Then _ + Exit Sub + Dim sFolder$: sFolder = UserInteraction.PromptFolder(ActiveWorkbook.Path & "\") + If sFolder = vbNullString Then _ + Exit Sub + + Dim iScanner As New LinksOutput: Call iScanner.Init(ActiveWorkbook.Application.Selection.Cells(1, 1), sMask) + Call ForEachFileRecursive(sFolder, iScanner, "ProcessFile") + + Call UserInteraction.ShowMessage(IM_LINKS_SCAN_OK, iScanner.countAdded_, iScanner.countAll_) +End Sub + +Public Sub CC_RunLinksValidate() + Dim iProcessor As New CellProcessor: Call iProcessor.Init + Call XLForEachNonEmptyCell( _ + target:=ActiveWorkbook.Application.Selection, _ + oCallback:=iProcessor, _ + sFuncName:="ValidateHyperlink") + Call UserInteraction.ShowMessage(IM_LINKS_VALIDATION, iProcessor.countInvalid_, iProcessor.countAll_) +End Sub + +Public Sub CC_RunLinksServer() + Dim iProcessor As New CellProcessor: Call iProcessor.Init + Call XLForEachNonEmptyCell( _ + target:=ActiveWorkbook.Application.Selection, _ + oCallback:=iProcessor, _ + sFuncName:="FixServerLink") + Call UserInteraction.ShowMessage(IM_LINKS_SERVER, iProcessor.countInvalid_, iProcessor.countAll_) +End Sub + +Public Sub CC_RunLinksRelocate() + Dim iTarget As Excel.Workbook: Set iTarget = ActiveWorkbook + Dim iSelection As Excel.Range: Set iSelection = iTarget.Application.Selection + If iSelection.Hyperlinks.Count = 0 Then + Call UserInteraction.ShowMessage(EM_SELECTION_NO_HYPERLINKS) + Exit Sub + End If + + Dim fso As New Scripting.FileSystemObject + Dim sInitFolder$: sInitFolder = fso.GetParentFolderName(iSelection.Hyperlinks(1).Address) + Call RelocateDlg.Init(sInitFolder) + Call RelocateDlg.Show + If RelocateDlg.isCancelled_ Then _ + Exit Sub + + Dim iProcessor As New LinksRelocator: Call iProcessor.Init(RelocateDlg.Path, RelocateDlg.Prefix, iTarget.Path, bRemoveSource:=True) + Call XLForEachNonEmptyCell( _ + target:=ActiveWorkbook.Application.Selection, _ + oCallback:=iProcessor, _ + sFuncName:="ProcessCell") + + Call UserInteraction.ShowMessage(IM_LINKS_RELOCATE_OK, iProcessor.countRelocated_, iProcessor.countAll_) +End Sub + +Public Sub CC_RunLinksCopyFiles() + Dim iTarget As Excel.Workbook: Set iTarget = ActiveWorkbook + Dim iSelection As Excel.Range: Set iSelection = iTarget.Application.Selection + If iSelection.Hyperlinks.Count = 0 Then + Call UserInteraction.ShowMessage(EM_SELECTION_NO_HYPERLINKS) + Exit Sub + End If + + Dim fso As New Scripting.FileSystemObject + Dim sInitFolder$: sInitFolder = fso.GetParentFolderName(iSelection.Hyperlinks(1).Address) + Call RelocateDlg.Init(sInitFolder) + Call RelocateDlg.Show + If RelocateDlg.isCancelled_ Then _ + Exit Sub + + Dim iProcessor As New LinksRelocator: Call iProcessor.Init(RelocateDlg.Path, RelocateDlg.Prefix, iTarget.Path, bRemoveSource:=False) + Call XLForEachNonEmptyCell( _ + target:=ActiveWorkbook.Application.Selection, _ + oCallback:=iProcessor, _ + sFuncName:="ProcessCell") + + Call UserInteraction.ShowMessage(IM_LINKS_COPY_OK, iProcessor.countRelocated_, iProcessor.countAll_) +End Sub + +Public Sub CC_RunListIncome() + Dim iProjects As Scripting.Dictionary: Set iProjects = CCListProjects(T_PRJ_INCOME) + If iProjects Is Nothing Then _ + Exit Sub + Call PasteProjects(Excel.ActiveWindow.ActiveCell, iProjects) +End Sub + +Public Sub CC_RunListOutcome() + Dim iProjects As Scripting.Dictionary: Set iProjects = CCListProjects(T_PRJ_OUTCOME) + If iProjects Is Nothing Then _ + Exit Sub + Call PasteProjects(Excel.ActiveWindow.ActiveCell, iProjects) +End Sub + +Public Sub CC_RunListLeads() + Dim iProjects As Scripting.Dictionary: Set iProjects = CCListProjects(T_PRJ_LEAD_ACTIVE) + If iProjects Is Nothing Then _ + Exit Sub + Call PasteProjects(Excel.ActiveWindow.ActiveCell, iProjects) +End Sub + +Public Sub CC_RunListTentative() + Dim iProjects As Scripting.Dictionary: Set iProjects = CCListProjects(T_PRJ_LEAD_TENTATIVE) + If iProjects Is Nothing Then _ + Exit Sub + Call PasteProjects(Excel.ActiveWindow.ActiveCell, iProjects) +End Sub + +Public Sub CC_RunLinksPrint() + Dim selRange As Excel.Range: Set selRange = ActiveWorkbook.Application.Selection + Dim theLinks As Excel.Hyperlinks: Set theLinks = selRange.Hyperlinks + If theLinks.Count = 0 Then + Call UserInteraction.ShowMessage(EM_SELECTION_NO_HYPERLINKS) + Exit Sub + End If + + Call PrintLinks(theLinks) +End Sub + +Public Sub CC_RunConfig() + Dim fso As New Scripting.FileSystemObject + Dim sConfigPath$: sConfigPath = ConceptConfigPath + If Not fso.FileExists(sConfigPath) Then _ + Call SetupConfig(sConfigPath) + + Dim oShell As New Shell32.Shell + Call oShell.Open(sConfigPath) +End Sub + +Public Sub CC_RunWordAddin() + If Not ValidateNoWordOpen Then + Call UserInteraction.ShowMessage(EM_WORD_IS_OPEN) + Exit Sub + End If + + Dim iCurrent As AddinOptions: Set iCurrent = ScanAddinOptions() + Call WordDlg.Init(iCurrent) + Call WordDlg.Show + If WordDlg.isCanceled_ Then _ + Exit Sub + + If ApplyAddins(iCurrent, WordDlg.GetResult) Then + Call UserInteraction.ShowMessage(IM_WORD_ADDINS_OK) + Else + Call UserInteraction.ShowMessage(EM_WORD_ADDINS_FAILED) + End If +End Sub + +Public Sub CC_RunUpdateTemplates() + If Not ValidateNoWordOpen Then + Call UserInteraction.ShowMessage(EM_WORD_IS_OPEN) + Exit Sub + End If + + If CopyFileOrFolder( _ + sSource:=SERVER_TEMPLATES_FOLDER, _ + sDestination:=VBA.Environ$("APPDATA") & "\" & LOCAL_TEMPLATES_FOLDER) Then + Call UserInteraction.ShowMessage(IM_TEMPLATES_OK) + Else + Call UserInteraction.ShowMessage(EM_TEMPLATES_FAILED) + End If +End Sub + +Public Sub CC_RunUpdateConceptCore() + Call AccessPython.UnloadDLL + Call UnloadConceptCore + + If Not UpdateConceptPowershell Then + Call UserInteraction.ShowMessage(EM_CORE_UPDATE_FAILED) + Exit Sub + End If + + Call UnregisterUDF + Call RegisterUDF + Call UserInteraction.ShowMessage(IM_CONCEPT_UPDATE_OK) +End Sub + +Public Sub CC_RunConceptStatus() + Dim iExcel As New API_XLWrapper + Call iExcel.NewDocument + + Call OutputConceptStatus(iExcel.Document.Sheets(1)) + + Call iExcel.Document.Activate +End Sub + +Public Sub CC_RunAppdata() + Dim oShell As New Shell32.Shell + Call oShell.Open(VBA.Environ$("APPDATA") & "\Microsoft") +End Sub + +Public Sub CC_RunAnalyseSearch() + Dim iDoc As Excel.Workbook: Set iDoc = Excel.ActiveWorkbook + + Call SearchDlg.Init(iDoc) + Call SearchDlg.Show + If SearchDlg.isCancelled_ Then _ + Exit Sub + + Dim params As ParametersSearch: Set params = SearchDlg.ResultParams + Call ExecuteSearch(iDoc, params) + + Call UserInteraction.ShowMessage(IM_SEARCH_OK) +End Sub + +Public Sub CC_RunHelp() + Dim iWord As New API_WordWrapper + Dim iHelp As Word.Document: Set iHelp = iWord.OpenDocument(APP_HELP, bReadOnly:=True) + If iHelp Is Nothing Then _ + Exit Sub + + With iHelp + .ActiveWindow.View.ReadingLayout = False + Call .Application.Activate + End With +End Sub + +Public Sub CC_RunDescriptionUDF() + Call RegisterUDF +End Sub diff --git a/src/MainImpl.bas b/src/MainImpl.bas new file mode 100644 index 0000000..8b437c2 --- /dev/null +++ b/src/MainImpl.bas @@ -0,0 +1,168 @@ +Attribute VB_Name = "MainImpl" +Option Explicit +Option Private Module + +Public Function PasteProjects(ByVal rWhere As Excel.Range, iProjects As Scripting.Dictionary) + If iProjects.Count = 0 Then _ + Exit Function + + Set rWhere = rWhere.Cells(1, 1) + If Not IsEmpty(rWhere) Then + Call rWhere.Offset(1).EntireRow.Insert + Set rWhere = rWhere.Offset(1) + End If + + Dim aKey As Variant + For Each aKey In iProjects + If IsEmpty(rWhere) Then _ + GoTo PASTE_PRJ + + Call rWhere.EntireRow.Insert + Set rWhere = rWhere.Offset(-1) + Call rWhere.Offset(-1).Copy(rWhere) + +PASTE_PRJ: + rWhere = CStr(aKey) + Set rWhere = rWhere.Offset(1) + Next aKey +End Function + +Public Function PrintLinks(iLinks As Excel.Hyperlinks) + Dim fso As New Scripting.FileSystemObject + Dim iShell As New Shell32.Shell + Dim aLink As Excel.Hyperlink + For Each aLink In iLinks + Dim sAddress$: sAddress = fso.GetAbsolutePathName(aLink.Address) + If sAddress = vbNullString Then _ + GoTo NEXT_LINK + If Not fso.FileExists(sAddress) Then _ + GoTo NEXT_LINK + Call iShell.ShellExecute(sAddress, vOperation:="Print") + +NEXT_LINK: + Next aLink +End Function + +Public Function SetupConfig(sPath$) + Dim iConfig As API_Config: Set iConfig = ConceptConfig + Call iConfig.SaveToFile(sPath) +End Function + +Public Function ValidateNoWordOpen() As Boolean + On Error Resume Next + Dim iWord As Word.Application: Set iWord = GetObject(, "Word.Application") + ValidateNoWordOpen = Err.Number <> 0 Or iWord Is Nothing + On Error GoTo 0 +End Function + +Public Function ScanAddinOptions() As AddinOptions + Dim fso As New Scripting.FileSystemObject + Dim sLocals$: sLocals = VBA.Environ$("APPDATA") & "\Microsoft\Word\STARTUP" + Set ScanAddinOptions = New AddinOptions + With ScanAddinOptions + .data_.Item(T_WA_CONCEPT) = fso.FileExists(sLocals & "\" & ADDIN_NAME_CONCEPT) + .data_.Item(T_WA_NPA) = fso.FileExists(sLocals & "\" & ADDIN_NAME_NPA) + .data_.Item(T_WA_MARKUP) = fso.FileExists(sLocals & "\" & ADDIN_NAME_MARKUP) + .data_.Item(T_WA_PARSERS) = fso.FileExists(sLocals & "\" & ADDIN_NAME_PARSER) + .data_.Item(T_WA_MAKET) = fso.FileExists(sLocals & "\" & ADDIN_NAME_MAKET) + End With +End Function + +Public Function ApplyAddins(iCurrent As AddinOptions, iNew As AddinOptions) As Boolean + ApplyAddins = False + + Dim sParams$ + Dim nID As TWordAddin + For nID = TWordAddin.[_First] To TWordAddin.[_Last] Step 1 + If iNew.data_.Item(nID) Then + If sParams <> vbNullString Then _ + sParams = sParams & ", " + sParams = sParams & ProductNameFromID(nID) & "+" + ElseIf iCurrent.data_.Item(nID) Then + If sParams <> vbNullString Then _ + sParams = sParams & ", " + sParams = sParams & ProductNameFromID(nID) & "-" + End If + Next nID + + ApplyAddins = VersionUpdateProducts(sParams) +End Function + +Public Function ExecuteSearch(target As Excel.Workbook, params As ParametersSearch) + Dim iOut As Excel.Worksheet: Set iOut = target.Sheets.Add + Dim iEngine As New SearchEngine + Call iEngine.Init(iOut, params) + Call iEngine.Execute +End Function + +Public Function UpdateConceptPowershell() As Boolean + UpdateConceptPowershell = False + + Dim fso As New Scripting.FileSystemObject + Dim sInstall$: sInstall = CP_TOOLS_SERVER & "\" & CONCEPT_INSTALLER + If Not fso.FileExists(sInstall) Then _ + Exit Function + + On Error GoTo RETURN_FALSE + Dim sExec$: sExec = "cmd.exe /c " & """" & sInstall & """" & " < nul" + Dim iShell As New WshShell + iShell.CurrentDirectory = CP_TOOLS_SERVER + UpdateConceptPowershell = iShell.Run(sExec, waitOnReturn:=True) = 0 + Exit Function + +RETURN_FALSE: + On Error GoTo 0 +End Function + +Public Function OutputConceptStatus(iOut As Excel.Worksheet) + With iOut + .Cells(1, 1) = "ProductID" + .Cells(1, 2) = " " + .Cells(1, 3) = " " + .Cells(1, 4) = " " + .Columns(1).ColumnWidth = 25 + .Columns(2).ColumnWidth = 15 + .Columns(3).ColumnWidth = 15 + .Columns(4).ColumnWidth = 15 + End With + + Dim nRow&: nRow = 2 + + Dim iLocal As API_DistrManifest: Set iLocal = VersionLocalManifest + Dim iServer As API_DistrManifest: Set iServer = VersionServerManifest + Dim iEnabled As AddinOptions: Set iEnabled = ScanAddinOptions + + Dim iProduct As Variant + For Each iProduct In iLocal.data_.Keys + Dim sProduct$: sProduct = VBA.CStr(iProduct) + + Dim sLocalVer$: sLocalVer = iLocal.GetVersion(sProduct) + If sLocalVer = vbNullString Then _ + sLocalVer = " " + + Dim sServerVer$: sServerVer = iServer.GetVersion(sProduct) + If sServerVer = vbNullString Then _ + sServerVer = " " + + With iOut + .Cells(nRow, 1) = sProduct + .Cells(nRow, 2) = sLocalVer + .Cells(nRow, 3) = sServerVer + .Cells(nRow, 4) = IIf(iEnabled.CheckProductEnabled(sProduct), "", "") + End With + nRow = nRow + 1 + Next iProduct +End Function + +' ======= +Private Function ScanProjects(iSource As Excel.Worksheet) As Collection + Set ScanProjects = New Collection + Dim nRow& + Dim lstRow&: lstRow = iSource.Cells(iSource.Rows.Count, 1).End(xlUp).Row + nRow = PROJECTS_FIRST_ROW + For nRow = PROJECTS_FIRST_ROW To lstRow Step 1 + Dim sTxt$: sTxt = iSource.Cells(nRow, 1) + If sTxt <> vbNullString Then _ + Call ScanProjects.Add(sTxt) + Next nRow +End Function diff --git a/src/ParametersSearch.cls b/src/ParametersSearch.cls new file mode 100644 index 0000000..9e78093 --- /dev/null +++ b/src/ParametersSearch.cls @@ -0,0 +1,20 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True +END +Attribute VB_Name = "ParametersSearch" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = False +Option Explicit + +Public searchWhere_ As Excel.Range +Public searchWhat_ As Excel.Range + +Public partialMatch_ As Boolean +Public normalize_ As Boolean +Public outputText_ As Boolean + +Public ignoreSmall_ As Boolean +Public smallSize_ As Long diff --git a/src/PublicFunctions.bas b/src/PublicFunctions.bas new file mode 100644 index 0000000..f8825c1 --- /dev/null +++ b/src/PublicFunctions.bas @@ -0,0 +1,639 @@ +Attribute VB_Name = "PublicFunctions" +' User defined function to use in Cells formula +Option Explicit + +Private Const BLANKS_LIMIT = 300 + +Public Sub RegisterUDF() + Dim xlApp As Excel.Application: Set xlApp = ThisWorkbook.Application + + Call xlApp.MacroOptions(Macro:="RS_ToASCII", Category:="CONCEPT_RS", _ + Description:=" Unicode ASCII") + Call xlApp.MacroOptions(Macro:="RS_ToMath", Category:="CONCEPT_RS", _ + Description:=" ASCII Unicode") + Call xlApp.MacroOptions(Macro:="RS_ToTree", Category:="CONCEPT_RS", _ + Description:=" ASCII ") + + Call xlApp.MacroOptions(Macro:="PY_Parse", Category:="CONCEPT_PYTHON", _ + Description:=" " & vbNewLine & _ + " , ") + Call xlApp.MacroOptions(Macro:="PY_Normalize", Category:="CONCEPT_PYTHON", _ + Description:=" ") + Call xlApp.MacroOptions(Macro:="PY_Inflect", Category:="CONCEPT_PYTHON", _ + Description:=" ") + Call xlApp.MacroOptions(Macro:="PY_InflectSubstitute", Category:="CONCEPT_PYTHON", _ + Description:=" , " & vbNewLine & _ + " , " & vbNewLine & _ + " ") + Call xlApp.MacroOptions(Macro:="PY_InflectDependant", Category:="CONCEPT_PYTHON", _ + Description:=" , " & vbNewLine & _ + " , ") + Call xlApp.MacroOptions(Macro:="PY_InflectContext", Category:="CONCEPT_PYTHON", _ + Description:=" , " & vbNewLine & _ + " " & vbNewLine & _ + " ") + Call xlApp.MacroOptions(Macro:="PY_FindSubstr", Category:="CONCEPT_PYTHON", _ + Description:=" ") + + Call xlApp.MacroOptions(Macro:="CC_AbbreviateText", Category:="CONCEPT", _ + Description:=" ") + Call xlApp.MacroOptions(Macro:="CC_TrimWhitespace", Category:="CONCEPT", _ + Description:=" ") + Call xlApp.MacroOptions(Macro:="CC_TrimPunctuation", Category:="CONCEPT", _ + Description:=" ") + Call xlApp.MacroOptions(Macro:="CC_SubstituteWhitespace", Category:="CONCEPT", _ + Description:=" . ") + + Call xlApp.MacroOptions(Macro:="CC_CutRight", Category:="CONCEPT", _ + Description:=" " & vbNewLine & _ + "cutWhat - " & vbNewLine & _ + "cutWhere - -" & vbNewLine & _ + "[keepDelim=FALSE] - ") + + Call xlApp.MacroOptions(Macro:="CC_CutLeft", Category:="CONCEPT", _ + Description:=" " & vbNewLine & _ + "cutWhat - " & vbNewLine & _ + "cutWhere - -") + + Call xlApp.MacroOptions(Macro:="CC_CountColor", Category:="CONCEPT", _ + Description:=" " & vbNewLine & _ + "rData - " & vbNewLine & _ + "rCriteria - , ") + + Call xlApp.MacroOptions(Macro:="CC_FileMD5", Category:="CONCEPT", _ + Description:=" - MD5") + Call xlApp.MacroOptions(Macro:="CC_FileSHA1", Category:="CONCEPT", _ + Description:=" - SAH1") + + Call xlApp.MacroOptions(Macro:="CC_ExtactFileName", Category:="CONCEPT", _ + Description:=" ") + Call xlApp.MacroOptions(Macro:="CC_ExtactFileNameText", Category:="CONCEPT", _ + Description:=" ") + Call xlApp.MacroOptions(Macro:="CC_ExtactFileExtension", Category:="CONCEPT", _ + Description:=" ") + Call xlApp.MacroOptions(Macro:="CC_ExtactFolderName", Category:="CONCEPT", _ + Description:=" , ") + + Call xlApp.MacroOptions(Macro:="CC_HyperlinkToString", Category:="CONCEPT", _ + Description:=" ") + + Call xlApp.MacroOptions(Macro:="CC_MatchCount", Category:="CONCEPT", _ + Description:=" ") + Call xlApp.MacroOptions(Macro:="CC_MatchMultiple", Category:="CONCEPT", _ + Description:=" , " & vbNewLine & _ + "target - " & vbNewLine & _ + "iMatchList - " & vbNewLine & _ + "[nMode=1] - " & vbNewLine & _ + "1 - ( ) - " & vbNewLine & _ + "2 - " & vbNewLine & _ + "3 - " & vbNewLine & _ + "4 - ") + Call xlApp.MacroOptions(Macro:="CC_LookupSubstr", Category:="CONCEPT", _ + Description:=" (HLOOKUP), , ") + Call xlApp.MacroOptions(Macro:="CC_LongestDuplicatePrefix", Category:="CONCEPT", _ + Description:=" , 2 ") + Call xlApp.MacroOptions(Macro:="CC_LongestDuplicateSuffix", Category:="CONCEPT", _ + Description:=" , 2 ") + Call xlApp.MacroOptions(Macro:="CC_SLOW_LongestDuplicateSubstring", Category:="CONCEPT", _ + Description:=" , 2 " & vbNewLine & _ + "! ") + + Call xlApp.MacroOptions(Macro:="CC_LookupMulti", Category:="CONCEPT", _ + Description:=" 1 2." & vbNewLine & _ + " = 3 , 2") + Call xlApp.MacroOptions(Macro:="CC_LookupMultiCount", Category:="CONCEPT", _ + Description:=" LookupMulti, ") + Call xlApp.MacroOptions(Macro:="CC_LookupMultiAll", Category:="CONCEPT", _ + Description:=" LookupMulti, ") +End Sub + +Public Sub UnregisterUDF() + Call UnregisterMacto("RS_ToASCII") + Call UnregisterMacto("RS_ToMath") + Call UnregisterMacto("RS_ToTree") + Call UnregisterMacto("PY_Parse") + Call UnregisterMacto("PY_Normalize") + Call UnregisterMacto("PY_Inflect") + Call UnregisterMacto("PY_InflectSubstitute") + Call UnregisterMacto("PY_InflectContext") + Call UnregisterMacto("PY_InflectDependant") + Call UnregisterMacto("PY_FindSubstr") + Call UnregisterMacto("CC_AbbreviateText") + Call UnregisterMacto("CC_TrimWhitespace") + Call UnregisterMacto("CC_TrimPunctuation") + Call UnregisterMacto("CC_CutRight") + Call UnregisterMacto("CC_CutLeft") + Call UnregisterMacto("CC_CountColor") + Call UnregisterMacto("CC_FileMD5") + Call UnregisterMacto("CC_FileSHA1") + Call UnregisterMacto("CC_ExtactFileName") + Call UnregisterMacto("CC_ExtactFileNameText") + Call UnregisterMacto("CC_ExtactFileExtension") + Call UnregisterMacto("CC_ExtactFolderName") + Call UnregisterMacto("CC_HyperlinkToString") + Call UnregisterMacto("CC_SubstituteWhitespace") + Call UnregisterMacto("CC_MatchCount") + Call UnregisterMacto("CC_MatchMultiple") + Call UnregisterMacto("CC_LookupSubstr") + Call UnregisterMacto("CC_LongestDuplicatePrefix") + Call UnregisterMacto("CC_LongestDuplicateSuffix") + Call UnregisterMacto("CC_SLOW_LongestDuplicateSubstring") + Call UnregisterMacto("CC_LookupMulti") + Call UnregisterMacto("CC_LookupMulti") + Call UnregisterMacto("CC_LookupMultiCount") + Call UnregisterMacto("CC_LookupMultiAll") +End Sub + +Public Function RS_ToASCII(sUnicodeText$) As String +Attribute RS_ToASCII.VB_Description = " Unicode ASCII" +Attribute RS_ToASCII.VB_ProcData.VB_Invoke_Func = " \n20" + RS_ToASCII = MathToASCII(sUnicodeText) +End Function + +Public Function RS_ToMath(sAsciiText$) As String +Attribute RS_ToMath.VB_Description = " ASCII Unicode" +Attribute RS_ToMath.VB_ProcData.VB_Invoke_Func = " \n20" + RS_ToMath = ASCIItoMath(sAsciiText) +End Function + +Public Function RS_ToTree(sAsciiText$) As String +Attribute RS_ToTree.VB_Description = " ASCII " +Attribute RS_ToTree.VB_ProcData.VB_Invoke_Func = " \n20" + RS_ToTree = ASCIItoAST(sAsciiText) +End Function + +Public Function PY_Parse(sTarget$, Optional sTags$ = "") As String +Attribute PY_Parse.VB_Description = " \r\n , " +Attribute PY_Parse.VB_ProcData.VB_Invoke_Func = " \n21" + PY_Parse = AccessPython.CallFunction(PY_MODULE_TEXT, "parse", Array(sTarget, sTags)) +End Function + +Public Function PY_Normalize(sTarget$) As String +Attribute PY_Normalize.VB_Description = " " +Attribute PY_Normalize.VB_ProcData.VB_Invoke_Func = " \n21" + PY_Normalize = AccessPython.CallFunction(PY_MODULE_TEXT, "normalize", Array(sTarget)) +End Function + +Public Function PY_Inflect(sTarget$, sTags$) As String +Attribute PY_Inflect.VB_Description = " " +Attribute PY_Inflect.VB_ProcData.VB_Invoke_Func = " \n21" + PY_Inflect = AccessPython.CallFunction(PY_MODULE_TEXT, "inflect", Array(sTarget, sTags)) +End Function + +Public Function PY_InflectSubstitute(sTarget$, sOriginal$) As String +Attribute PY_InflectSubstitute.VB_Description = " , \r\n , \r\n " +Attribute PY_InflectSubstitute.VB_ProcData.VB_Invoke_Func = " \n21" + PY_InflectSubstitute = AccessPython.CallFunction(PY_MODULE_TEXT, "inflect_substitute", Array(sTarget, sOriginal)) +End Function + +Public Function PY_InflectDependant(sTarget$, sMaster$) As String +Attribute PY_InflectDependant.VB_Description = " , \r\n , " +Attribute PY_InflectDependant.VB_ProcData.VB_Invoke_Func = " \n21" + PY_InflectDependant = AccessPython.CallFunction(PY_MODULE_TEXT, "inflect_dependant", Array(sTarget, sMaster)) +End Function + +Public Function PY_InflectContext(sTarget$, Optional sBefore$ = "", Optional sAfter$ = "") As String +Attribute PY_InflectContext.VB_Description = " , \r\n \r\n " +Attribute PY_InflectContext.VB_ProcData.VB_Invoke_Func = " \n21" + PY_InflectContext = AccessPython.CallFunction(PY_MODULE_TEXT, "inflect_context", Array(sTarget, sBefore, sAfter)) +End Function + +Public Function PY_FindSubstr(sHaystack$, sNeedle$) As String +Attribute PY_FindSubstr.VB_Description = " " +Attribute PY_FindSubstr.VB_ProcData.VB_Invoke_Func = " \n21" + Dim result As Variant: + result = AccessPython.CallFunction(PY_MODULE_TEXT, "find_substr", Array(sHaystack, sNeedle)) + PY_FindSubstr = Fmt("{1},{2}", result(0), result(1)) +End Function + +Public Function CC_AbbreviateText(target$) As String +Attribute CC_AbbreviateText.VB_Description = " " +Attribute CC_AbbreviateText.VB_ProcData.VB_Invoke_Func = " \n22" + CC_AbbreviateText = ApplyCommonAbbreviations(target) +End Function + +Public Function CC_TrimWhitespace(target$) As String +Attribute CC_TrimWhitespace.VB_Description = " " +Attribute CC_TrimWhitespace.VB_ProcData.VB_Invoke_Func = " \n22" + CC_TrimWhitespace = TrimWhitespace(target) +End Function + +Public Function CC_TrimPunctuation(target$) As String +Attribute CC_TrimPunctuation.VB_Description = " " +Attribute CC_TrimPunctuation.VB_ProcData.VB_Invoke_Func = " \n22" + CC_TrimPunctuation = TrimEndPunctuation(target) +End Function + +Public Function CC_CutRight(cutWhat$, cutWhere$, Optional keepDelim As Boolean = False) As String +Attribute CC_CutRight.VB_Description = " \r\ncutWhat - \r\ncutWhere - -\r\n[keepDelim=FALSE] - " +Attribute CC_CutRight.VB_ProcData.VB_Invoke_Func = " \n22" +' + Dim nPos&: nPos = VBA.InStr(1, cutWhat, cutWhere) + If nPos = 0 Then _ + Exit Function + If keepDelim Then + CC_CutRight = VBA.Right(cutWhat, VBA.Len(cutWhat) - nPos + 1) + Else + CC_CutRight = VBA.Right(cutWhat, VBA.Len(cutWhat) - nPos + 1 - VBA.Len(cutWhere)) + End If +End Function + +Public Function CC_CutLeft(cutWhat$, cutWhere$) As String +Attribute CC_CutLeft.VB_Description = " \r\ncutWhat - \r\ncutWhere - -" +Attribute CC_CutLeft.VB_ProcData.VB_Invoke_Func = " \n22" +' + CC_CutLeft = cutWhat + Dim nPos&: nPos = VBA.InStr(1, cutWhat, cutWhere) + If nPos = 0 Then _ + Exit Function + CC_CutLeft = VBA.Left(cutWhat, nPos - 1) +End Function + +Public Function CC_CountColor(rData As Excel.Range, rCriteria As Excel.Range) As Long +Attribute CC_CountColor.VB_Description = " \r\nrData - \r\nrCriteria - , " +Attribute CC_CountColor.VB_ProcData.VB_Invoke_Func = " \n22" + Dim aCell As Excel.Range + Dim xcolor&: xcolor = rCriteria.Interior.ColorIndex + For Each aCell In rData + If aCell.Interior.ColorIndex = xcolor Then _ + CC_CountColor = CC_CountColor + 1 + Next aCell +End Function + +Public Function CC_FileMD5(sPath$) As String +Attribute CC_FileMD5.VB_Description = " - MD5" +Attribute CC_FileMD5.VB_ProcData.VB_Invoke_Func = " \n22" + CC_FileMD5 = FileToMD5(sPath) + If CC_FileMD5 = vbNullString Then _ + CC_FileMD5 = "File not found" +End Function + +Public Function CC_FileSHA1(sPath$) As String +Attribute CC_FileSHA1.VB_Description = " - SAH1" +Attribute CC_FileSHA1.VB_ProcData.VB_Invoke_Func = " \n22" + CC_FileSHA1 = FileToSHA1(sPath) + If CC_FileSHA1 = vbNullString Then _ + CC_FileSHA1 = "File not found" +End Function + +Public Function CC_ExtactFileName(sPath$) As String +Attribute CC_ExtactFileName.VB_Description = " " +Attribute CC_ExtactFileName.VB_ProcData.VB_Invoke_Func = " \n22" + Dim fso As New Scripting.FileSystemObject + CC_ExtactFileName = fso.GetFileName(sPath) +End Function + +Public Function CC_ExtactFileNameText(sPath$) As String +Attribute CC_ExtactFileNameText.VB_Description = " " +Attribute CC_ExtactFileNameText.VB_ProcData.VB_Invoke_Func = " \n22" + Dim fso As New Scripting.FileSystemObject + CC_ExtactFileNameText = fso.GetBaseName(sPath) +End Function + +Public Function CC_ExtactFileExtension(sPath$) As String +Attribute CC_ExtactFileExtension.VB_Description = " " +Attribute CC_ExtactFileExtension.VB_ProcData.VB_Invoke_Func = " \n22" + Dim fso As New Scripting.FileSystemObject + CC_ExtactFileExtension = fso.GetExtensionName(sPath) +End Function + +Public Function CC_ExtactFolderName(sPath$) As String +Attribute CC_ExtactFolderName.VB_Description = " , " +Attribute CC_ExtactFolderName.VB_ProcData.VB_Invoke_Func = " \n22" + Dim fso As New Scripting.FileSystemObject + CC_ExtactFolderName = fso.GetParentFolderName(sPath) +End Function + +Public Function CC_HyperlinkToString(aCell As Excel.Range) As String +Attribute CC_HyperlinkToString.VB_Description = " " +Attribute CC_HyperlinkToString.VB_ProcData.VB_Invoke_Func = " \n22" + If aCell.Hyperlinks.Count > 0 Then + With aCell.Hyperlinks(1) + CC_HyperlinkToString = .Address + If .SubAddress <> vbNullString Then _ + CC_HyperlinkToString = CC_HyperlinkToString + "#" + .SubAddress + End With + End If +End Function + +Public Function CC_SubstituteWhitespace(target$) As String +Attribute CC_SubstituteWhitespace.VB_Description = " . " +Attribute CC_SubstituteWhitespace.VB_ProcData.VB_Invoke_Func = " \n22" + CC_SubstituteWhitespace = SubstituteWhitespace(target) +End Function + +Public Function CC_MatchCount(target$, iMatch$) As Long +Attribute CC_MatchCount.VB_Description = " " +Attribute CC_MatchCount.VB_ProcData.VB_Invoke_Func = " \n22" + CC_MatchCount = (VBA.Len(target) - VBA.Len(VBA.Replace(target, iMatch, "", Compare:=vbTextCompare))) / VBA.Len(iMatch) +End Function + +Public Function CC_MatchMultiple(target$, iMatchList As Excel.Range, Optional nMode As TMatchMode = T_MM_DEFAULT) As String +Attribute CC_MatchMultiple.VB_Description = " , \r\ntarget - \r\niMatchList - \r\n[nMode=1] - \r\n1 - ( ) - \r\n2 - \r\n3 - \r\n4 - " +Attribute CC_MatchMultiple.VB_ProcData.VB_Invoke_Func = " \n22" + Dim aCell As Excel.Range + Dim sMatch$ + Dim sTarget$: sTarget = ApplyMatchMode(target, nMode) + For Each aCell In iMatchList + Dim sText$: sText = ApplyMatchMode(aCell.Text, nMode) + If VBA.InStr(1, sTarget, sText, vbTextCompare) <> 0 Then + If sMatch <> vbNullString Then _ + sMatch = sMatch & ";" + sMatch = sMatch & aCell + End If + Next aCell + CC_MatchMultiple = sMatch +End Function + +Public Function CC_LookupSubstr(sSearch$, iData As Excel.Range, nColumn&) As Variant +Attribute CC_LookupSubstr.VB_Description = " (HLOOKUP), , " +Attribute CC_LookupSubstr.VB_ProcData.VB_Invoke_Func = " \n22" + If nColumn > iData.Columns.Count Then + CC_LookupSubstr = CVErr(xlErrValue) + Exit Function + End If + + Dim aCell As Excel.Range + Dim nBlank&: nBlank = 0 + For Each aCell In iData.Columns(1).Cells + Dim sText$: sText = aCell.Text + If sText = "" Then + nBlank = nBlank + 1 + If nBlank > BLANKS_LIMIT Then _ + Exit Function + Else + nBlank = 0 + End If + + If VBA.InStr(1, sText, sSearch, vbTextCompare) <> 0 Then + CC_LookupSubstr = aCell.Offset(0, nColumn - 1).Text + Exit Function + End If + Next aCell +End Function + +Public Function CC_LongestDuplicateSuffix(iData As Excel.Range, Optional nMaxLen& = 1000) As String +Attribute CC_LongestDuplicateSuffix.VB_Description = " , 2 " +Attribute CC_LongestDuplicateSuffix.VB_ProcData.VB_Invoke_Func = " \n22" + Dim arrValue As Variant + arrValue = iData.Value + If ArraySize(arrValue, 2) <> 1 Then + CC_LongestDuplicateSuffix = CVErr(xlErrValue) + Exit Function + End If + If ArraySize(arrValue, 1) = 1 Then + CC_LongestDuplicateSuffix = "" + Exit Function + End If + + Dim sInputs() As String: ReDim sInputs(1 To UBound(arrValue)) + Dim nLens() As Long: ReDim nLens(1 To UBound(arrValue)) + Dim nItem& + Dim nOut&: nOut = 1 + Dim sCurrent$ + Dim nCurrentLen&: nCurrentLen = 0 + For nItem = 1 To UBound(arrValue) + sInputs(nOut) = VBA.Right$(CStr(arrValue(nItem, 1)), nMaxLen) + nLens(nOut) = VBA.Len(sInputs(nOut)) + If nLens(nOut) <= nCurrentLen Then _ + GoTo NEXT_ITEM + If nOut = 1 Then + nOut = nOut + 1 + GoTo NEXT_ITEM + End If + + Dim nCompare& + For nCompare = 1 To nOut - 1 Step 1 + If nLens(nCompare) <= nCurrentLen Then _ + GoTo NEXT_COMPARE + If VBA.Right$(sInputs(nOut), nCurrentLen + 1) <> VBA.Right$(sInputs(nCompare), nCurrentLen + 1) Then _ + GoTo NEXT_COMPARE + + Do + nCurrentLen = nCurrentLen + 1 + If nLens(nCompare) <= nCurrentLen Or nLens(nOut) <= nCurrentLen Then _ + Exit Do + If VBA.Mid$(sInputs(nOut), nLens(nOut) - nCurrentLen, 1) <> VBA.Mid$(sInputs(nCompare), nLens(nCompare) - nCurrentLen, 1) Then _ + Exit Do + Loop + + sCurrent = VBA.Right$(sInputs(nOut), nCurrentLen) +NEXT_COMPARE: + Next nCompare + + nOut = nOut + 1 +NEXT_ITEM: + Next nItem + + CC_LongestDuplicateSuffix = sCurrent +End Function + +Public Function CC_LongestDuplicatePrefix(iData As Excel.Range, Optional nMaxLen& = 1000) As String +Attribute CC_LongestDuplicatePrefix.VB_Description = " , 2 " +Attribute CC_LongestDuplicatePrefix.VB_ProcData.VB_Invoke_Func = " \n22" + Dim arrValue As Variant + arrValue = iData.Value + If ArraySize(arrValue, 2) <> 1 Then + CC_LongestDuplicatePrefix = CVErr(xlErrValue) + Exit Function + End If + If ArraySize(arrValue, 1) = 1 Then + CC_LongestDuplicatePrefix = "" + Exit Function + End If + + Dim sInputs() As String: ReDim sInputs(1 To UBound(arrValue)) + Dim nLens() As Long: ReDim nLens(1 To UBound(arrValue)) + Dim nItem& + Dim nOut&: nOut = 1 + Dim sCurrent$ + Dim nCurrentLen&: nCurrentLen = 0 + For nItem = 1 To UBound(arrValue) + sInputs(nOut) = VBA.Left$(CStr(arrValue(nItem, 1)), nMaxLen) + nLens(nOut) = VBA.Len(sInputs(nOut)) + If nLens(nOut) <= nCurrentLen Then _ + GoTo NEXT_ITEM + If nOut = 1 Then + nOut = nOut + 1 + GoTo NEXT_ITEM + End If + + Dim nCompare& + For nCompare = 1 To nOut - 1 Step 1 + If nLens(nCompare) <= nCurrentLen Then _ + GoTo NEXT_COMPARE + If VBA.Left$(sInputs(nOut), nCurrentLen + 1) <> VBA.Left$(sInputs(nCompare), nCurrentLen + 1) Then _ + GoTo NEXT_COMPARE + + Do + nCurrentLen = nCurrentLen + 1 + If nLens(nCompare) <= nCurrentLen Or nLens(nOut) <= nCurrentLen Then _ + Exit Do + If VBA.Mid$(sInputs(nOut), nCurrentLen + 1, 1) <> VBA.Mid$(sInputs(nCompare), nCurrentLen + 1, 1) Then _ + Exit Do + Loop + + sCurrent = VBA.Left$(sInputs(nOut), nCurrentLen) +NEXT_COMPARE: + Next nCompare + + nOut = nOut + 1 +NEXT_ITEM: + Next nItem + + CC_LongestDuplicatePrefix = sCurrent +End Function + +Public Function CC_SLOW_LongestDuplicateSubstring(iData As Excel.Range) As String +Attribute CC_SLOW_LongestDuplicateSubstring.VB_Description = " , 2 \r\n! " +Attribute CC_SLOW_LongestDuplicateSubstring.VB_ProcData.VB_Invoke_Func = " \n22" + Dim arrValue As Variant + arrValue = iData.Value + If ArraySize(arrValue, 2) <> 1 Then + CC_SLOW_LongestDuplicateSubstring = "ERR" + Exit Function + End If + If ArraySize(arrValue, 1) = 1 Then + CC_SLOW_LongestDuplicateSubstring = "" + Exit Function + End If + + Dim sInputs() As String: ReDim sInputs(1 To UBound(arrValue)) + Dim nLens() As Long: ReDim nLens(1 To UBound(arrValue)) + Dim nItem& + For nItem = 1 To UBound(arrValue) + sInputs(nItem) = CStr(arrValue(nItem, 1)) + nLens(nItem) = VBA.Len(sInputs(nItem)) + Next nItem + + CC_SLOW_LongestDuplicateSubstring = RunLCS(sInputs, nLens) +End Function + +Public Function CC_LookupMulti(iData As Excel.Range, sText$, nResultColumn&) As Variant +Attribute CC_LookupMulti.VB_Description = " 1 2.\r\n = 3 , 2" +Attribute CC_LookupMulti.VB_ProcData.VB_Invoke_Func = " \n22" + If nResultColumn > iData.Columns.Count Then + CC_LookupMulti = CVErr(xlErrValue) + Exit Function + End If + + Dim aCell As Excel.Range + Dim nBlank&: nBlank = 0 + For Each aCell In iData.Columns(1).Cells + Dim sSearch$: sSearch = aCell.Text + If sSearch = "" Then + nBlank = nBlank + 1 + If nBlank > BLANKS_LIMIT Then _ + Exit Function + Else + nBlank = 0 + End If + + If VBA.InStr(1, sText, sSearch, vbTextCompare) <> 0 Then + CC_LookupMulti = aCell.Offset(0, nResultColumn - 1).Text + Exit Function + End If + Next aCell + CC_LookupMulti = "" +End Function + +Public Function CC_LookupMultiCount(iData As Excel.Range, sText$) As Variant +Attribute CC_LookupMultiCount.VB_Description = " LookupMulti, " +Attribute CC_LookupMultiCount.VB_ProcData.VB_Invoke_Func = " \n22" + Dim aCell As Excel.Range + Dim nBlank&: nBlank = 0 + CC_LookupMultiCount = 0 + For Each aCell In iData.Columns(1).Cells + Dim sSearch$: sSearch = aCell.Text + If sSearch = "" Then + nBlank = nBlank + 1 + If nBlank > BLANKS_LIMIT Then _ + Exit Function + Else + nBlank = 0 + End If + + If VBA.InStr(1, sText, sSearch, vbTextCompare) <> 0 Then + CC_LookupMultiCount = CC_LookupMultiCount + 1 + End If + Next aCell +End Function + +Public Function CC_LookupMultiAll(iData As Excel.Range, sText$, nResultColumn&) As Variant +Attribute CC_LookupMultiAll.VB_Description = " LookupMulti, " +Attribute CC_LookupMultiAll.VB_ProcData.VB_Invoke_Func = " \n22" + If nResultColumn > iData.Columns.Count Then + CC_LookupMultiAll = CVErr(xlErrValue) + Exit Function + End If + + Dim aCell As Excel.Range + Dim nBlank&: nBlank = 0 + CC_LookupMultiAll = "" + For Each aCell In iData.Columns(1).Cells + Dim sSearch$: sSearch = aCell.Text + If sSearch = "" Then + nBlank = nBlank + 1 + If nBlank > BLANKS_LIMIT Then _ + Exit Function + Else + nBlank = 0 + End If + + If VBA.InStr(1, sText, sSearch, vbTextCompare) <> 0 Then + If CC_LookupMultiAll <> "" Then _ + CC_LookupMultiAll = CC_LookupMultiAll & ";" + CC_LookupMultiAll = CC_LookupMultiAll & aCell.Offset(0, nResultColumn - 1) + End If + Next aCell +End Function + +' ======= +Private Function UnregisterMacto(sMacro$) + On Error Resume Next + Call Excel.Application.MacroOptions(Macro:=sMacro, Category:=Empty, Description:=Empty) +End Function + +Private Function ApplyMatchMode(sText$, nMode As TMatchMode) As String + Select Case nMode + Case T_MM_DEFAULT: ApplyMatchMode = sText + Case T_MM_SPACE_LEFT: ApplyMatchMode = " " & sText + Case T_MM_SPACE_RIGHT: ApplyMatchMode = sText & " " + Case T_MM_SPACE_BOTH: ApplyMatchMode = " " & sText & " " + End Select +End Function + +Private Function RunLCS(sInputs() As String, nLens() As Long) As String + Dim sCurrent$ + Dim nCurrentLen&: nCurrentLen = 0 + + Dim nSample& + For nSample = 1 To UBound(sInputs) - 1 Step 1 + Dim nSampleLen&: nSampleLen = nLens(nSample) + If nSampleLen <= nCurrentLen Then _ + GoTo NEXT_SAMPLE + + Dim nSubstr& + Dim nPos& + Dim nCompare& + For nSubstr = nSampleLen To nCurrentLen + 1 Step -1 + For nPos = 1 To nSampleLen - nSubstr + 1 Step 1 + Dim sSample$: sSample = VBA.Mid$(sInputs(nSample), nPos, nSampleLen) + For nCompare = nSample + 1 To UBound(sInputs) Step 1 + If nLens(nCompare) < nSampleLen Then _ + GoTo NEXT_COMPARE + Dim nFound&: nFound = VBA.InStr(nPos, sInputs(nCompare), sSample, vbTextCompare) + If nFound <> 0 Then + nCurrentLen = nSubstr + sCurrent = sSample + GoTo NEXT_SAMPLE + End If +NEXT_COMPARE: + Next nCompare + Next nPos + Next nSubstr +NEXT_SAMPLE: + Next nSample + + RunLCS = sCurrent +End Function diff --git a/src/RelocateDlg.frm b/src/RelocateDlg.frm new file mode 100644 index 0000000..39a932f --- /dev/null +++ b/src/RelocateDlg.frm @@ -0,0 +1,78 @@ +VERSION 5.00 +Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} RelocateDlg + Caption = " " + ClientHeight = 1740 + ClientLeft = 120 + ClientTop = 465 + ClientWidth = 6840 + OleObjectBlob = "RelocateDlg.frx":0000 + StartUpPosition = 1 'CenterOwner +End +Attribute VB_Name = "RelocateDlg" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Explicit + +Private prefixInit_ As String +Private fso_ As Scripting.FileSystemObject + +Public isCancelled_ As Boolean + +Private Sub UserForm_Initialize() + isCancelled_ = True + Set fso_ = New Scripting.FileSystemObject +End Sub + +Public Function Init(sFilesLocation$) + prefixInit_ = sFilesLocation +End Function + +Public Property Get Path() As String + Path = TBTargetPath.Text +End Property + +Public Property Get Prefix() As String + Prefix = TBPrefix.Text +End Property + +' ====== Internal API +Private Sub OkBtn_Click() + If Not ValidateData Then + Call UserInteraction.ShowMessage(EM_RELOCATE_DATA_FAIL) + Else + isCancelled_ = False + Call Me.Hide + End If +End Sub + +Private Sub CancelBtn_Click() + isCancelled_ = True + Call Me.Hide +End Sub + +Private Sub BtnPrefix_Click() + Dim sFolder$: sFolder = UserInteraction.PromptFolder(prefixInit_ & "\") + If sFolder <> vbNullString Then _ + TBPrefix.Text = sFolder +End Sub + +Private Sub BtnTargetPath_Click() + Dim sFolder$: sFolder = UserInteraction.PromptFolder(ThisWorkbook.Path & "\") + If sFolder <> vbNullString Then _ + TBTargetPath.Text = sFolder +End Sub + +' ===== +Private Function ValidateData() As Boolean + ValidateData = False + + Dim sPath$: sPath = Path + If sPath = vbNullString Then _ + Exit Function + If Not fso_.FolderExists(sPath) Then _ + Exit Function + + ValidateData = True +End Function diff --git a/src/RelocateDlg.frx b/src/RelocateDlg.frx new file mode 100644 index 0000000000000000000000000000000000000000..416233669783c0e94ec4bf6072d628ec32ee432e GIT binary patch literal 3608 zcmeHIO-NKx6#m}K^)IJ#BrSiiDO^Mh(X_r$I8qV8+tn_k zjhliNp|q4K{zTc1n=X#bKiaEe&^itce_KyzyYj} z*&3jt1o-&D`|ZW+>ZSD`&g4AYSj(26aKjISb0Iy-02e3ny_U^p?L~moy|Iftuu5Ac zenN^tEO6qvi;l2o>JB{6hZLU-d}zlQc^da}rJNV9WX9ywOFvjioP7Vaa?$&I8n1Bu zN@OF*)O5w1=iwK_&Bb|1HjY7?ZTqd*g>w3Z=L_`KX=JH?4(uq(|&0muuu8 ziC2JLD|fh@e{bwA4?xwU*i+__7)$j?Oz{9Xb_!UPpgY6ew_N(<@uK(HGV8i)?wYXx zOc`w<1BKDpa4H$I)8(e*(<37ZoWM`cnM#%{HIkwlssi1yxH;MYeCGEITz-lIwWMkl zR!u6Xe7K;R)kV@d(j^sAr`1#1GAl?fADYRSf7TND0_!N6NSYJA9`lZ`kA^U_9n5O} zuTu@`GWWM=RKaZH*BPP~y0?aT2rP7qkf`aj{3|s0zSMAD_UvS@A05WL)+=Xbtyxl^ zbcMy5wLbABb_5YXAP}HEM=;6%;`o>33obY808NgIU-HAkCRhpTsnv0l-ciR0wd!aE zRTUdXgf`{uU>~to96Q3X(L_8gdzU4UTQTR>T92U4#^l#Se?9PO2QwdFX; z4TCp;o6^$t{=WOGD0DT^pH5Ar1~a~nR604~YYYVSOgEbLWZWDWFb8~*_=wq`fm|+H VEFkYd1Aer;xt-Ir$Nz^1egiR0YVrU8 literal 0 HcmV?d00001 diff --git a/src/SearchDlg.frm b/src/SearchDlg.frm new file mode 100644 index 0000000..9a871c9 --- /dev/null +++ b/src/SearchDlg.frm @@ -0,0 +1,96 @@ +VERSION 5.00 +Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} SearchDlg + Caption = " " + ClientHeight = 5370 + ClientLeft = 120 + ClientTop = 465 + ClientWidth = 4575 + OleObjectBlob = "SearchDlg.frx":0000 + StartUpPosition = 1 'CenterOwner +End +Attribute VB_Name = "SearchDlg" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Explicit + +Public isCancelled_ As Boolean + +Private dataSource_ As Excel.Workbook + +Public Function Init(targetWB As Excel.Workbook) + isCancelled_ = True + Set dataSource_ = targetWB +End Function + +Public Function ResultParams() As ParametersSearch + Set ResultParams = New ParametersSearch + With ResultParams + .ignoreSmall_ = CBIgnoreWords.Value + .partialMatch_ = Not CBFindWhole.Value + .normalize_ = CBNormalize.Value + .outputText_ = CBOutputText.Value + .smallSize_ = TBSymbolLimit.Value + Set .searchWhere_ = Excel.Range(TBSearchRange.Text) + Set .searchWhat_ = Excel.Range(TBQueryRange.Text) + End With +End Function + +Private Sub BtnCancel_Click() + isCancelled_ = True + Call Me.Hide +End Sub + +Private Sub BtnOK_Click() + If Not ValidateData Then + Call UserInteraction.ShowMessage(EM_DIALOG_DATA_INVALID) + Else + isCancelled_ = False + Call Me.Hide + End If +End Sub + +Private Sub BtnSearchRange_Click() + Call Me.Hide + + Dim iRange As Excel.Range + On Error Resume Next + Set iRange = Excel.Application.InputBox( _ + Title:=" ", _ + Prompt:=" , ", _ + Type:=8) + On Error GoTo 0 + + If Not iRange Is Nothing Then _ + TBSearchRange.Text = iRange.Address(External:=True) + + Call Me.Show +End Sub + +Private Sub BtnQueryRange_Click() + Call Me.Hide + + Dim iRange As Excel.Range + On Error Resume Next + Set iRange = Excel.Application.InputBox( _ + Title:=" ", _ + Prompt:=" , ", _ + Type:=8) + On Error GoTo 0 + + If Not iRange Is Nothing Then _ + TBQueryRange.Text = iRange.Address(External:=True) + + Call Me.Show +End Sub + +' ======== +Private Function ValidateData() As Boolean + ValidateData = False + If TBQueryRange.Text = vbNullString Then _ + Exit Function + If TBSearchRange.Text = vbNullString Then _ + Exit Function + ValidateData = True +End Function diff --git a/src/SearchDlg.frx b/src/SearchDlg.frx new file mode 100644 index 0000000000000000000000000000000000000000..750e3a01d804f1c82d900c18f245f46f7ad8976b GIT binary patch literal 4632 zcmeHKOH5o<82<0fftHq1UPVf2d#SAu(@bE1@*aj6pbwB~fdpgR%rLhwbslvXVyPPM z!Wb7#syh=Oi3?-n!bB5|OII!oXekMbEMQWum?qD5$Lgc$UH9vm%S<}73L4FYsuRL6bp6KnhL@ZBoRiC?2s>CSR3TSB=dH3hsFe`d z{&)lO4c0)i+p2u}$;=m4L&DG@C08XPF}bpBWoma||5K2X&P$^1M*!4+{r$&_Ar%0I zYCoV7Z~#yRI0(QKAT0qiAr(+T)e8tHziL+@HK|M)Q3LsJQ~EVV zK%G_H>fKMp({t)b7WHU_Cj*bAM|{IL_QRB4PzdOs4kSuriLJ%h1+eQxEd)Od zA;$E}IDQAPW>g267#qbi%Cnq7zsBLaTFqgwz^O${ISw9!R}d5QD(1}H=+8lM+rTk89;_R+L+RTZ{`cNrnk5b=4J98{1eSE@Z9V&;g=S5 zNSy+%vq!H^s4;wxf>S#rn&Jnvs%l`KP>onSG3bWIf5&_Q_2Dodh|Tj<$BnV!n?fu4 z!Hsuqi+K+EW_@S)1|5U_gRq?brhM{YUMyom-)cX=yz22vIGRkvvI(5EYg)cLwXlI6 z8PNIRRF9&EM83eqo!XRNz2*lr+voEo+?wI)P^=f;e7*4NdrJGaNAv84cghD|Zf)#< z4o6{A5MF85x1|SP#p>usZt*S^t0agwx<}ey$qnU>g7i5&;<_fIM$(_1kQ^?_LdK;} z=jIT+>|}EY8uaTNck(Nu>vJFWdf}T#)M&`tWZcC$%Wvs>!w3!n3^XFMp_!FbER&o} zq!KyowW2p!k6)I@_c-`gG&{dI9ZfG-*snsr^D#<_An3niW_bDU5uc|?fEP{AWHe?a zI}$=&TwK0=NLQOFPhFJeeQDXsu4vZe`z-~R@MWvz@-1`u`W?P5F8QJzv)Pip4k$;1 z6%LIj(($>)OwzKb1D}vmzPvW%`yOcbxO_VuzBBCCN_1e0N8BJ_uZ!Cyavpu6I*Y%hUg+-pMx8j08gfogXi=L;AgX~ z#1U-NJZDOS@iT-v{w?+vY(a@%>EIU~jNlP}z29nqdkt_v`)w+dO`%R)w{+|l=qUKY zjUC&f8-OZ}8(Gd>UCzx~*K&8UM;pacsaxD%Uo&J4c5ZtZ=ytt`Iy=1e|2wgFekL)W z%`9au=ge^^x@7u&?Ruq~@3B nStart And nCur - nStart >= params_.smallSize_ Then _ + Call iWords.Add(VBA.Mid$(sText, nStart, nCur - nStart)) + nStart = nCur + 1 + End If + nCur = nCur + 1 + Loop + + If nCur > nStart And nCur - nStart >= params_.smallSize_ Then _ + Call iWords.Add(VBA.Mid$(sText, nStart, nCur - nStart)) + Set ExtractWords = iWords +End Function + +Private Function ResetFoundIDs() + ReDim foundIDs_(1 To queryCount_) + Dim nItem& + For nItem = 1 To queryCount_ Step 1 + Set foundIDs_(nItem) = New Collection + Next nItem +End Function + +Private Function ResetWordCounts() + ReDim wordCounts_(1 To queryCount_) +End Function + +Private Function CountNonEmpty(target As Excel.Range) As Long + Dim emptyIndex&: emptyIndex = XLFirstEmptyCell(target) + If emptyIndex = -1 Then + CountNonEmpty = target.Count + Else + CountNonEmpty = emptyIndex - 1 + End If +End Function + +Private Function ListIDs(nItem&) As String + ListIDs = "" + Dim vID As Variant + For Each vID In foundIDs_(nItem) + If ListIDs <> "" Then _ + ListIDs = ListIDs & ", " + ListIDs = ListIDs & CStr(vID) + Next vID +End Function + +Private Function OutputWords(nItem&) + Dim nColumn&: nColumn = S_SR_DATA + Dim vID As Variant + For Each vID In foundIDs_(nItem) + out_.Cells(nItem, nColumn) = params_.searchWhere_(CLng(vID)) + nColumn = nColumn + 1 + If nColumn >= MAX_COLUMNS Then _ + Exit For + Next vID +End Function + +Private Function IsDelim(sSymbol$) As Boolean + IsDelim = True + If sSymbol = Chr(13) Then + Exit Function + ElseIf sSymbol = Chr(10) Then + Exit Function + ElseIf sSymbol = "," Then + Exit Function + ElseIf sSymbol = ChrW(&H2013) Then _ + Exit Function + ElseIf sSymbol = ChrW(&H2012) Then _ + Exit Function + ElseIf sSymbol = ChrW(&H2010) Then _ + Exit Function + ElseIf sSymbol = ";" Then + Exit Function + ElseIf sSymbol = " " Then + Exit Function + ElseIf sSymbol = "!" Then + Exit Function + ElseIf sSymbol = ":" Then + Exit Function + ElseIf sSymbol = "?" Then + Exit Function + ElseIf sSymbol = """" Then + Exit Function + ElseIf sSymbol = ")" Then + Exit Function + ElseIf sSymbol = "(" Then + Exit Function + ElseIf sSymbol = "Chr(85)" Then + Exit Function + End If + IsDelim = False +End Function + + diff --git a/src/WordDlg.frm b/src/WordDlg.frm new file mode 100644 index 0000000..7323eb1 --- /dev/null +++ b/src/WordDlg.frm @@ -0,0 +1,55 @@ +VERSION 5.00 +Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} WordDlg + Caption = " " + ClientHeight = 3300 + ClientLeft = 120 + ClientTop = 465 + ClientWidth = 4770 + OleObjectBlob = "WordDlg.frx":0000 + StartUpPosition = 1 'CenterOwner +End +Attribute VB_Name = "WordDlg" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Explicit + +Private bUpdate_ As Boolean +Public isCanceled_ As Boolean + +Private Sub UserForm_Initialize() + isCanceled_ = True + Call PositionInMiddle(Me) +End Sub + +Public Function Init(opts As AddinOptions) + isCanceled_ = True + CBConcept.Value = opts.data_.Item(T_WA_CONCEPT) + CBNpa.Value = opts.data_.Item(T_WA_NPA) + CBMarkup.Value = opts.data_.Item(T_WA_MARKUP) + CBParsers.Value = opts.data_.Item(T_WA_PARSERS) + CBMaket.Value = opts.data_.Item(T_WA_MAKET) +End Function + +Public Function GetResult() As AddinOptions + Set GetResult = New AddinOptions + With GetResult + .data_.Item(T_WA_CONCEPT) = CBConcept.Value + .data_.Item(T_WA_NPA) = CBNpa.Value + .data_.Item(T_WA_MARKUP) = CBMarkup.Value + .data_.Item(T_WA_PARSERS) = CBParsers.Value + .data_.Item(T_WA_MAKET) = CBMaket.Value + End With +End Function + +' ======= +Private Sub BtnCancel_Click() + isCanceled_ = True + Call Me.Hide +End Sub + +Private Sub BtnOK_Click() + isCanceled_ = False + Call Me.Hide +End Sub diff --git a/src/WordDlg.frx b/src/WordDlg.frx new file mode 100644 index 0000000000000000000000000000000000000000..6d444ed5cfcb4951f3c1fab5d51658aceef3d350 GIT binary patch literal 3608 zcmeHJO-xfk5T4gA2!cpah&BQ*N({k3N|n%7TFWb-5wJ)|JeRgae)?lu4~Ce$gNZRA z5j}a)#CXtn(~}2Hdh$fjg9i_Wh{U@G6XQYZH~ZehMlC6L!GtCAc6N6<-^}dHEF)SK zQ5|iJy9bCm_Y=K+C*Xdu@ZIRQG@r%d&Q1Tof8dX%9ytO73e}1KF{SUnl~F+s@xxxkORKLs@SJ; z@i|Tt`~wVyLWqBY(iEminlU!F@NL+J{|BKzX=1SLXywv=tNyv??*ZY(plZ-wPz|US zv=7A32%Zkv_Z^rUKzL5%y3w4A?_`(Xxe*}IMpd=-wS321J$#RJooGcRdey`WW7x;n zYVO=#cHCb>T@Syws4NjJDg&BAl@pQ6sYJv`nRd>noBU~~&zO)tI$pf7uNbb6F_03*QlPyL=N?vEx$aNh#u5*0=U-w~NX(pNn zz6-olw1{SLTr`SSaa5?(Nh$?IKYR!XxAY{8UH0e{b~RWQ5MJTK+K2XWhBm_wuw9VwKtd%I-yYKz7uJS! zNn3zLwsc8bhHxBhG2`(UTT~$T%Dd2{*G7bbf9z_o$tSJixH0BtvDv;oM}X{=vG9wN zW{fATX3;{%@YeL&H08=MPntSv;&ogmH_*$0UL zBvd+q-2ut>VP6B4j1Akeg~7d>+GMR(AO(?qGzL;g)@pbb{5w#$l>1fF9E}?w8#yVY zg;FT#bPhHBSTW>_bwV#Kfb3HCLOKGT<&Lou6B|#B&QH!FNJzQSNCsudav44->L>gx zv0R0e8;fMJ@l4jl&T}6#b>e3_FB!Yi)H#c?Vx8Oy + \ No newline at end of file diff --git a/ui/customUI.xml b/ui/customUI.xml new file mode 100644 index 0000000..85d790d --- /dev/null +++ b/ui/customUI.xml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +