日韩精品一区二区三区在线视频放-无码中文字幕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
返回資訊列表
日韩三级在线观看网站| 波多野结衣一级视频| 欧美日本天堂| 国产传媒日本欧美专区| 精品精品精品| 亚洲免费看片| 久久婷婷亚洲| 操逼网站地址| 乱色视频中文字幕| 日本精品不卡一二三区| 911粉嫩人妻| 久久久久亚洲AV无码专区少妇| 国产福利一区二| 91色拍| 欧美性高潮| 92大香蕉| 亚洲中文sv| 人人澡综合涩| 伦理弟一页| 午夜男女爽爽爽影院视频| 天天操妹子| 精品一二三区女同| 欧美极品色| 日韩人人精品| 狠狠色五月亚洲91| 玖玖综合网| 性一级黄色录像片网站导航 | 国产午夜精品在线观看| 亚洲视频中文一区| 色黄色美女大长腿午夜视频| 日本成人电影资源网| 品亲网欧美品亲网| 欧美成人色| 国产精品丝袜久久亚洲不卡| 东京热一区二区三区四区五区六区| 97在线免费看| 福利天堂| 青草精品视频一日本久久久久网站| 美女上床网站| 男女一进一出视频久久| 美国一区二区三区视频| 青草av在线| 久久久久久午夜男人的天堂| 国产精品久久发布| 欧美日韩亚洲高清不卡一区二区三区| 久久久久久久久久久久黄色| 亚洲综合夜色| 一本色道人妻久久| 精品国产91av一区二区三区 | 啪啪91| 91丨国产丨白浆秘 洗澡动漫| 91美女在线观看| 欧美成人四级在线播放| 久久久久9999精品九九九| 国产操操日韩三级黄| 婷婷久久五月| 欧美丰满熟妇XXXX性ppX人交| 人人操人人操人妻人| www.婷婷五月天| 日韩欧美综合激情| 国产精品无码久久久久2025| 懂色中文一区二区三区| 日韩一级久久毛片| 国产v亚洲v日韩v欧美v片另类| 国产97在线播放| 亚洲天堂日本| 日韩97视频| 中文字幕精品专区搜索结果91| 国产精品久久久久久9999| 青青草成人视频在线观看二区| 熟女一区二区| 久无码| 美日韩成人| 91碰碰碰| 大香蕉伊人亚洲| 日产中文字幕2020| 亚洲人久久久网| 区自美91| 欧美97av| 97免费在线视频| 97干色| 亚洲情欲| 91东京热男人的天堂| 日韩无码a片| 一线黄色免费性爱片| 26uuu偷拍亚洲欧洲综合| 久操网址| 美女啊啊啊啊啊啊啊| 麻豆一区在线| 中文字幕视频在线观看| 国产精品视频91久久| 国产亚洲精品A在线观看下载| 一级特黄aaa大片在线观看成人一级片在线观看 | 国产麻豆福利av在线播放| 亚洲av影音先锋| 激情婷婷丁香| 久久少妇人妻| 午夜毛片亚洲精品片国产久久久| 老司机深夜18禁污污网站| 精品成人亚洲午夜电影| 99精品无码| 亚洲欧美天堂在线| 97超碰色中文字幕| 亚洲熟伦熟妇AV无码春色| 特级毛片特黄久久免费看| 91无码中出人妻视频| 欧美在线55555| 亚洲色诱惑| 国产精品老熟女一区二区| 亚洲天堂第一页| 国内一级精品| 人人天天干干| 久久爱超碰网| 丝袜亚洲综合| 婷婷五月天丁香花| 乱色老一区二区三区的观看方式| 久久精品人人做人人看| 亚洲情色五月天| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 久久手机视直播| 97超碰总站| 亚洲欧美综合| 精品一区二区三区蜜桃臀赵总| 极品五月天噜噜| 超碰碰激情97+久| 色五月AV| 天天干2019| 欧美黑人与女人91| 亚洲 自拍偷拍 欧美| 中文字幕在线播放2中文字幕在线观看2| 99re99视频在线免费观看| 激情小说亚洲| 久久久久九九九九九| 探花在线免费观看视频国产一区| 快点操死我| 亚洲国产成人精品久久久国产成人一区二区 | 激情五月丁香五月| 99av| 午夜精品99久久久久传媒| 久久成人东京热人妻| 亚洲乱伦图片视频| 色爱欲亚洲| 国产第12页| 欧洲综合视频| 波多野42部激情无码喷潮| 亚洲,欧美,春色,另类| 亚洲欧洲日韩中文字幕一区| 十八禁的黄污污免费网站| 久久香蕉超碰97国产精品| 五码视频在线观看| 国产美女激情| 欧美特大黄一级片片免费| 亚洲脚交| 麻豆60秒| 国产无码精品高清| 亚洲精品白丝| 欧美九9 9 9| 国产女人视频三四五区| 午夜久久一区二区无码中出 | 久久女女| 亚洲天堂久久| 日韩无码极品| 欧美有码亚洲中文字幕一区二区三区四区| 国产色产精品在线观看 | 少妇精品| 亚欧中文字幕在线视频| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 欧美顶级黄色大片免费| 色区97| 蜜桃久久久久久| 欧美一级特黄淫片在线观看| 久久精品噜噜噜成人看免欧美大片| 亚洲丁香花色| 青椒国产97在线熟女| 精品久久久久成人码免| 亚洲成人一二三区| 色婷婷九月| 天天日天天干天天色| 亚洲亚洲亚洲天堂天堂| 蜜臀精品1区2区| 成人97人人超碰人人| 色香综合天天影视综合| 精品人妻夜夜草| 国产自偷自拍一区| 欧美探花网| 热热色中文无码| 欧美国产有色电影| 久久偷拍人| 91小视频| 亚洲色系另类精品国产| 国产一区96在线| 国产毛片在线| 欧美国产婷婷久久| 99在线精品观看视频中文| 伊人一区二区三区| 日日干日日| 婷婷亚洲五月***久久| 国产 亚洲 一二三四| 蜜臀久久99精品久久久久电影| 综合网欧| 亚洲s在线观看| 亚卅熟女乱色| 美女午夜福利免费视频| 老熟女乱子伦中文字幕一区二区| 91熟女在线| 欧美97网| 综合网亚洲在线| 日本最新1区2区3区| 三级网站超变态精品| 91亚洲青青草原精品1区| 日本三级中国三级99人妇网站| PMv在线观看| 国产精品不卡一区二区三区av| 天天干嫩逼网| 无码精品久久久久久亚洲| 99精品丰满人妻无码| 国内黄色精品| 99热超碰| 日本不卡二三区| AND人妻系列| 成人A片男人的天堂| 国产精品呦一区二区三区| 人人干人人操人人爱| 亚洲精品国语在线播放| 人人干黄色| 99久久久无码国产精品性啊聊| 久久天堂| 中文字幕一区二区三区高清| 九九久久99| 人妻无码后入| 9久久久久久| 亚洲日韩人妻中文字幕一区| 乱伦AVxx| 亚洲影视综合网| 青青草在线视频欧美| 一区二区三区在线日韩影院观看| 精品九九九| 亚洲欧美中文一区二区三| 亚洲成?V人片在线观看福利| 欧美一二三区四五区| 智利AV在线网| 襙一襙| 亚洲操人| 久久久久元码视频| 蜜臀久久久99久久久久 | 亚洲天堂2020| 玖玖玖玖精品国产剧情| 久久婷婷在线观看视频| 日韩无码人妻中字久久三区四区| 亚洲精品一区二区精华| 韩国一区二区精品亚洲| 5月婷婷6月六月丁香| 九t超碰| 91老妇女| 亚洲精品一二三四区| 国产成人一级av88| 秋霞操逼片| 亚洲日韩资源| 色爽——AV| 色婷婷在线视频精品导航| 大香蕉久| 黄色电影在线播放综合网站| 国产精品一区二区a| 国产视频大全| 久热这里| av大香蕉| 色婷婷六月| 欧美黄片视频在线观看免费 | 97久精品| 精品精品精品| 91色女| 久久丁香五月婷婷| 中文字幕交换人妻| 懂色av色欲av蜜臀av| 亚洲成aⅴ人片不卡无码| 国产久久久久久| 欧美久久人体| 嗯嗯嗯啊啊在线观看| 97在线青| 91天堂丝袜美腿| 国产精品第一页国产大屁股视频免费区i| 区一二区日韩亚洲乱码av电影| 欧美性猛交美女自慰91| 大香蕉之青青草原| 91久久久久久久| 啊啊啊啊啊舒服| 熟女高潮精品一区二区| 久区视频| 久热一区二区| 久久黄色视频一区二区三区| 中文字幕一二区二三区人妻专区| 家庭乱伦性爱av| 乱伦图一区| 精品久久人妻成人网| 综合色99| 欧美日韩婷婷中文| 欧美激情 一区| 亚洲少妇在线观看| 九月丁香婷婷色| 无码国产精品午夜不卡(| 97碰在线视频| 国产极品久久久| 天天干人妻视频| 亚洲天堂在线怕怕视频| 国产67194| av婷婷色网| 国产白领连续中出在线播放| 九久9精品| 亚洲国产尤物yw在线观看| 成人av免费观看| 有码人妻系列| 国产老太乱伦一区| 91丨九色丨国产打屁股| 台湾佬中文娱乐网久久久久久久久久com | 国产亚洲 中文欧美久久| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 久久久久中出| 骚女天天综合网| 国产精品极品美女视频| 超碰97玖玖爱| 欧美中文字幕日韩在线| 欧洲无码一区二区| 后入人妻无码| 丁香五月婷婷啪啪| 91国产丝袜白虎| 午夜120视频在线观看| 色鬼在线综合| 国内毛片欧美香蕉精品| 天天香香欲综合| 久久久久9999| 91中文精品日韩欧美在线 | 亚洲男人的天堂AV| 日本成人A片网站| 一区| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 尤物一级在线免费观看| 东方亚洲在线操逼天堂| 综合网色| 秋霞一集毛片观看| 天综合网欧美| 九九久久99| 超碰精品97| 久热免费视频| 欧 美 自 拍 偷 拍| 超碰 欧美| 欧美日韩国内不卡| 日日爱99| 熟女网站最新| 97色冈| 国产乱伦亚洲| 欧美图片校园春色| 熟妇一区二区三区| 九九人人操| 美日韩男女操屄视频| 最新av在线| 久草网站免费在线观看| 97中文热色| 国产小炒后入式| 丁香六月综合激情| 操操操日本的逼| 国产精品噜噜噜日日日| 欧美91丝袜| 天天综合~91入口| 夜夜操青青草| 久久久久久网址| 日韩色图 一区二区| 久久99国产综合精品女同| 亚洲国产精品9999在线观看| 天天射天天色成人| 综合性视频99| 97精品97久久| 91久久久视| 九久久九精品视频| 成人五月香网在线| 天综合网| 淫淫总合网| 超碰av在线| 国产精品探花视频| 亚洲 国产 精品一区| 亚洲精品一区中文字幕乱码| 色婷婷影视| 九月婷婷久久| 熟女性视频| 亚洲天堂中文字幕无码男同| 国产67194| 免费啪啪一级视频| 精品亚洲国产成人AV制服丝袜 | 亚洲精品三区在线观看| 性爱视频啪啪啪啪| 一级A片女人高潮叫床| 日韩人妻制服丝袜av| 岛国激情视频在线观看| 国产精品无套内谢| 亚洲一区二区中文字幕| 激情自拍 校园春色| 狠狠五月天| 91丝袜美女| 物业黑人 AV一区| 女上位精品在线| 夜夜爽夜夜高潮夜夜爽| 88xx成人精品视频| 另类一区| 爱干爱射网啊啊啊| 亚州色阁| 极品销魂美女一区二区| 变态乱伦伪娘灌肠一区二区| 国产呦精品一区二区三区下载| 婷婷五月天伊人| yiren97| 亚洲精品 欧美精品| 色综合1991| 五月丁香黄色网| 女人喷水视频在线观看| 国产精品天美传媒| 五十路熟女,国产欧美精品区一区二区三区 | 亚洲好色人妻| 国产女人高潮嗷嗷嗷叫小说 | 亚洲国产97| 亚洲AV成人无码久久精品播放| 在线观看一卡二卡| 精品二区久久| 一本一道vs波多野结衣| 日本天堂网| 91观看 国产白丝| 天天综合网日韩7799| 国产精品一区二区在钱播放| 欧美激情一区| 红杏大香蕉| 超碰人人干天天射| 国产在线精品偷| 新视频sss国产| 色综合V| 久久久久久大| 国产精品高潮久久久无码| 国内毛片国产专区二| 99re3这里只有精品| 亚洲资源站| 精品一区二区三区蜜桃臀赵总 | 亚洲熟女人妻中文字幕一区二区| 国产精品成人在线| 伊人网高清| 91大胆欧美| 96久久久久久久| 日日狠狠久久偷偷色综合免费| 清纯唯美综合亚洲| 天天肏夜夜肏| 九九无码| 亚洲男人的天堂网| 996热| 欧美 亚洲| 超碰日本97美女人妻人人玩人人爱| 综合色91| 欧美一区二区三区大综合| 日韩av在线精品观看| 青青草伊人久久| 欧美黄片欧美黄片xxx| 欧美色图片欧美色图| 综合久久欧美| 日韩精品资源专区二区| 欧美在线 亚洲| 最新国产精品久久精品| 熟女人妻一区二区三区| 天堂麻豆天美| 人人天天欧洲| 熟女色综合久久| 成人性交午夜免费片| 久草新免费| 亚洲精品乱码久久久久久蜜桃麻豆 | 在线观看亚洲专区| 亚洲综合电影| 久久超碰天天| 亚洲激情色片 | 精品国产99| 日本大片日本一区二区免费高清 | 亚洲人妻在线精品| 夜夜嗨一区| 国产美女91视频| 婷婷五月色| 亚洲欧美在线观看2021 | 一级日本牲交大片好爽在线看| 91精品导航| 欧美玖玖爱免费玖玖| 爱射综合| 欧美一区二区在线资源| 青青11操操操操操操操操| 操逼操网| 伊人黄色视频免费观看| 日本高清_区二区三区 | n1038 一二三区| 国模限制级电影| 亚洲不卡AV在线| 懂色av中文字幕一区二区三区天美 | 日韩人妻精品久久久久| 日韩一级二级| 国产欧美一区二区| 亚洲自拍欧美国产首页网曝 | 欧美色图亚洲色| 欧美视频激情久久久久久| 欧美亚洲另类在线蜜桃| 2017亚洲天堂| 日韩成人综合网| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 97 九色| 天堂涩涩| 色婷婷亚洲婷婷| 欧美日韩99| 色色色色日本| 久久性爱视频99| 探花一区二区三| 亚洲麻豆av一区二区| 97日韩| 亚洲天天操| 78综合网| 国产11页| 91国产大片| 亚洲综合另类| 欧美春色| 性爱视频无打码在线观看| 国产精品欧美激在线| 成人5码视频| 欧美综合第一| 东京太热男人的天堂久久久| 亚洲一区二区麻豆影院| 国产97视频免费观看| 欧美天天弄| 色九九九综合| 天天综合网~69| 色婷婷激一区二区三区 | 丁香色色网| 欧美夜夜| 精品人妻一区二区三区视频| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 十八禁电影伊人网| 欧美在线l亚洲| 婷婷四五区| 精品人妻美妇91job| 黄色人人| 亚洲无码国产探花在线观看| 亚洲精品人体| 啊啊啊啊嗯嗯在线久久久| 亚洲污污网站| 欧美综合制服在线| 大香蕉天天看妹子| 久久久不能久久久久| 激情六月天| 日韩精品一区二区三区色欲| 新婚人妻扶着粗大强行坐下| 欧美一级黄片视频在线| 亚洲男人久久综合天堂| 91精品人| 精品免费视频国产一区| 免费国产视频| 91爱网| 亚洲人妻日日日| 玖玖爱视频网站| 久久久九九| 日产成人久久| 9997se| 亚州高清av| 亚洲色图欧美色图制服诱惑| 亚洲和欧美裸体美女双飞视频| 欧美中文字幕一区| 99综合自拍| 欧美日韩国产电影| 日本五十路在线| 1204av韩国| 精品高清一区二区三区三州| 午夜激情成人在线观看| 日逼视频日本| 手机在线人成免费视频| 日韩免费看黄片| 亚洲熟女av日韩熟女| 国产免费一区在线观看| 色五月亚洲| 日本高清电影欧美色图| 人妻天天爽夜夜爽爽| 久久这里精品国产99丫e6| 综合日韩激情另类图片| 丁香婷婷激情五月天无毒不卡 | 人妻久久久久久久久久久久久久久| 色色色综合网| 久久久影院| 大香蕉欧美伊| 人妻内射一区二区在线视频| 中日韩久久久免费看| av天堂加勒比| a级免费在线观看| 超碰在线欧美性爱激情| 国产探花精品在线| 色色婷婷五月天| 特污免视频| 天天综合香 ld视频| 青青欧洲黑| 青青草在线视频美女| 无码78| 青青青国产手线观看视频2| 亚洲一区二区三区播放在线| 欧美综合区| 成人在线视频二区| 久久精品中文| 亚洲a色| 日韩欧美大片免费高清啪啪| 岛国片国产成人亚洲播放| 五月丁香激情综合| 亚洲国产综合久久天堂| 久久久91福利姬| 亚洲在线a| 精品国产一区二区三区四区在线看| 久久久免费一级黄片| 欧美日韩高潮喷水91| 99国产精品免费| 99色热| 亚洲欧洲自拍图片专区满春格 | 日韩有码一区三区| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 日语五十路和六十路亚洲国产精品 | 天无日色综合| 亚洲高清男人天堂| 百度百度日本操逼| 92人人操人人| 婷婷五月天久久精品视频一区二区三区 | 天天看天天日天天操| 人干人人人操人人摸| 青青草日韩无码| 97超碰精品成| 久9re热视频这里只有精品| 日本在线视频导航| 99色婷婷中文字幕乱色| 久久东京热久久| 亚洲色 国产 欧美 日韩| 久久久久精| 蜜臀在线网站| 超碰无码加勒比| 亚州色交| 欧美天天影院| 日韩色| 亚洲五区熟女| 国产熟妇 码视频户外直播| 亚州操逼网| 国产盗摄美女如厕大神作品在线观看| 蜜臀久久99精品久久久久久-DVD| 亚洲一本色道中文无码aV天美| 亚洲成人一二三区| 青青青青青手机视频| 欧美日韩国产三级黄色| juliaann精品熟女一区| 夜夜欧美 | 欧美日韩精品久久久久东北老熟妇| 精品国产乱码| 日韩国产品视频中文字| 色臀AV| 国产动漫操逼视频| 3P乱轮视频| 精品十三区| 国内伊人久久久久久网站视频| 99性视频| 日本道人妻久久久在线不卡色视频| 国产精品久久久久无码A√| 日本少妇va7777| 91制服丝袜中文字幕| 成年女人18级毛片毛片免费观看| 99re在线精品78| 成人av影院在线观看| 影音综合网| 久久大黄片| 久久婷婷一区二| 久久岛国| 99热这里| 午夜精品久久久久久久久久久久久| 国产精品成人无码av| 夜夜夜夜爽| 国产精品久久久久久片| 99re综合伊人| 婷婷亚洲五月***久久| 青青青草伊人精品| 无码聚合| 精品少妇高潮久久| 丁香色色网| 日日不卡av| 色色色综合| 久久久久久九九九| 日本免费一区二| 国产自制av蜜乳| 爱干爱射网啊啊啊| 26uuu国产亚洲综合| 人人妻人人色| 夜间福利片1000无码| 色亚州人久干视频在线观看免费版| 丰满人妻无码一区二区三区| 欧美熟女丝袜| 亚洲AV无码国产精品久久久久| 伊人视频| www.色五月| 91老熟女| 欧美性爱一区| 日本成人电影资源网| 久草毛片| 大奶啊啊好爽| 欧州一区二区三区四区| 欧美 牲| 五月丁香社区婷婷日韩欧美精品影院 | 九九热三级片| 欧洲Au麻豆| 国产女人和拘做爰视频| 日韩黄色小说| 超踫中文字幕| 四虎午夜影院| 亚洲麻豆18发?| 激情久久久| 88xx成人精品视频| 国产久久久久影院老熟女| 色噜噜人妻丝袜a∨先锋影| 中文字幕乱妇免费视频| 老熟女区| 国产精品爽爽va在线观看98| 亚洲男人天堂2017| 日少妇亚洲版| 在线观看国产黄色| 亚洲色图欧美色图另类图片| 亚洲第91页| 成人综合久久精品色婷婷| 一起草视频在线| 日韩电影天堂视频二区三区| 精品国产精品一区二区| dy888午夜老子影视达达兔| 欧美精品三区| 成人综合色网| 成人性爱视频在线看| 久久大香蕉97| 国产精品高潮久久AV| 五月丁香六月婷综合成人综合| 日韩在线观看三级电影| 97热视频在线观看| 熟女日韩| 男女真人网18| 人妻少妇久久中文字幕一区二区 麻豆| 天堂涩涩| 熟妇高潮一区二区免费视频| A 天堂在线观看视频| 91春色| 国产三级中文字幕粉嫩| 亚洲 图片 欧美 色图| 亚卅熟女乱色| 囯戸精品高潮呻吟旡码| 国内一级精品| 日本黄色天堂| 亚州色站 日韩电影| 欧美性爱五月天| 岛国片国产成人亚洲播放| 久操97| 亚洲丝袜二区在线| 久日91在线| 91久热这里只有精品| 强奸乱伦αv片| 久久久久久人妻一区精品色欧美| 天天综合网在线观看| 97爱啪| 国产熟女一区二区丰满| 蜜桃视频精品一区二区| 黄片在线免费在线观看| 久久黄色性爱视频| 免费A片三p视频| 熟妇女伦乱视频| 欧美,日韩,中文,另类| 和协影院中文字幕三区| 宅男91视频在线播放| 婷婷六月色| 91free福利| 天堂中文日本在线观看| 午夜.DJ高清在线观看免费7| 日日夜夜精品视频| 欧美日韩欧美| 欧美亚洲天天| 日韩欧美~中文字| 9999久久久久| 国产一区二区久久| 日日黄色三级网站| 超碰性爱97| 欧洲中文字幕| 九一屌逼| 国产精品久久久久久夜夜夜| 91N欧美| 五月天婷婷成人网| 五月婷婷性爱| 91人妻PORNY九色大屁股| 激情啪啪拍91| 久久久 国产精品| 日本午夜精品理论片A级APP发布| 99久久e免费热视| 视频黄色国产一级| 欧美一区二区三区另类精品| 一类av片在线看| 樱花蜜乳av| 国产大陆天天艹| 99色热国产视频精品| 国产av波波国产精品| 欧美综合娱乐久久| 国产51色综合久久免费| 青娱乐国产精品| 欧美黑人精品一区二区| 草莓精品视频| 久久婷婷色| 九九色综合| 色色色网站| 久久超碰爱| 在线天堂999| 日韩传媒在线| 亚洲日韩乱码中文无码蜜桃臀网站| 久久日本熟女精品一区| 国偷自 一区二区| 国产久9| 97国产精品一区二区传媒公司| 亚洲天堂男| 国产又黄又粗又猛大片| 久草精品国产99| 成 人片 黄色大片| 在线v中文字幕一区二区三区 | 少妇久久久久久久久| 麻豆久久精品亚洲精品88| 国产二区三区免费视频| 国模不卡| 色五月综合| 97久久资源| 欧美日本天堂| 综合熟妇一区二区三区| 大香蕉中文在线| 日韩免费福利在线观看| 国产精品制服丝袜清纯唯美| 午夜免费福利视频一区| 天天日日舔舔| 九九热在线精品视频| 超碰偷拍| 97精品国产| A 在线网址| 色区久久| 97爱爱影院| 久9久9久9久9久9久9| 色欧洲| 亚洲色系另类精品国产| 99久久综合网| 黄色二级片网站| 少妇99| 丝袜亚洲综合| 淫荡少妇免费| 乱精品一区字幕二区| 超碰综合色| 中文字幕青青草| 国产精品免费1区2区视频| 在线国产一区二区av| 懂色AV一区二区三区| 亚洲精品不卡一二三区| 美女91| 先锋色眉乱伦资源| 天天综合91在线| 99精品人人爽| 91欧美大片| 亚洲超碰AV| 欧美亚综合色图| 大色网久久| 乱操乱伦AV| 日本韩欧美在线播放a| 色91综合网| 怡春院久久| 天天摸夜夜添无码小视频| 色久综合| 色网1| 日韩欧无码一区二区三区免费不卡 | 偷窥自拍亚洲| 国产av波波国产精品| 亚洲不卡AV在线| 久久人体一区二区| 明星性猛交ⅹxxx乱大交| 大屁股xxxxx| 日本五十路在线| 日韩亚洲欧美中文字幕| 这里都是精品在线观看| 综合97亚洲| 日韩成人无码| 防屏蔽在线视频| 蜜桃臀一区二区三区久久| 久久久久久亚洲Av无码精| 五月丁香综合网| 日韩人妻精品| 亚洲精品国产专区在线观看| 青娱乐 成人娱乐在线| 超碰吊日色| 午夜福利视频在线一区| 黄资源| 熟女激情综合网| 夜夜操二区| 97操b| 欧美日韩第一页| 91超碰在线播放| 性色生活片久久毛片婬片免费放女人一级毛片| 亚洲18禁| 美女诱惑久久| 婷婷亚洲天堂| K8久久久久| 秋霞曰韩R级| 欧美日韩人妻少妇 一区二区三区| 国产真乱mangent| 久久发布国产伦子伦精品| 欧美成人精品一区| 久久精品性| 丝袜加勒比| 久久精品国产免费观看99| 九区国产| 色色色色日本| 极品色电影院| 国产理论视频在线播放| 欧美日韩精品久久| a一区二区三区乱码在线| 欧美97在线观看| 欧美性爱第一页久久| 麻豆AV一区二区| 欧美一级黄色免费专区| 精品国产一区二区久久| 亚洲欧美综合| 毛片17S| 五月丁香黄色网| 欧美在线色图| 国产精品免费1区2区视频| 久久免费看高潮毛片韩国| 国产v片在线免费观看| 97在线欧洲| 97在线观看播放视频| 亚洲精品97中文字幕| 手机在线看片免费人成视频| 人妻丰满熟妇av无码区蜜桃| 91色婷婷综合久久中文字幕二区| 青青草依人大香蕉| 开心激情站| 欧美中出| 亚洲淫乱骚妇AV| 操逼片国产| 日韩精品一区,二区 九九...老司机| 欧美顶级黄色大片免费| 亚洲影视第一页| 色色婷婷丁香| 青青草中文字幕| 日本少妇va7777| 九九热久久99精品re| 丰满人妻一区二区中文| 亚洲经典啪啪| 日韩综合色图| 亚洲棕合电彰| 温婉少妇玩3p| 久久香蕉国产线看观看亚洲女人 | 久久久性爱| 极品白嫩福利在线| 国产精品一区av在线| 97操综合| 五月天婷婷小说| 亚洲无码国产探花在线观看| 欧美熟妇亚洲版| 五月丁香六月婷综合成人综合 | 亚洲欧美日韩免费观看| 伊人伊人LD| 久久久九九网站| 亚洲国产丝袜熟女av| 日韩电影天堂视频二区三区| 日本操BAV| 国产深夜福利| 日韩精品作爱导航| 九九香蕉网| 伊人网免费视频| 日韩人妻精品| 99国产精品人妻人伦| 欧美一区二区三区另类精品| 老熟女综合网| 欧美久久毛片基地| 九九性爱网| 蜜乳中文字幕a在线| 九九亚洲色在线观看| 欧美激情总合网| 超97在线精品视频| 婷婷久月| 97网址97| 91狠狠综合久久久久久| 欧美国产伊人久久久久| 日本一区二区不卡| 国产丝袜高跟美女av免费观看| 日韩天美| 强奸乱伦麻豆| 亚洲中文字幕在线视频一区二区| 欧美性视频二区三区| 啪啪91| 伊人久久大香大香线蕉中文| 99精品国产户外露出| 青青久久久| 大香蕉欧美伊| 五月天伊人| AV不卡在线| 2024黄色视频| 97亚洲综合在线| 欧美91网站| 青青草在线成人视频| 激情五月天色色网| 操逼www.| 亚洲āv网址在线观看| 97久久超碰日韩精品| 加勒比五月天| 亚洲高清视频在线观看| 91 刺激在线| 中文字幕在线观看二区三区| 成人无码电影在线观看网| 大香蕉综合网| 啊啊啊啊嗯嗯在线久久久| 学生妹天天看| 物尤视频一区二区| 天天看片天天爽| 天天操综合网| 国产免费久久久久| 丰满高潮18xxxx| 国产特级毛片AAAAAA高潮流水| 蜜臀在线视频| 亚洲se91| 老熟女综合网| 婷婷五月天色网| 9ⅰ久久久天天| 夜夜操一区二区| 白丝少妇一区二区| 97se综合网| xxx亚洲午夜天堂| 91亚洲黑人| 亚洲老熟妇xxx| 婷婷丁香六月天| 婷婷色色五月| 香蕉综合网| 五月天开心网| 超碰在线91| 日日干夜夜干| 99视频只有精品| 香蕉综合网| 五月丁香影视| 免费视频无码| 欧美夜夜狠| 精品区9| 国产久久一区二区午夜| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 蜜臀网 一区| 亚洲精品电影| 日韩欧美中文字幕搭讪巨乳美人妻视频| 夜夜做夜夜爽精品视频| 天天爱综合网| 人人九九精| nuu12国产麻豆精品| 人妻喷水| 91n处女在线观看| 俞拍久久国应视频| 综合夜夜| 亚洲伊人久久综合97| 日韩免费福利在线观看| 亚洲精品白浆高清久久久久久| 豆花视频操逼网址| av在线观看不卡网站| 国产精品一二三在线看| 中文字幕性感少妇av| 99热这里是精品| 欧美少妇熟女| 91精品人妻一区二区三区蜜桃臀| 亚洲综合影片| 97在线观视频免费观看| 久久久精品一区二区| 色网亚洲人| 人妻一区二区三区熟女| 精品性爱| 日韩在线性爱免费视频| 91操人| 天天干天天做| 欧美久久婷| 后入式在线免费观看60秒| 精品欧美日韩在线观看| 精品在线78| 欧美色图20p| 成人免费毛片| 国产欧美岛国精品一区| 99久视频| 久久不卡一区二区| 91超碰碰在线| 激情文学亚洲| 综合久久97| 成人av影院在线观看| 极品白嫩美女白浆成人福利在线看| 久久久久久久人妻| 第二页中文字幕| 蜜乳av一区二区三区四区不卡| 96国产精品| 久久在线观看免费视频| 国产 无码 一区二区| 九九无码| 热久久国产精品视频大陆精品| 熟女久久久| 九九九九热| 在线观看亚洲专区| 偷拍 精品另类 凸凹了四区| 青草香蕉网| www男人天堂| 秋霞免费无码视频日韩A片| 午夜国产成人福利视频| 麻豆天美久久91| 操淫穴亚洲五月丁香 | 亚洲码专区| 天天色悠悠激情| 日本免费不卡二区| 黑人粗大V S日韩女优视频| 超碰97人妻在线| 老司机射| 999狠狠综合| 美国三级日本三级久久99| 九九九九热| 精品一区二区成人动漫| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 欧美日韩资源在线| 亚洲欧美日韩中文久久自慰| 亚洲久久久久| 亚洲欧美日韩精品久久久一区二区| 天天爽夜夜操| 久久精品人妻一区二区| 五月婷亚洲精品天堂| 日韩乱插| 超碰午夜在线| 久久国产精品m码| 午夜无码精品免费看性色| 强奸a片网| 福利天堂| 精品视频在线观看精品| 精品超碰国产| 亚洲综合888| 一本色道综合久久欧美日韩精品| 国产成人亚洲精品无码古代早漏男| 国产最新AV| 美女骚尻视频| 成 人片 黄色大片| 日韩中字av一区| 熟女少妇一区二区三区| 美女视频尤物网在线看| 长长久久免费视频| 98超碰日本| 91色香| www久| 啊啊啊啊啊舒服| 国产一区二区a毛片| 91精品人妻一区二区三区蜜桃臀| 91蜜桃传媒精品久久久一区二区| 国产精品干干干| 裸模AV女优| 亚洲网站一区二区在线| 大香蕉伊人久久| 97超碰欧美手机在线| 一区操逼日比视频| a人欧美综合天堂麻豆| 五月天伊人网| 九九久久99| 欧美最婬乱婬爆婬牲视频| 91三级理论片播放器| 中文字幕免费观看| 男人的天堂在线| 日本不卡免费二区| 国产AV毛片|