色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

VBA數(shù)組篩選進(jìn)階:超越原生Filter,實(shí)現(xiàn)多條件、多模式與多維數(shù)組處理

VBA數(shù)組篩選進(jìn)階:超越原生Filter,實(shí)現(xiàn)多條件、多模式與多維數(shù)組處理 1. 項(xiàng)目概述從“能用”到“好用”的VBA數(shù)組篩選之路在VBA的日常開發(fā)里處理數(shù)組篩選是家常便飯。系統(tǒng)自帶的Filter函數(shù)用起來確實(shí)順手一句Filter(源數(shù)組, 匹配字符串, 包含, 比較模式)就能快速返回一個(gè)包含子串的結(jié)果數(shù)組。但用久了尤其是在處理稍微復(fù)雜點(diǎn)的數(shù)據(jù)清洗、報(bào)表生成或者自動(dòng)化核對任務(wù)時(shí)它的“脾氣”和“局限”就暴露無遺了。最讓人頭疼的莫過于它只能進(jìn)行基于字符串的“模糊包含”匹配你想按精確相等、數(shù)值范圍、多條件“與/或”邏輯來篩對不起Filter函數(shù)攤攤手表示辦不到。另一個(gè)坑是它的返回結(jié)果永遠(yuǎn)是一維的字符串?dāng)?shù)組如果你的源數(shù)據(jù)是二維的或者里面混著數(shù)字、日期Filter要么報(bào)錯(cuò)要么給你轉(zhuǎn)成字符串后續(xù)處理起來非常別扭。所以當(dāng)項(xiàng)目里又一次因?yàn)镕ilter無法實(shí)現(xiàn)“篩選出金額大于1000且部門為‘銷售部’的記錄”而不得不寫一長串循環(huán)時(shí)我決定不再將就。這次的目標(biāo)很明確自己動(dòng)手寫一個(gè)能完全模仿Filter基礎(chǔ)功能同時(shí)又能突破其核心局限的自定義函數(shù)。它不僅要能處理Filter能做的字符串包含篩選更要搞定Filter做不了的精確匹配、多條件、非字符串?dāng)?shù)據(jù)類型、多維數(shù)組篩選。這不僅僅是再造一個(gè)輪子而是打造一個(gè)更適應(yīng)復(fù)雜現(xiàn)實(shí)場景的“瑞士軍刀”。2. 核心需求與設(shè)計(jì)思路拆解2.1 深入剖析原生Filter函數(shù)的“阿喀琉斯之踵”在動(dòng)手之前必須先把標(biāo)準(zhǔn)Filter函數(shù)的局限性摸透這樣才能有的放矢。它的局限主要體現(xiàn)在四個(gè)方面匹配模式單一且不可控這是最根本的局限。Filter函數(shù)本質(zhì)上是一個(gè)“字符串包含”篩選器。它的Match參數(shù)必須是一個(gè)字符串函數(shù)的行為就是在源數(shù)組的每個(gè)元素中查找是否包含這個(gè)字符串。你無法將其改為“等于”、“以...開頭”、“以...結(jié)尾”或“正則表達(dá)式匹配”。例如你想從數(shù)組[“蘋果”, “香蕉”, “葡萄”]中精確找出“蘋果”用Filter(arr, “蘋果”, True, vbTextCompare)會(huì)把包含“蘋果”字的都找出來如果存在“紅蘋果”也會(huì)被選中而這往往不是我們想要的。數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換與丟失Filter的輸入數(shù)組和輸出數(shù)組都被強(qiáng)制限定為字符串類型Variant/String。如果你傳入一個(gè)包含數(shù)字、日期、布爾值的數(shù)組VBA會(huì)隱式地將它們?nèi)哭D(zhuǎn)換為字符串再進(jìn)行匹配。這會(huì)導(dǎo)致兩個(gè)問題一是精度可能丟失例如數(shù)字123.456可能變成“123.456”二是匹配邏輯變得詭異。比如你想從[123, 234, 345]中篩選出包含“23”的元素Filter會(huì)返回[123, 234]但這本質(zhì)是在字符串“123”和“234”中查找“23”而非數(shù)值比較。更麻煩的是輸出結(jié)果是一個(gè)一維字符串?dāng)?shù)組原始的數(shù)據(jù)類型信息徹底丟失給后續(xù)計(jì)算帶來隱患。無法處理多維數(shù)組Filter函數(shù)只接受一維數(shù)組作為輸入。在實(shí)際業(yè)務(wù)中我們經(jīng)常從Excel的Range.Value屬性直接得到一個(gè)二維數(shù)組或者自己構(gòu)建多維數(shù)組來存儲(chǔ)表格數(shù)據(jù)。面對這樣的數(shù)據(jù)源Filter函數(shù)會(huì)直接拋出“類型不匹配”或“下標(biāo)越界”的錯(cuò)誤迫使開發(fā)者必須先通過循環(huán)將其展平為一維篩選后再重組過程繁瑣且低效。多條件篩選能力缺失現(xiàn)實(shí)場景中的篩選很少是單條件的。Filter函數(shù)一次只能接受一個(gè)匹配字符串和一個(gè)是否包含的邏輯。要實(shí)現(xiàn)“條件A與條件B”或者“條件A或條件B”必須多次調(diào)用Filter并進(jìn)行數(shù)組間的交集或并集操作代碼會(huì)變得冗長且難以維護(hù)。2.2 自定義函數(shù)SuperFilter的頂層設(shè)計(jì)基于以上痛點(diǎn)我設(shè)計(jì)的自定義函數(shù)SuperFilter需要實(shí)現(xiàn)以下核心目標(biāo)功能目標(biāo)兼容模式完全復(fù)刻原生Filter函數(shù)的所有參數(shù)和功能作為保底選項(xiàng)。擴(kuò)展模式提供多種匹配模式精確、開頭、結(jié)尾、包含、正則支持?jǐn)?shù)值/日期等非字符串類型的直接比較。多條件支持允許傳入一個(gè)條件數(shù)組并指定條件間的邏輯關(guān)系A(chǔ)ND 或 OR。多維數(shù)組支持能夠直接處理二維數(shù)組并可以指定按行篩選還是按列篩選返回一個(gè)結(jié)構(gòu)保持的二維子數(shù)組。數(shù)據(jù)類型保持輸出數(shù)組的元素?cái)?shù)據(jù)類型盡量與輸入數(shù)組對應(yīng)元素保持一致。接口設(shè)計(jì)Function SuperFilter(SourceArray As Variant, _ Match As Variant, _ Optional Include As Boolean True, _ Optional Compare As VbCompareMethod vbBinaryCompare, _ Optional MatchMode As String “contains”, _ Optional ConditionLogic As String “AND”, _ Optional Dimension As Long 1) As VariantSourceArray: 源數(shù)組接受一維或二維Variant數(shù)組。Match: 匹配條件。可以是單個(gè)值字符串、數(shù)字、日期等也可以是一個(gè)一維條件數(shù)組。Include: 是否包含。True返回匹配項(xiàng)False返回不匹配項(xiàng)與Filter一致。Compare: 字符串比較模式vbBinaryCompare區(qū)分大小寫或vbTextCompare不區(qū)分。MatchMode: 匹配模式??蛇x“exact”精確、“startswith”開頭、“endswith”結(jié)尾、“contains”包含默認(rèn)、“regex”正則表達(dá)式。ConditionLogic: 當(dāng)Match為數(shù)組時(shí)條件間的邏輯。“AND”所有條件都滿足或“OR”任一條件滿足。Dimension: 對二維數(shù)組的篩選維度。1表示按行篩選返回符合條件的整行2表示按列篩選。內(nèi)部邏輯流程輸入驗(yàn)證與初始化檢查SourceArray是否是數(shù)組判斷其維數(shù)。根據(jù)維數(shù)和Dimension參數(shù)確定循環(huán)遍歷的方式是遍歷行還是列。條件預(yù)處理將Match參數(shù)統(tǒng)一處理為一個(gè)條件數(shù)組condArr()并確定匹配模式MatchMode。如果是多條件需明確ConditionLogic。核心遍歷與匹配判斷遍歷源數(shù)組的每一個(gè)目標(biāo)元素可能是一行、一列或一個(gè)單元素。對每個(gè)元素根據(jù)MatchMode調(diào)用對應(yīng)的匹配判斷函數(shù)并結(jié)合ConditionLogic計(jì)算最終是否匹配。結(jié)果收集與數(shù)組構(gòu)建動(dòng)態(tài)收集所有匹配項(xiàng)的索引。遍歷結(jié)束后根據(jù)收集的索引從源數(shù)組中提取對應(yīng)元素/行/列構(gòu)建一個(gè)新的、結(jié)構(gòu)正確的Variant數(shù)組作為結(jié)果返回。錯(cuò)誤處理在整個(gè)過程中加入必要的錯(cuò)誤捕獲例如無效的匹配模式、維度參數(shù)錯(cuò)誤、正則表達(dá)式編譯失敗等并返回一個(gè)可識(shí)別的錯(cuò)誤值如Empty數(shù)組或拋出描述性錯(cuò)誤。3. 核心細(xì)節(jié)解析與關(guān)鍵技術(shù)實(shí)現(xiàn)3.1 多模式匹配引擎的實(shí)現(xiàn)這是SuperFilter函數(shù)的核心也是與原生Filter最大的區(qū)別。我們需要一個(gè)統(tǒng)一的判斷函數(shù)它能根據(jù)MatchMode參數(shù)采用不同的邏輯進(jìn)行比較。首先定義一個(gè)內(nèi)部幫助函數(shù)IsMatchPrivate Function IsMatch(ByVal SourceValue As Variant, _ ByVal ConditionValue As Variant, _ ByVal MatchMode As String, _ ByVal CompareMethod As VbCompareMethod) As Boolean ‘ 處理空值情況 If IsEmpty(SourceValue) Or IsEmpty(ConditionValue) Then IsMatch False Exit Function End If Dim srcStr As String, condStr As String Dim regex As Object On Error GoTo ErrorHandler Select Case LCase(Trim(MatchMode)) Case “exact” ‘精確匹配 If VarType(SourceValue) vbString And VarType(ConditionValue) vbString Then IsMatch (StrComp(SourceValue, ConditionValue, CompareMethod) 0) Else ‘ 非字符串類型使用等號(hào)直接比較注意Variant的比較方式 IsMatch (SourceValue ConditionValue) End If Case “startswith” ‘開頭匹配 srcStr CStr(SourceValue) condStr CStr(ConditionValue) If CompareMethod vbTextCompare Then IsMatch (InStr(1, srcStr, condStr, vbTextCompare) 1) Else IsMatch (Left(srcStr, Len(condStr)) condStr) End If Case “endswith” ‘結(jié)尾匹配 srcStr CStr(SourceValue) condStr CStr(ConditionValue) If CompareMethod vbTextCompare Then ‘ 通過StrComp比較末尾部分稍微復(fù)雜一點(diǎn) IsMatch (StrComp(Right(srcStr, Len(condStr)), condStr, CompareMethod) 0) Else IsMatch (Right(srcStr, Len(condStr)) condStr) End If Case “contains” ‘包含匹配 (模擬原生Filter) srcStr CStr(SourceValue) condStr CStr(ConditionValue) IsMatch (InStr(1, srcStr, condStr, CompareMethod) 0) Case “regex” ‘正則表達(dá)式匹配 Set regex CreateObject(“VBScript.RegExp”) regex.Pattern CStr(ConditionValue) regex.IgnoreCase (CompareMethod vbTextCompare) regex.Global False IsMatch regex.Test(CStr(SourceValue)) Set regex Nothing Case Else ‘ 默認(rèn)使用包含匹配 srcStr CStr(SourceValue) condStr CStr(ConditionValue) IsMatch (InStr(1, srcStr, condStr, CompareMethod) 0) End Select Exit Function ErrorHandler: ‘ 例如正則表達(dá)式模式無效 IsMatch False End Function關(guān)鍵點(diǎn)與避坑指南數(shù)據(jù)類型處理在“exact”模式下我們優(yōu)先判斷是否為字符串是則用StrComp函數(shù)以支持大小寫敏感控制否則直接用等號(hào)比較。這比原生Filter全部轉(zhuǎn)字符串更合理。性能考量正則表達(dá)式對象的創(chuàng)建和銷毀CreateObject和Set regex Nothing有一定開銷。如果在一個(gè)大數(shù)據(jù)集的循環(huán)中頻繁使用“regex”模式會(huì)成為性能瓶頸??梢钥紤]將正則對象創(chuàng)建移到主函數(shù)中作為可選參數(shù)傳入但會(huì)增大接口復(fù)雜度。對于一般應(yīng)用在IsMatch內(nèi)部創(chuàng)建是清晰簡單的做法??罩堤幚鞩sEmpty判斷至關(guān)重要。VBA數(shù)組中經(jīng)常存在Empty值直接對其進(jìn)行字符串轉(zhuǎn)換或比較可能導(dǎo)致類型不匹配錯(cuò)誤。這里選擇將任何一方為Empty的匹配直接判定為False邏輯上更安全。3.2 動(dòng)態(tài)數(shù)組構(gòu)建與結(jié)果收集策略原生Filter函數(shù)內(nèi)部知道結(jié)果數(shù)量可以直接分配一個(gè)大小合適的數(shù)組。我們的自定義函數(shù)在遍歷完成前無法預(yù)知有多少項(xiàng)符合條件。因此需要一種動(dòng)態(tài)收集匹配項(xiàng)索引或引用最后再構(gòu)建結(jié)果數(shù)組的策略。我采用了Collection對象作為中間容器來收集匹配行的索引對于一維數(shù)組或匹配行的索引數(shù)組對于二維數(shù)組按行篩選。Collection在VBA中對于動(dòng)態(tài)增刪非常高效?!?假設(shè)我們已經(jīng)確定是二維數(shù)組按行篩選 (Dimension 1) Dim matchedRows As New Collection Dim i As Long, j As Long Dim rowMatchesAllConditions As Boolean Dim conditionArr As Variant ‘ 假設(shè)這是處理好的條件數(shù)組 Dim matchModeStr As String ‘ 假設(shè)這是匹配模式 For i LBound(SourceArray, 1) To UBound(SourceArray, 1) ‘ 遍歷每一行 rowMatchesAllConditions True ‘ 假設(shè)初始匹配用于AND邏輯 ‘ 對于當(dāng)前行檢查所有條件 For j LBound(conditionArr) To UBound(conditionArr) ‘ 這里需要根據(jù)條件與行的對應(yīng)關(guān)系進(jìn)行比較可能只比較特定列 ‘ 假設(shè)條件數(shù)組的每個(gè)元素是一個(gè)結(jié)構(gòu)體或數(shù)組包含“比較值”和“比較列索引” ‘ 這里簡化為直接比較當(dāng)前行的第一列與條件值 If Not IsMatch(SourceArray(i, 1), conditionArr(j), matchModeStr, Compare) Then If ConditionLogic “AND” Then rowMatchesAllConditions False Exit For ‘ AND邏輯下一個(gè)條件不滿足整行就不滿足 End If Else If ConditionLogic “OR” Then rowMatchesAllConditions True Exit For ‘ OR邏輯下一個(gè)條件滿足整行就滿足 End If End If Next j ‘ 根據(jù)Include參數(shù)和匹配結(jié)果決定是否收集 If (rowMatchesAllConditions And Include) Or (Not rowMatchesAllConditions And Not Include) Then matchedRows.Add i ‘ 收集行號(hào) End If Next i遍歷結(jié)束后matchedRows這個(gè)Collection里就存放了所有符合條件的行號(hào)。接下來根據(jù)這個(gè)行號(hào)集合來構(gòu)建結(jié)果數(shù)組If matchedRows.Count 0 Then ‘ 沒有匹配項(xiàng)返回一個(gè)空的數(shù)組 SuperFilter Array() ‘ 返回一個(gè)包含0個(gè)元素的數(shù)組 Else ‘ 根據(jù)源數(shù)組的維度和篩選維度構(gòu)建結(jié)果數(shù)組 Dim resultArr() As Variant Dim targetRowIndex As Long, srcRowIndex As Long Dim colCount As Long ‘ 計(jì)算列數(shù)對于按行篩選 colCount UBound(SourceArray, 2) - LBound(SourceArray, 2) 1 ‘ 重新定義結(jié)果數(shù)組的大小 ReDim resultArr(1 To matchedRows.Count, 1 To colCount) targetRowIndex 1 For Each srcRowIndex In matchedRows ‘ 遍歷收集到的行號(hào) For j 1 To colCount ‘ 復(fù)制數(shù)據(jù)保持原數(shù)據(jù)類型 resultArr(targetRowIndex, j) SourceArray(srcRowIndex, j) Next j targetRowIndex targetRowIndex 1 Next srcRowIndex SuperFilter resultArr End If實(shí)操心得使用Collection而非ReDim Preserve在循環(huán)內(nèi)部頻繁使用ReDim Preserve來擴(kuò)大數(shù)組是非常低效的因?yàn)槊看蜳reserveVBA都需要在內(nèi)存中創(chuàng)建一個(gè)新的更大數(shù)組并復(fù)制所有舊數(shù)據(jù)。Collection的.Add方法在動(dòng)態(tài)增長方面性能好得多。明確數(shù)組下界VBA數(shù)組默認(rèn)下界可能是0也可能是1取決于如何聲明和賦值。使用LBound和UBound函數(shù)始終是最安全的做法能確保代碼的健壯性。返回空數(shù)組的處理當(dāng)沒有匹配項(xiàng)時(shí)返回Array()一個(gè)長度為0的數(shù)組比返回Null或Empty更友好。調(diào)用方可以用If UBound(SuperFilter(...)) LBound(SuperFilter(...)) Then來判斷是否有結(jié)果這與處理原生Filter的結(jié)果習(xí)慣一致。4. 完整實(shí)現(xiàn)與代碼剖析下面是將上述思路整合后的SuperFilter函數(shù)的一個(gè)相對完整的簡化版本重點(diǎn)展示架構(gòu)和邏輯。實(shí)際版本可能包含更多錯(cuò)誤處理和邊界情況判斷。Option Explicit ‘ 定義匹配模式枚舉使代碼更易讀實(shí)際使用字符串也可 ‘ Private Enum MatchModes: mmExact: mmStartsWith: mmEndsWith: mmContains: mmRegex: End Enum Function SuperFilter(SourceArray As Variant, _ Match As Variant, _ Optional Include As Boolean True, _ Optional Compare As VbCompareMethod vbBinaryCompare, _ Optional MatchMode As String “contains”, _ Optional ConditionLogic As String “AND”, _ Optional Dimension As Long 1) As Variant ‘ —————————— 1. 參數(shù)驗(yàn)證與初始化 —————————— If Not IsArray(SourceArray) Then Err.Raise 13, “SuperFilter”, “SourceArray 必須是一個(gè)數(shù)組?!?End If Dim numDims As Long numDims GetArrayDimensions(SourceArray) ‘ 自定義函數(shù)獲取數(shù)組維數(shù) If numDims 2 Then Err.Raise 5, “SuperFilter”, “暫不支持二維以上的數(shù)組?!?End If ‘ 統(tǒng)一將Match轉(zhuǎn)換為數(shù)組方便后續(xù)處理 Dim conditionArr() As Variant If IsArray(Match) Then conditionArr Match Else ReDim conditionArr(0 To 0) conditionArr(0) Match End If ‘ 驗(yàn)證MatchMode MatchMode LCase(Trim(MatchMode)) If Not (MatchMode “exact” Or MatchMode “startswith” Or _ MatchMode “endswith” Or MatchMode “contains” Or MatchMode “regex”) Then MatchMode “contains” ‘ 默認(rèn)回退到包含模式 End If ‘ —————————— 2. 分派到不同的處理流程 —————————— Dim result As Variant If numDims 1 Then result SuperFilter1D(SourceArray, conditionArr, Include, Compare, MatchMode, ConditionLogic) Else ‘ numDims 2 If Dimension 1 And Dimension 2 Then Dimension 1 result SuperFilter2D(SourceArray, conditionArr, Include, Compare, MatchMode, ConditionLogic, Dimension) End If SuperFilter result End Function ‘ 處理一維數(shù)組的核心私有函數(shù) Private Function SuperFilter1D(SourceArr As Variant, _ ConditionArr As Variant, _ Include As Boolean, _ Compare As VbCompareMethod, _ MatchMode As String, _ ConditionLogic As String) As Variant Dim matchedIndices As New Collection Dim i As Long, c As Long Dim elem As Variant Dim conditionMet As Boolean For i LBound(SourceArr) To UBound(SourceArr) elem SourceArr(i) conditionMet EvaluateConditions(elem, ConditionArr, MatchMode, Compare, ConditionLogic) If (conditionMet And Include) Or (Not conditionMet And Not Include) Then matchedIndices.Add i End If Next i ‘ 構(gòu)建結(jié)果數(shù)組 If matchedIndices.Count 0 Then SuperFilter1D Array() Else Dim result() As Variant ReDim result(LBound(SourceArr) To LBound(SourceArr) matchedIndices.Count - 1) ‘ 注意這里簡化了實(shí)際應(yīng)處理下界可能為0的情況 Dim idx As Long, pos As Long pos LBound(result) For Each idx In matchedIndices result(pos) SourceArr(idx) pos pos 1 Next idx SuperFilter1D result End If End Function ‘ 處理二維數(shù)組的核心私有函數(shù) (按行篩選示例) Private Function SuperFilter2D(SourceArr As Variant, _ ConditionArr As Variant, _ Include As Boolean, _ Compare As VbCompareMethod, _ MatchMode As String, _ ConditionLogic As String, _ ByVal Dimension As Long) As Variant ‘ 實(shí)現(xiàn)邏輯與上文“動(dòng)態(tài)數(shù)組構(gòu)建”示例類似遍歷行/列使用EvaluateConditions判斷整行/列是否滿足條件 ‘ 此處省略詳細(xì)代碼結(jié)構(gòu)同SuperFilter1D但內(nèi)部循環(huán)和結(jié)果數(shù)組構(gòu)建是二維的。 ‘ ... ‘ 返回一個(gè)二維Variant數(shù)組或空數(shù)組 End Function ‘ 評估單個(gè)源值 against 一組條件的私有函數(shù) Private Function EvaluateConditions(SourceValue As Variant, _ ConditionArr As Variant, _ MatchMode As String, _ Compare As VbCompareMethod, _ ConditionLogic As String) As Boolean Dim j As Long Dim condMet As Boolean Dim overallResult As Boolean If ConditionLogic “AND” Then overallResult True ‘ AND邏輯初始為真遇到一個(gè)假則變假 For j LBound(ConditionArr) To UBound(ConditionArr) If Not IsMatch(SourceValue, ConditionArr(j), MatchMode, Compare) Then overallResult False Exit For End If Next j Else ‘ “OR” 邏輯 overallResult False ‘ OR邏輯初始為假遇到一個(gè)真則變真 For j LBound(ConditionArr) To UBound(ConditionArr) If IsMatch(SourceValue, ConditionArr(j), MatchMode, Compare) Then overallResult True Exit For End If Next j End If EvaluateConditions overallResult End Function ‘ 獲取數(shù)組維數(shù)的幫助函數(shù) Private Function GetArrayDimensions(arr As Variant) As Long On Error Resume Next Dim dims As Long dims 0 Do dims dims 1 Err.Clear Dim lb As Long lb LBound(arr, dims) If Err.Number 0 Then Exit Do Loop GetArrayDimensions dims - 1 End Function代碼設(shè)計(jì)要點(diǎn)模塊化將一維和二維數(shù)組的處理拆分成獨(dú)立的私有函數(shù)SuperFilter1D和SuperFilter2D主函數(shù)只負(fù)責(zé)路由和基礎(chǔ)驗(yàn)證。這使得代碼結(jié)構(gòu)清晰易于維護(hù)和調(diào)試。條件評估分離EvaluateConditions函數(shù)專門負(fù)責(zé)根據(jù)ConditionLogicAND/OR來綜合多個(gè)條件的判斷結(jié)果。IsMatch函數(shù)前面已定義則負(fù)責(zé)最底層的單個(gè)值比較。這種分層設(shè)計(jì)符合單一職責(zé)原則。健壯性開頭進(jìn)行了必要的參數(shù)驗(yàn)證并使用Err.Raise拋出清晰的錯(cuò)誤方便調(diào)用者調(diào)試。GetArrayDimensions函數(shù)優(yōu)雅地處理了獲取未知數(shù)組維數(shù)的問題。5. 實(shí)戰(zhàn)應(yīng)用與性能優(yōu)化探討5.1 典型使用場景示例假設(shè)我們有一個(gè)從Excel表格讀取的二維數(shù)組data結(jié)構(gòu)如下姓名部門銷售額日期張三銷售部15002023/10/1李四技術(shù)部8002023/10/2王五銷售部22002023/10/1趙六市場部12002023/10/3‘ 場景1精確篩選部門為“銷售部”的所有行原生Filter做不到 Dim result1 As Variant result1 SuperFilter(data, “銷售部”, True, vbTextCompare, “exact”, , 1) ‘ 結(jié)果將是一個(gè)包含張三和王五兩行的二維數(shù)組。 ‘ 場景2多條件AND篩選銷售部且銷售額大于1000 ‘ 假設(shè)我們構(gòu)建一個(gè)條件數(shù)組每個(gè)條件是一個(gè)包含“比較值”和“比較列索引”的數(shù)組。 ‘ 這里簡化演示假設(shè)我們分別對第2列部門和第3列銷售額進(jìn)行篩選。 ‘ 注意對于數(shù)值比較MatchMode用”exact”并不合適實(shí)際需要擴(kuò)展MatchMode支持”greaterthan”等。 ‘ 一種變通方法是使用正則表達(dá)式或直接在EvaluateConditions中寫特殊邏輯。 ‘ 更優(yōu)雅的設(shè)計(jì)是允許Match為對象數(shù)組或自定義類型數(shù)組包含比較運(yùn)算符。 ‘ 本例展示思路 Dim conditions(1) As Variant conditions(0) Array(“銷售部”, 2) ‘ 第2列等于“銷售部” conditions(1) Array(“^([1-9]\d{3,}|[2-9]\d\d\d)$”, 3) ‘ 第3列匹配正則大于等于1000的數(shù)字字符串形式 ‘ 這里需要自定義IsMatch函數(shù)能識(shí)別這種結(jié)構(gòu)化的條件并解析。 ‘ 這展示了SuperFilter框架的擴(kuò)展性。 ‘ 場景3篩選日期為2023/10/1的記錄原生Filter會(huì)將其轉(zhuǎn)為字符串再匹配不可靠 Dim result3 As Variant result3 SuperFilter(data, #10/1/2023#, True, vbBinaryCompare, “exact”, , 1) ‘ 直接使用日期類型進(jìn)行精確匹配可靠。 ‘ 場景4反向篩選Include:False排除所有部門名稱中包含“部”字的行模擬原生Filter Dim result4 As Variant result4 SuperFilter(data, “部”, False, vbTextCompare, “contains”, , 1) ‘ 返回部門名不包含“部”的行可能為空。5.2 性能瓶頸分析與優(yōu)化建議自定義函數(shù)在帶來靈活性的同時(shí)必然會(huì)在性能上有所犧牲尤其是與高度優(yōu)化的原生函數(shù)相比。SuperFilter的主要性能開銷在雙層循環(huán)對于二維數(shù)組的多條件篩選是O(m*n)的復(fù)雜度m行*n條件。當(dāng)數(shù)據(jù)量巨大數(shù)萬行時(shí)循環(huán)本身會(huì)成為瓶頸。頻繁的類型判斷與函數(shù)調(diào)用在循環(huán)內(nèi)部每次比較都要調(diào)用IsMatch內(nèi)部還有Select Case、StrComp、InStr甚至CreateObject正則等操作。Variant類型操作Variant是VBA中開銷最大的數(shù)據(jù)類型頻繁的讀取、賦值和比較會(huì)比明確類型的變量慢。優(yōu)化策略提前進(jìn)行類型判斷和轉(zhuǎn)換如果事先知道某列全是數(shù)字或日期可以在主循環(huán)外進(jìn)行類型判斷并在IsMatch函數(shù)中為這種類型實(shí)現(xiàn)快速路徑避免每次都進(jìn)行VarType判斷和CStr轉(zhuǎn)換。使用靜態(tài)正則對象如果匹配模式是“regex”且模式不變可以在模塊級(jí)別聲明一個(gè)靜態(tài)的RegExp對象在函數(shù)中重復(fù)使用避免反復(fù)創(chuàng)建銷毀。針對純字符串一維數(shù)組的快速路徑如果檢測到輸入是一維字符串?dāng)?shù)組且匹配模式是“contains”可以退化到使用原生Filter函數(shù)進(jìn)行第一步快速篩選然后再對結(jié)果應(yīng)用其他條件或處理。這相當(dāng)于用原生函數(shù)做了一次預(yù)過濾。限制條件數(shù)量在業(yè)務(wù)邏輯允許的情況下盡量減少單次篩選的條件數(shù)量。將最嚴(yán)格、最能過濾掉數(shù)據(jù)的條件放在前面判斷可以提前退出循環(huán)對于AND邏輯。數(shù)組切片與內(nèi)存操作對于超大規(guī)模數(shù)據(jù)可以考慮借助Windows API調(diào)用或編寫C DLL來實(shí)現(xiàn)內(nèi)存塊的高效比較但這大大增加了復(fù)雜度僅適用于極端性能場景。注意對于絕大多數(shù)Office VBA應(yīng)用場景數(shù)據(jù)處理量在幾千到幾萬行上述SuperFilter函數(shù)的性能是完全可接受的。優(yōu)化時(shí)應(yīng)遵循“先測量后優(yōu)化”的原則用Timer函數(shù)定位真正的熱點(diǎn)避免過度設(shè)計(jì)。6. 常見問題與排查技巧實(shí)錄在實(shí)際使用和調(diào)試SuperFilter函數(shù)的過程中我遇到了不少典型問題。這里記錄一下方便大家避坑。問題1函數(shù)返回#VALUE!錯(cuò)誤或運(yùn)行時(shí)錯(cuò)誤‘13’類型不匹配。排查思路檢查源數(shù)組確保傳入的SourceArray確實(shí)是一個(gè)數(shù)組。有時(shí)從某個(gè)可能返回單值的函數(shù)獲取數(shù)據(jù)需要先判斷IsArray()。檢查條件值類型當(dāng)使用“exact”模式比較數(shù)字和字符串時(shí)“123”和123是不相等的。確保你的Match參數(shù)類型與數(shù)組中對應(yīng)元素的類型一致或理解這種差異。二維數(shù)組的維度參數(shù)確保對二維數(shù)組調(diào)用時(shí)Dimension參數(shù)只傳了1或2。傳了0或3會(huì)導(dǎo)致后續(xù)計(jì)算索引時(shí)出錯(cuò)。正則表達(dá)式模式無效當(dāng)MatchMode為“regex”時(shí)如果傳入的匹配字符串不是有效的正則表達(dá)式regex.Test會(huì)出錯(cuò)。確保在IsMatch函數(shù)中做好了錯(cuò)誤捕獲。問題2篩選結(jié)果為空但明明覺得應(yīng)該有數(shù)據(jù)。排查思路字符串比較模式Compare參數(shù)這是最常見的原因。vbBinaryCompare區(qū)分大小寫”Apple”和”apple”不匹配。vbTextCompare不區(qū)分。檢查你的數(shù)據(jù)大小寫和參數(shù)設(shè)置。匹配模式MatchMode理解錯(cuò)誤想要精確匹配卻用了默認(rèn)的“contains”。仔細(xì)核對MatchMode參數(shù)。前后空格數(shù)據(jù)中可能存在肉眼不易察覺的首尾空格。使用Trim函數(shù)清洗源數(shù)據(jù)或條件值。可以在IsMatch函數(shù)內(nèi)部對字符串比較加入自動(dòng)Trim的選項(xiàng)但需注意對于精確匹配有時(shí)空格是有意義的。多條件邏輯ConditionLogic錯(cuò)誤誤將“OR”邏輯當(dāng)作“AND”使用或者反之。理清業(yè)務(wù)邏輯。Include參數(shù)理解反了Include:False是返回不匹配的項(xiàng)。確認(rèn)你是否想要的是排除。問題3處理大量數(shù)據(jù)時(shí)速度非常慢。排查思路啟用屏幕更新和計(jì)算關(guān)閉如果是在Excel中循環(huán)調(diào)用該函數(shù)處理大量單元格確保在代碼開頭設(shè)置了Application.ScreenUpdating False和Application.Calculation xlCalculationManual處理完再恢復(fù)。檢查是否在循環(huán)中重復(fù)調(diào)用函數(shù)避免在For Each循環(huán)中針對每一行數(shù)據(jù)都調(diào)用一次SuperFilter。應(yīng)該一次性將整個(gè)數(shù)據(jù)區(qū)域裝入數(shù)組用SuperFilter處理這個(gè)數(shù)組最后將結(jié)果一次性寫回工作表。這是VBA操作數(shù)據(jù)的黃金準(zhǔn)則盡量減少VBA與工作表之間的交互。審視匹配模式是否不必要地使用了開銷巨大的“regex”模式如果只是簡單匹配換成“exact”或“contains”會(huì)快很多。數(shù)據(jù)量是否真的超出了VBA處理范圍如果數(shù)組有幾十萬行VBA循環(huán)本身就會(huì)很慢??紤]是否能在數(shù)據(jù)庫層面如Access、SQL Server進(jìn)行篩選或者使用Power Query進(jìn)行處理。問題4如何篩選“大于某個(gè)數(shù)值”或“介于某兩個(gè)日期之間”這類范圍條件解決方案當(dāng)前的SuperFilter框架主要通過MatchMode支持文本匹配模式。為了支持?jǐn)?shù)值/日期比較最整潔的擴(kuò)展方式是修改Match參數(shù)和IsMatch函數(shù)的設(shè)計(jì)。方案A快速但不優(yōu)雅將MatchMode擴(kuò)展增加“gt”大于、“l(fā)t”小于、“gte”大于等于、“l(fā)te”小于等于、“between”介于等模式。此時(shí)Match參數(shù)可能需要是一個(gè)兩元素?cái)?shù)組來表示范圍。這需要修改IsMatch函數(shù)來支持這些新的比較運(yùn)算符。方案B更靈活允許Match參數(shù)傳入一個(gè)自定義的回調(diào)函數(shù)函數(shù)指針。在IsMatch中如果發(fā)現(xiàn)Match是一個(gè)函數(shù)則調(diào)用這個(gè)函數(shù)來進(jìn)行判斷。這樣用戶可以將任何復(fù)雜的比較邏輯寫成一個(gè)獨(dú)立的函數(shù)傳入。這是最強(qiáng)大但也對使用者要求最高的方式。方案C實(shí)用折中對于簡單的范圍篩選可以結(jié)合使用Include:False。例如要篩選銷售額大于1000的可以先篩選出小于等于1000的然后取反。但這對于“介于兩者之間”這樣的條件就有點(diǎn)繞。最終我選擇了在內(nèi)部預(yù)留了擴(kuò)展接口但當(dāng)前版本主要優(yōu)化了字符串和精確匹配的通用場景。對于復(fù)雜的數(shù)值比較我通常建議使用方案C的變通方法或者直接在調(diào)用SuperFilter之前用簡單的數(shù)組循環(huán)預(yù)處理出一個(gè)標(biāo)志列然后再用SuperFilter進(jìn)行篩選。工具不是萬能的在復(fù)雜場景下組合使用多種方法往往是最佳實(shí)踐。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩激情小说一区二区| 亚洲 日本 一 二 三| japan日本高清乱xxxx| 最新日韩黄片| 99黄页网站| 中文有码9| 亚洲成?V人片在线观看福利| 免费啪啪av| 中文字幕亚洲热播人妻| 日日骚 av| 欧美精品97| 色狠狠 - 百度| 欧美久久草熟女| 日韩本不卡视频在线观看| 欧美激情性久久久久久| 欧美伦乱爱| 翔田千里A片一区二区| 搞中出久久| 精品区国产区一区二区三区| 操死我了嗯嗯嗯| 91精品老女人| 天天干天天爽| 成人国产二区三区在线,男女精品。| 日本精品高清一二区一本到| AV天黑人| 婷婷丁香六月| 精品久久97| 国产精品免费美女视频| 色色97爱| 不卡人妻少妇精品毛片一区23区视频| 天天做天天爱| 一色网男人的天堂| 国产一区二区在线播放量| 亚洲91亚洲| 天天综合网在线91| 97视频在线免费看| A V视频日本| 日本精品性生活久久久| 欧美日韩中文亚洲v在线综合| 青苹果影院男人的天堂| 偷拍偷窥与盗摄视频专区| 精品久久久九九九孕妇| 四虎国产成人精品免费一女五男| 极品尤物自安慰| 和协影院中文字幕三区| 欧美啪啪女女| 国产性爱强奸乱伦大全| 殴美日韩m| 国产探花精品在线| 亚洲熟女av中文字幕| 99热这里都是精品| 国产成人在线观看网址| 视频黄站| 欧美美女自慰一区二区三区| 十八禁成人网站在线观看| 久久成人网站| 亚洲情色1区| 12一15性XXXX粉嫩国产| 久久精品视频一区三区小泽玛利亚| 操日韩第| 91宗合网| 亚洲五区熟女| 伊人久久大香大香线蕉中文 | 小说区 图片区色 综合区| 国产成人主播| 五月激情综合网| 天天影视综合色| 91狠| 欧美性爱免费短视频| 国产日韩人人| 日本天天人人狠狠在线日美女 | 996热| 久久久精品网站| 人人综合| 婷婷激情五月| 精品国模无码| 黄色工厂这里只有精品| 东京日日夜夜| 一区二区三区机械有限公司| 青娱乐老司机视频| 日躁天天爽爽| 欧美性第1页| 综合久欧洲| 欧美亚洲手机在线| 日日A∨| 日韩色图 一区二区| 国产精品色色| 欧美日韩国产中文精品字幕自在自线| 天美传媒AV在线播放| 啊啊啊好舒服视频在线观看| 欧美毛片在线网| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 五月天AV资源| 国产传媒日本欧美专区| 午夜a成v人电影| 天天天天干| 国产人人干| 久久精品视频久久久| 性爱乱伦一区| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 男人天堂毛片| 人妻熟女一区二区| 亚洲精品一区二区免费在线观看| 青青草日本中文字幕 | 亚洲精品一区二区免费在线观看| 亚洲91av| 国产精品久久发布| 婷婷在线精品| 日韩999| 国产成人自拍视频视频| 亚洲中文字幕熟女| 熟女精品日韩一区二区三区| 国产AV中文| 欧美后入式| 成人在线午夜视频一区| 精品无码久久久久| 久久超碰、| 人妻啊啊人妻啊啊| 亚洲制服欧美另类内射| 综合欧美日韩在线观看| 久久老子无码午夜伦不卡| www.av在线视频| 波多野42部激情无码喷潮| 搡老女人老91二区| 天天综合站| 大香蕉手机在线| 日韩综合97P| 天天操天天日天天干| 国产久久日| 中文字幕免费观看| 青青草色插素人| 亚洲另类久操网| 97久久精品亚洲| 日本三级中国三级99人妇网站| 九九色婷婷| 91操操| 日韩成人色图| 熟女一区二区| 97操在线| 97久久超碰亚洲| 国产久久天堂资源| 蜜桃av色偷偷av老熟女| 伊人精品久久网站| 大香蕉免费3| 性色高清..……| 酒色综合网| 亚洲黄色影视| 成人精品一区二区三区| 久久夜色一区二区| 屌妞视频久久久久久久 | 97爱爱爱| 草草电影院| 亚洲AV麻豆Aⅴ无码电影一| 色综合一本| 亚洲啪啪视频免费| A片 AV一级在线播放观看免费| 农村女一级毛卡片| 91人妻最真实刺激绿帽| 人人贴人人摸| 人人玩人人添人人澡免费| 韩国手机不卡无码三级视频| 日韩欧美一级特黄大片| 中国乱伦一区二区| 99久久精品欧美国产| 五月天大香蕉| 亚洲成人免费中文字幕| 免看60秒涩涩视频| 蜜色网色哟哟| 人人手机欧洲亚洲国产人妻| 伊蕉97蜜桃97狠狠综合干| 久久久久久亚洲精品中文字幕人妻| 蜜伊人色综合97| 人妻AV 中文字幕的| 久久人妻丝袜一区二区三| 91人人爽人人爽| 九久久九精品视频| 国产精品3| 2017天天插| 97超碰人人操人人操| 岛国免费视频在线| 人人操人人摸人 | 狠狠久久亚洲欧美专区| 精品久久久av| 很很很很操| 青青草AV色| 偷拍亚洲| 日韩去日本高清在| 顶级少妇BT天堂| 亚洲性感丝袜诱惑在线观看| 成人小电影网站tex| 成人羞羞视频国产| 熟女字幕| 中文字幕片| 久久鲁夜| 在线亚洲欧美| 国语对白在线播放视频| 九九热免费在线国产视频伊人五月| 欧美变态激情网| 九九国产热| 亚洲清纯唯美| 日韩免费福利在线观看| 亚洲色阁| WWW啪啪的com| 无码91| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 老熟女乱子伦中文字幕一区二区| Blackedraw视频一区二区| 91碰碰碰| 大肉棒导航| 94色色电影网| 天天色播亚洲综合网站| 亚洲熟女综合| 思思热国产高清| 日韩欧美亚洲自拍偷拍| 久久久网站| 日韩精品电影| 亚洲欧美首页| 亚洲精品久| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 啪啪免费| 少妇同性| 日韩一级久久毛片| 亚洲天堂,男人| 男人的天堂久久狠| 久久riav中文精品| 厕所偷拍在线| 亚洲一二三四区在线免费看视频| www.色吧5.com| 美日韩成人| 怡红院亚洲怡春院av| 男女猛烈无遮掩视频免费软件| 国产刺激视频| 无码人妻精品酒店| 色噜噜人妻丝袜a∨先锋影| 午夜欧美神马久久久久| yaouchengrenav| 久久女人视频| 欧美成人性活片| 丁香五月婷婷五月| 欧美日韩亚洲天堂| 成片免费观看视频大全| 欧美性高潮| 粉嫩av在线一区二区| 午夜福利在线合集| 无码一区二区精品视频久久久春药| 青青草日本无码| 色爱亚洲| 亚洲欧美一区二区三区一猛片| 国产精品视频在线播放 | 日本三级人妻a人妻一在线| 国产人妻精品一区二区三区秋霞| 欧美性爱91| 黄色不卡视频| 色操逼网| 久久久国产护士丝袜美腿一| 中文字幕 国产区| 好湿好紧视频| 伊人网av| 成人午夜高潮av猛片| 99热超碰| 91色综合| 91色狼| 久久人妻丝袜一区二区三| 91高潮| 97人肏| 国产午夜福利专区综合| 亚洲综合性网址| 免费一级精品啪啪视频| 色哟哟AV| 伊人色综合网电影| 亚洲精品97久久| 夜夜操天天肏| 婷婷视频在线免费观看| 夜夜高潮夜夜爽夜夜爱爱一区| 人人操av| 国产日逼视频| 国产日本顶级一区二区三区| 99精品丰满人妻无| 黑丝自慰喷水网站| 美欧色综合| 日日夜夜干| 精品无码久久久久久久杏吧| 加勒比五月天| 亚乱色| 人妻一区视频| 久久久96| 秋霞无码av鲁丝片一区| 密臀AV在线| 日韩精品影视| 亚洲精品视频在线播放| 国产精品久久久久久亚洲色欲| 五月天婷婷社区| 超碰9 7女人 | 爱丝福利| 精品.99999| 天堂俺去俺来也www久久婷婷| 欧洲大香蕉| AV大香蕉| 久草视频观看视频在线| 97久久国产| 精品999日本| 超碰在线国产| 久久综合资源一区二区| 91亚州| 爱爱久久| 97色色婷婷| 农村妇女精品一二区| 国产超碰国产97| 岛国视频免费在线观看| 蜜臀无码视频在线观看| 日韩精彩视频| 久久、1234| 91色久| 欧美激情性久久久久久| 思思热国产高清| 久久久久幕乱码| 夜夜嗨一区二区| 无码人妻精品一区二区三区99不卡| 天操天操夜操夜月月年年操操| 亚洲色天堂日韩中| 久久AV无码网址| 小说区 图片区色 综合区| 亚洲麻豆18发?| 97超碰天天| 久久精品三级影视| 亚洲情色1区| 日韩美女操b| 精品国产一区探花在线观看| 人人操人人肉久久精品| 91老司机视频| 99草精| 97超碰免费生活| 中文字幕55555| 夜夜嗨一区二区| 国产不卡免费在线视频| 丰满美女一级毛片在线播放| 超碰97色| 久九色| 俞拍久久国应视频| 99少妇| 日本五区不卡| 97超碰精品成| 日韩久草| 欧美中字不卡| 亚洲另类色综合网站| 粉嫩av一区二区三区四季| 久久国产99精品72福利| 99热在线观看| 亚洲图片偷拍视频区| 国产男人又猛又粗又爽| 强奸乱伦av电影| 日本免费人成视频播放120秒| 极品销魂美女一区二区| 色吧5亚洲| 日本一道在线播放高清| 97在线免费看视频| 亚洲视频中文一区| 午夜视频久久久久一区| 欧美东京热青青草| 97超碰超碰| 97亚洲欧美| 日本精品一区二区不卡| 欧美性第一页| 日本高清免费一本视频在线观看| 亚洲天堂男| 五月天婷婷影院| 日韩久久艹| 家庭乱伦国产| 欧美在线 亚洲| 先锋色眉乱伦资源| 亚洲清纯唯美| 欧美强奸一区二区诱惑| 在线天堂资源亚洲| 亚洲视频中文一区| 留下AⅤ黄色片| 日日夜夜骚| 91成人在线免费视频| 免费αⅴ在线观看| 欧美黄色大片在线观看| 久久国内| 99久久综合| av天堂影视中文在字幕在线中文| 色九九九九久| 色爱综合网欧美| 看黑人AV不卡| 欧美淫穴| 熟女一区二区三区| 少妇精品久久久八区九区| 少妇高潮九九九九九九九| 天美传媒婬乱在| 色姑娘综合网| 搡老女人老妇女AAA一VU麻豆| 日韩av一级黄片| 人人爱操| 久久精品老司| 成人AV在线网站| 青青草大香蕉视频| 乱伦日本中文自拍| 18禁超污无遮挡无码免费网| 天天干人人乐| 国产精品网址| 综合免费无码中文| 亚洲高清无码免费观看视频| 久久久久久久久久久久久久久性生活视频| 91原创在线观看| 婷婷五月天无码| 久久粉色| 欧美熟女操屄| 泰国AV在线观看| 日本性一区| 黑人猛交| 不卡免费av在线播放| 伊人青青一区成人视频在线观看区| 精品成人女人久久| 蜜桃久久一区二区| 久久精品三级影视| 九九久久国产精品| 春色综合网| 国产精品无套内谢| 黑丝91视频| 亚洲色图欧美色图在线播放| 在线观看无码三级少妇| 人妻天天操天天爽视频免费| 亚洲大色堂| 亚洲一区二区AV| 18禁网站在线播放| 国产精品。| 欧美色道啊| 搞中出久久| 久久久久久性爱片| 麻豆尤物视频网| 亚洲欧美自拍偷拍| 密臀在线免费观看| 蜜桃精品一区二区三区久在线| 测评在线观看AV| 五月婷婷丁香| 人妻少妇精品无码专区二区密桃| 国产精品嫩草影院免费| 五十路二区在线| 国产无码成人无码| 睡产熟女乱伦| 国产精品久久久777| 91欧洲入口| 亚洲91在线播放影院| 一区二区首页| 日韩少妇无码| 天天摸,夜夜摸| 好屌色综合| 性爱视频啪啪啪啪| 久久久中文版| 少妇高潮流水av免费| 久热色情精品| 久久大黄片| 综合色图区| 中文三一区| 色综合色色| KK色在线影院| 日本韩欧美在线播放a| 亚欧美综合网。| 国产一区自拍欧美日韩| 人妻爽爽啪视频| 一级片视频啪啪| 久九干| 亚洲无 码A片在线观看麻豆| 欧美色棕合| 蜜臀99久久精品久久久久| 狠狠色婷婷7777久| 97资源站国产精品| 野狼激情网| 干超碰碰熟女| 久久熟妇五十路一区| 无遮挡男女激烈动态图| 曰本精品久久久| 国产精品久久久久久久久久梁医生| 婷婷伊人一区| 久久青青草原免费视频| 熟女精品一区二区在线观看| 一本一道vs波多野结衣| 欧美性五月| 婷婷久久综合| 国产强奸AV在线| 九九无码久久精品视频| 国产精品ⅴ无码大片在线看.| 亚洲日韩精品久久久久一区壹牛 | 91黑人狂躁丰满熟妇| 大香蕉手机在线视频| 秋霞Av理论一级在线| 综合网欧| 国产一区二区三区白丝| 97天天在线| 中文字幕 国产 精品| 亚洲欧美洲综合| 九九久久一区二区三区| 操逼www.| 怡红院成人视频| 吻戏激情性巴克| 无码一区免费在线不卡| 亚洲综合贴图91| 国产免费一区在线观看| 国产在线播放成人免费| 试看福利| 九九色综合| 超碰色男人操熟女| 精品妇操一区二区三区| 亚洲精品无码久久AV| 亚洲色棕合| 天天影视色香色欲| 亚洲砖码砖专无区2023| 成年人黄色| 亚洲美女30b| 动漫爆乳3D奶水一区在线观看 | 97超碰碰| 久久天堂网| 人人澡人人爽人人精品| 国产九九九九九九九九| 国产高清成人免费视频| 加勒比AV网| 国产亚洲国产超碰| 岛国大片国产| 亚洲国产综合图区中文字幕| 超碰伊人在线| 密臀在线免费观看| 中文激情网| 日韩中文字幕人妻视频| 日韩精品人妻| 天美传媒Av在线| 很很干很很操| 大香网站| 国产福利视频精品视频| 78精品在线| 老女人老91妇女老热女| 日本特黄f c2| 免費黃色視頻觀看一| {男男暴菊gay无套网站| 曰本道人妻久久久在线不卡色视频| 久久五月丁香| 国产精品蜜乳AV| 91啦人妻| 国产综合久久久麻桃个| 丝袜狂射91| 亚洲综合在线高清| 精品 码产区一区二-1080P高清在线www-B029AV| 先锋激情∨在线视频播放| 超碰九7免费| 日本97久久| 精品美女久久一二三| 色噜噜人妻av 中文字幕| 久久久夜夜嗨免费视频| 日韩欧美国产高清视频| 天天操人人操狠狠插| 亚洲色天| 9久9久| 久欲AV| 桃色人妻在线视频| 久久天天躁日日躁狠狠躁| 又大又白奶子| 国产AV超爽| 无码精品一区二区三区潘金莲| 日本国产亚洲一区在线观看| 亚洲?V高清一区二区三区尤物| 久久99干一本高清| 久久熟女嫩草成人片免费| 91丝袜美腿片| 久草热制服丝袜在线观看 | 操美女人妻| 亚殴在线| 欧美三级不卡| 中文字幕国产精品1区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 啊啊啊免费视频| 久热网| 人妻少妇无码| 怡红院久久老司机| 欧美日韩精品一区二区三区高清| 久久性生大片免费观看性| 久夜视频| 亚洲精品97| 欧美超碰97| 欧美美女视频| 久久久久女教师免费一区| 欧美亚洲清纯| 欧美 亚洲精品首页| www.91视频网| 国产极品馒头逼| 综合网亚洲| 精品国模无码| 熟女乱伦A| 黄色网址在线免费观看| 日本理论在线| 亚洲色五月| 色婷婷成人综合| 欧洲亚洲人妻无码中字久久三区四区| 一区二区不卡| 天操天操夜操夜月月年年操操| 后入式999| 大香蕉日亚洲日本亚大| 黄页av| 婷婷色综合欧美日韩| 天天射天天操天天干天天吃2018| 亚洲精品一区二区精品| 亚洲日本激情| 国产在线精品偷| 五月婷婷影院| 狠狠搞 亚洲91| 国产精品一区二区后入| 97欧美色| 中国特猛少妇色xxx| av网站国产主播在线| 日本日逼高清| 激情色播| 蜜桃久久综合视频| 超碰97最新人妻| 死我十八禁| 久久免费少妇| 亚洲一曲日韩精品| 丁香成人五月天| 69超碰综合| 日本人妻一区二区| 丰满人妻一区二区中文| 黑丝制服中文字幕| 亚洲 日本 国产 综合| 黄色一级视| 嗯嗯嗯啊啊啊在线免费观看| 久久亚洲色图中文字幕| 色香欲综合| 欧美激情性爱视频网站| 欧美日综合| 免费网色网站| 精品69网| 久久精品国产亚洲AV高级北京| 99超碰色| 偷拍亚洲情色| 五码视频在线观看| 伊人91| 国产美女口爆吞精| 成年人黄色| 欧美日韩另类在线| 久久麻豆一区二区| 亚洲大色鬼| 国产又粗又大硬免费色网视频| 亚洲极品| 一直超碰| www.婷婷六月天| 日本道人妻久久久在线不卡色视频| 色欧美在线| 国内亚洲精彩视频在线| 韩国一区二区精品亚洲| 日韩有码回春沙龙第一页| 五月亭亭六月丁香| 国产 日韩 另类 视频一区爱| 精品黑人一区二区| 国产精品肉丝自拍| 欧洲精品欧洲精品| 一级成人性爱| 午夜福利久久久噜久噜久久综合| 婷婷九月丁香| blacked精品一区国产| 久久综合日韩亚洲欧美| 亚洲 欧美 色图| 午夜男女爽爽爽在线视频| 青青三级视频| 最新日产中文在线麻豆| 七久久久| 久久精品久| 色官网在线| 日本天堂在线播放| 亚洲?V无码专区在线电影| 精品人妻二区三区| 超碰九7免费| 97超碰国产亚洲精品资源| 男人的天堂久久| 国产少妇与亚洲av| 国产偷拍网站| 亚洲性爱高潮影院| 91av熟女人妻| 国产在线76页| 99热欧美| 97网址www| 台湾一区国产高清在线| 日产狠狠干| 久久久一区二区三区麻豆| 伊人久久婷婷| 国产成人在线观看网址| 欧美一区二区传媒| 操逼视频亚洲| 亚洲图片第一页| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 男人高清无码一区二区| 97日亚洲欧美| 国产人伦精品一区二区三区 | 超碰99在线观看| 丁香色狠狠色综合久久小说| 使劲用力艹少妇视频一区二区| 尤物黄色在线观看网站| 啊啊啊不要嗯嗯在线观看| 狠狠色综合网| 手机午夜电影神马久久| 极品色电影院| 91 手机在线播放 绯色| 人干人人人操人人摸| 97在线观| 亚洲图片小说欧洲| 国产精品久久久久久久久久久久久久久 | A级毛片在线看免费| 国产激情在线| 欧美高潮| 1204金沙人妻懂旧版免费| 日本免费亚洲欧美| 精品亚洲国产成人精品| 96精品久久久久久久久久| 91女优在线观看| 97看操| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 五十路成人在线视频二区三区| oumeisetu综合| 少妇xx精品| 日本黄色精品专区网站| 免费视频97| 欧美性爱一区二区三区| 欧美天天综合站| 蜜臀99999| 五月天精品| www.久久久久| 国产免费久久久久| 日韩激情电影中文字幕| …亚洲黄色厕厕女女在线播…| 亚热日本熟女| 熟女自慰久久久| 久久草草欧美精品| 亚洲欧美激情另类色图| 大香蕉久久| 亚洲成av人片色午夜乱码| 国产女性无套 免费观看| 强奸乱伦大香蕉网| 日本精品高清一二区一本到| 黄色区免费观看中文字幕| 五月婷网站| av无码av无码专区| 国产在线视视频有精品| 国产精品人人爽人人做可爱福利| 曰韩精品视频一区二区| 欧美性爱在线无码| 狠狠干婷婷| 九九热免费在线国产视频伊人五月| 九九热免费国产视频婷婷伊人五月| 97网址www| 性老妇一区二区三区| 99999这里都精品| 日韩有码回春沙龙第一页| 精品一久久久| 超碰97人人乐| 黄色香蕉视频网站一区| 日韩亚洲中文字幕在线| 婷婷色综合| 国产av高清版| 99福利社| 超碰免费人妻人人| 大屁股xxxxx| 自拍二页| 精品视频一二三中文| 中文字幕AV乱伦| 久久久中文| 男生女生啊啊啊啊| 日韩一级二级三级免费看完整版国语版 | 亚洲激情视频| 91色拍| 99热这里是精品| 久久久久9| 久草草一二三四区久久| 中文字幕国产在线天堂| 99视频自拍| 人妻少妇三级| 亚洲人成在线放东京热| 黄片www.| 超碰综合色| 白丝av| 日韩欧美视频青青| 十八禁黄色| 久久久国产成人一区二区三区在线| 色婷婷香蕉| 久久久91福利姬| 亚洲无码太久| 日韩一999精品| 9久久久久| 一二三区在线| 97超碰欧美手机在线| 欧美99999| 免费看毛片操穴| 欧美高清16| 啊啊啊啊一区| 久久人妻熟女一区二区 | 成人a级高清视频在线观看| 国模精品一区二区三区苹果色戒| 欧亚日韩综合精品国产| 亚洲国产麻豆一区二区三区 | 青青操轻轻| 中文字幕午夜精品久久久| 十八禁成人网站在线观看| 91偷拍欧美亚洲| 黑人精品XXX一区一二区| 久婷婷一区| 亚洲免费成人在线高清无码视频| 人妻在线大香蕉| 欧美日本一区二区a人| 亚洲综合九| 中文字幕一区二区三区高清| 成人天天爽| 久久久国产亚洲精品系列| 亚洲资源吧| 久操黄色视频| 日本丝袜人妻内射| 日韩精品一二三| 清清草影| 日日干日日| 在线综合 亚洲 欧美中文字幕| 99国产精品久久久在线播放| 九九综合久久| 国产91福利小视频在线观看| 欧美日韩精品青青| 91人人看| 欧美十八禁在线看| 久久无码成人| 中文字幕一二三| 97精品综合久久网| 天天操天天干一区二区 | 国产精品对白内射| 欧美激情视频在线一区| 97超碰色色| 熟女自慰久久久| 思思热在线| 91精品无码人妻系列| 免费观看成人www精品视频| 超碰在线综合97| 久久最新视频免费观看| 久久久久国产精品喷潮免费观看臀 | 欧美五十路熟| 综合色好色| 大但人体久久久久| 人人摸人人舔一区二区| 人人妻人人澡人人爽久久av| 日本黄页视频在线观看| 亚洲三级网址久久最新| 5月婷婷6月六月丁香| 欧美日产国产在线成人第一区| 激情小说亚洲| 怡红院久久老司机| 久久久天美| 欧美肥臀在线| 国产夫妻性生活视频| 日本 情色 1区2区3区| 长久操视频| 亚洲风情综合网| 91成人在线| 欧美综合在线91| 国产欧美伊人| 欧美熟妇乱码在线一区| caopeng97| 久久婷婷一区二| 六月婷婷五月丁香| 色婷婷久久| 中文字幕国产精品1区| 五月天色图影视| 日韩精彩免费| 超碰69| 色爱亚洲| av黄图片在线观看| 国产亚洲精品A在线观看下载| 亚洲影院365| gogogo免费高清看中国国语| 操逼视频色| 婷婷久草| 黄色高清久久无码依人| 欧美色综合图片| 91影视亚洲| 天天色欧美| 国产亚洲精品久久久久小| se吧提供91精品国产91久久久久久 | 另类一区| 亚洲综合网电影91| 99re69综合| 久久人妻无码毛片A片麻豆| 2020中文字幕在线| 狠狠爱夜夜| 一个色导综合| 新版天堂中文资源8在线| 97色色视频| 久久一二三四不卡 | 亚洲超碰在线| 亚洲AO在线| 欧美色亚洲色| 色网在线视频观看免费| 欧美亚洲综合色| 99久在线精品99re8a| 日本精品一区二区三区四区的功能| 少妇久久久| 国产精品久久伊人| 麻豆AV一区二区| …中文字幕亚洲乱,97人妻无码费视… | 婷婷亚洲五月***久久| 日韩人妻网站| 亚洲欧美999| 无码少妇精品一区二区60岁老人| 草久久久| 久久久啊啊啊| 中文字幕狠狠玩| 91在线视频免费中出| 精品国产乱码久久久久久免费| 国内偷自视频区视频综合| 久久熟女人| 欧美亚洲首页| 免费视频a级毛片免费视频| 91嫩草欧美| 欧美 色 亚洲| 男人天堂久久精品| 青草一区二区| 91黑丝在线播放| 精品对白久久不卡| 中文字幕 码精品视频网站| 天天插夜夜爽| 香蕉欧美| 男人的天堂在线2| 综合影院永久入口国产| 啊啊啊好舒服好爽啊啊啊视频| 麻豆国产精品午夜视频| 920日本午夜免费| 97在线视频观看| 亚洲限制级在线| 在线看片国产精品每日更新| 久热色情精品| 三级AV入口| 日本国产二线女色| 婷婷尹人大香蕉免费| 91久久久亚洲| 老熟妇一区二区三区啪啪| 91精品啪在线观看国产城中村| 亚州色图片在线色| 91精品久久久久久77777| 无套后入双马尾| 麻豆国产av网| 女人被男人桶爽视频网站| 久久有碼| 99自拍视频在线观看| 欧美人体性爱互联网第一页婷婷日本| 久久精品一区| 久久久夜夜嗨免费视频| 欧州91高潮| 久久久久久久久久久久久久久久9| 97综合久久| 曰韩少妇无码| 亚洲美女精品| 国产精品久久久吖| 老熟女综合网| 情色五月天网| 色色99| 久久91视频| 伊人国产成人av网站| 91天射| 插老姨肥穴| hd成人一区二区在线| 综合色91| 日韩三级av片| 国产精品粉嫩福利在线| 97干天天| 日韩三级久久久| 日韩视频中文字幕| 欧美日韩久久精品爱爱| 午夜精品人妻二区三区| 久久精品老司| 嗯嗯,啊啊,国产精品| 欧美激情五月天| 大香蕉久| www.91色| 色五月激情网| 99re久久| 午夜免费视频1000| 五月婷婷六月丁香| 久久肏大逼| 精品人妻美妇91job| 老熟女乱伦一区| 啊啊啊久久| 老熟妇91| 18禁的网站在线| 免费一级性爱久久| 日本日逼高清| 亚洲无线码欧洲精品区别| 国产精品露脸在线观看| 中文字幕色AV| 国产精品农村妇女| 9久久久久久| 久 久无码人妻AV| 一级做a爰片性色毛片久久| 国产丝袜一区二区三区| av一区二区三区不卡| 婷婷丁香五月综合| 男生女生啊啊啊啊| 淫荡网址| 综合影院永久入口国产| 国产超碰在线| 性色av一区二区| 日韩 欧美 国产 麻豆| 欧美人妻一区二区| 精人妻无码一区二区三区伊人直播| 日日干夜夜干| 97日视频| 素人伊尹大香蕉免费下载视频| 欧美人妻熟女在线| 99超碰碰| 在线观看色视频| 久久麻豆一区二区| 亚洲第91页| 4虎在线观看| 天天噜| 9色国产精品一区粉嫩 | 三级网色| 国产suv精品一区二区四| 天堂射| 男人女人18禁片免费看网站| 91视频综合网| 无色无码| 青女在线| 午夜福利一区二区影院| 五月天色图| 久9久| 精品久9| 久久黄色视频一区二区三区 | 欧美色图91| 久久久久国产无av| 在线亚洲精品久久久| 97久久国产亚洲精品超碰热| 岛国黄片网站| 天天爽天天爽| 欧美第一页| 日本精品一级二级三级| 综合网色| 国产久9| 一区操逼日比视频| 中文字幕一区 二 区 三 四 五 区日 日 骚| 精品人妻视频一区二区在线播放| 欧洲黄色网| 国产性刺激| 91伊人久| 亚洲一二三四区机械| 3PAV乱伦视频| 色爱综合网| 色图四区| 国产高潮AA片免费看| 成人草草视频| 五月天婷婷综合| 亚洲人妻久久| 日韩精品中文字幕二区| 无毛精品| 国产无马视频| 99热日| 色综合网1| 日韩情色一区二区| 日本污ww视频网站| 99re在线| 亚州 综合 色图| 成年人黄色视频免费| 成人A片男人的天堂| 日B操| 欧美日韩国产色五月综合在线| 蜜桃无码AV一区二区| 欧美日韩传媒| 91嫩草在线| 亚洲另类在线观看| 蜜臀一区二区三区在线| 日韩精品9区| 色蜜AV| 人妻81p| 91色拍| 欧美78| 看日韩操逼| 欧美999| 国产精品一区二区麻豆| 亚洲综合网图| 在线国产一区二区av| 国产日韩中文字幕欧美| 超碰激情808| 99久久网站| 日韩欧美aⅴ综合网站发布| 88在线一区二区三区| 老熟女乱伦一区| 久久久亚洲熟妇资源| 日本九九久久99| 蜜乳av首页| 欧美日韩在线国产在线| 欧美人黑A片无码免视费| 人妻天天爽| 97久久免费| 97色插| 校园春色制服丝袜中文字亚洲| 久久久久久亚洲Av无码精| 久久久不卡| 玖玖爱伊人玖玖爱| 精精夜夜| 久久五月丁香| 日本欧美一区二区三区免费| 操逼无码操逼| 1769一区| 黄色香蕉视频网站一区| 精品人妻一区二区蜜桃视频 | 婷婷五月综合在线| 蜜桃视频成a人v在线| www.yeyecao| 精品中文字幕一区二区| 国产综合久| 欧中美三级一区二区三区| 久热精品在线| 丝袜 中出 制服 人妻 美腿 中文字幕| 99精品人人爽| 人人乐大香蕉| 欧美激情超碰777| 久久久不卡区一区二区三区久久久| 九一综合精品视品av| 亚洲射综合网| 精品无码人妻一区二区免费蜜桃| 日韩一级二级在线| 久久精品夜色国产亚洲AV| 亚洲乱熟女一区二区| 精品视频久久| 国产三区免费在线观看| 国产精品成人蜜臀AV在线| 亚洲综合激情五月久久| 超碰 另类 欧美| 九九久久一区二区伦理| 天操天操夜操夜月月年年操操 | 97欧美精品综合| 狠狠色一区二区中文字幕| 久久久三区二区一区| 96超碰网| 国语对白露脸XXXXXX| 欧美一区二区三区互相| 爱媛媛久久国产福利| 又大又黄国产| 国产精品熟女九九九| 久久 久久国内精品亚洲| 天天综合网在线91| 国产亚洲深夜激情| 亚洲精品aa久久伊人| 天堂岛av| 热久日综合| 国产久久天堂资源| 综合久久久久久久综合网| 亚洲另类综合欧美| 伊人久久久日韩一区| 青女偷拍网| 岛国大片国产| 五月天成人综合| 安徽熟妇视频| 久久久久久免费电影| 久久欲| 东京热免费视频| 午夜精品久久久久久久99热影院| 亚洲在线观看| 国产成人一级av88| 综合国产97| 青娱乐91| 欧美精品999| 色偷偷超碰亚洲|