日韩精品一区二区三区在线视频放-无码中文字幕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
返回資訊列表
日韩 成人 有码| 中国国国产一级特黄毛片| 99久久婷婷国产综合精品草原| 91欧美另类| 老熟女乱伦片| 丝袜综合| 亚洲av无码成电影在线播放| 一级黄碟在线观看| 国产Av超碰| 岛国AV一区二区电影| 东北女人高潮视频| 啪啪一区| 91在线欧美| 久久男人的天堂国产| 日韩十八禁| 91中文在线| 殴美色网| 日韩三四五区| 国产精品久久久久久久无码AV| 搡老女人老妇女老妇老熟女怎么读| 欧美亚洲韩国视频十五区| 在线国产一区二区av| 欧美传媒一区| 中文字幕亚洲在线一区 | 美女诱惑在线一区| 国产三级多多影院2022国产AA一级毛片无码| 一区二区不卡| 黄色AV影视| 秋霞一集毛片观看| 粉嫩AV一区夜夜嗨| 日韩精品在线观看网站| 干B网| 精品视频一二三中文| 国产免费一区二区三区最新不卡| 激情小说日韩无码| 97爱b| 丰满岳乱妇一区二区三区| 亚洲 综合 第一页| 久久黄黄| 久操网视频| 日韩av情韩国爱禁区av一区二区| 日本三级日本三级99| 92久久| 丰满人妻一区二区三区在线| 浪人综合网| 老熟乱一区二区三区四区| av优播| 尤物网址| 国产99热| 日本孕妇孕交| 丁香五月综合| 370p日韩欧美亚洲精品| 18+91网站| 激情自拍 校园春色| 国产又黄又粗的视频| 日本加勒比无码专区一二三| 另类图片欧美激情综合| julia ann久久| 九九九九88| 精品人妻av在线播放| 青青草一本道福利视频| 操逼内射干逼白丝91| 日本一区二区做爱的视频| 9.1小视频| 亚州色站 日韩电影| 亚洲激情在线一区二区| 亚洲日韩黑丝| 亚洲天堂热| 欧美日韩性感| 亚洲激情av| 老女人91| 99草精| 岛国片在线播放| 蜜臀久久99精品久久综合| 亚洲精品国产熟女久久久| 久久产精品一区二区三区电影| 人妻乱仑一区二区三区| 欧美日本天堂| 亚洲av综合伊人久久| 91久久久久久久久久久| 91综合网站| 涩五月婷婷| www欧美91| 国产少妇肉丝在线观看| 久热伊人| 老女人爆菊| 色呦呦国产精品免费看| 女人的久久久| 中文字幕av亚洲精品| 久九干| 国产精品99999| 国产精品香蕉| 亚洲男人综合| 婷婷五月天激情小说| 东北女人| 一本一道久久综合久久| 啊啊啊 在线观看| 人妻中文字幕日韩电影| 欧美色另类| 婷婷五月天在线观看| 78p欧美| 人妻一区二区三区视频| 国产97色在线| 综合欧美亚洲| 久久綜合很很很| 九九精品99| 欧美色图片色哟哟| 麻豆黄四叶草网站| 色久桃花影院在线观看| 99999国产| 亚洲少妇诱惑| 手机看av网站在线看| 伊人操| 成人精品视频| 中文字幕黑人大片| 国产探花精品在线| 激情欧美97| 亚洲色资源| 色五月亚洲| 日韩无码黄色片| 欧美成人精品一区| AV色五月| 亚洲码和欧洲精品激情系列| 亚洲操逼网| 国产精品白虎| 日本高清有码网址视频| 综合天天。| 97精品在线| 一区二区三区色综合| 久超超碰| 国产中文字幕在线观看| 日韩女优中文字幕| 人妻少妇久久中文字幕一区二区 麻豆 | 成人蜜乳小视频网站| 91精品黄在线观看| 欧美亚洲| 日本天堂网| 中日亚韩免费视频| 91综合中文字幕| 亚洲97P| 在线看片国产精品每日更新| 久久一区二区蜜桃| 欧美精品偷拍| 国产67194| 成人性爱免费播放| 91视频女生| 国产成人资源| 日韩av影片在线观看| 亚洲色图片区| 99在线观看无大码| 91狠狠综合久久| 中文字幕乱在线伦视频中文字幕乱码在线| 98超碰欧美| 日韩 欧美 国产 麻豆| 日韩免费大片一级播放| 亚洲成人AB| 成年男人的天堂| 激情五月婷婷| 亚洲制服欧美另类内射| 国产精品爱欲| 男人的天堂Va| 久久25| 欧美丝袜激情| 亚洲最大黄网| 欧美激情 日韩精品| 久久丁香五月婷婷| 色婷婷影院| 日韩精品在线放| 激情 欧美 亚洲 小说| 夜夜操夜夜高潮夜夜爽国产精品区| 97激情97激情| 91久久18禁| 9/A片| 艹我哪美一区无码| 久热这里| 天天综合网国产| 18禁精品网站在线看| 亚洲网站一区二区在线| 黄色免费网| 午夜a成v人电影| av一区二区三区四区| 人人玩人人添人人澡免费| 亚洲无码 国产无码| 尤物av网站免费在线播放| 神马久久69| 天天操美美| 欧美亚洲今日在线| 久久久久久亚洲Av无码精| 国产精品白丝AV| 四虎免费视频| 久久极品伊人| 青青爽| 色女综合| 插B在线观看| 青草综合| 欧美大香蕉同搞| 91小视频| 日韩在线女优天天干| 欧美日韩天堂| 国产精品国产精品国产| 五月丁香六月综合缴清无码 | 国产精品自产拍在线观看社区| 婷婷AV一区二区三区| 亚洲图片 91| 午夜情侣自拍网站| 安微少妇操BBB| 热99这里有精品综合久久 | 超硑97精品| 后入福利视频| 国产精品久久久| 日韩精品黄片免费观看| 欧美美女自慰一区二区三区| 97视频在线视频| 九九亚洲| 天天综合色| 丰满少妇高潮无码| 亚洲天堂2020| 国产色呦呦| 欧美97日韩| 97chaopengongkai| 国产又大又硬又长又粗| 成人老鸭窝人人在线视频| 亚州 综合 色图| 天天综合青苹果| 97人人模人人爽人人| 天天影视网色欲色香| 欧美日韩中文字幕人妻| 成人午夜无码视频| 青青草一本道福利视频| 久久久新亚洲AV| 91久久精品国产| 狠狠躁伊人中文字幕| 国产 日韩 欧美高清| 人妻无码后入| 91香蕉国产尤物视频| 九九综合久久| 婷婷丁香人妻 | 国产熟女二区| www久久国产精品| 亚洲人精| 男人女人18禁片免费看网站| 欧美日不卡| 蜜臀AV一区二区三区| 欧美性爱伊人| 日本大香蕉综合网| 女优免费一区二区永久| 青青草中文字幕| 精品久久久av| 看免费的黄片| 久操视频免费观看| 日韩一级片在线看| 91热| 99re不伦| 污污汅18禁网站在线永久免费观看| 日韩精品9999| 亚洲激情在线一区二区| 97干97色| 91精品婷婷国产综合久久竹菊| 26uuu性| 性一级黄色录像片网站导航| 人妻啊啊人妻啊| 91精品老女人| 91艹逼精品| 亚洲第2页| 日日97| 3571色综合一区二区二区| 啪啪啪综合网| 绯色AV粉色AV蜜臀AV| 激情抓乳插进去啪啪啪日韩| 亚洲 欧美 综合 91| 亚洲精品日韩国产欧美| 欧美资源| 天天日美女的B| 大香蕉久操| av天堂5| 亚洲操操操无码| 久久久不卡区一区二区三区久久久| 色婷婷亚洲婷婷| 亚洲第一成人影院色播| 美中日韩无码| 黄页视频网站野外| 国产精品久久久久久久黄无码| 被男人吃奶很爽的毛片| 久久久久久精| 高潮精品| 欧美大波激情xxxx| 国产精品麻豆成人av| 国产精品九九九| 久久精品人妻一区| 久久产精品一区二区三区电影| 午夜爽爽爽| 亚洲巨爆乳一区二区三区四季网| 98久久| 91国产操逼视频| 五码视频在线观看| 思思热久久成人| 操逼操逼逼操操逼91| 欧美强奸乱| 人妻嗯啊啊在线播放| 久久久久幕乱码| 26uuu最新| 日日干夜夜操视频h| 亚洲综合888| 91欧美性| 亚欧美无遮挡| 中日韓欧美高清| 在线播放免费av福利片| 久久精品国产亚洲AV无码电影| 国产一级αv免费看片| 免费观看欧美日韩操逼视频| 日韩美女久久一区二区三区| 久久一二三四五六七八九区区| 国产精品久久久久999| 香蕉精品二区二区| 在线观看不卡一区二区三区| 中文字幕123| 偷拍欧美激情| 天天热精品| 精品一区二区三区国产| 国语av最新自产拍在线观看| 日本高清电影欧美色图| 97在线观看免费视频l| 青娱乐91| 日本性爱网址| 艾草av| 欧美日日人人天天| 日本精品999| 天天透伊人| 色婷婷综合网站| 激情久久久| 无码直播久久久| 欧美婷婷久久| 免费?级毛片无码?∨蜜芽试看| 乱老熟女一区二区三区| 日韩中文字幕在线视频观看| 久久99国产精品| 日韩免费福利在线观看| 天天综合网~69| 欧美五区| 一区| 亚州性色| 欧洲人妻视频| 国产成人亚洲精品无码古代早漏男 | 亚洲女毛多水多21P| 亚洲久热| 国产精品一级二级在线| 黄色十八禁网站| 色五月激情AV在线| 色官网色综合| 超碰国产情侣自拍网| 亚洲脚交| 中国一级操逼视频| 欧美日不卡| 9 1超碰九色| 岛国激情视频在线观看| 日日狠狠久久偷偷色综合免费| 夜夜 中文视频rt| 欧美精品久久久久久久丰满| 超碰av在线| 熟女高潮合集-永久久久-成人AV | 国产精品情侣啪啪| www.久久超碰| 丁香九月激情啪| 一牛一区二区三区久久| 亚洲成人在线高清| 黑丝少妇麻豆| 超碰在线人人射| 99在线观看| 208天天久久九九九| 少妇一级婬片免费放一级a性色. | 国产一区在线免费播放| 骚熟女吞| 操我无码| 97视频新免费| 亚洲黄网在哪免费看| 天天看高清麻豆| 国产超碰AV在线精品| 激情深爱五月天| 久久9久| 人妻在线臀日韩| 精品国产人成在线| 99国产精品自在自在| 天天懆天天日| 中文字幕精品亚洲熟女| 欧美国产伊人久久久久| 后入人妻一区| 无码精品蜜桃一区二区三区ww| 欧美肥臀在线| 久草婷婷| 嫩呦国产一区二区三区AV| 日韩欧美偷拍美女视频| 青娱乐久久艹| 少妇蹲下露出大唇5| 日韩pv中文| 国产日韩区| 日本 情色 1区2区3区| 色情五月婷婷| 亚洲熟女乱色一区二区三区| 日韩av电影网站| 色婷婷丁香五月| 熟女探花啪啪| 亚洲第一视频 欧美风情 日韩| 天天爽爽爽爽| 欧美日韩色综合网| 精品无吗m| 偷拍五区| 丁香五月天婷婷姐| 中文字幕在线高清男人的天堂| 蜜臀久久99精品久久久久久婷婷| 亚洲成人精品久久久| 久久欧美性爱视频| 思思热在线视频免费| 欧美玖玖爱免费玖玖| 大奶啊啊好爽| 这里都是精品在线观看| 天天干干天天干干| 日本影视久久免费| 日韩欧视频| 天天内射| 欧美日韩免费专区在线| 国产无马av| 日韩乱伦视频| 中国一区二区亚洲人妻| 思思在线免费视频| 国产精品久久久久久久电影渣男| 2020天天色综合| 狠操91,com| AV丝袜少妇| 午夜免费视频1000| 国产自偷自拍一区| 人人人人插| 男男H黄动漫啪啪无遮挡网站| 蜜臀99久久国产| 不卡二三区人妻少妇| 在线小说视频一区| 国产蜜臀在线| 校园春色美腿丝袜| 丝袜美腿丝袜| 亚洲丝袜综合| 免费岛国一级片| 人人搞人人插人人操| 老熟女91| 欧美午夜视频免费观看| 狠狠色噜噜狠狠狠狠狠色综合久久| 无码精品久久| 国产精品爱欲| 麻豆国产96在线| 高树玛利亚无码流出| 久久久99999久网站| 啊啊啊啊免费视频| 国产乱伦性爱区| 99日韩| 中出789在线视频| 哑洲在线| 日韩精品一区二区高清| 国产精品久久久久av| 欧美大香蕉97| 亚洲深夜福利| 久久精品国产亚洲AV片多多| 精品精品精品| 日韩色图 一区二区| 亚洲综合第一页| 无码抄逼网| 一牛一区二区三区久久| 玖玖久久久| 亚洲一本大道中文字幕无码在线| 国产日韩精品一区二区三区| 亚洲欧美校园| 国产69精品久久久久99尤物| 91色爽欧美| 啪啪综合网| 久久综合激情| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 91激情网| 99这里都是精品| 精品成人女人久久| 富女玩鸭子一级毛片| 国产精品女久久久久av爽| 六月色色| 日日干夜夜骑| 在线一道啪| 日日操丁香五月天| 青青草伊人久久| 亚洲激情视频| 婷婷啪啪| 人人摸人人舔一区二区| 8x福利精品第一福利视频导航| 国产伦精品一区二区三区在线观| 九九久久国产精品| 欧美成人一级麻豆| 亚洲五月丁香花狠狠干一区二区三区 | 人人模人人看| 色五月综合| 粉嫩小泬久久久一区二区| 福利视频网站| 男人的天堂不卡一区二区| 青青草一区二区三区四| 影音先锋视频在线| 日日AV加勒比| 亚洲综合第一页| 欧美精品四区| 91色香| 亚洲午夜AV| 日本道人妻久久久在线不卡色视频| 精品国产91av一区二区三区| 中文字幕97色| 密乳无码| 51一区二区三区| 人妻乱仑一区二区三区| 国产熟码AV| 亚卅熟女乱色| 天堂男人网| 久热色情精品| 国产无吗在线播放| 色大师网站www永久网站视频| 大香蕉www.超碰| 极品后入免费视频| 日韩成人大片一区二区| 欧美超碰97| 亚洲美女 晚间男人天堂 | 看看日B真人视频| 久久一级无码精品毛片6| 欧美亚洲特P| 91婷婷| 国产在线视频午夜精华在| 97这里都是精品| 一区二区三区成人高清视频| 男人天堂导航| 99精品热| 五月激情小说| 国产狂喷潮在线精品| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 国产操逼逼网| 天久久久噜噜噜久久国产精品爽爽| 91色噜噜狠狠| 婷婷五月天影院| 永久免费av无码网站国产app| 亚洲人精品久久久| 色欲人妻一区二区在线| 99自拍视频| 另类TS人妖一区二区三区| 欧美黑人与女人91| 另类亚洲图色| 99国产精品在线观看| 9999久久久久| 亚洲成av人片色午夜乱码| 亚洲综合另类小说色区亚洲成av人片在www | 综精品久久久aaaa| 久久午夜伦| 青青草中文-久久青草精品一区二区三 | 久久9精品网站| 九九亚洲精品| 亚洲熟久久| 欧美亚洲激情一二三| 玖玖爱一区在线| 欧美青青视频| 新精精品久久精品| 男人的天堂久久狠| 久久久国产护士丝袜美腿一| 人人操人人射人人干| 97就爱干| 3P丝袜熟女 色综合| 91性感在线| 亚洲学生妹高清av| 国产美女销魂在线观看不卡| 国产高清精品一区二区三区毛片| 8x福利精品第一福利视频导航| 小视频国产| 黑人操一区二区| 精品对白久久不卡| 中国AAAAAA黄色片| 96超碰网| 免费毛片在线播放| 国产第二页| 91性高| 爱av免费| 97人人爱人人做人人乐| 精品人妻一二三| 久久久9999| 天美传媒AV在线| 伊人在线大香蕉二。| 欧美另类色图片| 高清国产性猛交xxxx乱大交| 久久社区一区二区三区| 男人天堂综合| 九九九九精品一区| 日韩综合97p| 一本色道久久天天射天天干| 在线可观看的黄色网址| 天天看综合网| 日本熟妇精品九九| 综合亚洲欧美精品日韩?v| 在线国产福利网址导航| 91久精品| 91久久久久久久久18| 色老汉色| 97日韩| 大香蕉乱伦视频网| 超碰98综合网| 国产亚洲精品一区二区三区| 色婷婷久久| 日本顶级天天操狠狠操夜夜操中文字幕| 日韩在线电影| 91色久| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 欧美色人| 狠狠干,狠狠操| 欧美91久久久久| 久久亚州精品成人Av无| 久久久久国产亚洲一区欧美色图日韩| 精品女同一区二区三区| 亚洲午夜福利视频| 九九国产| AAAAAAAAA黄片| 久久999久| 一二区在线观看视频| 69精品久久久久中文字幕| 亚洲精品xxx| 日韩三A大片在线观看 | 国产精品内射婷婷一级二| 久久久成人精品| 亚洲AV无码成人精品久久| 99av| 欧美激情视频一区二区三区不卡| 亚洲 日本 国产 综合| 午夜精品久久一区二区| 国产青青美女玩逼视频| 九色精品视频导航1| 任你干在线视频| 熟女露脸激情自拍视频| 色九月| 亚洲欧美啪啪| 超碰97丝袜| 夜夜草天天| 成人夜夜| 成人性爱AV在线免费观看| 久久久A∨| 综合97亚洲| 天操天操夜操夜月月年年操操| 天堂v无码免费视频| 欧美人妻二区三区| 99精品欧美一区二区三区桃色| 国产中文日韩欧美一区二区三区人妻丝袜美腿 | 在线只有精品| 国产午夜精品理论片a大结局| 青女在线| 亚洲另类在线观看| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 人人操人人操人人操人人操人人操人人人11.CM | 日日日日做夜夜夜夜做无码97| 六月丁香婷| 中文字幕AV乱伦| 夜夜骑日日| 天天综和| www.狠狠操| 狠狠操夜夜| 日本欧美中文字幕| 高清孕妇孕交 交孕妇| 热久久精品| www.国产高潮精品| 欧美日韩*字幕一区| 日曰骚久久精品| 欧美97在线观看| 激情开心五月天| 大香网站| 91大神精品长腿在线观看网站| 国产青青综合伊人| 日韩午夜国产| 国内毛片国产欧美拍| 日韩综合97p| 91美女在线视频| 欧美日韩理论一区| 老熟妇乱轮| 97久久超碰| 九色 人妻 大香蕉| 欧洲色| 人妻av在线| 久久九色| 欧美色图成人网一区二区| 欧美日韩国产男人| 天天热精品| 柠檬AV导航| 久热精品在线| 国产日比| 91精片| 夜夜中出国产| 91日韩国产欧美亚洲另类精盘州至城都| 91人精品妻入口| 天天看人人操屄犊摸阴| 肏逼福利网站| 欧美天天综| 精品国产三级av韩国在线| 婷婷五月天久久精品视频一区二区三区 | 亚洲男人天堂2| 美国一区二区免费视频| 国产97综合| 亚洲乱熟女一区二区三区大香蕉| 色综九九九一区| 女人爽到高潮潮喷18禁网站| 国产91 丝袜在线播放| 人妻丝袜无 码视频专区| 日韩无限资源| 91色综合激情| 国产一级不卡在线观看| 超碰一区二区| 成片免费播放| 最近二区三区视频大全| 欧美色图片91| 美国一区二区三区视频| 呻吟 欧美 日本 中出| 免费看日产一区二区三区| 精品人妻一区二区三区不卡断| 亚洲五月丁香花狠狠干一区二区三区 | 超碰97久久| 亚洲精品国产AV天美传媒| 密乳AV免费观看| 免费99精品国产自在在线| 一区二区三区机械有限公司| 春色综合网| 97这里都是精品| 人人摸人人添人人操| 亚洲Av诱惑| 大香蕉十区| 大香蕉免费乱伦视频| 男人的天堂2010| 97精品一区二区视频| 久久熟女久| 加勒比大香蕉视频在线| 国产精品久久久久久高清无码免费看| 久久99草| 懂色综合久久久| 精品人妻一区二区视频| 揉揉揉夜夜| 鸥美插入视频| 亚洲午夜AV| 成人无遮挡毛片免费看| 青青草综合在线| 国精品一区二区三| 精品v日韩欧美国产| 九九碰九九爱97超| 色香综合天天影视综合 | 懂色中文一区二区三区| 欧亚 另类 久| 日韩中文字幕2020| 青青草九九九九九| 亚洲一区二区性爱电影| a亚洲欧美色欲| 欧美激情 亚洲色图| 欧美后入视频| 久久精品视频久久久| 亚欧国产无码精品在线| 九九综合久久中文字幕| 亚洲色图一区二区三区| 亚州精品人妻一二三区| 久久久久久久国产| 96久久科窝| 色情五月婷婷| 亚洲综合中文字幕有码| 国产成年女人免费视频播放a| 免费视频一二三区| 深夜激情 | 999999精品| 日本一卡二区在线| 亚洲天堂美臀在线| 欧美视频第二页| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 75大香蕉| 超碰爽人妻熟女Av| 亚洲天堂,男人| 日本欧美国内在线| 欧美精品久久久久久久久88| 少妇一区二区三区高速| 91视频精品| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 超碰99热中文字幕| 1024亚洲中文字幕久在线看片你懂的| 久久9视频| 欧美综合区| 韩国三级理论在线| 美女一区二区国产精品| 91高清无码下载| 黄色AAAAAAAAAAA大片| 色就色综合| 青青青艹在线视频| 久久精品老司| 欧美精品91| 久久久久久九九九九-美女久久久久久久-成人AV | 色综合91| 精品久久久av| 九一亚洲国产免费| 婷婷综合在线观看| 久久av网| 国产精品久久久777| 97视频620| 色香在线| 天综合网欧美| 国产精品久久久久久久久久二区三区| 日韩精品影视| 天天干夜夜| 情色大香蕉| 人妻久久| 啊啊啊好多水| 欧美 精品国产制服第一页| 欧美一级AAAAAAA| 一本精品日本在线视频精品| 中国一级特黄大片护士| 国产黄片在线免费观看| 黄片无码在线制服| 色五月综合网| 人人乐大香蕉| 日日夜夜国产综合| 色老久久| 欧美激情精品久久久久久| 人妻久久一区二区三区 | 亚洲在线a| 午夜国产综合视频在线观看| 黄色人人| 国产亚洲禁久一区二区| 五月丁香成人网| 日韩女优中文字幕| 亚洲揄拍网| 日本亚欧爱爱| 欧亚日韩中文在线| 韩三级a视频在线观看| 温婉少妇玩3p| 丁香五月综合| 日本日日色视频| 99在线啪| 天天影视亚洲| 欧美偷拍区| 91精品国产麻豆国产自产在| 69精品少妇一区二区三区蜜桃| 91色黑人少妇| 久久久久人| 好爽视频在线观看视频| 26uuu欧美日韩| 中文字幕在线高清男人的天堂| 人夜夜精品网站香蕉嫩草| 秋霞午夜视频一区二区| 婷婷精品久久av影视| 日本一区二区不卡| 亚洲天堂7777| 99久久com免费视频′| 加勒比海成人视频网 | 五十路二区在线| 久久久九九网站| 四虎AV无码| 欧美日韩亚洲国产中文永久天天看| 97在线免费视频观看| 欧美午夜视频免费观看| 丁香六月婷| 曰本91情色| 97天天操| 26uuu国产成人综合| 97色冈| 久久精品高清无码一区| 91精品国产91综合久久蜜臀| aaaa少妇高潮大片| 国产suv精品一区二区四区999| 人妻激情在线视频| 中文字幕av亚洲精品| 国产亚洲日本精品在线| 久久久9品一区二区三区| 超碰偷拍| 免费日韩黄片| 又大又白奶子| 9久9久| 日本三级一区二区 在线| 亚洲第一页色| 夜夜骑日日| 欧美激情性爱视频网站| 天天综合~91入口| AV男人天堂网| 日韩精品一区二区日韩| 啊啊啊啊啊在线观看网址 | 精品国产乱子伦一区二区三区,精品一 | 97人人模人人爽人人| 亚洲精品1区| 国产午夜精品理论片一二三区区| 国产伦精品一区二区三区在线观| 伊人久久亚洲中文字幕不卡| 91这里只有精品| 婷婷99| 精品一区二区2| 九九久久一区二区伦理| 日韩人妻网站| 成人线上超碰| 色蜜AV| 嗯嗯不要 视频| 国产三区免费在线观看| 成人在线视频一区| 久久国产逼| 77777亚洲蜜臀精品久久综合蜜臀| 成人日本片久久久蜜桃| 91三级理论片播放器| 搞中出视频在线观看| 日韩欧美性吧婷婷乱伦大香蕉| 日韩精品一二三四| 青青草大香蕉视频| 亚洲欧美国产其他二区| 老鸭窝日丰县女人| 顶级丝袜熟女一区二区三区| 天天看高清麻豆| 国产精品ⅴ无码大片在线看.| 又大又黄国产| 久久久久97| 国产极品999| 最新亚洲黄色免费电影| 久久精品亚洲婷婷| 12一15性XXXX粉嫩国产| 一区二区三区 丝袜 高跟 美腿| 中文字幕乱亚洲美女精品一区| 色婷婷影院| 亚洲视频精选| 偷拍网站久久男女男| 97超碰碰| 看免费一级在线播放毛片| 欧亚洲精品有视频| 91免费看一区二区三区| 久久蜜桃综合网| 亚洲AV麻豆Aⅴ无码电影一| 91最新综合| 噜噜噜在线视频| 久久精品中文字幕女同| 久久久久久AⅤ无码免费肉站| 精品少妇人妻一区二区三区| 搡老熟女老女人老熟妇免费视频| 久久成人东京热人妻| 日本片日本片祼观看网站在线看中文版网页在线看 | 午夜福利成人免费视频| 亚春色色| 神马精品视频| 操逼视频国产无套| 亚洲色图欧美另类在线| 久久久久亚洲Aⅴ无码| 91热色| 久久久久久国产精品| 91中出| 亚洲综合影片| 欧美成人性爱视频免费观看| 99re99在线视频| 67914亚洲精品| 一区二区三区免费视频入口| 天天综合香 ld视频| 欧美日韩国产高清在线一二三区| 国产精品97超碰| 99热精品免费| 一级性爱视频免费观看 | 欧美日韩黄片精品在线| 国产乱子伦一区二区三区免看| 青青草天天亲夜夜操网| 久久精品熟妇丰满人妻99| 中文字幕乱碼在线| 免费强奸av| 欧美不在线| 蜜臀99999| 乱伦熟女区| 精品九九| 屁股久久久久久久久| 亚洲一区二区麻豆影院| 午夜福利无毒不卡| 97伊人超碰| 欧美 亚洲 大香| 911粉嫩人妻| 国产精品久久久久久久无码AV| 人人爽人人精品乱人伦AV| 午夜一区| 日韩三A大片在线观看| 一本色道久久综合亚洲二区三区| 91人人爽人人爽| 乱伦日本色图AⅤ| 亚洲国产精品成人久久蜜臀| 久操影视| http://qxhbdz.com| 日韩亚洲中文字幕在线| 超碰78| 色偷偷人人玩人人舔人人操人人摸人人爽| 婷婷五月影院| 95自拍视频在线观看| 激情在线青青操| 亚洲男人的天堂网| 懂色AV一区二区三区| 色呦呦呦在线观看视频| 亚州综合色| 九九免费影片| 91在线免费观看处女| 国产动漫操逼视频| 免费无码国产精品v片在线观看| 96超碰网| 久久视频,这里只有精品| 久jiu久神马影院| 操婷婷逼| 手机在线A片| 精品久久久久久中文字幕视频免费| 人人摸人人舔一区二区| 日欧美色| 欧美日韩性感| 日韩人妻无码专区| 欧美αv.com| 国产精品999aaa| 欧美图片色五月天| 97干天天| 2010男人的天堂| 国产精品久久久久久久久AV大片| 尤物视频一区| 裸体美女久久久| ,国产乱人伦精品一区二区三区| 国内自拍 日韩激情 99| 免费久久一级毛片大黄| 色综合天天爱去电影网| 久久久久幕乱码| 后入人妻一区| 激情文学网伊人| 99色色网| 日本日皮视频逼| 波多野结衣一级视频| 免费视频在线一区二区不卡| 久久久久久久性爱| 中文字幕欧美精品亚洲日韩蜜臀| 国产第11页| 91艹逼精品| 中文字幕一区二区三区人妻少妇在线| 丁香五月大香蕉| 综合色色网| av午夜影院在线播放| 天天看天天在线精品| 另类TS人妖一区二区三区| 亚洲欧美综合| 91天天看| 啊啊啊啊啊啊在线观看| 97超碰色色| 人妻天堂三区| 亚洲97在线| 97干在线视频| 国产精品日日摸天天碰| 97精品人妻一二三四| 久9爱经典视频| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 欧美成人一区二区| 亚洲吊色| 美日韩一二三区| 蜜桃久久精品一区二区三区| 久久久久久九九九九-美女久久久久久久-成人AV | 久久综合九九| 五月天综合| 久久思思热| 九九色色| 天堂蜜桃无码视频一区二区| 大稥蕉免费视频这里只有精品| 天天干一干| 99自拍视频| 99热网站| 天美AV片| 91色图片| 午夜后入| 加勒比东京热五月天天堂网| 色情婷婷久久五月天| 无码精品啪啪啪一区二区三区三州| 校园春色综合香蕉| 超碰这里有精品| 极品人妻少妇综合| 日韩三级性| 久久久极品| 91精品国产综合久久久蜜臀酒店| 色激情综合网站| 亚洲一区在线观看欧洲| 在线A日本| 欧美黄片视频在线观看免费| 色色五月婷| 麻豆黄色五月天| 亚洲熟女乱熟乱熟妇综合网二区| 日韩综合97P| 综合情欲网| suv精产一二三区| 国产精品一区二区手机看片| 在线观看不卡一区二区三区| 无码最新| 久久五月视频| 久久精品免费| 国模不卡一本二本三电影| 91日日夜夜| 91春色| 国模私拍一区二区三区神乳| 殴美在线AⅤ| 日韩97超碰中文字幕| 欧洲与亚洲欧美精品中文字幕| 男人精品天堂一区| 91精品丝袜久久久久久| 日本精品中文字幕视频| 琪琪精品免费一区二区三区 | 91中文精品日韩欧美在线| 夜夜福利| 好涩综合| 伊人黄色片| 五月丁香色婷婷| 欧美激情超碰777| 日日爽熟女| 日韩一区二区精彩视频| 久久久久成人亚洲国产| 亚洲精品一区中文字幕乱码| 国精综合一二三区影视| 欧美情色亚洲| 日韩黄片影院| 亚洲1区| 精品97久久综合| 农村妇女精品一二区| 51久久夜色精品国产麻豆| 超碰在线人妻| 秋霞午夜视频一区二区| 欧美色亚洲色| 亚洲性爱电影| 中文字幕日韩综合| 黄色一区三区| 91性色| 超碰成人国产| 一区二区三区四区久久视1| 亚洲资源一区| 激情五月天插| 97人肏| 精品国产a∨一区天美传媒| 欧美成人一级麻豆| 国产精品成人蜜臀AV在线| 视频在线观看一二三区| 九九九九热只有精品| 在线有码中文字幕| 大香蕉碰碰| 大干人妻| 日韩激情啪啪啪| 黑丝内射一区二区三区| 日日日日做夜夜夜夜做无码97| 亚洲日韩视频二区| 青青国产精品在线| 免费99精品国产自在在线| 国产精品久久久无码aV去| 亚洲图片 91| 国产后入式在线观看| 在线观看无码三级少妇| 综合国产97| 东京热综合久久一区二区| 多乙久久久久久| 国产美女91视频| 97精品国产| 99亚亚热| 91欧| 日操粉逼逼| 使劲用力艹少妇视频一区二区 | 亚洲天堂在线怕怕视频| 极品色社| 欧美丝袜中文字幕07在线| 熟妇操花| 亚洲国内精品成人不卡| 国产又黄又粗的视频| 国产人伦精品一区二区三区| 老色鬼成人精品视频下载大在线观看| 亚洲AV乱码专区国产噜噜亚洲 | 97九色人妻| 精品人妻久久久久一区二区三区| 日本Xx性爱| 无码男人天堂| 亚洲日韩视频二区|