亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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
返回資訊列表
狠狠操综合| 少好三P| 超碰在线日韩一区| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 日本超碰97日韩精品人妻| 色偷偷男人的天堂麻豆| 色色毛片| 日日黄色三级网站| 一区二区三区在线日韩影院观看| ,成人免费啪啪视频| 九九精品美女高溯喷水| 99热这里只有精品1| www.yeyecao| 亚洲少妇色| 一本大道青青| 久久熟女人| 中文字幕丝袜| 全免费a敌肛交毛片免费| 亚洲综合影片| 国产亚洲性生活视频播放| 久久一二三四五六七八九区区区| 97资源站国产精品| 第一高清av中文字幕| 蜜乳av一区二区三区| 国产极品美女高潮无套在线观看| 日本999精品视频| 久久久久久久久久va| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 麻豆天美传媒在线视频天堂| 亚洲欧美首页| 中文字幕加勒比海高清无码免费视频 | 成人性爱电影一区二区| 97er欧美性| 色就色综合| 日日做夜狠狠爱欧美黑人| 一二三四视频中文字幕在线看| 5252色欧美在线| PMv在线观看| 国产农村妇女精品1区二区| 天天看片青娱乐| 五月婷在线| 国产路线专区| 宗合情欲网| 强奸乱伦 亚洲一区| 97免费免费视频网| 一区二区三区机械有限公司| 夜夜做夜夜爽精品视频| 男人的天堂2018东京热啪啪啪| 亚洲91综合| 狠狠操夜夜| 女人天堂网| 福利在线黄片| 91春色| 亚洲欧美日韩有码| 日本色色色视频| 操人妻逼91| 国产成人免费观看在线视频 | 精品成人女人久久| 婷婷91| 91免费看一区二区三区| 粉嫩av一区二区三区四季| 久久‘黄片视频| 少妇熟女一区二区三区| 亚洲 欧美 小说| 欧美午夜一区二区三区| 亚洲欧美另类激情小说| 九九九九精品一区| 日本一级一级一级一级| 超碰色大香蕉| 狠狠夜色午夜久久综合在线| 操老熟女AV| 99re超碰| 91 国产丝袜在线播放-百度| 操九九九九九九| 福利操逼| 青草综合| 欧美91久久久久| 91国产精品在线看| 不卡一区二区日本视频| 欧美—性—交—色| 天天看高清麻豆| 激情综合五| 亚洲啪啪视频免费| 久久久久久久久9| 国产蜜臀精品一区免费尤物| 爱妃国产亚洲视频中文字幕| 加勒比无码毛片| 欧美日韩99| 少妇高潮流水av免费| 日本不卡一区二区三区| 成人热久久精品| 97人人模人人爽人人| 美日韩男女操屄视频| 免费福利视频中文字幕| 思思热在线| 亚洲欧美综合网| 第四色色综合91| 欧美亚洲日本激情在线| 91露脸熟女专区| 亚州性色| 人妻人久久精品中文字幕| 性欧美体内射精| 开心婷婷五月| 精品一区二区成人动漫| 爽极品影院| 欧美性爱精品七区| 色爱亚洲| 国产精品播放| 黄色污污污污污污网站| 国产精品乱码久久久久| 熟女熟妇伦久久影院毛片一区二区| 日本一二区免费| a级理论午夜日本| 一本色道久久天天射天天干| 超碰在线一区| 91老熟女视频| 色约约一区=区三区| 亚洲高清少妇| 日韩99神马视频播放| 色色热| 色色色天美视频| 翔田千里Av在线| 视频在线观看青青99国产| a人欧美综合天堂麻豆| AV天堂丝袜| 天天摸,夜夜摸| 国产懂色精品国产av| 俄罗斯一区二区视频在线观看| 亚洲欧美人妻| 蜜臀久久99精品久久久| 欧美AB在线| 超碰97 线线 在现| 热热色中文无码| 91国产丝袜白虎| 久热网| 搞中出视频在线观看| 99r九九| 青青草原狼av| 日韩在线76| 涩五月婷婷| 日日干夜夜干| 超碰超碰欧美| 天天激色| 超碰97久| 日韩肏逼视频| 日本色色视频网站| 亚洲黄色网址视频| 小日子操bb在线看| 俄罗斯一区二区视频在线观看| 97精品一区二区视频在线观看| 99热这里只有精品地址| 日韩精彩免费| 国产农村妇女精品一| 人妻一区久久二区三区色播| 欧美激情久久久久| 欧美另类丝袜熟女| 超清中文乱码字幕| 日韩操逼性鲍| 日本在线视频导航| 天天透伊人| 精品人妻一区二区免费蜜桃| 精品小视频在线| 久久亚码| 亚州欧美在线| 日韩综合无码一区久久92| 在线亚洲 欧美 日本专区 | 国产伊人自拍| 精品一区二区三区四区外站| 男女啊啊啊啊啊| 日本久久久精品电影| 91人人操| 国产强奸91| 精品亚洲黄色片 国产精品导航一区二区 | 国产小黄片在线免费观看 | 狠狠操综合| 无码99| 欧洲综合视频| 久久久99999久网站| 精品人妻一区二区三区蜜桃视频| 日本国产亚洲一区在线观看| 90后性网国产欧美| 91国产丝袜足交精品视频| 97 国产一区| 男人精品天堂一区| JuliaAnn丝袜熟女系列| 91综合在线| 乱伦AVxx| 日韩AV中文字幕电影| 偷拍综合亚洲| 视频国产欧美在线播放| 国产超碰| 精品九九淫乱男| 熟妇视频一区二区三区在线| av日韩在线观看电影| 黄色污污污污污污网站| 亚洲日本天堂| 午夜啪| 婷婷亚洲五月***久久| 韩国女主播青草福利视频| 精精夜夜| 老鸭窝黄色视频网站| 97超碰欧美精品| 高跟丝袜AV专区国产| 天天操人人操骚逼网站| 97色在线视频| heyZO天然素人无码AⅤ专区| 日本片日本片祼观看网站在线看中文版网页在线看 | 麻豆成人影音在线| 亚洲av夫妻操穴网| 丝袜视频网国产90| 狠狠干狠狠色| 日韩欧美三级| 91人妻丝袜无码| 影音先锋日本乱伦| 插入粉嫩少妇视频| 99啪啪| 91bbb| 午夜天天碰综合视频| 97精品中文字幕| 中文字幕神马久久| 性站| 黑人精品欧美一区二区蜜桃| 青青草精品| 欧美日韩精品久久| 丝袜AV一区二区三区| 欧美亚洲第1页| 久久超碰、| 日本性一区| 久久久久九九九九| 99精品在线观看| 男女香蕉一区二区| 久久精品国产96精品亚洲拳交| 熟妇高潮一区二区免费视频| 国产精品免费久久久久久久久久| 亚欧高清在线| 亚洲骚逼少妇| 九九热免费国产视频婷婷伊人五月| 四虎影视永久在线观看精品免费网站| 天天综合中文字幕 91| 日韩一级片| 亚洲日本天堂| 操逼网站视频漫画国产| 欧美日韩人妻精品一区二区三区| 日本网色| 欧亚无码视频| 日韩欧美资源| 色五月综合网| 男人的天堂日本东京热| 丰满人妻无码一区二区三区| 午夜精品久久久久久久| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 欧美骚少妇| 国产女人高潮视频| 免费精品无码一级毛片牛牛影视 | 观看视频图片一区二区三区| 亚洲一区二区三区播放在线| 中文字幕88av在线| 久久色人体 | 91超级碰碰碰| 丰满岳乱妇一区二区三区| 天天综合91入口| 久久精精区一区二区一蜜桃一区二区| 国产精品免费1区2区视频| 天天天堂影视日韩亚洲91| 99热网站| 999岛国大片| 国产精品久久久久无码A√| 久久久四区| 日韩AV噜噜噜一区二区三区四区| 久久久com| www欧美性爱| 99re超碰| 欧美片第一页| 中文字幕乱偷人妻久久艾草网| 97天天摸天天碰| 去干网最新版| 久久久久久一日韩字幕无码| 综合色区偷拍| 丝袜足交视频| 亚洲黄色AV电影| 色眯眯av| 一卡二卡三卡| 特污精品女优骚货黄色视频在线免费观看| 五月天精品| 男人天堂最新手机版在线青青草| 51一区二区三区| 中文人妻av高清一区| 亚洲加勒比久久日本道| 亚洲精品熟妇1区2区3区。| 天天澡天天爽日日av| 黄日韩| 人妻久久久| 国产99 中文字幕日韩小视频| 午夜在线播放| 免费在线看黄片av| 中文字幕精品一区欧美| 久久6热视频免费观看| 国产成人bd在线观看| 色综合av综合久久| 韩三级a视频在线观看| 2017天天插| 亚洲se91| 国产精品ⅴ无码大片在线看.| 国产不良强奸视频免费看| 伊人久久亚洲色欲综合网站| 欧美日韩国产人人| 熟女熟妇一区二区三四区| 思思热一热婷婷热一热| 中文字幕丰满子伦无码专区在线视频最新 | 精品人妻一区二区三区视频在线| 国产肏逼网站| 一级做a爰片性色毛片久久| A 天堂在线观看视频| 人妻精品视频一区二区| 天天夜夜久久| 久久久久亚洲熟妇熟女| 亚洲国产婷婷在线播放| 26uuu欧美| 97干色天堂| 久久中文字幕人妻熟av女蜜柚| 精品国产乱码久久久A| 午夜国产综合视频在线观看| 国产精品视频麻豆入口| 婷婷五月影院| 精品一区二区三区18| 国产v片在线免费观看| 人、人、摸,人、人、草| 夜夜操天天肏| 男人天堂网址| a男人的天堂| 日韩欧美加勒比| 无码免费精品高清| 欧美在线干| 国内伊人久久久久久网站视频| 99久久99九九99九九九| 青青青草伊人精品| 午夜福利精品| 野狼激情网| 91性网| 小日子操bb在线看| 亚州男人的天堂| 午夜操逼不卡| 人妻免费观看| 黄片直播三级黄片两女一男| 蜜臀无码一区二区| 亚洲av影音先锋| ′ !γ}丶。。久久精品欧美一区二区三区 | 欧美偷拍| 久久久五月天| 久久人体一区二区| 大香蕉五月天婷婷| 91亚.色| 亚洲AV无码国产成人| 热的中文 热的有码 热的国产| 亚殴在线| 国产1024在线播放| 欧美在线l亚洲| 欧美极品性爱天天射| 九九九九免费视频| 国产馆极品诱惑| 91欧洲国产成人久久精品网站| 亚洲另类久操网| 秋霞久久亚洲精品成人| 大香蕉线| 中文字幕免费在线观看| 欧美美女在线高潮999| 天天干18禁| 久久国产精品,久久国产| 成人26uuu| 欧美亚州综合网图片| 色综合中文字幕不卡| 黄片com.| 国产强奸乱伦xd| 天天综合,91入口| 色婷婷蜜臀av| 97超碰无码网| 91精品丝袜久久久久久| 91 亚洲 欧美 日韩 国产 综合| 久久老女人| www.AV有限公司一区| 五月激情视频| 综合一区中亚洲国产成人综合精品| 国产精品另类一区大香蕉| 国产丝袜美腿美女麻豆| 婷婷视频网| www.av在线视频| 2019亚洲男人天堂| 人妻素股| 久热久操| 久艹视频在线| 日韩无码服务区| 免费操逼91| 97干天天| 足交视频老司机| 人妻黑丝袜电影| 玖玖97综合| 97免费在线视频在线观看| 亚洲男人bt天堂| 丁香五月影院| 亚洲一区二区三区欧美日韩| 日韩精品中文字幕人妻| av一区二区三区不卡| 亚洲成人ab| 欧美日韩人妻婷婷一区| 天天天天做夜夜夜夜做| 精品一国2| 亚洲男人的天堂一区二区| 在线黄页看毛片| 激情五月天丁香| 日本大片日本一区二区免费高清 | 无码男人天堂| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 欧美啪啪女女| 爱爱动态120秒| 又大又黄国产| 激情自拍 校园春色| 天天日天天舔天天喷天天射| 艳尻美人妻| 51一区二区三区| 99在线精品视频| 男女啪啪网站免费视频| 综合亚洲欧美精品日韩?v| 91色综| 欧美性,色九九| 午夜精品久久久久久久99热影院| 啊啊啊骚| 另类亚洲一区二区三区| 国产乱伦性爱AV| 欧插网站| 9久精品视频在线观看| 97中文天堂| 天天干天天干天天干| 亚洲综合校园春色| 97超色| 极品销魂美女一区二区 | 欧美久热| a人欧美综合天堂麻豆| 久久国模av| 99热在线只有精品| 中文字幕一区二区韩| 艳美熟妇先锋一二三区| 亚州欧美另类| 久久美女福利是上海美女| 日韩影片中文字幕一区二区三区| 亚洲淫乱骚妇AV| 亚洲在线a| 欧美色视频在线| 欧美黄色图片| 男女激烈网站最新| 九九九九九九九九九九精品视频| 国产精品人妻免费精品| 99re6国产精品99re在线| 91精品丝袜久久久久久无码人妻| 偷拍精品一区二区三区| 97精品一二区| 日韩在线电影| 天天干天天日天天射黄色大片| 精品一区二区三区四区女| 青青操视频在线| 久久久久国产精品片区无码直播| 99999久久精| 丁香五月婷婷基地| 日韩在线观看三级电影| 97人人草| 日韩国产成人自拍视频| 国产后入| 无码男人天堂| 可以免费观看的av| 中文字幕乱码在线观看| 青青久操| 色婷婷五月天| 日韩不卡在线一区二区| 日韩精品亚洲一二三| 欧美在线l亚洲| 国产成人自拍视频视频| 极品久久久久久久久久久久久久| 欧美十八禁在线看| 国产女人极品高潮毛片| 黄片视频观看| 天堂成人网| 粉嫩不卡一区二区性爱| 欲女人妻性色av| 精品视频日日夜夜| 九九AV| 人妻色偷色噜| 亚洲十八禁止| 久久e6只有精品| 被窝影院午夜看片无码| 美女黄站| 欧美狠狠狠| 免费97视频| AAA久久| 婷婷色影院| 中文字幕 国产区| 欧美天天综合网版| 精精品人妻一区二区三区| 亚洲视频二区| 校园春色综合香蕉| 色哟哟-国产专区| 伊色综合天堂色97| 日本韩欧美在线播放a| 亚洲好色人妻| 99热在线只有精品| 久9久| 男人的天堂成人的社区| 激情五月综合| 国产黄色 A 片免费看| 强奸乱伦亚洲第一页| AVE乱伦| 亚洲一卡二卡在线免费| 日韩一性一交一A片俄罗斯| 日韩欧美蜜桃精品久久中文字幕久久| 精品国产一区二区三区久久久蜜臀| 日韩无码专区| 夜夜嗨AV蜜臀av| 操B久久| 啊啊啊啊啊好舒服视频| 久久精品无码不卡| 97一区二压| 亚洲熟妇综合久久久久久| 91精品国产长腿丝袜美女| 女优大全 - 91n| 亚洲色图A| 国产精品九九| 人妻精品一区一区三区蜜桃91| 97视频播放| 亚洲 在线| 综合欧美色图| 八戒无码国产午夜福利| 1024人妻| 国产吹潮女在线观看| 五月天欧美色图| 欧美岛国精品在线观看| 大香蕉九九| 97精选久久| 日本不卡一区| 一级黄色视频网| 99热这里都是精品| 久久综合av| 蜜臀无码视频在线观看| 亚洲人成网www| 婷婷九月丁香| 91人妻尻屄视频| 在线 亚洲 网爆 自拍| 四虎精品一区二区| 欧美黑人精品一区二区| 九九九九九九九精品视频| 国产青视频| 97天天插| 日韩人妻 中文字幕| 亚91亚洲网| 久久久久九九九九九| 亚乱色| 男人的天堂色偷偷青青草视频婷婷网| 国产极品粉嫩馒头一线天av| 极品白嫩美女白浆成人福利在线看| 免费人人搞97| 国产精品无码成人精品| 69AV女优男人的天堂| 天美传媒婬乱在| 野狼激情网| 五月亭亭六月丁香| 超碰 av 女人天堂| 美女黄频a美女大全免费皮| 人人色人人射人人妻| 日韩在线国产字幕| 色爱综合网欧美| 日韩精品在线放| 床上啊啊啊一区二区三区| 国产视频第二页| 99综合网| 精品人妻15区| 日本丝袜美腿人妻九九| 欧美性生活免费网| 青青久草| 国产在线不卡导航| 一起草三级AV电影在线观看| 婷婷情色五月天| 人人干人人操人人..com| 日韩精品亚洲一二三| 亚洲中文人妻色| 国产女生在线| 一级成人性爱| 久午视频| 天躁夜夜躁2021| 自拍丝袜美腿人妻| 精品国产一区二区三区四区在线看| 性生活无遮挡纯毛片在线看| 丁香五月天激情网站| 亚洲最新Av| 啊啊啊免费| 国产白丝网站| 日日嗷| 2019亚洲男人天堂| 中文字幕加勒比海高清无码免费视频| 亚洲欧美在线观看2021 | 国产人妻精品一区二区三区秋霞| 好看的91视频| 清清一区二区三区四区不卡视频| 妇女性内射冈站HDWWWCOM| 天堂精品小草| 国产精品亚洲四五区在线观看| 免费一级黄色录像影片| 日本操逼无码| 亚洲图片欧美色| 久久伊人东京热| 精品97精品97| 国产日韩精品一区二区三区| 91一区二区| a在线观看| 中文字幕 国产区| 情趣丝袜无码操逼视频| 欧美日韩国产成人高清| 被男人添B超爽视频| 在线97视频| 亚洲AV无码乱码| 熟妇人妻精品一区二区| 欧美男人的天堂| 无码九九九九| 欧美综合狠| 日本幼女18+| 青青草久草| 色吧5亚洲| 亚洲国产av中文字幕久久| 国产性久久久| 九九Av| 久久久久久久 九九九九九九九| 欧美第38页| 婷婷九月国产| 91综合在线| 草草草视频在线免费看| 熟女激情综合网| 国产9 9在线 | 亚洲| 久久国产逼| 九九亚洲视频| 成人久久精品| 日韩欧美日韩| 国产成人精品亚洲日本| 白嫩嫩一区| 青女在线| 精品久久久久久中文字幕视频免费| 久久青青草原免费视频| 婷婷成人五月天| 九九激情网| 97国产色综合| 麻豆色99999| 一级岛国大片| 丁香五月av| 美女露胸露奶头| 偷拍导航视频网站| 乱伦图一区| 熟女自慰久久久| 又大又大又大又粗爽高潮观看| 91c色| 一级@啪啪视频| 97久久久久久久精| 视频国产欧美在线播放| 97色在线观看| 大香蕉伊然在亚洲91| 黄色电影在线播放综合网站| 综合天天网| 少妇高潮九九九九| 精品国产久久乱码| 色婷亚洲五月在线观看| 国产精品另类一区大香蕉| 亚洲国产成人高清在线| 蜜臀99久久精品久久久久久| 免费观看的黄色的网站| 天天干夜夜| 亚洲AV无码国产精品久久久久 | 91在线丝袜视频| 97超碰磁| 色香综合天天影视综合| 亚洲欧洲网站免费观看| 亚洲精品少妇| 精品免费一区二区三区在线亚洲人成| 啊啊啊啊操死我| 操死我了啊啊啊| 免费簧片在线观看| 精品无码一区二区三区| 日韩啪啪啪啪啪| 天天亚洲| 欧亚日韩三区| 91啪啪视频| 精品人妻一二三| 婷婷九月丁香| 91中文精品日韩欧美在线| 囯产乱伦一区二区三女| 超碰精品人妻狠狠干| 五月综合激情网| 9色国产精品一区粉嫩| 日本精品一区三区| 综合免费无码中文| 色噜噜人妻av中文字幕| 亚洲第一页色| 天天视频黄网站| 国内毛片四区| 欧美天天综合站| 亚洲网自拍| 青青草中文-久久青草精品一区二区三| 欧美一二三级精品在线| 天美传媒婬乱在| 国产第11页| 人妻密肉在线观看| 1956日韩精品| 亚洲精品一区二区三区新线路| 欧美一区二区三区蜜桃| Av手机版天堂网| 九九九久久久| 日本黄色天堂| 亚洲日产专区婷婷| 99热aaa| 超碰 另类 欧美 | 无码伊人久久大杳蕉中文无码| 日日日日做夜夜夜夜无码| 国产超碰AV在线精品| 成人小说视频在线精品欧美| 久久久四区| 蜜臀久久久99久久久久 | TS人妖另类精品视频系列 | 999岛国大片| 日本熟女中文| 91ise欧美| 99re只有精品| 毛片中心9视频99| 99热免费| 色哟哟AV| 99色网| 蜜乳视频网站| 天天看天天在线精品| 91碰超| 丁香久久| 一区二区三区无卡视频在线观看| 97欧美色综合| 91欧洲入口| 欧美激情综合| 99久久婷婷丁香| 久久免费精彩视频| 爱啪精品一区| 国产精品一区在线播放| 国产精品ⅴ无码大片在线看.| 涩涩涩综合| 国产精品一级毛片不卡视| 久久激情网| 人人妻人人操人人乐| 伊人综合色网| 欧美日韩少妇色情| 日韩午夜国产| 亚洲在线91| 精品久久人妻成人网| 国产在线播放成人免费| 青青草国产一区二区三区| 亚洲资源站| 和协影院中文字幕三区| 草久久久| 久久九色| 免费精品人妻一区二区三| 97天堂| 嗯嗯啊啊好大好爽| 97超碰色| 五月天婷婷基地| 欧美大香蕉卡久久| 青青草在线视频欧美| AV女资源| 精品性爱一二三区| 69AV女优男人的天堂| 欧美在线|亚洲| 久久久久久久91| 在线看片国产精品每日更新| 亚洲国产一区二区三区在线| 亚洲欧美97√| 大香蕉一线视频| 久久亚洲不卡一区二区三区| 97在线公开视频| 国模吧 一区二区三区| 亚洲精品 欧美精品| 牛牛操视频逼| 精品人妻一区二区三区-国产精品| 91高潮喷水美女| 欧美亚洲尤物久久| 试看福利| 人人 操人人 操人人| 中文字幕国产精品1区| 97 国产精品| 国产91精品福利在线| 精品一区二区啪啪啪| 丰满人妻-区二区三区免费看| 99综合视频| 国内成人圈中文字幕无码视频| 久热在线精品免费观看| 亚洲婷婷五月天| 超碰在线一区| 亚洲。日韩。欧美| 91综合中文字幕| 日韩三级一区| 国产午夜精品在线观看| 精品少妇一区二区三区免费观看| 大香蕉日韩| 91大神电影天堂| 丁香色狠狠色综合久久小说| 一区二区蜜臀| 极品色www影院| 91亚洲网站| 欧美精品四区| 欧美18老人禁| 日韩综合第八区国产精品| 激情av| 国产婷婷综合在线观看| 久久综合日韩亚洲欧美| 日本熟女免费視颖| 黄色成年| 91超碰人人| 人人操人人操人人操人人操人人操人人人11.CM| 天天做天天爱天天爽AV| 欧美性爱中文字幕无线码| 2017天天操| 欧美大色交| 午夜呻吟欧美| 日本福利二区视频| 人人干黄色| 久草精品在线| 欧美久久人妻少妇一区二区| 亚洲AV无码AV吞精久久久久| 久草资源在线| 亚洲电影91| 欧美第38页| 91狠狠综合久久久久久| 91香蕉视频在线观看免费| 插插综合网天天影视网| 青青草色插素人| 小草精彩毛片| 色99视频| 思思热影视| 日夜精品| 夜夜黄| 嗯嗯啊啊好大好爽| 偷拍伦理视频| 天天看,天天做| 成人乱码一区二区三少妇| 高潮毛片无遮挡高清免费| 国产女人视频三四五区| 欧美日韩亚洲少妇寂寞影院正在播放 | 亚洲欧洲综合成人av一区| 国产精品一区二区后入| juliaann丝袜大战黑鬼| 色狠狠综合噜一二三区| 日韩AV一区二区三区三州三州| 综合激情五月丁香| 亚洲图片偷拍视频区| 久草网站免费在线观看| 激情天天视频| 国产无码精品高清| 欧亚三区动漫| 综合 亚洲 欧美| 亚洲久久久久| 婷婷五月天激情四射| 亚洲的天堂网| 97干综合网| 亚洲大色堂| 欧美大片一区二区三区| 欧美亚洲厕所精品偷拍91| 97超久碰| 神马影院午夜福利久久久| 亚洲自拍青操视频| 女生91网站| 天天干天天操天天操夜夜操天天操| 乱操乱伦AV| 乱伦图一区| 色激情五月天| 久久久草成人网站久久久草成人久久久草久久久 | 少妇人妻无码| 97精品中文字幕| 超碰97极品9| 黄片免费日韩| 中文字幕国产在线天堂| 思思热久久成人| 五月香婷婷| 国产传媒日本欧美专区| 国产中午字一暮区| 国产精品农村妇女精品| 淫淫综合网| 少妇人妻好深太紧了vr91| 99视频精品| 国产精品久久久九九九| 欧美精品,四区。五区| 天天噜| 亚洲高清国产理伦片| 五月丁香社区婷婷日韩欧美精品影院| 中文字幕老熟妇黄色视频| 天天欧美色| 自拍啪啪视频| 日本高清_区二区三区| 中文字幕一二三区| 97视频免费| av日韩在线观看电影| 亚洲免费97免费| 91美女视频在线观看| 手机看av网站在线看| 免费网色网站| 天堂v无码免费视频| 欧美性爱在线无码| 狠狠躁天天躁日日躁| 午夜福利国产欧美日韩夜夜| 亚洲91av| 超碰97伊人| 亚洲强奸乱伦影视网| 99精品高潮| 综合免费无码中文| 91天美传媒精品| 欧美亚洲自拍另类人妻| 97国产高清视频在线观看| 亚洲青色欧美| 中文字幕一二区二三区人妻专区| 91人妻视频| 成人性爱av| 久久骚| 在线中文字幕极品av| 2020中文字幕在线| 制服乱伦| 欧美综合网站999| 丁香六月综合激情| 好吊色综合| 99色色| 99热这里只有精品18| 日本午夜福利影院| 亚洲天堂少妇| 爱射综合| 亚洲图片激情综合另类| 美日韩一二三区| 亚洲91在线播放影院| 性爱AV天堂| 亚洲欧洲日韩国产自在线| 欧美操逼熟女| 国产精品乱码久久久久久久久| 国产精品久久久三级无码| 欧美亚洲特P| 精品十三区| 99热99色| 欧美的性爱网站免费| 欧美最婬乱婬爆婬牲视频| 台欧久久精品视频| 国产精品嫩草久久久久| 久久黄黄黄| 精品人妻一区春色| 中文字暮97| 日语五十路和六十路亚洲国产精品| 黑人精品久久97| 欧美第一页性| 亚洲欧美国产中文视频| 天天大干大香蕉| 99re95| 午夜激情床戏激情| 黄片免费视频2019| 亲子敌伦对白在线播放| 91久久国产精品| 天美一二三在线观看Av| 99热这里只有精| 日韩国产乱子伦App| 亚洲国产一级黄色视频| 久久久四区| 亚洲精品电影| 国产后入式在线观看| 少妇3P性爱自拍| 久久草草亚洲蜜桃臀| 啊啊啊啊操死我| 在线色资源| 韩国三级三级BD在线| 日韩精品高清资源在线| 久久国色天香香蕉| 国产亚洲 中文欧美久久| 曰韩av中文字幕专区| 久久三| 亚洲成人av电影在线| 先锋影音av先锋一区| 成人性爱AV在线免费观看| 日本一级特级毛片视频| 啊啊啊好想要| 亚洲国产成人精品久久久国产成人一区二区| 综合亚洲网| 神马麻豆福利院| 91五十路| 亚洲天堂男人天堂网| 男女无套 免费网站| 四虎午夜影院| 日韩精品一区二区日韩| 人人人人插| 伊人色综合网| 亚洲男人的天堂亚洲| 欧美九九爱| 久久免费精品96| 天天影视综合色| 起碰97| 免费观看的黄色的网站| 欧美一二三级精品在线| 高清成年美女黄网站免费大全| 亚洲欧洲国产综合av| 亚洲国产精品久久久久久久久久| 97超碰美国| 日本最新1区2区3区| 久久精品国产亚洲粉嫩| a片 xxxx受爽视频| 久久久久久国产手机AV| 久久97| 青青草伊人久久| 风间由美日韩欧美久久| 亚洲婷婷丁香在线| 91精品女厕偷拍视频| 久久久九97| 97中文天堂| 亚洲九九视频在线观看| 国产h小视频在线观看免费| 久久久久免费看少妇A片特黄| 在线另类| 久肏视频字幕| 凸凹视频在线观看| 后入人妻一区| 日韩猛交| 午夜偷拍久久熟女| 午夜免费视频1000| 欧美另类丝袜熟女| 操人人| 日本免费一区二| 97日韩欧美亚洲| 国产精品无码av| 欧美操逼视频二区| 三级日韩一区二区三区| 色5月婷婷| 操一对老熟妇爽上天视频| AA特级绝黄| 69人妻精品丰满熟女区| 韩国三级一线观看久| 中出91| 91中文字幕制服丝袜免费视频| 久久精品国产72国产精品福利| 性老妇一区二区三区| 国产精品白丝在线播放| 亚洲精品99| 天天拍夜夜| 亚洲人精品久久久喷水| 啪啪性爱免费视频| 日本精品国产视频| 成·人免费午夜在线观看| 久久国产视频性吧| 综合久久少妇中文字幕| 日韩一999精品| 人人爱人人乐人人操| 色女99一级片在线观看| 久久精品国产亚洲AV清纯| 黑丝91视频| 日韩国产欧美伦理在线| 伊人成人情色综合| 91深夜夜| 国产精品禁久久久精品| 亚洲夜色在线| 久久性生大片免费观看性| 99啪啪视频| 成人性爱美曰韩| 久久内射| 国产女同性恋视频| 日本精品一区二区中文字幕| 一区二区高清视频| 插入综合网| 亚洲最大的综合性av| 五月天人妻综合| 丰满少妇一区二区三区专区| 欧美黄片欧美黄片xxx| 久久内射| 九九热精彩视频| 五月丁香综合啪啪| 国产AV色黄看到爽| 亚洲另类春色| 亚洲高清在线se| 国产有码一区| 久久激情亚洲精品无码?V| 亚洲色图欧美一区二区不卡| 亚州精品人妻一二三区| 中文字幕在线观看网页| 99在线观看| 在线欧美69V免费观看视频| 丰满人妻一区二区三区蜜桃视频| 嗯嗯啊啊视频一区二区三区| 久久亚洲婷婷| 久久久精品视频免费观看| 国际精品久久久| 91路www| 自拍视频大全亚洲专媒视频/一区二区三区| 欧美一级色| av强奸乱轮| 人人操,人人液| 97色亚洲| 男女国产精品| 风韵犹存大大大大香蕉| 亚洲图片欧美偷拍| 亚洲无限观看| 碰超人人在线一区二区三区| 欧中日成人免费影视| 久久一区无码| 青青草原狼av| 人妻少妇av在线观看| 午夜电影在线观看无码专区| 中欧人妻丝袜中文字幕 | 免费一级毛片在线视频观看| 精品人妻一区| 久久亚洲精品成人av| 国内毛片无码一级毛片| 国产精品久久成人免费| 超碰人人超在线观看| 成人网址在线观看| 精品超碰中文在线| 久久理论字幕视频| 欧美日韩婷婷中文| 九九九影院| 在线看污网站| 亚洲天堂男人| 免费看黄视频亚洲网站| 中文字幕一二区二三区人妻专区| 中文字幕中文字幕一区二区| 色欲日韩欧美在线一区| 大香蕉伊人久久| 久久久久一本一区二区青青蜜月| 大香蕉中文aV在线| 久久华人网| 国产1024在线播放| 中国女人内射6XXXXX| 桃花色涩综合影院| 亚洲欧美一区二区三区在钱蜜桃| AND人妻系列| 天欧美在线| 一级片视频啪啪| 粉嫩av在线一区二区| 久久国色天香香蕉| 亚洲天天精品| 大香蕉欧美| 欧美aaaaaaa| 久操高青| 欧美精品不卡一二三四在线91| 中国人高清www色视频免费| 久久性爱网站| 久久做97| 97国产精品| 五月婷丁香| 欧美亚洲综合999| 久久丁香久草综合网| 97久久资源| 丰满搜索结果 -第18页- 久久高清无码 | 操国产高清| 日韩亚洲精品一区二区| 97视频在线免费看| 国产AB视频| 国产不卡免费在线视频| 亚洲天天艹| 亚洲图片欧美| 翔田千里av一区二区三区| 欧美精品另类人妖xxxx| 香港久久久| 亚洲一区日韩| 亚洲青青草| jizzjizz欧美| 亚洲免费97免费| 欧美伊人久久综合网|