日韩精品一区二区三区在线视频放-无码中文字幕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
返回資訊列表
蜜桃久久久久久| 亚洲天堂中文字| 成人自拍三级在线观看| 国产日比| 9 1超碰九色| 高清国产成人无码| 青青草啪啪网| 富女玩鸭子一级毛片| 午夜精品视频777| 欧美色日本| 九久精品| 久久久爆乳翘臀一线天伦理视频| 精品一区二区三区四区女| 78超碰| 久久久久亚洲AV无码专区少妇| 性爱综合网| 久久亚洲天堂| 色色婷婷五月| 人妻精品一区二区| 五月激情小说| 91痴汉| 亚洲成人福利电影免费| 夜夜操中文字幕| 亚洲日韩精品久久久久一区壹牛 | 欧亚在线视频| 国产超碰97| 乱论91| 爽爽爽免费视频| 人人搞人人插人人操| 日韩亚洲美州欧洲综三区一品在线| 欧美视频激情久久久久久| 岛国福利在线精品播放| 99操逼| 婷婷九月色| 久久精品男人的天堂| 9Ⅰ超碰| www.久久| 偷拍亚洲| 亚洲中文人妻色| 成人小说另类在线| 天天躁狠狠躁av| 亚洲系列第一页| 久久国产999| 操逼无码操逼| 区二区亚洲婷| 亚洲免费成人在线高清无码视频| 亚洲男人的天堂在线看| 风流老熟女一区二区三区l| 97超碰免费生活| 日韩欧美字幕亚洲一区二区| 久久亚码| 婷婷激情五月| 亚州色图欧美| 国产精品探花视频| 精品对白久久不卡| 色妹子A V| 国产又色又粗又黄又爽| 精品日日人妻| 男人天堂综合| 国产精品麻豆视频网站| 人乳av| 色色无码| 欧美在线永久天堂| 中文在线视频| 欧美成人黄网色网站| 国产第二页| 大香蕉丝袜一级片| 日本不卡一区| 亚洲成?V人片在线观看福利| 国内外毛片在线观看| 大香蕉丝袜一级片| 亚洲色图欧美色图日韩色图| 欧美少妇高潮视频| 99热官网| 欧美日韩大黄片| 二级毛片| 嫩草 人人网精品| 中国国产精品一区视频| 天天干嫩逼网| 96超碰网| 97精品久久久久中文字幕| 操逼网站视频漫画国产| 麻豆国产精品午夜视频| 欧美九一精品久久久熟妇| 国产伦精品一区二区三区在线观| 91天天综合日韩欧美| 欧美色色人| 999日韩中文精品观看视频。| 超碰碰小说97| 激情欧美日韩女同久久| 国产成人亚洲精品自产在线| 九九精品无码专区免费| 天天插网| 欧美亚洲中文字幕| 国产丝袜美腿美女麻豆| 国产成人网址| 亚洲色 国产 欧美 日韩| 囯产精品久久久久久久久久二区三区| 97在线资源| 超碰超碰欧美| 亚洲操人| 十八禁成人网站在线观看| 国产精品久久久久久亚洲色欲| 欧美精品三区| 韩国国产欧美情侣视频在线| 中文一区二区婷婷视频| 久久久一级| 免费看一级a性色生活片久久无| 久久草草亚洲蜜桃臀| 亚洲亚洲亚洲天堂天堂 | 家庭乱伦国产精品| 国产精品熟女一区二区三区| 欧美另类丝袜熟女| B049AV在线播放| 日本天天吊| 人人操我人人干| 亚洲在线91| 2020中文字幕在线| 欧美激情一| 激情人妻另类| 国产二区三区粉嫩在线| 久久久久国产| 中文字幕人乱码中文字的预防方法 | 色偷综合| 久久久久亚洲精品| 人妻一区二区三区| 五月天色五月| 青青草中文-久久青草精品一区二区三| 最新的亚洲无吗| 日韩中文字幕国产| 黄片色区软件| www.yeyecao| 亚洲成人在线高清| 777AV电影| 日韩成人精品| 激情五月天插| 久久精品店| 国产宅男宅女在线观看| 亚洲精品第一| 91天堂丝袜美腿| 色性欧美| 国产97/欧美| 国产女主播视频在线观看| 国产久久日| yazhousetuoumei| 强奸乱伦中文字幕AV| 综合久欧洲| 中国91AV| 2019AV天堂| 国内伊人久久久久久网站视频| 加勒比无码毛片| 99久热精品99re6热| 嗯,啊。舔我逼| 超碰久久精品| 97久久超碰日韩精品| 97色妞| 欧美在线l亚洲| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 2025亚洲男人天堂| 久久久精品日本一道| 五月激情小说| www.操| 天天弄欧美| 久久m| 亚洲性图91| 我想要啊 啊 啊| 欧美色图人妻| 熟女熟妇一区二区三四区| 春色综合网| 91视频精品| 九九九九九九九九九国产精品| 久久一区二区蜜桃| 久久欲| 久草福利在线资源站| 五月婷婷综合激情| 久久蜜桃综合网| 欧美日韩理论一区| 97天天在线| 偷拍视频青青草在线视频| 激情小说图片亚洲首页| 免费综合亚洲中文| 日韩 欧美 校园一区| 男人的天堂久久狠| 青青青青青手机视频| 国产传媒午夜理伦精品| 超碰AV在线| 久久国模av| 色约约一区=区三区| 你懂的在线观看区国产| 凹凸视频特色日本特黄| 国产嫩草精品A88AV在线| 嗯~啊~快点 死我视频| 精品白丝一区| 91看黄片| 久久一区二区高清免费| 麻豆天美电影一区二区| 亚洲青青草| 欧美中日韩XXXX| 99国产精品自在自在| 九九热在线视频| 绯色AV粉色AV蜜臀AV| 91丰满| 无码一区二区精品视频久久久春药| 欧美激情色婷婷花野真衣一区二区| 伦理日韩国产久久| 日韩精品资源专区二区| 天天日老熟妇| 99少妇内射| 精品无码不卡视频| 蜜桃视频一区二区三区在线观看| 在线观看啊啊啊啊啊| 超碰视97中文| 日韩性爱免费视频在线网站| 亚洲欧美人妻| 后入福利视频| 国产三级在线现体验区| 色色操| 在线黄色污污网站| 欧美综合第一页| 日韩精品黄片免费观看| 男人的天堂激情| 欧美亚洲在线| 乳欲人妻办公室奶水| 热天堂一区二区| 伊人国产AV| 久草网站免费在线观看| 极品少妇99| 国产精品另类一区大香蕉| 欧美丝袜亚洲| 日本不卡一二区| 黄色高清久久无码依人| 久久啊啊| 色色激情五月天| 九九热午夜欧亚国产视频| 黄片免费视频2019| 国产无遮挡| 欧美人妻少妇| 高清不卡一二三区视频......| 男人的天堂Va| 99九九久久| 东京热99999| 日韩无码a片| 北京美女一区二区| 老司机深夜影院18未满| 国产第11页| 制度丝袜99| 欧美A√综合网 | 操我啊啊啊啊啊| 91网站18禁| 大奶啊啊好爽 | 亚洲一区二区三区春色| 亚洲欧美性生活| 无码高清操逼| 亚码人妻| 看一级黄色视频| 亚洲a色| www超碰| 久久人体一区二区| 九九热久久99精品re| 色九月综合| 最新日日夜夜天天干干| 69久久久久久久久久久久久| 丁香九月婷婷| 国产绿奴视频在线观看| 艹比视频国产精品| 久久熟女嫩草成人片免费 | 色哟哟1区2区| 人人操人人色网| 久久精品人体| 乱伦熟妇一区二区| 97视频观看| 亚洲中文字幕熟女| 九七毛片九九毛片| 久色网| 色与欲影视| 亚洲精品国产av天美传媒| 美国aaaaa一级黄片| 欧美日韩妖精91com| 99热在线观看| 国产精品96久久久久久| 久久久性爱视频| 性久久| K8久久久久| 青娱乐亚洲热| 欧美日韩在线国产在线| 欧美另类丝袜熟女| 玖玖爱综合| 日本色色色视频| 一区二区视频在看| 97精品久久久久中文字幕| 亚洲黄网在哪免费看| 超碰在线91| 国产a级精品| 十八禁成人网站在线观看| 欧美97se| 蜜臀久久久国产| 十八禁啪啦拍视频无遮挡| 亚洲激情综合另类| 日日妻色网| 欧美极品女人的天堂| 亚洲无码国产精品久久| 少妇的嫩逼图片| 免费网站观看www在线观| 日本网色| 国产精品爱欲| 色汉综合| 色婷婷一区二区三区久久午夜| 久久最新免费视频23| 欧美黑人精品一区二区| 狠狠色伊人亚洲综合网站色| 少妇无码999| 久久草视频污视频| yazhousetuoumei| 亚洲1区| 激情国产乱伦Av| 绯色一区二区三区不卡少妇| 亚洲综合有码| 超碰地址97| 欧美制服另类丝袜| 五月婷婷爱六月丁香色| 嫩呦国产一区二区三区AV| 久久97精品久久久久久久不卡| 亚州欧美总和| 久久、1234| 激情四射五月天| 国产人妖的免费的视频| 中国AV美女| 91五十路| 婷婷激情一区二区三区俺也去| 粉嫩不卡一区二区性爱| 青青欧洲黑| 啊啊啊啊啊啊啊国| 亚洲国产精品久久久久久久久久| 丝袜美腿制服人妻二区中文字幕| 蜜乳中文字幕a在线| 高清孕妇孕交 交| 国产成人啪一区二区| 色欲人妻一区二区在线| 日韩偷拍色图| 95人妻爽爽人人做人人澡 | 蜜区区视频79| 亚洲综人| 一本一道久久综合久久| 99福利社| 偷拍导航视频网站| 人妻激情视频| 国产97av| 久久尹人大香焦视| 97美日韩视频| 欧美日韩久久精品爱爱| 老鸭窝成人免费毛片视频| 亚洲有薄码区久久在线一区| 免费国产| 日韩射图| 熟女91网站| 一区二区三区麻豆| 九九九九九九九九九国产精品| 久久久久久裸体| 天天搞欧美| 男人天堂最新手机版在线青青草| 嫩草91| 国产精品3| 中文子幕一二三| 夜夜爽夜夜摸夜夜操免费视频| 欧美激色| 97日韩欧美亚洲| 欧美自拍网| 欧美色综合网| 中文字幕一区二区视频在线观看| 男人天堂网站| 91精品久久久| 青青草AV色| 色五月激情综合网| 久久精品美女一区| 色狠狠综合| 日日爽夜夜爽| 动漫片子网站3黄| 啊啊啊啊啊啊啊好爽不要| 超碰1024久久| 97精品视频在线播放| 精品女同一区| 国产高清亚洲日韩一区| 人妻一二三区| 婷婷五月天久久久| 精品99999久久久久久| 天天操天天射青青草| 东北老女人的激情视频| 超碰 国产熟女精品一区| 97超碰影音| 人人操欧美风骚| 国产一在线观看| 色婷婷五月综合激情中文字幕| 999亚洲国产视频| 久久久国产成人一区二区三区在线 | 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 欧美久久九九| 亚洲色图亚洲| 亚洲AV无码翔田千里网站| 伊人嫩草| 乱伦熟女区| 狠狠爱综合网| 丁香九月婷婷| 欧美亚洲手机在线| 日韩99精品视频综合区| 欧美性爱五月天| 欧美日本天堂| 青草一区二区| 天天视频网站黄| 操逼天美3区| 激情五月天丁香| 色女99一级片在线观看| 久久9精品| 日日插夜夜| 婷婷丁香六月天| 久草在| 天天欧美| 操逼逼中文字幕| 色噜噜综合在线| 欧美日韩中国x| 欧美Ⅴ性爱| 偷窥自拍A片| 在线97在线| 97碰碰色| 在线性黄高清免费视频| 欧美色图私拍91| 精品1区2区3区| 91 手机在线播放 绯色| 在线αⅴ| 六月丁香五月婷婷| 夜夜做夜夜爽精品视频| 久久精品久久久久久久久| 五月婷丁香| 欧美亚州色的图| 网站A V在线| 免费黄色片子| 97超碰色中文字幕| 欧美日韩国产高清在线一二三区 | 97九色人妻| 死我十八禁| 亚洲 欧美 制服 另类 自拍| 97久久资源| 久久久无码精品人妻二区 | 亚洲色图91| 欧美十八禁在线看| www.婷婷| 久久一二三四| 91性感在线| 99re在线| 天天躁日日躁XXXXYY| 欧美熟妇视频| 91中出在线| 五月天婷精品激情| 亚洲综合贴图91| 久久午夜鲁丝片| 伊人久久国产免费观看视频| 天美传媒AV在线播放| 性做久久久久久久| 欧美激情亚洲情色| 亚洲超碰AV| 日韩欧美资源| 日韩精品视频在线观看一卡二卡| 女人的久久久| 亚洲色系另类精品国产| 国产强奸超碰AV| 日日夜夜骚| 啊啊啊啊啊操我视频| 亚洲精品国产av天美传媒| 国产兽交视频在线播放| 日本三级人妻a人妻一在线| 精品国产乱码久久久久久网站入口| 99久久99九九99九九九| 九九九一二三| 美女尤物福利视频| 精品一区二区三区国产| 91在线限制级| 黄色片,com| 欧美日韩另类字幕中文| 曰韩无码777| 亚洲欧美清纯| 99热97| 最新国产精品| 欧美日动态视频| 国产曰批免费观看久久久| 人妻精品4K4K4K4K4| 尹人免费观看视频在线| 中文久久96| 日韩一级欧美一级在线观看| 伊香蕉综合久久久久久久噜噜噜 | 中文字幕奈奈美被公侵犯| 校园春色中文字幕AV| 国语国产操逼伊人AV网| 蜜桃AV天堂| 男人夜色天堂ss| 肏逼视频日本| 少妇内射视频| 日日夜夜狠狠| 亚洲无码成人精品| 97精品一区| 亚洲精品丝袜-不卡成人免费…… 久久久久成人蜜桃精品 | 懂色Av| 九九拍拍精品视频在线播放 | 精品一区二区三区蜜桃| 亚洲国产一区二区三区在线| 亚洲一级性爱视频免费看| 欧美亚洲涩涩| 99在线精品视频| 人妻偷拍一区二区三区| 91国产在线精品| 婬女免费一二三区A片| 青青色在线观看| 清清草影| 丁香五月天社区| 黄片qw| 一二三四区电影| 91在线免费观看处女| 日韩亚洲中文字幕在线| 天天色综合影视网| 99在线视频播放| 99综合免费视频| 日本人妻中文字幕 | 97超碰站| 亚洲影视高清第一页| 男人天堂.AB| 国产精品无码AV网站| 97精品一区二区视频| 91美女高潮| 爽爽爽免费视频| 五月综合视频| 黄在线| 蜜桃狠狠色伊人亚洲综合网站| 亚洲超碰综合网| 日产国产精品中文久久婷婷| 亚洲成人综合在线| 无码WWW免费视频网站| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 岛国免费视频在线| 可乐操亚洲蜜911| 久草综合视频| 天天淫人人妻日日色| 五月丁香综合激情| 在线精品福利免费播放| 欧美一区二区日韩三区| 人妻丝袜美腿中文字幕| 亚洲综合嫩| 日本999精品视频| 中文字幕啊啊啊在线观看视频| PMv在线观看| 东京热综合久久一区二区| 激情四射婷婷六月天| 目产99999久久999| 日韩中文字幕熟妇人妻| 亚洲无码99| 五月丁香社区婷婷日韩欧美精品影院 | 天天综合91入口| 亚洲人久久久网| 台湾肥佬网一区二区三区| 2020视频1区2区3区| 色婷久久| 亚洲成人综合在线| 五月天玖玖资源站| 性爱边摸边日免费AV| 欧美AAAA黄片| 四虎国产精品永久在线囯在线 | 久久97资源 网| 激情婷婷| 久久久久精| 亚洲AV色图一区| 亚洲经典啪啪| 国产男女无套视频免费观看| 性色AV蜜色av色欲av| 91痴汉| 亚洲男人天堂视频| 伊人久久亚洲色欲综合网站 | 一级黄色性爱裸体视频| 99热婷婷一区二区三| 二三四区精品| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 国产一区二区免费福利片| 日本中文熟女视频| 一区二区中文| 澳门黄片一香蕉视频| 国内精品嫩模A∨私拍小视频| 日韩电影在线观看网址| 男女日B国产| 久久天天艹| 国产精品嫩草影院免费| 男人高清无码一区二区| 亚洲成人性爱在线观看| 国模精品一区二区三区苹果色戒| 最新日产中文在线麻豆| 操逼日韩无码 | 黄骗免费网站| 91欧美经典| 欧美啪啪色吧在线| 久久大黄片| 天天激情综合站| 一区二区三区免费岛国片| 成人性爱全视频观看| 亚洲AV无线| 日韩中文字幕二区| 亚洲欧美经典一区二区| 欧美亚洲玖玖玖| 美女淫穴| 校园春色家庭伦理欧美激情| 欧美日韩久久精品爱爱| 色综合一本| 日本人妻中文字幕精品| 久久精品中文字幕无码l| 爱媛媛久久国产福利| 亚洲色图大香| 激情欧美日韩女同久久| 后入日本1234| 97干在线视频| 视频二区美腿丝袜制服人妻欧美| 我想要啊 啊 啊| 天天日天天看| 神马麻豆福利院| 国产精品白丝在线播放 | 人人干人人操人人爱| 懂色天天爱天天日天天射天天澡| 婬女免费一二三区A片| 亚洲欧美九九| 亚洲午夜蜜臀| 高清国产精品福利网站| 亚洲最新a在线观看| 亚码激情| 久久久久久久久久精| 色淫网站优优视频| 青娱乐淫乱1314| 国语av最新自产拍在线观看| 亚洲情色婷婷五月天| 欧美论理片| 女人天堂av在线播放| 凸凹视频在线观看| 少妇二级| 骚日日av| 国产精品久久久久无码A√| 婷婷导航| 精品中文日韩字幕视频| 91色色网站| 在线观看综合精品亚洲| 日本A级视频| 人妻精品一区二区| 国产区性爱在线视频秋霞豆| 婷婷五月天久久精品视频一区二区三区 | 国产美女91视频| 男人的天堂VA| 色婷婷国产精品一区在线观看| 人人贴人人摸| 大香蕉AV丝袜| 久啪| 欧美18老人禁| 狠狠狠狠狠干| se,,,亚洲欧美| 玖玖无码超碰| 亚洲天堂7777| 蜜臀99999| 久久久9999| 色9999日韩国产| 精品美女久久一二三| 白丝被操91| 精品女人999| 啊啊啊轻点在线观看| 岛国免费黄色网址| 亚洲天堂自拍| 亚洲色狠| 大香蕉伊人色偷偷在线| 国产精品午夜福利| 亚洲Av无码成人精品国产| 91丝袜激情在线| 免费国产电影一区二区| 色999亚洲人成色| 丝袜视频网国产90| 欧美性爱十八禁| 亚洲综合骚逼| 亚洲第一狼人丝袜美女另类| 亚州色图欧美| 97久久超碰国产精品| 国产小u女在线观看| 九九九九97| 欧美日韩激情无码专区| 后入式在线免费观看60秒| 精品美女久久久久| 久久久久久性爱视频| av三级电影在线播放| 久久色人体| 欧美精品久久96人妻无码| 91女在线观看| 欧美小说区视频区| 亚洲免费看片| 亚洲综合草草| 亚洲精品三| 综合网亚洲在线| 在线观看色视频| 伊人久久久日韩一区| WWW啪啪的com| 欧美 综合 亚洲| 日本色色色视频| 亚洲伊人青青草| 色五月激情网| 日韩猛交| 狠狠狠狠狠狠| 欧洲在线性爱视频| 亚洲综合性感在线| 91精品女厕偷拍视频| 吊色| 色五月婷婷五月天| 亚洲人妻精品一区二区| http://qxhbdz.com| 青娱乐二区免费| 91丝袜熟女| 国产av强奸美女| 久久久久久少妇| 99精品久久久久久久婷婷蜜桃| 久久同城AV| 思思热国产在线视频| 强奸少妇AV导航网| 国产隔壁老王影院在线| 久久精品视频一区三区小泽玛利亚| 黄色欧美性爱视频| 久久超碰日韩精品| 超碰在线人妻不卡| 狠狠色噜噜狠狠狠狠狠色综合久久| 久久久禁| 精品久热| 无码久久国产| 午夜精品久久久99| 亚洲成?V人片在线观看福利| 伊人网综合在线视频| 国产人伦a片信息免费片| 国产精品一区午夜福利| 18禁美女裸体无遮挡啪啪| 亚洲精品久久久久久久蜜桃臀| 国产女人成人精品视频| 操人妻少妇中文| 色香伊人| 久久精品国产亚洲AV先锋| 97超碰护士| 八人操人人摸人人看| 婷婷在线播放| 精品176精品2| 欧美性色网| 无码逼| 欧美亚洲综合色| 久久99999| 搡老女人911熟妇老熟女| 五月天婷婷欧美三区| 国产乱伦视频污| 色官网色综合| 亚欧美综合网。| 丝袜足交视频| 岛国毛片在线观看免费| 激情啪啪拍91| 国产精彩女在线观看视频| 欧美另类色| 亚洲91网站| 自拍欧美| 国产精品久久99日日| 动漫片子网站3黄| 国产精品扒开腿做爽爽爽视频| 九九99精品| 婷色五月| 久操高青| 国产97在线 | 亚洲| 亚欧高清| 色情综合网| 操操操操网黑人| 国产精品色约约| 日本加勒比无码专区| 免费伦费视频在线观看| 青青草在线视频欧美| 日本不卡中文| 国产欧美岛国精品一区| 夜夜高潮夜夜爽| 国产高清免费不卡av| 欧美第五页| 伊人97色天使| 亚洲AV麻豆Aⅴ无码电影一 | 九热久| 97这里都是精品| 日本肉体xxxx裸交| 四虎国产精品永久在线囯在线| 亚洲天堂日本| 98一区二区精品| h无码动漫在线观看| 人妻娇喘 激情视频| 91国产大片| 欧美日韩国产黄色片| 操操吧亚洲乱伦视频| 欧美熟妇成人一区二区| 伊人网免费视频| 国产成年女黄特黄| 久久黄黄黄| 九月婷婷久久| 激情综合五月| 久久精9| 干干干天天| 人妻少妇精品久久久久久| 大香蕉乱伦视频网| 另类天堂| 中文字幕丰满人妻日本| 91欧美成人色站| 91国产丝袜足交精品视频| 国产av尤物| 国产精品久久久亚洲一区| 很很干很很操| 91麻豆天美国产欧美| av天堂影视中文在字幕在线中文| 黄片com.| 久久久精品无码亚免费| 日本欧美亚洲高清在线看| 亚洲中字幕日本一区二区三区| 日韩少妇无码| 欧美亚洲自拍另类人妻| 欧美爱三级日韩久久| 国产福利视频精品视频| 日韩国产不卡在线视频| 成 人片 黄色大片| 欧美一级黄色18片免费看| 日本护士高潮| 99热这里只有精品99| 中文字幕精品一区二区精品| 国产精品国产自产拍高清AV| 日韩久久超碰色| 精品然女一区二区| 67914亚洲精品| 狠狠色噜噜狠狠狠狠狠色综合久久 | 人妻丝袜一区二区三区在线| 性欧美天天| 国产 三级自拍| 亚洲无吗在线视频| 精品国产av一区二区三区四区入口| 大香蕉2017| 国产乱码精品一区二区三区四川| 内射中国少妇高清视频免费视频| 丁香五月AV| 9久热| 国产精彩女在线观看视频| 人妻 丝袜美腿 中文字幕| 国模久久在线| 亚洲AV免费在线观看| 国产精品爽爽va在线观看98| 黑人白女精品一区| 国产成人精品必看| 国产久久成人| 九九综合久久中文字幕| 91bbb| 成年人免费观看网站| 我要看免费韩日黄片| 97资源制服丝袜| 亚洲97P| 久久天堂网| 久久久亚洲| 99久久婷婷丁香| 狠狠综合网| 婷婷综合| 粉嫩小泬久久久一区二区| 美女天天干| se..亚洲欧美| 思思热久久成人| 精品女人999| 国产乱人妻精品入口| 老熟女综合网| 欧美亚洲情色| 午夜理论片在线观看免费| 亚洲色天堂日韩中| 在线观看视频91| 情色五月天就去干| 88xx成人精品视频| 国产18精品亚洲精品| 首页亚洲国产高跟丝袜诱惑视频| 亚洲免费97免费| 蜜臀久久99精品久久久久久成人小说| 女沟厕偷窥piss小便| av影片在线观看不卡| av日韩在线观看电影| 91狠狠综合久久久久久| 亚洲综合69| 亚洲熟妇一,二,三期| 91 亚洲 欧美 日韩 国产 综合| 色色色综合| 久久黄色视频一区二区三区 | 日韩欧美天天爽爽爽天天爽爽| a啊啊啊啊啊啊啊啊一区二区| 日韩在线国产字幕| 日韩女模中文造逼| 白 大 人妻 区 在线| 神马久久久久久久久久久久| 九九九九九精品| 天天爽夜夜爽夜夜爽精| 高清无码在线播放网站| 91狠狠综合久久久久久| 五毛骚逼极品美女怕怕| 免费看片黄| 久草国产在线视频| 色第一页| 久九色| 欧美十八禁在线看| 欧美成人国产精品| 91日韩国产欧美亚洲另类精盘州至城都 | 欧美在线电影| 深夜国产福利| 国产三级中文有码在线视频| 色婷婷婷五月天激情四射| 欧美一二三| 1024人妻熟女一区二区三区| 91撸色网 玖玖网 欧美| 91爱啪| 丁香六月啪啪| 日日AAvv| 天天躁日日躁AAA片李宗瑞| 97精品国产手机| 日韩在线观看三级电影| 好吊妞转入那个网| 校园春色美腿丝袜 | 99热精品在线播放| 欧美一品道| h4610国产人妻| 日日做夜狠狠爱欧美黑人| A片大香蕉在线| 五月婷婷无码| 亚洲欧美洲综合| 五月天婷婷久久| 91亚洲黄色网| 亚洲国产一区二区三区四区国产| 欧美精品久久| 大香蕉强奸乱伦| 久久精品99久久久久久| 亚洲精品天堂久久A∨51成人漫| 青青操少妇| 久久精品一区二区| 五月婷婷六月色| 国产美女自拍视频| 99热在线播放| 久操免费电影| 欧美日不卡| 日本乱人伦片中文三区| 日本一区二区三区欧美日韩中文字幕| 黑人精品XXX一区一二区| 久久男人网| www.91理论| 亚洲在钱| 亚洲国产欧美一区二区潘金莲| 特级特黄一级毛片免费| 丁香婷婷激情五月天无毒不卡| 老外又粗又长一晚做五次| 小草精彩毛片| 欧美精品二区视频在线| 欧美国产视频| 国产成人精品无码久久| 亚洲自拍青操视频| 久久久国产三级黄色片| 亚洲黄色AV电影| 超碰97玖玖爱| WWW黄片COM| 久久久久白虎| 久久久久久大| 在线观看成人性爱免费小视频| 午夜久久久| 91五月天| 午夜激情成人在线观看 | 91久久九九精品国产综合| 嗯嗯啊好大| 1769精品一区二区三区| 熟女精品一区二区在线观看| 岛国福利在线精品播放| 丝袜美女诱惑 91 视频| 亚洲五码一区二区三区| 久久视网78| 亚洲中文日韩欧美大香蕉视频| 目产99999久久999| 免费啪啪啪网站18岁| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 欧美国产精品久久九九| 99色婷婷中文字幕乱色| 国产一区二区三区导航| 亚洲情欲| 欧美亚洲国产自久久| 欧美日韩 强奸乱伦| 欧美精品黑人猛交高潮| 在线97在线| 怡红院一区二区熟女人妻| 天天做天天爱| 久久偷偷色综合蜜桃| 色女女女导航| 国产一区二区av综合| 91另类| 东北操逼| 国产传媒一区日韩| 九九色精品| 天天插夜夜操| 超碰97 线线 在现| 成人久久精品| 综合色图亚洲欧美| 久久男女激情视频网站 | 亚州男人天堂| 欧美综合网1| 高树玛利亚无码流出| 国产Aα| 人人操人人摸人人骑| 亚洲色图欧美色图综合| 91亚洲欧美色图| 在线 制服丝袜中出 人妻| 日本一级婬片试看三分钟| 深夜福利黄片| 成人青青草原伊人| 自拍亚洲综合| 久久国99999| 色综合网1| 啪啪啪东京| 亚洲网站一区二区在线| 日本二区不卡| 熟妇激情| 精品视频专区| 精品四五区| 国产精品色| 日韩性爱电影一区| 亚洲男人电影天堂| 天天躁日日躁狠狠狠躁| 无码男人天堂| 欧美视频激情久久久久久| 日本不卡高清免v欧美日韩在线观看| 国产69精品久久久久99尤物| 亚洲 欧美 日韩 国产一区二区| 一区二区三区一亚洲中文字幕、综合区灬 | 亚洲丝袜色图| 玖色AV| 天天日天天插| 丁香六月婷婷综合| 亚洲天堂 视频你懂的| 入口操逼网站| 操逼啊啊啊91| 国产精品婬乱一级毛片彝族| 国产精品一区二区久久精品| 日韩三级在线观看网站| 一起草三级AV电影在线观看| 加勒比99999| 大茄子熟女AV导航| 精品1区2区3区| 自拍啪啪视频| 啊啊啊水好多| 96免费视频在线| 久久超碰98| 亚洲色资源| 97bbn| 综合性视频99| 国产成人精品一区| 大香蕉青青9| 后入福利| 骚货操死你| 强乱老妇中文字幕| 欧美97网| 另类图片综合| 九九无码| 在线观看不卡一区二区三区| 最新无码国产| 一区AV| 中文字幕久热视频在线| 99国产在线 精品 视频| 一区二区影院| 717影院理论午夜伦八戒| 亚洲精品无码久久AV| 国产一级作爱毛片| 在线国产探花| 99久在线精品99re8| 中文字幕 码 自拍 视频 区| 人人喜人人妻| 超硑97精品| 久久妇| 91人妻在线视频| 综合伊人激情| 久久超碰日韩精品| 婷婷伊人五月| 日韩av不卡在线看| 在线无码操| 精品久热| 97青青操视频| 欧美性爱一区二区三区四区| 制服诱惑亚洲一区二区三区在线观看| 中文字幕av片| 96精品久久久久久久久| 美女被啪到深处抽搐视频| 精品国产无码中文| av一区二区三区 中文| 九九热精品视频在线观看| 中文字幕丝袜美腿| 亚洲熟女偷拍在线观看| 久久亚洲日韩国产欧| 97网色| 国产一区二区三三视频| 欧美黄片欧美黄片xxx| 五月丁香啪啪啪| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV | 亚洲av无码国产精品字幕| 探花熟女,姿勢到位,體驗感也到位| 极品白嫩美女白浆成人福利在线看| 激情五月综合网| 60秒免费小视频| 中文字幕青青草| 日本中文字幕不卡视频| 无码不卡亚洲成?人片| AV一起草在线| 久久婷色| 久久久性爱视频| 淫纸中9区| 中国操逼无码| 免费a在线播放v| 曰本精品久久久| 色爽——AV| 婷婷操视频| 大香蕉520| 妇女视频网站| 黑丝制服中文字幕 | 夜夜爽妓女| 九九九九免费视频| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 免费a级毛片av无码久久精品中文字幕| 九久久九九久视频| 超碰三级秋霞| 丁香五六月啪啪| 国产呦精品一区二区三区下载| 三级三级三级日本99| 少妇专区一二三四五| 国产精品9999| 多毛小伙内射老太婆| 色妺妺在线视频| 黄站在线免费观看| 国产亚洲精品久久久久小| 色情五月丁香| 伊人久久久日韩一区| 九九碰九九爱97超| 福利在线黄片| 国产免费久久精品99re韩国| 日韩亚洲欧美中文字幕| 被体育老师抱着c到高潮| 欧美熟妇人体| 日韩欧美加勒比| www.av在线观看| 国产精品午夜福利视频| 欧美人人操人人插| 黄色片大香蕉| 夜夜久久| 波多野结衣之双飞调教在线播放| 亚洲另类在线观看| 欧美在线 亚洲| 日韩操逼HD| 欧美精品久久96人妻无码| 欧美双插| 91久久久久久| 97在线/亚洲| 乱欲一区二区| 日本欧美m v精品网站加| 国产精品永久免费10000| 久久久影院| 色综合美国| 夜夜国自区| 51国产午夜精品视频| 六月婷激情福利天堂69| 欧美成人精品欧美一级乱黄一区二…| 综合久久欧美|