亚洲有码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
返回資訊列表
欧美黄页在线| 免费A片三p视频| 久草毛片| 顶级丝袜熟女一区二区三区| 国产后入| 国产原创自拍| 国产精品色约约| 精品丝袜无码一区二区三APP| 久久伊人大香蕉| 密臀AV在线| 97干在线视频| 免费综合亚洲中文| 久草免费在线视频| 激情五月婷婷| 男人在线天堂| 人妻AV 中文字幕的| 一本色道久久综合熟妇| 亚洲精品官网在线观看| 天操老女人| 亚洲无码com| 黄色乱论网站| 亚洲精品久久久久毛片A片拉屎 | 强奸乱伦中文字幕AV| 三级精品三级在线观看| 久久的网站啊啊啊啊啊| 丝袜美腿亚洲| 欧美最婬乱婬爆婬性视频 | 久久久涩| 高树玛利亚无码流出| 香蕉人欧美综合| 伊人久操| 男人的天堂视频精品乱在线| 免费看久久久性性| 7777奇米影视久久| 国产曰批免费观看久久久| 欲香欲色| 日韩一区二区熟女| 亚洲密乳AV| 九九热超碰| aV中文麻| http://qxhbdz.com| 国产精品不卡一区二区电影| 素颜老阿姨乱情色| 国产亚洲日本精品在线| 色婷婷一区二区三区久久午夜成人不| 激情综合久久| 热99这里有精品综合久久 | 精品一区二区三区最新| 国产第12页| 综合av社区| 大香蕉啪啪啪啪在线| 成 人 A V免费视频在线观看| 91男女啊啊啊| 无码人妻精品一区二区中文| 日本A级视频| 久操网无码在线| 91激情网| 婷婷伊人綜合中文字幕| 欧美一区二区三区不卡高清视频| 夜夜嗨绯色| 国产91亚洲精品一区二区三区| 欧美v亚洲v日韩v最新在线二区| 制服丝袜第二页| 亚洲成人av电影在线| 熟女露脸激情自拍视频| 盗摄 精品 另类 一区| 国产无码久久高清| 嗯嗯嗯啊啊啊操的我好爽| 熟女五十路一区二区三| 老女人综合网| 青青草五月份天| 久操大香蕉手机视频在线看| 一类无码操逼视频| 91色花堂| 欧美熟女妇同| 亚洲第一综合| 亚洲少妇综合在线播放| 伊香蕉综合久久久久久久噜噜噜 | 97视频在线看| 久久久久久九九九九九九| 尻女朋友一夜| av资源在线播放天堂| 亚洲欧洲成人在线电影| 97中文字幕一区| 亚洲大色堂| 激情五月天网| 亚洲国产欧美中文永久| 探花在线免费观看视频国产一区| 超碰免费人妻人人| 久艹日日日| 99re在线视频这里只有精品| 久草新免费| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 青椒国产97在线熟女| 大逼色网站| 日韩人妻无码精品系列| 蜜桃久久久久久| www超碰| 亚洲日韩视频二区| 丝袜亚洲综合| 欧美日韩亚洲少妇寂寞影院正在播放| 综精品久久久aaaa| 天天流夜夜操| 99热最新| 欧洲一级性爱视频在线观看| 欧美人人曰人人操人人射射| 久九九九九九九九热| www.男人天堂| 操淫穴亚洲五月丁香| 男人的天堂.com| 国产黄片在线免费观看| 天天弄天天操| www.色操逼| 国产 亚洲 一二三四| 极品另类| 国产丝袜美女在线一区| 无码精品久久| 98人妻精品一区二区色欲| 97综合在线| 天天干人人乐| 欧美不在线| 粉嫩av一区二区三区天美传媒 | 热无码中文亚洲H一道本一区二区| 欧在线一二区| 国内外内射高清视频| 久夜视频| 国产肏逼网站| 亚洲图片日本AⅤ欧美在线| 一级做a爰片性色毛片久久| 日本一级特级毛片视频| 久久精品亚洲成a人天堂| 国产精品无码AV网站| av凤凰久久久| 欧美成人黄网色网站| 69精品久久久久中文字幕| 日韩欧美福利视频看看| 午夜福利无毒不卡| 国产日韩欧美亚洲精品95| 亚洲欧美国产中文字幕| 白丝少妇一区二区| 蜜臀在线看片| 中文字幕人妻资源在线| a片在线播放| 久久伊人亚洲AV无码网站| 久久的免费性爱视频| 男女一进一出视频久久| 日韩卡一卡二卡三在线| 国产高清无码一区二区三区四区皇冠| 人人扣人人操| 欧美色图亚洲色图成人在在线| A级在线视频| 天天草天天日| 无码WWW免费视频网站| 亚洲蜜乳av| 自拍偷拍2025在线观看| 熟妇熟女一区二三区| 在线亚洲精品久久久| 粉嫩AV一区夜夜嗨| 高潮9999外国| 伊人一级免费黄片| 亚洲欧洲国产综合av| 国产一区96在线| 最新精品久久蜜桃 | 91性高| 九九九九九九九九九五码| 欧美 亚洲 综合 制服 另类| 欧美综合第一页| 高清国产精品福利网站| 色人久久| 精品国产国产AV| 99999久久精| 久久成人国产| 伊人91| 日韩成人私密一级精品av| 26uuu性| 国产怡红院| 丝袜高跟澳门91视频| 精品黄色电影| 91狠狠综合久久久| 精品九九九九九九九九九| 97在线观| 天天肏夜夜肏| 久久亚州大香蕉| 夜夜精品视频| 亚洲婷婷五月天| 麻豆人妻偷人精品无码视频| 亚洲A曰本VA欧美VA视频| 亚洲精品日日夜夜52| 亚州再线| 国产内射爽爽大片| 激情文学 国产一二三aV| 国产9熟妇视频网站| 欧美性天天| 婷婷精品视频| 1204人成网站色www| 啊啊啊啊啊啊在线观看| 天堂精品在线| 九久久九九久视频| 五月天亚洲色图| 一起草日韩| 久艹伊人精品综合在线| 精品一区二区三区丰满熟女-亚洲欧美一区| 国产精品亚洲无码| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 美女露胸露奶头| 亚洲AV在线资源| 日韩高清黄片| 超碰精品人妻狠狠干| 在线看的av| 志村玲子视频一区二区| 自拍六区| 九九99精品视频在线观看| 欧美性爱一区二区三区四区| 国产一区二区三区视频在线看| 强免费黄色网址| 天天躁狠狠躁av| 亚洲国产成人福利在线观看| 尤物AV免费网站| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 精品性爱一二三区| 90后后入| 综合激情五月天| 国产青青综合伊人| 第一高清av中文字幕| 我想要啊 啊 啊| 欧亚乱色熟女一区二区| 97久操| 欧美性爱在线无码| 大香蕉日韩| 九色 人妻 大香蕉| 免费精品无码一级毛片牛牛影视 | 日韩在线一区高清在线| 2017天天透天天通天天擦| 亚洲导航深夜福利| 久草毛片| 亚洲欧洲网站免费观看| 五十路三区在线| 九九久久九九久久| 免费观看日本操逼视频| 久久国产99精品72福利| 亚洲天堂AV在线播放| 黑人干亚洲| 欧美视频边做饭边橾| 校园春色宗合网| 伊人久久婷婷| 视频国产成人精品日本亚洲18| 秋霞男人网| 神马久久中文字幕| 精品久久人妻成人网| 欧美97网| 男人久久精品| 欧美成人黄网色网站| 人妻一区二区三区熟女| 亚洲性猛交| 大香蕉九九| 亚洲欧美伦综合| 一区二区三区蜜桃成人撸久久东京热| 蜜臀操逼黄色视频操的好爽| 91操熟女| 99日视频在线免费| AV高清一区| 久久亚洲精品成人av| 欧美精品97| 欧美精品 - 91爱爱| 青青草成人视频在线观看二区 | 国产福利在线视频网站| 亚洲人妻熟妇三十三区| 日韩在线观看字幕精品| 91亚洲网| 精久久久| 欧美激情久| 男人的天堂啪啪啪啪啪蜜桃不卡| 日本免费一级AAA大片器 | 中文字幕视频2区| 丝袜亚洲综合| 久久久性少妇| 中出后入| 99蜜桃臀亚洲成人在线观看| 91N欧美| 欧美激情性爱视频网站| 国产视频一区二区免费| 国产精品熟女九九九| 亚洲色色色| 国产曰批免费观看久久久| 男人天堂资源| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 亚洲第一二区另类图| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 大香蕉琪琪日本女优不卡| 国产精品老师| 秋霞视频一区二区 | 春色综合免费| 伦理弟一页| 亚洲综合电影| 好爽视频在线观看视频| 日本 情色 1区| 亚洲高清男人天堂| 综合干干干av久久久综合网| 精品无码一区二区| 亚洲日本韩国极品一区二区| 欧美日韩99精品麻豆传媒| 99热18| 五月婷婷激情综合| 丁香五月天啪啪| 免费一级视频特黄色大片| 亚洲精品无码久久AV| 国产传媒午夜理伦精品| 国产美女在线精品免费看| 97综合久久| 欧美+日产+中文| 丰满人妻av一区二区三区| yazhousetuoumei| 岛国色情视频在线观看| 亚洲精品人妻在线| 人人做人人妻人人夜视频| 精品国产人成在线| 无码抄逼网| 久久无码电影| 激情综合网五月婷婷| www.色婷婷色综合| 五月花婷婷| 国产精品白领在线观看| 色眯眯av| 日本国产高清色www视频在线| 久久这里是精品| 日韩99999| 在线二区不卡| 亚洲精品97| 国产精品久久久吖| 亚洲国产精品无码AV久久久| 黄色区免费观看中文字幕| 国产99久久99热这里只有精品15| 人人操人人狠狠操| 中文伊人大香蕉视频| 91色鬼| av一区二区三区四区五区久草臀| 久艹视频在线| 国产精品片| 亚洲av综合伊人久久| 日本Xx性爱| 欧美强奸一区二区诱惑| 色操逼网| 男人的天堂VA| 国产又黄又爽又刺激久久久久久| AV不卡在线| 成人国产精品三级A片| www.99色| 麻豆天美传媒在线视频天堂| 欧美日日人人天天| 日韩电影在线观看网址| 韩国一级婬片A片AAAAA| 国产97av| WWW啪啪的com| 国产又色又粗又黄又爽| 在线二区不卡| 中文字幕视频2区| 夜夜骑操视频| 久久午夜色播影院免费高清| 人人操人人搞人人草| 十八禁啪啦拍视频无遮挡| 日韩人妻少妇中文字幕| 啊啊啊啊啊啊啊在线| 日本一区二区三区四区五区六区七区八区九区| 天美传媒婬乱| 韩国一级婬片A片AAAAA| 亚洲欧洲无码97久久精品| 大干人妻| 五月婷网站| 美女黄页| 日韩欧视频| 天天色,天天干,天天干| 美女诱惑1区2区| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 干干干天天| 亚洲精品久久久久久久蜜桃臀| 91黑丝少妇| 亚洲激情欧美色图 | 精品白丝一区| 天天插夜夜爽| 97精品久久久久中文字幕| 99在线精品观看视频中文| 日本人妻中文字幕| www久久99| 欧美激情 日韩精品| 亚洲天堂男人天堂网| 美女操逼A A| 欧美制服网站美腿丝袜| 1区2区3区中文字幕日韩| 97色色婷婷| 国产午夜精品理论片a大结局| 97免费在线视频| 97色爱| 四虎AV无码| 激情五月综合网| 亚洲黄日韩无码专区| 色蜜AV| 一区二区视频在看| 久久五月婷| 色好看av| 中日韩免费看男女操逼大全| 综合久久中文字幕综合日韩精品| 欧美人妻中出| 97免费免费视频网| www…国产操逼| 中文字幕第2页| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 久久精品国产Aⅴ| 91在线美女| 久久人人爽人人爽人人片Ⅴ| 国产精品交换一区二区| 91AV天美在线视频| 100啪啪视频大全| 久久久国产成人一区二区三区在线| 内射白嫩美女| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 怡红院成人av| 伊人国产成人av网站| 91oumei| 美女丝袜激情小说| 岛国黄色短视频| 美美91成人国产精品欧美精品久久久久久久| 国产精品丝袜在线| 久综合网| 激情五月天中文字幕色| 黑丝少妇在线观看| 超碰一区二区| 丁香啪啪| 好爽视频在线观看视频| 不卡超碰护士AV在线免费播放| 自拍六区| 中文字幕片| 亚洲精品三区在线观看| 九九九九97| 操人无码| 国产精品视频内谢女人| 久久超碰大香蕉| 操逼片中文| 大学生美女口爆| 99色视频| 亚洲āv网址在线观看| 欧美日韩人妻少妇 一区二区三区| 极品色www影院| 97精品人妻一二三四| 亚洲黄色影视| 俺去啦俺来也久久综合| 男人天堂无码| 久久夜嗨| 中文字幕一区av| 性爱网站一区二区| 风间由美日韩欧美久久| 美女AV一区二区| www.99热| 久久精品国产免费观看99| 玖玖爱影院| 97在线日韩中文字幕| 97视频在线观看高清资源| 激情五月综合网| 欧美性爱中文字幕无线码| 亚洲高清自拍| 老熟女综合网| 999熟女精品| 欧美美女在线高潮999| 东京热免费视频| 国产精品自拍xxxx| 国产家庭乱伦表演| 欧美日韩1234| 国产尹人在线视频免费| 成人无遮挡毛片免费看| 精品综合久久久久久五月天| 久久久极品| 色一区二区三区综合| 久久爽爽精品| 999九九精品| 日韩欧美中文字| 一区二区三区无卡视频在线观看| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 国内毛片欧美香蕉精品| 天天干18禁| 少妇的嫩逼图片| 少妇精品久久| 操www| 人人艹亚洲| 国产一级作爱毛片| 美女刺激久久国产欧美| 色五月丁香五月| 天堂九九九九九九九九九| 日韩偷拍色图| 欧美日韩另类字幕中文| 91日韩网站| 男人女人18禁片免费看网站| 国产精品无码久久久久2025| 伊人久久婷婷| 精品176精品2| 2017亚洲天堂| 国产精品久久久久中文字幕| 久久久98网站免费视频| 狠狠操狠狠操操| 成人国产视频在线观看| 福利伊人玖玖国产| 色性综合| 蜜臀Av一区二区三区| 在线日韩日本亚洲国产| 久久肏大逼| 好吊色一区| 亚洲欧美另类图片| 亚洲AV成人无码一区二区三区在线观看 | 亚州春色| 亚洲毛片基地专区| 在线国产探花| 亚洲精品一区二区免费在线观看| 丰满熟女人妻一区二区三五十一路| 午夜精品久久一区二区| 国产免费永久精品无码| 9999久久久久| 国产日韩欧美操逼视频| 自拍丝袜美腿人妻| 日本影视久久免费| 成人在线永久| 国产高清午夜成人在线观看| 久久婷婷国产一区二区色| 欧美综合色| 蜜乳av首页| 韩国毛片一区二区三区| 在线观看国产黄色| 99这里都是精品| 无码高清专| AV色五月天| 女人喷水视频在线观看| AV99热18这里只有精品| 懂色av色欲av蜜臀av| 97亚洲资源| 超碰 av 女人天堂| 国产精品久久久久久无码红治院| 亚洲欧美国产成人综合不卡| 中文有码9| 嗯嗯啊啊的视频| 国产精品网站免费| 99久久久无码| 久久婷婷国产一区二区色| 亚洲欧美日韩夜夜| 久操 高清| 欧美成人精品A片免费一区99| 国产第25页在线观看| 很黄很色的视频在线观看| 国产美女销魂在线观看不卡| 国产97免费视频| 三级色影综合网| 色逼综合| 超碰97人人cao| 在线观看一级α片刺激高潮视频| 久久久久国产亚洲一区欧美色图日韩| 久久精品成人| 影音先锋国产精品| 美日韩男女操屄视频| 漂亮人妻被强中文字幕hd| 亚洲色性情三级| 婷婷综合五月天| 亚洲黄网在哪免费看| 中文无码一二三区| 免费精品人妻一区二区三| 久99久视频精选| 久久久久久综合久久伊人蜜月| 国产日韩精品suv| 久久久久久久极品香蕉视频| 人人干人人操人人..com| 日日骚AV| 亚洲精品尤物yw在线影院| 蜜区区视频79 | 九九视频黄色片| 亚洲综合嫩| 97超碰中文| 99久在线精品99re8a| 偷拍 精品 另类 四区| 亚洲成?V人片在线观看福利| 亚洲另类小说卡通动漫| 84YTCOM性无码| 久久一二三四| 人妻色偷色噜| 国产在线综合福利网站| 欧美色网络| 天美麻豆一区二区三区| 3P丝袜熟女 色综合| 97视频播放| 亚洲精品91| 欲香欲色| 国产精品一二三区18| 亚洲天堂久久久久久粉红视频| 日韩一卡二卡三卡| 另类天堂| 人人看人人插| 日本天天操| 亚洲无码?第一页| 亚洲精品三| 天天色粽合合合合合合合| 艹我哪美一区无码| 曰本精品久久久| 少妇内射视频| 不卡二三区人妻少妇| 91视频在线观看18| xxxx网站亚洲精品| 国产农村一一级特黄毛片| 精品人妻伦一二三区久久| 国产日本熟女顶级一区二区三区视频 | 福利社区午夜一区二区| 婷婷香蕉欧美在线一区二区三区 | JIZZJIZZ国产精品喷水| 夜夜嗨一区二区| 在线观看A啊啊啊| 色亚洲欧美| 三级精品三级在线观看| 99无码视频| 偷拍超碰| 丁香九月婷婷| av一区二区三区 中文| 久久9精品视频| 亚洲欧美视| 小视频国产| 久久黄黄| 91综合网在线| www…国产操逼| 中文一区在线日| 岛国激情视频在线观看| 久久久一区二区三区四曲免费听| 国产诱惑| 国产对白刺激视频| 亚洲瓯美色图| 亚洲综合欧美| 在线啊啊啊啊| 蜜臀99久久精品久久久久| 日韩精品视频在线观看一卡二卡| 青青草手机在线免费观看| 可免费观看的av毛片中日美韩| 国产麻豆一级精品视频| av 模特一区了| 国产精品久久99日日| 91久久国产综合精品| 欧美性爱精品七区| 中文字幕乱码人妻一区二区三区,99精品 | 校园春色 亚洲| 亚洲色图日韩精品| 96久久久精品| 国产成人手机视频激情| 激情人妻另类| wwwcaobibi| 久久久亚洲精品中文字幕人妻| 久久婷婷综合国际产色怕| 极品综合| 97一本大道亚洲一区| 国产精品久久久久久片| 超碰欧美97资源| 日产狠狠干| www.色吧5.com| 亚洲资源网| 夜夜操狠狠操| 伊人丁香五月婷婷| 精品无码少妇| 亚洲精品欧洲精品| 26uuu性| 亚洲国产精品V?在线播放| 国岛片视频| 一区麻豆 高清中文字幕| 能看的AV| 亚洲麻豆精品二区三区| 亚洲 日韩 欧美 国产综合体| 在线看免费无码AV天堂的| 成人福利视频网| 日本色色色视频| 中文字幕在线观看二区三区| 国产一级αv免费看片| 国产日韩欧美三级片| 9999免费精彩视频| 天天日天天色| 天天色香欲综合网| 天天综合网91入口| 试看60秒| 少妇精品| 啪啪性爱免费视频| 亚洲第一狼人丝袜美女另类 | 精品少妇一区二区三区在线视频| 国产伦精品一区二区三区在线观 | 色五月AV在线| 伊人9| 国语av狠狠色丁香婷婷综合激情| 久热9| 69精品在线| 啊啊啊啊啊啊啊啊要喷了| 国产呦精品一区二区三区下载| 超碰人妻在线| 久久啊哟| 国内一区二区三区| 午夜舔阴达高潮视频免费看| 日韩 欧美 另类 人妻| 亚洲天堂,男人| 欧美 日韩 婷婷 五月| 男人的天堂99| 国产精品女久久久久av爽| 欧洲色色| 神马九九九| 国产亚洲精品A在线观看下载| 亚洲第一成人影院色播| 亚洲熟女综合| 啊啊啊久久| 日本污ww视频网站| 国产91乱伦| 精品久久久av无码免费| 天堂v无码免费视频| 91c色| 91黑丝在线播放| 亚洲精品国产av天美传媒| 色综合久久夜色精品国产天堂| 伊人五月天青青草婷婷| 精品无码一区二区| 久久色一区| www. 男人天堂成人在线| 日本黄色XXX| 综合激情一一91| 高清孕妇孕交 交孕妇| 亚洲在钱| 日本一线产区和二线产区伦理片| 午夜在线播放| 欧洲在线性爱视频| 日韩性爱1级片视频| 欧美日韩国产高清在线一二三区 | 亚洲色图 欧美| 视频一区二区免费在线| 国产一区二区在线播放量| Sekablack无码一区| 67914亚洲精品| 欧美日韩亚洲少妇寂寞影院正在播放| 久久久久久久亚洲Av无码| 亚州久久9| ji熟女.com| 91九色丨国产丨爆乳| 97在线免费看视频| 精品亚洲国产成人AV制服丝袜| 97超碰久| 欧美丝袜制服久久| 天综合网欧美| 老司机老司机午夜影院| 国产乱码久久久久久| 岛国色情视频在线观看| 亚洲精品国产av天美传媒| а√天堂资源官网在线资源| 肉丝网站91| 人人操 欧美| 99999无码| 欧美一级美片在线观看免费| 国产精品天干天干综合网麻豆| 国产av又色又爽又黄| 欧美在线中M| 国产三级电影免费观看| 久操免费观看| 97玖玖人妻| 69少妇一区二区| 97在线无精品| 五月天激情网图片| 97色碰| 日日黄色三级网站| 欧美特大黄一级片片免费| 久久高潮妇女视频| 久久97资源 网| 偷窥自拍A片| www.av家庭乱伦| 少妇内射视频| 国产精品久久久久绯色| 女人喷水视频在线观看| 亚洲影院365| 丰满熟女一区二区三区在线播放| 欧美色图亚洲色,麻豆| 欧美手机在线综合| 欧美精品不卡一二三四在线91| 亚洲欧美一区二区不卡视频播放| 九九九网页| 91在线限制级| 伊人亚洲国产一成人久久精品,久久| 亚洲伊人久久综合97| 易易A毛视频| 久草成人影片| 蜜臀久久精品久久久久视频| 日欧毛片久久| 国产十八禁视频| 亚洲AV无码| 一区,二区,三区网站| 国内外色色色色色成人视频| 亚洲一卡2卡3卡4卡乱码网站 | 这里都是精品在线观看| 手机看片日韩人妻| 一级AV性爱| 久久免费少妇| 欧美78P| 97在线播放| 在线中文AV| 中文字幕78| 男插女青青影院| 色噜噜综合在线| 亚洲国产精品乱码在线观看| 五月丁香婷婷色| HEYZO高无码国产精品227| 国产高清成人mv在线观看| 欧美日韩国产成人高清| 操婢日韩| 性感美女91影视| 伊人伊人LD| 亚洲图片小说欧洲| 日本高清视频xxxx| 国产女性无套 免费观看| 色哟哟综合| 人人弄人人摸| 欧美极度丰满熟妇hd| 日韩熟妇二区| 足交视频老司机| 欧美性暴力| 小情侣高清国产在线视频| 泰国AV在线观看| 床戏久久久av一区二区麻豆| 欧美中文字幕日韩在线| av天堂影视中文在字幕在线中文| 天天做天天爱天天爽AV| 国产97在线 | 亚洲| 91社操逼| 嗯~啊~快点 死我视频| 男同专区一区二区三区在线| 久久 精品| 精品中文一区二区| 九九久久久九九| 人妻精品综合中文字幕在线 | 欧美丝袜91| 欧美BT 亚洲色图| 天天综合网~91| 免费操逼91| 思思热久久成人| 欧美系列在线一区二区| 丁香五月天激情网站| 蜜桃视频精品一区二区| 91欧美丨精品丨入口| 舔人妻中文免费视频| 大JI巴好深好爽又大又粗视频| 成人无码在线超碰网| 久久怡红院| 人人爱人人操人人性| 色图综合网| 欧美狠狠狠| 色色色999| 国产成人精品网站| 中文字幕日韩电影人妻| 色欲久久99精品久久| 91扒丝袜综合在线| 婷婷综合网站| 久久人人爽爽人人爽人人片αV| 亚洲色婷婷综合久久一区二区三区| 色女网日韩| 日本熟女中文| 欧美日韩色综合网| 亚洲天堂欧美| 久久成人东京热人妻| 台湾大香蕉99热| 黑操B| 日本性爱少妇| 亚洲免费成人在线高清无码视频| 国产三级片在线观看| 中文字幕人乱码中文字的预防方法 | 日韩在线观看中文字幕视频| 日韩欧美亚欧在线视频| 天天夜夜rb| 日本黄页视频在线观看| 伊人综合色网| 五月香婷婷| 尤物一级在线免费观看| 95自拍视频在线观看| 日韩一级久久毛片| 欧美色视| 亚洲图片欧美偷拍| 午夜九九| 亚洲欧美综合网站| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 99色在线| 亚洲日本韩国在线| 亚洲一区二区精品福利| 日本免费一级AAA大片器| 欧美精品三区| 五月天伊人网| 日韩欧美传媒一区国产| 9I1性色影院| 67914在线兔费成人视频| 欧美性天天影院| 少妇内射www在线观看视频| 国产传媒一区日韩| 少妇人妻无码| 久久大线蕉一区| 97免费视频网| 国精综合一二三区影视| 熟女欧美日韩综合婷婷| 日韩欧美丝袜诱惑| 99国产精品免费| 久久久不卡区一区二区三区久久久| 一二三四日本视频高清| 欧美色偷拍| 看黑人AV不卡| 啊啊啊啊啊好大好舒服想要| 白丝少妇一区二区| 中文字幕人乱码中文字的预防方法 | 欧美综合传媒| 人妻大香蕉| 99热日| 欧美性Fer办公室秘书| 少妇特黄一区二区三区| 一卡二卡三卡| 欧美日韩在线小说 | 日本97久久| 久操免费视频| 美女诱惑一区| 欧美日韩国产成人高清| 国产一级内射无挡观看| 日本丝袜人妻内射| 精品人人插人人操| 色蜜AV| 亚洲淫乱骚妇AV| 天天操人人操骚逼网站| 久久久久久中文| 亚洲天堂资源在线| 男女啪啪网站免费视频| 一级性爱啪啪视频| 欧美精品自慰系列寂寞少妇| 啊啊啊啊一区| 国产美女激情| 色欧美色交综合| 东京热天堂网| 97人人夜夜精品视频| 久久欧美性爱视频| 欧美嗯啊……在线观看视频免费| 欧美色图私拍91| 欧美色图在线视频少妇| 国产三级片在线观看| 国产一区二区三三视频| 婷婷久久五月| 久久久99久9| 日韩人妻丝袜美腿中文| 99999re| 国产成人无码啪| 色婷婷九月| WWW.加勒比人妻一区不卡.com| 欧洲站一级二级三级h| 91老女人| 国产精品成人蜜臀AV在线| 亚洲有码 视频一区| 男人把坤坤插入女人的下体| 欧美成人精品欧美一级乱黄一区二…| 国产精品高潮久久久无码| 黑丝自慰喷水网站| 丰满人妻-区二区三区免费| 欧美色图成人网一区二区 | 玖玖爱影院| 333kkkk·亚洲com久久| 天天影视网综合少妇| 在线小视频| 操b在线观看| 丁香五月久久| 中文字幕-区二区三区四区视频中国| 亚洲资源吧| 精品久久久高清无码| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 网页导航五月天免费一二三区| 深爱五月天| 中文字幕久久亚州无码| 人人妻人人玩人人澡人人爽| 日本性爱少妇| 嗯嗯啊啊视频一区二区三区| 91精品国产综合久久久蜜臀酒店| 欧日a| 试看福利| 少妇综合| 婷婷五月丁香五月| 蜜桃臀一区二区三区久久| 国产精品ⅴ无码大片在线看.| 精品区9| 黑人性暴力毛片| 乱伦AVxx| 欧美色一二三| 视频国产欧美在线播放| 欧美另类色图片| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 亚欧操逼片在线观看| 亚洲精品自拍| 日韩美一区| 综合欧美亚洲| 久久综合婷婷| 五月天婷婷社区| 亚洲国产一区二区三区四区国产| 亚洲色香| 国产乱伦性爱区| 第45页一区二区| 蜜桃久久一区二区| 超碰人人妻| 91色婷婷综合久久中文字幕二区| 欧美日韩99| 91精品久久久久久| 乱伦系列一区二区| 少妇久久久免费| 久久东京国产精品视频| 日日骚av| 超碰av在线| 久草新在线| 人人喜人人妻| 大香蕉一级黄色片久久| 老鸭窝亚洲毛片| 9Ⅰ老熟女| 性感女人网页在线观看视频| 校园春色 欧美| 国产suv精品一区二区四| 欧洲特黄毛片免费看欧洲毛片| 内射日韩大臀美女| 一本色道无码DVD中文字幕| 夜夜狼人妻| 日韩欧美操逼xxx| 精品网站99999| 一级aaaaa欧美中文字幕录像片| 狠狠躁天天躁日日躁97| 日本在线视频导航| 欧美的精品的视频| 久久国色天香香蕉| 亚洲色图尤物视频 | 亚洲 se图 欧美电影| 天天干天天燥| 欧美色图在线视频少妇| 人人看人人摸人人色| 中文字幕精品码亚洲| 久久国产精品一级二级三级| 日韩兔费看黄片| 久久久久久91香蕉国产| 亚洲高清无码在线桃色| 9I1性色影院| 91美腿丝袜在线观看| 人人操人人摸人人看人人插| 国产精品3| 丁香五月天社区| 翔田千里无码一区| 久久综合av| 婷婷五月天基地| 人人操人人爽人人操人人| 亚洲视频二区| 亚洲色五月| 懂色中文一区二区三区 | 蜜桃精品视频一区| 亚洲国产欧美中日韩成人综合视频| 青青在线视频免费| 欧美高清性猛交| 伊人黄色视频免费观看| 久久激情婷婷| 亚洲Av噜噜一区二区三区妖精| 国产久久久久久久久一区二区| 伊人天天久久动态图| 欧美亚州色的图| 天天干天天爽| jk白丝没脱就开始啪啪| 亚洲丝袜少妇在线| 骚女高跟AV在线| 亚洲综合色男人网| 一级特级aaaa毛片免费观看| 夜夜爽夜夜| 狠狠干妹子| 天天综合网91入口| 99精品综合久久久久五月天| 激情抓乳插进去啪啪啪日韩 | 九九热午夜欧亚国产视频| 懂色AV一区二区三区| 亚洲国产婷婷在线播放| 试看60秒 爽| nuu12国产麻豆精品| 97硬碰| 婷色五月| 浪人综合网| 日婷婷| 天天噜| 亚洲色图 91| 搡老女人老91妇女老熟女| 大屁股国产在线视频| 色呦呦、国产精品| 大香蕉九九| av在线免费一区二区| 小说区 图片区色 综合区| 99re99在线视频| 青木玲在线不卡| 久插综合| 少妇国产不卡| 亚洲色色色| 十八禁啪啦拍视频无遮挡| 狼狼色丁香久久婷婷综合五月| 精品综合久久久久久五月天| 五月天婷婷社区| 一级免费精品| 九一性生活免费视频| 日韩av色图综合| 亚洲aw毛茸茸在线| 精品视频久久久久九九九九9999| 囯产操逼片| 国产人妖视频一区在线观看| 中文字幕精品一区二| 2023天天操夜夜操| 嗯嗯啊啊操我| 嗯嗯不要视频| 亚洲中文丝袜美腿诱惑字幕| 男人成人黄色视频在线观看免费下载| 九九九久久久久| 女同性恋一区二区三区精品视频| 色av中文字| 九九天堂| 日本精品人妻少妇一区二区| 九九毛片这里只有精品| 女色视频社区| 久热伊人99re| 蜜臀精品1区2区| WWW4虎| 综合网~91综合网| 日韩国产十八禁| 91日日| 青青草色情网站视频| 绯色AV粉色AV蜜臀AV| 97色97好| 日日干男人的天堂| 久久97超碰香蕉| 一区二区播放| 91中出视频| 搡老女人老熟女91老熟女综合网| 亚洲人妻爽爽爽| 亚洲国产综合图区中文字幕 | 婷婷20月天青娱乐| 亚洲图片91| 97啪啪| 被男人吃奶很爽的毛片| 亚洲中文字幕久久人妻| 郑州宾馆老熟女露脸啪啪| 欧美一级做a爰片免费视频| 亚洲天堂久久| 99热97| 亚熟hd视频在线| 搡老女人老91妇女熟女| 久久久久久人| 999精品乱码| 88xx成人精品视频| 日本精品无码三级网站| 亚洲福利中文字幕在线| 日韩一级二级| 四虎免费看黄| 桑老女人九区| 久草在线| 狠狠操官网| 中文字幕亚洲在线一区 | 亚洲欧美中文一区二区三| 偷看洗澡一二三区美女| 天天操天天插| 中文有码第五页| 美女网站黄页| 色吧91| 国产操偷| 极品色社| 无码男人天堂| 麻豆天美一区二区| 中文字幕一区二区三区高清| 午夜天堂啪啪| 国产农村妇女精品一二区|