日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满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
返回資訊列表
无码137片内射在线影院| 丁香激情五月| 91美女在线视频| 起碰97| 97啪啪| 欧美日韩美女精品久草一区二区三区| 中文字幕一区二区三区四区在线视频| 久草婷婷| 91精品女厕偷拍视频| 四虎免费看黄| 国产探花日韩援交| 日韩精品熟妇| 岛国黄片网站| 国产乱青青草久久| 日本视频在线观看污污污| 中文字幕人妻色偷偷久久皮 | 玖玖爱一区在线| 精品免费视频国产一区| 国产精品白虎| 久久久精品91八戒| 亚洲有码第一页| 一个国产在线综合网站| 青青草好吊| 天天做日日做天天欢。| 人人操人人精品影片| 男男H黄动漫啪啪无遮挡网站| 欧美日韩国产人人| av午夜影院在线播放| 97视频在线视频| 国产成人无码网站在线视频| 日韩无码第3页| 黄色电影观看久久9| 伊人一区二区三区| 亚州综合| 亚洲色图欧美色图制服丝袜| 黄片aaaaa一区| 粉嫩久久久极品| 一级性爱aaaa| 97操| 久久↗↗| 青青草中文-久久青草精品一区二区三| 欧美九九九九九| 亚洲熟女乱色| 天天色播亚洲综合网站| 天天射天天操天天干天天吃2018 | 9久精品| 成人久久精品| 女人高潮抽搐喷水视频网站| 女性91网站| 日日橹狠狠爱欧美超碰| 亚洲啪啪性视频| 久久精品久| 丰满少妇高潮无码| 水澄无码AV| 亚洲AV秘无码一区..| 色偷偷综合91久久噜噜| 91N五十路| 日韩三级天堂在线观看| 日韩中文字墓| 欧美懂色综合网| 精品97精品97| 99在线精品视频| 人妻偷拍一区二区三区| 这里只有精品97| 熟女色图在线| 色爱综合网| 丰满人妻无码一区二区三区| 干超碰碰熟女| 99rre在线精品99re8| 久久国产对白激情浪潮| 夜色五月天| 精品毛片av一区二区| www男人天堂| 日韩 成人 有码| 婷婷五月天影院| 国产女s强制榨精视频| 欧亚日本情色| laoshunv91| 人妻久久久久久久久久久久久久久| 久久透逼视频| 国产精品网址| 欧美成人免费在线观看| 四虎在线视频| 97se亚洲| 后入式五六区| 97超碰在线资源网站| 懂色综合久久久| 婷婷五月天丁香| 无码av永久免费专区网站| 天天亚洲| 欧美 亚洲| 欧美亚洲se91| 欧美日韩亚洲少妇寂寞影院正在播放| 国产AV人人 夜夜人人澡| 九九九午夜| 麻豆精品久久久久久久| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 亚洲电影91| 一区二区三区日韩欧美| 欧美日本天堂| 96国产污污污丝袜| 一区二三区四区视频大全套| 亚熟hd视频在线| 成人日韩中文字幕| 亚洲第91页| 久偷拍| 欧美色图天堂网m| 你操综合| 偷拍亚洲高清图片| 超硑97精品| 日韩精品三区四区| 1024久久高清视频| 蜜臀久久99精品| 久久久久久久久久黄色网| 亚洲最大的黄色电影网站。| 精品网站9999| 69综合网| 91在线丝袜| 白嫩妹子国产骚| 97欧美色| 人人操,人人液| 偷拍 亚洲 欧美| 97色碰| 搡老熟女免费视频| 欧美激情性爱视频网站| 大色综合网| 女人双腿搬开让男人桶| 99久热| 国产伦精品一区二区三区视频女| 清清一区二区三区四区不卡视频| 亚洲成人一二三区| 97热视频在线观看| 一区二区影视| 亚洲国产精品有声| 欧美亚性天堂| 国产精品不卡一区二区三区| 青女偷拍网| 丰满人妻-区二区三区| 干超碰碰熟女| 青青久久手机线视频| 国产呦精品一区二区三区下载| 久久久久国产无av| 亚洲国产一区二区三区在线| 校园春色综合香蕉| 亚洲熟女av中文字幕| 一级毛片电影免费看| 天天干天天操天天操夜夜操天天操| 呦呦影院| 国产高潮AA片免费看| 91ise欧美| 国产女人9999| 日本久久女同性恋视频| 亚洲欧洲综合视频在线| 天天综合网久久ww| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 中日无幕一二三四区| 四虎视频在线观看| 麻豆天天躁天天揉揉AV| 欧美激情性爱视频网站| 中文字幕 一区二区 亚洲无码| 欧美综合在线91| 清纯唯美综合亚洲| 国产精品久久久久无码Av网曝门| 国产欧美日韩在线不卡第一页| 99久久无色码| 有码专区最新中文字幕有码| blacked精品一区国产| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 九九碰九九爱97超碰| 日han少妇无码| 亚洲a色| 日韩人妻制服丝袜av| 116美女午夜| 伊人96在线| 在线岛国新天堂8| 婷婷激情五月综合| 91亚洲黄色网| 丁香五月偷拍| 亚洲欧美首页| 九九热最新| 国产人人干| 91精品久久久久五月天精品| oumeisetupian| 国产一区在线看| 伊人女女资源在线观看| 99热99re6国产在线播放| 久久久久国产精品久久久| 国产免费一区在线观看| 日日夜夜模| 国产精品又黄又猛又粗| 艳美熟妇先锋一二三区| 97视频在线播放| 91粉嫩萝控精品福利网站_精品影音先锋国 | 天天爽天天爽| 97美日韩视频| 国产九月婷婷| 国产精品美女久久久久久网站| 精品少妇一区二区三区在线视频| 日韩丨制服丨中文|在线| 日韩欧洲操屄视频| 亚洲日韩青青草色月| 国产免费一区2区3区| 9色在线| 伊人性在线视频| 国产AV高清AV无码| 中文字幕欧洲有码| 艹我哪美一区无码| 密臀视频三区免费网站| 九月丁香婷婷| 91成人高清在线观看| 亚洲人在线成线成人| 亚洲色图欧美| 激情露脸爱| 国产无码精品久久久久久| 国产伦精品免编号公布| 日韩精品人妻一| 九九av| 大香网站| 亚洲深夜福利| 婷婷五月天久久精品视频一区二区三区| 成年人黄色| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 日日橹狠狠爱欧美超碰| 成人麻豆av电影网站| 中文幕97| 大香蕉综合在线| 九t超碰| 欧美熟爽综合| 五月婷婷六月丁香网址| 亚洲文学偷乱拍啪啪啪啪| 乱伦日本色图AⅤ| 久久久免费高清中文视频| 欧美操人| 精品偷拍13p欧美dodk视频| 中文日韩欧美熟| 激情五月天色色网| 国产狂喷潮在线精品| 亚洲色悠悠久久88| 99热国产| japan日本高清乱xxxx| 91精品国产长腿丝袜美女| 欧美在线视频99| 人人人摸人人| 亚洲玖玖爱| 校园春色综合| 亚洲精品亚洲人成在线麻豆| 欧美高清色| 中日韩久久人妻一区二区| 国产无马视频| 日本淫乱女一区二区三区视频| 久偷拍| 人人爱操| 免费精品中文字幕| 国产 日韩 欧美一区| 欧美日韩国产人人| 中文字幕av色| 在线不卡视频| 色色福利| 色视频蜜乳| www男人天堂| 成人久久精品| 色呦呦、国产精品| 99热啪啪| 一块操欧美| 人人操,人人插| 亚洲双插| 蜜臀网址在线| 日韩BBN| 日日骚 av| 丰满欧美少妇| 五月婷婷五月天| a v网站在线播放| 亚洲h片在线免费观看| 欧洲综合色| 日本天天干天天日一区| 97天天在线| 精品亚州18| 亚洲情色婷婷五月天| 国产福利精品最新在线 | 日韩中文字墓| 国产狂喷潮在线精品| 欧美激情在线观看视频| 四虎影视永久在线观看精品免费网站| 欧美性区| 日韩二三区| 中文啪啪视频| 人夜夜精品网站香蕉嫩草| 久热无码| 伊人网av| 91超碰人人| 人人人人人人少妇| 92福利社视频| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 午夜精品久久久99| 91色黑人少妇| 老女人老91妇女老热女| 久婷婷一区| 日日AV加勒比| 亚洲综合校园春色| 欧美在线第五页| 亚洲欧美91√| 久久99久久99精品天美传媒棢·纸:. | 人妻AV在线| 91久久久久久久| 欧美黄片视频在线观看免费 | 亚洲天堂一区| 国内毛片欧美香蕉精品| 女人与公拘交酡2020视频| 午夜人人操| 五十路六十路素人熟女| 黄片无码在线制服| 天天综合色| 91oumei| 992这里有精品| 成人色女网| 超碰人妻久久人妻中文97| 午夜性| Aa东京男人的天堂| 国产精品在线免费| 日韩AV无码网站| 狠狠中文字幕| 欧美亚洲综合色| 伊人青青一区成人视频在线观看区| 99热免费| 成熟熟女国产精品一区二区| 91美女视频电影| 亚洲性高潮| 久久婷婷电影网| 成人七区| 狠狠操狠狠爱| 91欧美成人色站| 9 9无尺码天堂网| 日韩欧美麻豆| 襙一襙| 亚洲情色中文字幕一区| 老色69| 我中文字幕6区| 超碰偷拍| 亚欧性爱无码| 欧美九九爱| 欧美日动态视频| 日本免费二区三区| 无码人妻精品一区二区中文| 婷婷色一区| 天天草AV| 日本精品中文字幕视频| 伊人AAA| 亚洲日韩欧美一区二区| 亚洲欧美日韩制服另类| 女人被添高潮免费视频| 九月AV| 久草看看看| 超碰无码加勒比| 99视频内射三四| 亚洲的天堂网| 日韩熟女操逼| 五月丁香啪啪啪| 日韩美女高潮喷水视频| 色综合av综合久久| 红杏大香蕉| 久久久久久少妇| A片大香蕉在线| 九九色色| 欧美97av| 激情专区综合| 久久精品一区二区三区蜜桃臀| 美女裸体无遮挡永久免费观看网站| 抽插无码高清一区| 老汉网| 电家庭影院午夜69久久夜色精品国产69乱| 国产麻豆一级精品视频| 97超碰亚洲| 亚洲欧洲成人在线电影| 国产成人网址| 日日操夜夜操天天操免费观看麻豆| 日韩精品一区二区日韩| 美女淫穴| 美女天天干| 男人天堂久久精品| 少妇无码999| 亚洲啪啪性视频| 懂色av中文字幕一区二区三区天美| 国产乱伦亚洲色图高清无码| 艾草av| 九九九久久久| 人人操天天爽| 秋霞免费无码视频日韩A片| 97香焦色区| 中出欧美| 麻豆黄四叶草网站| 极品欧美一区二区三区| 超碰激情808| 凹凸视频在线一区二区| 7月婷婷综合| 69视频入口| 久操99| 国产成人亚洲精品无码最新在线| 久久久久久中文字幕中文字幕最新| 欧美激情 亚洲色图| 日日碰狠狠添天天爽超| 在线播放欧洲免费av| 欧美特大黄一级片片免费| 成人久久久精品| 操屄不卡视频| 大香蕉草草| 色婷婷激情| 97欧美日韩| 亚洲精品蜜桃久久久一区二区三区| 97色碰| 天天天肏屄欧美| 国产一区自拍欧美日韩| 90后后入| 99热色这里只有精品| 国产午夜精品理论片a大结局| 久久久噜噜噜久久久| 亚洲国产一级黄色视频| 少妇丝袜在线观看AV| 很很热性爱视频| 国产精选视频| 久久欧洲| 激情四射五月天| 欧美日韩资源| 中文字幕-区二区三区四区视频中国| 久久久久久久久久久免费精品| 神马久久69| 日本色色色| 狠狠操,使劲操| 很很很很操| 五月丁香婷婷综合| 另类TS人妖一区二区三区| 狠操91,com| 国产超碰在线| 日韩精品碰碰| 婷婷五月天激情四射| 久久综合女优| 99婷婷| 在线中文字幕视频| oumeisetupian| 91精品丝袜在线观看| 亚洲激情视频| 日韩BBN| 麻豆人妻少妇在线免费观看| 99啪啪| 秋霞久久亚洲精品成人| 亚洲欧美另类图片| 中字一区| 91网亚洲| 欧美嗯啊……在线观看视频免费| 99精品久久久久久久婷婷| 久久综合97| 99国内熟女露脸视频| 花野真衣| 色色五月丁香| 日韩精品免费高清视频在线| 人妻另类 专区 欧美 制服| 四虎影视永久在线观看精品免费网站 | 亚洲97超碰| 久男人久久| 亚洲宗合电影| 国产精品小视频一区二区三区| 乱伦av.com| 大二网站亚洲| 人妻三级在线中文字幕| 久久久久久久久久久久97| 成人一区二区三区四区| 综合干干干av久久久综合网| 天天做天天爱天天爽| 国产精品无码在线| av网站在线观看了| 国产亚洲福利第一页丝袜| 另类小说欧美激情校园春色| 麻豆色99999| 中文字幕视频免费| 日本九九久久99| 天操天操夜操夜月操月年年操| 一起草AV| 五月丁香啪| 99这里只有精品| 91九色精品熟女内射| 女同性恋久久| 亚洲制服欧美另类内射| 黄色免费网页无码| 亚洲少妇综合在线播放| 日韩欧美aⅴ综合网站发布| 久久国产熟女影院| 国产乱伦性爱区| 91大神精品长腿在线观看网站| 无码人妻1727| 欧洲在线性爱视频| 亚洲国产成人精品久久久国产成人一区二区 | 欧洲一区二区| 黑人性暴力毛片| 欧美视频一区二区三区| 亚洲高清欧美总合| 99re免费| 老外又粗又长一晚做五次| 国产精品不卡一区二区三区av| 日本影视久久免费| 日本人妻中文字幕| 国产真实野战在线视频| 日本日皮视频逼| 久久艹逼视频| 91亚洲黑人| 久久久久久性爱视频| 九月AV| 国产久久日| 9ⅰ久久久天天| 综合亚洲网| 亚洲图片另类| 国产精品无码久久久久2025| 思思性爱| 色嘟嘟人妻天堂网| 国产熟女一区二区丰满| 综合网亚洲1| 精品人妻丰满熟妇一区二区三| 久久久久久九九九| 爽极品影院| 亚洲偷拍自拍在线视频| 懂色AV一区二区三区| 中文字幕丝袜美腿| 91劲爆| 青青草久草| 国产成人自拍视频视频| 亚洲乱熟女一区二区三区大香蕉| 国产精品麻豆成人AV艾秋| 偷拍亚洲高清图片| 啊啊啊男女| 无码国产精品96久久久久孕妇| 国产最火爆久久国产网站网站 | 国产精品又黄又猛又粗| av无码av无码专区| 日韩AV电影网站 | 久久久精品日本一道| 神马久久久久久久久久久久| 人妻精品一区二区三区| 国产亚洲精品久久久久小| 熟女乱伦二区| 嗯嗯啊啊视频一区二区三区| 亚洲一区二区中文字幕| 热无码中文亚洲H一道本一区二区| 日韩在线观看字幕精品| 麻豆av一区二区三区| 在线电影亚洲色图| 日韩性爱1级片视频| www.99色| 男人天堂网手机版婷婷| 日韩福利综合一区| 玖玖视频在线资源一区二区三区| 久久视频,这里只有精品| 激情小说在线视频| 啊视频在线| 日本东京热大香蕉a片| 男人综合网| 免费操逼视频下载| 亚洲性猛交| 国内亚洲高清无码| 天美传媒av 在线| 中出91视频| 中文字幕中文字幕一区二区| 日韩熟女精品无码专区一区二区| 亚洲欧美碰碰| 精品国产精品一区二区| 天天操天天日天天干| 91在线精品一区二区三区| 五月婷婷丁香| 99热精品在线观看| 国产AV高清AV无码| 国产精品一级二级在线| 亚洲国产婷婷在线播放| 四虎免费看黄| 家庭乱伦国产精品| av操操不卡| 久久久999| 操人妻少妇中文| 男人综合网| 91综合在线| 啊啊啊骚| 色五月婷婷网| 欧美日韩制服| 99这里只有精品| 人人妻人人澡人人爽久久av| 欧美日韩成人在线| 亚洲熟女诱惑| 99亚亚热| 日韩一级欧美一级国产一级台湾| 欧美超碰9798| 人人爱人人乐人人操| 亚洲熟女国产综合另类| 国产一级高清免费观看| 九久9热| av网站免费线看| 97人人爱人人做人人乐| 亚洲国产av中文字幕久久 | 国产女人高潮视频| 富女玩鸭子一级毛片| 熟妇人妻一区二区三区| 久久久久亚洲三级电影| 99热这里只有是精品10| 日韩精品1区2区中文字幕| 天天草AV| 97人人草| 三级日韩一区二区三区| 欧美999999| 日韩AV熟女乱伦| 超碰碰97资源站| 久视频在线观看| 青娱乐欧美激情一区二区| 成人黄页| 五月婷婷啪啪| 亚洲欧美另类激情小说| 成人一区二区三区四区| 91呆哥人妻| 日本男人天堂| 97中文字幕色| 曰韩成人免费视频| 亚洲色人阁| 91中文精品日韩欧美在线 | 在线观看av区| 爱爱啊啊啊| 亚州色国| 99这里只有精品| 激情小说日韩无码| 人人操人人精品影片| 美女诱惑爱爱| 久久精品高清AV| 97超碰超| 亚洲污污网站| 91原创在线观看| 中国zzijzzijzzwww精品| 97久久久久| 超碰综合色| 日本在线一二 | 一区二区三区 日韩欧美| 人妻欧美| 色偷偷人人玩人人舔人人操人人摸人人爽| 亚洲色图大香| 亚欧性爱ab| 超碰在线人妻中文字幕| 青青草AV色| 日韩 欧美 校园一区| 五月婷视频| 亚洲啪啪视频一区二区| 日日夜夜精品视频| 久热网| 性爱欧美五月| 热天堂一区二区| 亚洲一区中文字幕一区| 日韩黄片视频试看| 亚洲伊人成综合成人网| 日韩BBN| 裸体美女久久久| 狼人综合婷婷激情四射 | 中文字幕日产av人| 99精彩视频| 人妻精品一区二区在线| 色色网91| 中国熟女老妇仑乱一区二区三区| 亚洲欧美综合网| 天天操天天7| 999综合色| 99re这里只有精品3| 欧美日韩成人| 日本国产成人亚洲精品无码| 免费伦费视频在线观看| 五月天久久综合网| 沈阳熟女高潮对白视频| 久久啊啊啊| 青青操日韩| 亚洲久久东京热一二三四五区视频| 久久精品亚洲东京热色播| 一区二区日韩欧美久久| 九九RE视频在线精品| 性色av网站| 无码最新| 国产精品久久久久久无码红治院| 亚洲欧洲中文日韩女优乱码| 狠狠操狠狠操操| 欧美综合第一页| 亚洲无码日韩电影| 蜜臀久久99精品久久久久久| 中文字幕乱妇免费视频| 超碰人人干天天射| 91爱剪切久久| 色婷婷一区二区三区久久| 91黄站| 91日韩| 国产成人在线观看网址| 日韩性爱一级片| 日本黄大片在线观看视频| 操一操摸一摸| 肏逼福利网站| 性爱综合一区二区| 久操com| 无码精品一区二区三区潘金莲| 久久国产乱子伦精品免费女人| 成 人片 黄色大片| 亚洲成人美女无吗| 日本污ww视频网站| 天天综合亚在线| 日韩中文字幕熟妇人妻 | 青青11操操操操操操操操| 97网址www| 国产丰满熟夫69mpp| 夜夜嗨绯色| 欧美性Fer办公室秘书| 97欧美日韩精品| 少妇高潮九九九九| 91精品人妻偷情| 青娱乐亚洲自拍| 亚洲成A∨人影院在线欢看| 亚洲成人综合在线| 九九九午夜| 91黑丝美女| 大香蕉日亚洲日本亚大 | 99操逼| 国产成人91一区二区三区| 草草影院最新网址| 大香蕉综合网| 国产乱弄免费在线视频。| 久久6热精品99视频| 超碰久超碰久| 色婷婷六月丁香七月婷婷| 看黄片视频免费| 五月婷婷六月天| 九月AV| 亚洲中字慕不卡| 又粗又长又大国产不卡| 亚洲成人无码影院| 欧美美女自慰一区二区三区| 伊人久久久日韩一区| 日日骚av| 亚瑟国产精品久久无码| 日韩性爱高清免费视频| 草b在线 | 国产视频第2页| 性色综合网| av绯色| 欧美三级不卡| 日本五区不卡| 家庭乱伦国产| 欧美另类色图片| 亚洲高清男人天堂| 国产精品黑人一区二区三区| 国产高清成人传媒影视| 97 国产一区| 96麻豆精品一区二区三区| 黄色片,com| 日本精品人妻少妇一区二区| 伊人宅男大香蕉| 一级片在线观看高清无码| 亚洲天堂区| 超碰伊人在线| 18啪啪手机免费性爱| 麻豆2区1区天美| 超碰在线在公开超碰在线在公开| 国内精品久久人妻性色av| 大香蕉免费中文| 亚洲成人帖图| 强奸乱伦日韩AV| 青青操少妇| 精品91| 天天爱天天操| 欧美日韩小说| 天天色播亚洲综合网站| 福利天堂| 国产乱伦亚洲| 人人超碰在线观看黄| 爱爱啊啊啊| 婷婷五月天网| 91制服丝袜| 欧美十八禁在线看| 少妇久久久免费| 久久精品中文字幕无码l| 欧美白嫩在线放| 操操操五月天婷婷丁香影院| 欧美精品另类人妖xxxx| 欧美激情视频一区二区| 丁香五月天啪啪| 男人天堂导航| www.五月天| 在线天堂资源亚洲| 亚洲综合激情五月久久| 超碰在线日韩一区| 国产99 中文字幕日韩小视频| 208天天久久九九九| 国语av最新自产拍在线观看| 超碰97亚洲区| 91小视频| 97人人夜| 欧美1727免费观看视频| 久久这里只| 国产欧美日韩女同性恋ww喷水精品| 99999久久精| 亚洲美乱| 亚洲av综合伊人久久| 宗合情欲网| 2017人人操,人人摸| 青青草成人视频在线观看二区| 成人av影院在线观看| 欧美亚洲涩涩| 亚洲国产麻豆一区二区三区| 夜夜国自区| 熟女精品一区二区三区| 日韩亚洲欧美中文字幕| 午夜成人福利影视| 18禁的网站在线| 性生活性生大爱77AV国产| 爱射综合| 视频国产欧美在线播放| 久久久久亚洲一区女同性恋中文字幕| 亚洲国产av中文字幕久久 | 国产极品久久久| 色yeye成人免费视频| 97在线观看视频| 老色69| 久久久久亚洲av综合波多野制衣| 99久在线精品99re8热视频在线| 久久美女福利是上海美女| 人妻丝袜一区二区三区在线| 丰满人妻一区二区三区在线| 波多野结衣一级视频| 91激情国产| 超碰日本97美女人妻人人玩人人爱| 综合影院永久入口国产| 97超碰中文| 日本超碰在线国产一区| 国模私拍一区二区三区神乳| 蜜桃AV天堂| 亚洲天堂另类小说男人| 日本国产欧美高清在线| 好爽视频在线观看视频| 天天舔天天日天天射| 99热久| 久久久久亚洲AV无码专区少妇| 色天天野狼综合社区| 亚洲AO在线| 日韩午夜啪啪视频| 人妻干天天| 天天躁日日躁狠狠狠躁| 欧美精品 - 91爱爱| 色综合久久久久| 久久久久久亚洲Av无码| 中国熟妇| 91久久久老司机| oumeisetu综合| 日韩性爱电影一区| 欧美日韩在线视频网站| 大香蕉手机在线| 国产人妻一区二区三区欧美毛片| 五月天激情国产综合婷婷婷| 无码精品久久久天天影视| 亚洲美女AV无码| 欧美天天影院| 欧美日韩青操| 亚洲男人天堂2012| 能看的AV| 麻豆国产96在线| 大香蕉视频一二三区| 中文字幕三四区| 蜜桃AV天堂| 久久久久久久久久久久欧美日| 一二三啪啪专区| 色爱综合网| 91人妻尻屄视频| 中日亚韩免费视频| 亚洲人成网站7777| 美女久久久久久久久久久| 台湾佬中文娱乐网久久久久久久久久com | 亚洲天天精品| 熟女AV一区| 青青草视频久久久久| 无码91| 欧美色三级片91| 狠狠穞A片一區二區三區| 欧美劲爆视频一区二区| 中文字幕日韩人妻视频一区二区三区 | 91亚洲欧美激情| 欧美最婬乱婬爆婬牲视频| 老司机午夜精品福利视频一区二区| 欧美亚洲丝袜美女电影| 成年男人的天堂| 天天肏美女| 中文高清一区二区的| 婷婷丁香六月| av天堂影视中文在字幕在线中文 | 欧美日产国产在线成人第一区| 日韩性爱一级片| 精品人妻免费观看| 精品无码一区二区三区| 日本成a人v网站在线观看| 懂色av一区二区三区天美传媒| 熟妇一区二区| 老熟女网站| 日韩兔费看黄片| 尤物av网站免费在线播放| 91香蕉国产尤物视频| 秋霞怕怕片| 亚洲国产成人精品久久久国产成人一区二区 | 伊人一区二区三区| 熟女精品一区二区在线观看| 日本高清熟女久久一区| 欧美熟女逼久久久久久| 死我十八禁| 一区二区三区一亚洲中文字幕、综合区灬 | 99热在线不卡| 日韩精品9区| 99re在线视频这里只有精品| 久草老司机| 免费视频观看60秒| 97超碰色色| 欧美呦呦性爱| 人干人人人操人人摸| 日本道久久综合色色| 欧美日韩99| 午夜激情床戏激情| 性色国产东北露脸精品视频| 男人把坤坤插入女人的下体| 91九色丰满高潮| 亚洲高清综合网| 操人人| 无码抄逼网| 蜜桃视频精品一区二区| 亚洲最大的黄色电影网站。| 亚洲精品蜜桃久久久久久久| 超碰在线1234区| 搡老女人老91二区| 国产黄色影片在线观看| 大香蕉乱伦视频网| 久九九九九九九热| 美女91av| 亚洲欧美另类激情小说| 东京热男人的天堂精品| 天天爽天天| 欧美久久婷婷| 日本一二三免费久久| 国产精品点击进入在线影院高清| 三级特黄60分钟播放| 一块操欧美性爱| 96精品久久久久中文字幕| 激情婷婷丁香| 亚洲精品97| 日韩AV一起草| 97国伦国色| 精品十八在线观看| 亚洲av综合伊人久久| 人人操人人狠狠操| 上床不卡网站| 欧美中文综合| 亚洲中文日韩欧美大香蕉视频| 超碰人人妻| 欧美日韩人妻少妇 一区二区三区| 亚洲天堂男人天堂网| 亚洲一级性爱视频免费看| 天天添天天干电影| 校园春色欧美| 在线观看一级α片刺激高潮视频| 熟女人妻一区二区三区| 男人的天堂成人的社区| 九九九偷拍| 久久综合资源一区二区| 欧美亚涩| 蜜臀久久99精品久久久久久成人小说| 亚洲无无码αⅴ每日更新| 九九九九久久久| 无码九九九九| 日韩簧片免费看| 女同亚洲欧美一二三区久久电影| 色香伊人| 欧美伊人久久综合网| 日韩乱码av| 欧美在线亚洲| 入口操逼网站| 亚洲一本色码中文字幕| 国产女人视频三四五区| 色五月婷婷中文字幕| 超碰无码五月97| 思思视频免费看网站| 又大又白奶子| 成人青青草原伊人| 日韩性爱电影一区| 天天舔天天日天天射| 无码人妻一区二区三区色欲aⅴ| 夜夜肏2021| 大逼色网站| 一级免费啪啪片| 91AV国产精品| 无码精品蜜桃一区二区三区ww| 物尤视频一区二区| 综合激情二| 亚洲97P| 国产精品白领在线观看| 丁香五月天婷婷姐| 99色网| 国产欧美日韩女同性恋ww喷水精品 | 乱理日韩中文| 免费A片三p视频| 日韩一区二区熟女| 1769一区| 中文字幕视频2区| 免费观看成人www精品视频| 久久发布国产伦子伦精品| 亚洲加勒比久久日本道| www.97在线| 欧美亚洲自拍另类人妻| 亚洲国产一级中文综合久久天堂在线免费观看 | 日韩 欧美 国产 麻豆| 色婷婷视频| 天天综合网合集91| 一区二区三区激情在线观看| 热热色综合网| 国产67194| 亚洲国产97| 亚洲人在线成线成人| 亚洲啪啪视频免费| 裸体1区| 欧美一区二区三区日韩| 欧美性爱超碰97| 夜夜夜久久| 变态乱伦伪娘灌肠一区二区| 日韩精品系列| 九九色综合| 26uuu最新| 中文字幕女同在线| 韩国黄色片精品久久久| 久久精品一区二区| 欧美中字二区| 麻豆这里只有精品| 国产品精品自在在线午夜免费| 久草资源在线视频官方总站日韩丝袜美腿 | 一区二区影视| 久久中日麻豆| 麻豆啪啪啪视频| 狠狠91| 色男人色天堂东京热| 欧美日韩操逼嗦吊| 久久精品人妻一区| 加勒比海成人视频网| 激情综合网五月婷婷| 国产中出内射一区二区| 在线观看午夜婷婷久久久久清性观看| www…国产操逼| 成人羞羞视频国产| www. 男人天堂成人在线| 激情综合网激情五月天| 欧美Aⅴ| 亚洲综合在线91| 97 视频在线| 亚洲操人| 精品国产一区二区三区香蕉欧美| 后入合集| 一区二区三区 丝袜高跟| 日韩无码成人电影| 黑人美精品 A片| 老司机香蕉久久久久| 极品粉嫩少妇视频| 人妻少妇一区二区| 成人午夜小视频手机在线看| 综合网欧美| 色综合 加勒比| 久草精品国产蜜臀| 欧美激情五月天| 免费作爱一级视频| 日韩电影在线观看网址| 精品少妇高潮久久| 九一精品牛牛一区二区| 欧美夜夜狠| 操逼逼无码| 美女尤物人人操| 黄色免费一级在线毛片| 東南亚性呦成人伦理资源在线视频| 欧美日韩婷婷中文| 天天色悠悠激情| 青草av在线| 双插性欧美一二三区| 一区二区三区国产在线播放| 日本幼女18+| 国模91| 欧美国产一区二区三区麻豆传媒| 亚洲图片欧美91N| 蜜乳av首页| 333kkkk·亚洲com久久| 久久精品国产AV一区二区三区| 啊啊啊爽爽| 99超碰碰| 在线啊啊啊| 国产av色网| 国产欧洲精品亚洲午夜拍精品| 在线视频一区二区传媒| 伊色综合天堂色97| 一二三区在线| www.99视频| 99热国产| 综合网色| 99在线精品观看99| 日本肉体xxxx裸交| 1禁看欧美黄片免费看| 国产亚洲女v在线观看| 日本黄色精品专区网站| 人人么人人操| 欧美在线播放| 久久久久九九九九| 欧美色图片| 中国人高清www色视频免费| 色香欲影| 神马久久午夜| 91色拍| 国产又黄又爽| 污色区网站| 亚州熟女乱伦| 亚洲欧美色图小说| 在线岛国新天堂8| 久久久久久一日韩字幕无码| 嫩呦国产一区二区三区AV| 一区不卡在线观看av| 91香蕉视频在线观看免费| 色在线亚洲视频www| 999亚洲国产视频| 欧美黄片欧美黄片xxx| 色牛牛AV| 思思热在线| 国产超碰国产97| 亚洲码和欧洲精品激情系列| 国产精品色哟哟| 91国精产品| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 日本在线视频导航| 国产自偷自拍一区| 国产二区三区免费视频| 亚洲无无码αⅴ每日更新| 欧美黄色大片在线观看 | 老司机射| 东北少妇高潮zzzz| 亚洲国产精品无码AV久久久| 收看日本人日bb| 国产aⅴ无码片毛片一级网站| 日韩一级久久毛片| 国产精品蜜臀久久久久无码AV| 伊人久久综合影院| A片 AV一级在线播放观看免费| 日日插夜夜| 围产精品一区二区三区视频播放| 性爱av在线免费观看| 色五月婷婷五月天| 91色女| 美女啪欧美一区| 99热在线播放| 青青草在线视频人人想人人上| 亚洲美女30b| 中文欧丝袜诱惑| 91精品网站| 国产一级特黄大片处女| 人、人、摸,人、人、草| 97碰在线视频| 中文字幕av久久爽Av| 美女91av| 老熟女网站| 国产欧美日本亚洲精品| 自拍偷拍2025在线观看| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 九九九九精品精|