久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码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
返回資訊列表
亚洲 欧美 综合 91| 717影院理论午夜伦八戒| 九九久久久九九| 久久香蕉国产线看观看亚洲女人 | 东京男人天堂| 天天色悠悠激情| 伊人一级免费黄片| 亚洲图片视频小说| 麻豆激情综合| 欧亚洲精品有视频| 五月丁香激情啪啪| 欧美经典一区二区三区| 玖玖爱在线视频免费观看| 久久视频,这里只有精品 | 人人弄人人摸| 夜夜高潮夜夜爽夜夜爱爱一区| 97一区二区蜜臀| 激情开心五月天| 国产精品一区人妻精品阁在线| 亚洲第2页| 蜜臀久久99精品久久久久| av大香蕉| 午夜欧美女人操逼| 黄色性爱网网| 国产乱码精品一区二区三区四川| www.久久最新地址| 国产黄色在线播放观看| CCYY草草影院地址入口| 天天干天天操天天操夜夜操天天操 | av中文在线| 日韩精品碰碰| 久久久久人妻二区精品叶可怜| 蜜臀99久久国产| 色原狠狠天天天| 久久久成人免费av电影| 亚洲性综合| 殴美日韩m| 狠狠干综合| 秋霞曰韩R级| 熟女人妇一区二区三区| 人妻嗯啊啊在线播放| 亚洲码专区| 国产av强奸美女| 超碰亚洲欧美日韩无| 日日躁夜夜躁狠狠躁超爽| 激情AV| 囯产精品久久久久久久久久梁医生| 激情人妻另类| 一本色道久久综合狠狠操| 亚洲高清少妇| 香蕉人欧美综合| 国产在线能看的你懂的| 黄色视频特级毛片| 91一起操| 91啪9色| 日韩操呦呦影院在线观看| 亚洲AV不卡在线观看尤物| 日韩超碰精品综合| 综合九九| 人人操欧美风骚| 国产精品96| 日韩性爱啪啪视频| 操逼1区| 操逼网站视频漫画国产| 六月丁香网| 亚洲国产一区二区三区在线| WWW.加勒比人妻一区不卡.com| 亚州色图片在线色| 丰满人妻一区二区三区免费 | 大香蕉在线SuP| 欧美淫乱视频| 日韩精品人妻| 99在线观看| 国产91美女高潮| 国产怡红院| 亚码人妻| 欧美夜夜草视频| 欧美操逼熟女| 久久欧美按摩999| 青青草好吊| 诱惑网综合| 欧美亚洲第一页| 五月天激情影院| 蜜臀精品1区2区| 不卡一区视频| 国产白丝精品在线观看| 日韩性爱小视频在线观看| 91人妻超碰| 久久久成人精品| 亚洲色天| 插入综合网| 东北操逼| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 强奸乱伦大香蕉网| 高清不卡一二三区视频......| 噜噜噜亚洲精品| 国产农村妇女毛片精品久久| 国产 日韩 欧美高清| 亚洲色图大香| 久久久亚洲熟妇资源| 人人做,人人操,人人摸| 亚洲图片欧美日韩| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 操www| 婷婷五月天成人| 色欲色香天天天综合网www-亚洲综合国| 一区二区三区麻豆| 手机看片1025| 中文无线日韩一区| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 国产精品9999| www.人人cao| 欧美视频第二页| 少妇淫妇久久久久久久| 日韩亚洲美州欧洲综三区一品在线| 国产一区二区久久| 老子午夜伦不卡影院| 人妻熟女字幕一区二区| 九久9精品| A V少妇特黄三级| 亚洲双插| 97干日韩| 亚洲精品乱码线路中文字幕| 精品无码一二三四区| 91福利网在线观看| 亚洲妇色| ,成人免费啪啪视频| AV天堂男人的天堂| 久久久久久久久久va| 欧美熟妇精品黑人巨大一二三区| 农村女一级毛卡片| 国产熟女一区二区丰满| 亚洲国产成人福利在线观看| 97 九色| 日韩高清黄片| 日本999精品| 狼狼色丁香久久婷婷综合五月| 人人操天天爽| 激情国产乱伦Av| 330dv亚洲成年视频网| 美女写真| 国产福利精品98视频| ,国产乱人伦精品一区二区三区| 97久久国产精品女不卡| 国产精品小视频一区二区三区| 99国产精品| 无码一区二区三区四区五区六区七区八区九区十区视频 | 无码78| 少妇二级| 国产三级中文有码在线视频| 国产日本一区二区三区蜜臀在线观看| 5252色欧美在线| 先锋色眉乱伦资源| 国产精品视频内谢女人| 色制服丝袜夫妻av一区| 日韩性爱网址| 日本精品五区| av72网| 操一区| 亚洲超碰97| #NAME?| 99亚亚热| 国产女人和拘做爰视频| 欧中美三级一区二区三区| 欧洲综合视频| 亚洲古典另类欧美在线| 丁香九月婷婷| 欧美天天影院| 69久久久久久久久久久久久| 一区二区 韩日AV| 色视频蜜乳| 天天干电影| 久色99999| 五月丁香啪啪啪| 草莓精品视频在线免费观看| 熟女探花啪啪| 另类图片欧美激情综合| 日曰骚久久精品| 欧美亚洲涩涩| 老汉网| 99热这里只有精品9| 亚洲黄片免费在线播放| 国产无码三级视频在线观看| 人人操人人操人妻人| 亚洲美女 晚间男人天堂 | 老女人老91妇女老热女| 大香蕉在线视频15| 久草大| 一区二区三区探花在线观看| 视频一区二区免费在线| 中文字幕一区二区三区人妻不卡| 噜噜噜久久亚洲精品色情| 日韩三四五区| 操操啪| 欧美性巨大╳╳╳╳╳高跟鞋| 免费视频一二三区| 欧美一区二区男人天堂| 精品人妻15区| 亚洲成人贴图| 蜜臀久久99精品久久久久| 欧美高清91| 国产吹潮女在线观看| 60秒试看最爽10分钟网站| 大香蕉97久久| 91九久| 天天做天天爱天天高潮| 爱我干综合| 啪啪视频亚洲第一| 一级毛片久久久久久久女人18| 婷婷爽人人婷婷爽视频| 大香蕉日韩| 精品人妻一区二区免费蜜桃| 91性感网站| 五月开心久久AV官网| 在线啊啊啊啊| 裸模AV女优| 91超碰人人| 人人天天欧洲| 天天肏美女| 99国产精品人妻人伦| 国内91熟女人妻丝袜天天精品视频在线| 亚洲日韩成人性爱视频| 五月天综合网| 久久精品视频久久久| 青娱乐av在线| 亚洲天堂人人妻| 91高跟美女在线播放| 99re99视频在线免费观看| 亚洲的天堂网| 蜜臀久久99精品久久久久久成人小说| 日日骚网站| 九九草| 97色碰| 国产AAAAAABBBBB| 人干人人人操人人摸| 国产区91柔拿会所技师| 91在线无码精品秘 软件| 99啪啪| 东北女人被操| 亚洲一区制服诱惑| 激情欧美97| 久久伊人最新网址视频| 无遮挡一级毛片视频免费的| 日韩AV无码中文一区二区| 亚洲欧美日韩精品久久久一区二区 | 国产高清视频无码在线| 啪啪免费| 青青操97| 亚洲好色人妻| 午夜性刺激视频免费观看| 家庭乱伦国产| 97在线精品| 亚洲男人的天堂V| 国产乱码精品久久久久久| 怡红院网站在线视频| 97视频免费播放| 尹人免费观看视频在线| 欧美亚性天堂| 久久视频,这里只有精品| 欧美v日韩v亚洲v最新在线| 2018天天干在线视频| 久久精品美女一区| 加勒比五月天| 凹凸久久人人| 毛片17S| 中文日韩欧美熟| 欧美综合自拍| 99色| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 啊啊啊 在线观看| 91国产美女丝袜足交精品视频| 蜜区区视频79| 亚洲女毛多水多21P| ss久久| 日本道人妻久久久在线不卡色视频| 精品久久久av无码免费| 久久思思热| 综合网97| 99在线无码精品秘 入口黑人| 亚洲少妇喷视频看| 成人九九| www.99在线| 日韩综合色网| 人、人、摸,人、人、草| 欧美熟女妇同| 日本伦乱九九九综合| 五月丁香激情综合网| 91欧美性| 自拍偷拍 高清无码| 黄总AV色图| 一区AV| 久久精品亚洲婷婷| 欧美一区二区男人天堂| 中文久久96| 美欧色综合| 免费超碰97在线观看| 殴美,日韩国产伦精品| 久久九九97| 人妻-91porn| 97精品在线| 日韩乱伦AⅤ| 加勒比AV网| 一级做a爰片性色毛片久久| 97干色天堂| 成人免费性爱视视| 骚逼一区二区| 丝袜剧情| 欧美人妻少妇| 久久不卡一区二区 | 欧美日韩高潮喷水91| 清纯唯美综合| 你操综合| 国产精品久久久久久久免牛肉蒲团| 18禁的网站在线| 欧美91精彩| 六月婷婷色综合| 四虎AV在线观看| 九色 蝌蚪 熟女自| 人妻AV在线| 亚洲激情在线| 色性欧美| 人人操人人操人人人操| 精品久久大胆人体| 九九色综合| 天天综合网在线观看| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 久草加勒比一区在线| 97午夜剧场日韩| 成人自拍三级在线观看| 熟女网站最新| 国产超碰人人操| 亚洲女人91| 91校园春色长篇| 香港澳门日本三级网站| 桑老女人九区| 台湾肥佬网一区二区三区| 被男人添B超爽视频| 性感美女啊啊啊在线| 丁香五月av| 四虎午夜影院| 精品女同一区二区三区| 4141514逼喷水三级片| 天天操夜夜嗨| 久久一二三四| 欧美色图自拍| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 欧美亚州综合网图片| 人人澡人人爽人人精品| 色婷婷丁香五月| 大香蕉一区二区在线观看.| 色97综合中文字幕| 嗯嗯,好大,好爽,好骚| 五月婷婷久久综合| 精品国产一区二区三区久久久蜜臀| 岛国免费视频在线| 人妻第一页| 91国产美女丝袜足交精品视频| 五月丁香| 在线观看日韩av不卡| 99无码狠狠久久| 在线电影亚洲色图| 国产美女精品| 欧美日韩国产中文精品字幕自在自线,| 日本不卡高清视频| 超碰色男人操熟女| 欧美A片中文字幕| 亚洲人妻精品一区二区| 欲色啪| 东北女人被操| 91伊人大香蕉| 欧美成人色| 亚洲成人一二三区| 91爱综合| 大香蕉AV丝袜| 97人妻色| 伊人天堂在线| 蜜桃久久一区二区三区| 91狠狠综合久久| wwwcaobibi| 亚洲无吗在线视频| 自拍偷拍 高清无码| 黄片免费视频2019| 亚洲日韩精品一区视频在线| 日本东京热加勒比久久| 日韩无码a片| 人妻一区二区三区视频| 欧美视频一| 福利视频网站| 亚洲青色欧美| 91暧暧| 岛国AV一区二区电影| 综合久草| 久久久∴| 国产风韵犹存熟妇三区| 综合亚洲网| 亚洲天堂男| 啊啊啊爽爽| 大香蕉一级黄色片久久| 天天影视色香欲综合网小说| 亚洲精品三区在线观看| 欧美成va视频网站| 国模一区二区三区| 91 丝袜在线| 果冻传媒A片一二三区| 久久是精品| 欧成人在线| 亚洲国产综合图区中文字幕| 不卡av在线中文字幕| 萌白酱自拍视频| 综合色色网| 五月丁香影视| 打av高清| 欧美肥臀在线| 超碰97久久| 啪啪啪东京| 国产精品久久久久久久久AV大片| 中文高清一区二区的| 99国产在线绯色一区| 欧美91网站| 亚洲久久天堂| 自拍偷拍草一草| 免费av大片| 东北夫妻性偷拍| 日本999精品| 丝袜加勒比| 91精品无码久久久久久久 | 一区中文字幕二区日韩| 久久婷婷一区| 日韩操逼性鲍| 丁香五月天社区| 久久久久久波多野吉衣高潮| 亚州欧美另类| 日韩中文字幕人妻视频| 熟妇人妻精品一区二区视频色欲| 天天综合网合集91| 先锋影音av先锋一区| 日日夜夜天天| 尤物网站91| 能在线播放的国产三级| 内射白嫩美女| 中日992视频| 无码操逼视频一下| 色色亚洲| 蜜臀中文无码午夜| 日本一区视频在线观看| 狼人综合婷婷激情四射 | 欧美日韩少妇色情| 人妻少妇久久中文字幕一区二区 麻豆 | 亚洲黄色网址视频| 又摸又舔在线观看网站| 国产深喉视频一区二区| 色噜噜人妻丝袜a∨先锋影| 色眯眯射| 七月婷婷综合| 亚洲色图91欧美日韩| 死我十八禁| 亚洲精品国产专区在线观看| 伊人丝袜美腿高跟在线观看高清| 久一区久久蜜桃| 天天精品| 夜夜无码| 日本高清一区二区在线| 亚洲精品黑丝| 人妻aa| 啊啊啊啊啊好舒服视频| 亚洲精品官网在线观看| 狠狠2050在线观看| 曰本人妻人人澡人人夹| 精品人妻一区二区三区视频| 亚洲伊人a线观看视频| 草b在线| 七月丁香婷婷| 久久久久国产亚洲一区欧美色图日韩| 亚洲美女精品九九视频| 亚洲综合色网| 超碰九7| 日韩另类色图| 国产精品爆乳懂色蜜乳| 综合网久久| 欧美日韩*字幕一区| 日韩激情无码影院| 玖玖爱免费观看视频| 国产亚卅97| 日本黄色精品专区网站| 精品国产99| 日韩99精品视频综合区 | 久久99久久99精品天美传媒棢·纸:.| 92午夜免费福利视频| 在线小视频| 亚洲精品日日夜夜52| 人妻精品一区一区三区蜜桃91| 性在久久久久久| 都市久久精品激情亚洲| 青娱乐国产精品| 东方亚洲在线操逼天堂| 超碰成人免费| 欧美gv在线观看| 91天天爱| 国产67194| 另类图片综合| 一区二区三区色综合| 亚洲 欧美 手机在线观看| 午夜福利 成人 91| 伊人影院在线理论播放 | 亚州色图第三区| 亚洲啪啪视频免费| 超碰欧美97资源| 久久久成人免费av电影| 天天插天天插| 在线色导航| 四虎在线视频| 啊啊啊不要啊啊受不了了视频在线 | 亚洲欧洲综合av在线| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | www熟女乱伦com| 天天舔天天日天天射| 婷婷精品| 亚洲欧美自拍偷拍| 中文字幕制服诱惑| 超碰在线第一页| www.狠狠干.coom | yazhousetuoumei| 黄色性爱网网| 国产精品人妻一区二区| 亚洲图片小说欧洲| 欧美 亚洲 另类 综合| 志村玲子视频一区二区| www国产天美久久久| 欧美日本成人一区二区| 91综合天天| 婷婷综合激情| 视频一区二区免费在线| 另类老少妇| 欧美日韩电影一区二区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 久欲AV| 欧美久久毛片基地| 久久久九97| 免费精品福利在线观看| 国内毛片婷婷六月色| 久久精品一区二区一8| 97中文综合| 91AV天美在线视频| 亚熟hd视频在线| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 五月婷色| 黄色片大香蕉| 国产精品一级片在线看| 黄色电影在线播放综合网站 | 精品久久久av| 欧美亚洲综合色| 大香蕉人妻| 俺去俺来也在线www| 亚洲一曲日韩精品| 精品人妻中文字幕4399| 欧美片第一页| 日韩有码 一区二区三区| 国产精品熟女一区二区三区| 亚洲不雅视频1区二区| 国际精品久久久| 超碰在线日韩一区| 亚洲第一页色网| 清纯唯美综合亚洲| 另类欧美综合| 欧美在线啊啊| 久久夜夜| 欧美极品美女aaaaaa级黄片| 精品性爱| 亚洲欧美在线观看无码| 亚洲国产精品9999在线观看| 国产av波波国产精品| 青娱乐亚洲自拍| 欧美人妻一区| 99视频内射三四| 色玖玖| ,国产乱人伦精品一区二区三区| 丰满人妻一区二区三区四| 中文字幕av色| 99热 按摩 日韩| 午夜AV污污污| 久久婷婷成人综合色怡春院| 欧美少妇色图| 国产日韩色综合| 五月天人妻综合| 亚洲日本大香蕉1| AV天堂因数| 国产女大学生AV| 欧美性爱免费短视频| 亚洲AV噜噜狠狠网址蜜桃动漫| 青草青草久热| 天天爱天天韩国日本牛牛牛牛| 欧插网站| 少妇内射视频| 伊人网高清| 午夜福利无毒不卡| 久久草在线综合视频| 国色天香av| 亚熟hd视频在线| 91 偷| Sekablack无码一区| 九九探花视频在线观看| 久热色情精品| 欧美爱国产综合、| 日本影视久久免费| 澳门特级毛片免费观看| 亚洲免费精品一区| 97人妻人人躁人人玩人人| 亚洲毛片基地专区| 国产午夜无码片在线观看影视| 亚洲色吧网| 日韩中文字幕宗合在线| 久久久97| 综合激情五月丁香| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 亚欧毛片基地国产毛片基地| 国产精品婬乱一级毛片彝族| 玖玖97综合| 国产人妻精品一区二区三区秋霞 | 亚洲黄网在哪免费看| 亚洲精品蜜桃久久久一区二区三区| 亭亭在线资源| 在线观看亚洲成人精品| 久久精品人体AV| 婷婷激情五月综合| 成人性爱av| 18一区二区三区| 97国产|免费| 亚洲天堂7777| 国产精品第二页| 99久久无码| 开心五月深爱五月| 欧美色图小说综合| 人妻81p| 性色高清在线| 亚洲 暴爽 AV人人爽日日碰| 五月婷丁香| 欧美韩日精品99综合| 日韩丰满熟妇| 国产久久久久影院老熟女| 久久久一区二区三区三州| 九九九网页| 亚洲婷婷丁香在线| 看看小穴| 老司机福利青青草| 少妇免费视频| 日韩一级欧美一级国产一级台湾 | 少妇色| 人夜夜精品网站香蕉嫩草| 91日韩网站| 99久久婷婷国产综合| 国产精品69久久久久久久| 欧美日韩性爱无码| 人人爽夜夜玩视频| 亚洲成A∨人影院在线欢看| 青操影院| 日本肉体xxxx裸交| 久9爱精品| 尹人大香蕉视频在线| 91老司机视频| 欧美黑人性猛交91| 亚洲人成网站7777| 国产极品久久久| 久久黄色视频一区二区三区| 97爱碰| 日本欧美国内在线| 9久久久久| 嗯阿好爽好紧| 欧美日韩国产中文精品字幕自在自线| 天天情欲宗合网| 九九色逼| 亚洲中文字幕精品一区| 九九九九免费高| 色综合久| 亚洲中文字幕av| 嗯嗯啊啊视频在线看| 欧美日韩另类激情图片| 91 丝袜在线| 精品人妻一区| 亚洲高清欧美总合| 久久久久一本一区二区青青蜜月| 2020中文在线一区二区三区| 国产女主播视频在线观看| 熟妇熟女视频一区二区三区| 亚洲日韩人妻中文字幕一区| 久热久操| 亚洲天堂区| 精品无码久久久久久国产浪潮| 男人天堂网手机版婷婷| 口爆综合网| 日韩中文字幕人妻视频| 欧美性爱一区二区三区| 亚洲永久AV无码精品秋霞| 色哟哟511老熟女| 992视频一区| 99啪啪| 俺去也婷婷| 草草影院最新网址| 天美传媒AV在线播放| 夜夜操一区二区| 欧美天天插| 96久久精品一二三区色欲| 男女一进一出视频久久| 男人天堂网手机版婷婷| 涩爱AV在线| 精品成人av一区二区三区在线| 成年人网站在线免费观看| 国产丁香精品露脸视频| 动漫区日韩区欧美区| 亚洲不卡AV在线| 国产剧情AV不卡在线观看| 成人一二| 91性感在线| 久久精品视频一区三区小泽玛利亚| 欧美后进式| 日韩成人性爱电影在线播放| 久久精品国内Av熟女高清| 丰满人妻-区二区三区免费看| 后入式在线免费观看60秒| 神马精品视频| 五月婷婷五月天| 多乙久久久久久| 涩综合导航| 亚州91| 精品视频久久| 少妇大屁屁| 中精品一区二区三区| 亚洲少妇色图自慰直播| av在线人气| 最新AVzaixian| 久久精彩视频| 五月天色图| 中文字幕在线观看二区三区| 亚洲最大的综合性av| www.99中文字幕| 91人妻最真实刺激绿帽| 亚洲熟女乱色一区二区三区| 啪啪综合网| 久久男人的天堂| 久久青青草在线视频| 国产精选视频| 日韩精品一区二区人人人| 欧洲一区二区| 国产综合久| 亚洲色人阁| 老鸭窝成人免费毛片视频| 亚洲Av诱惑| 97碰久久| 国产h小视频在线观看免费| 亚洲欧美首页| 国产一级舔足在线观看| 亚洲欧美国产中文视频| 国产精品久久久久久久久久梁医生| 日本视频在线中文字幕| 欧美性爱日韩高清| 2017人人操,人人摸| 最新三级网址| 国产精品香蕉热久久新品| 亚洲偷拍自拍在线视频| 99爱精品| 久草视频制服诱惑| 欧美日韩国产电影| 校园春色欧美| 78精品在线| 亚洲欧美日韩中文播放| 国产精品爱欲| 午夜寂寞欧美| 久热这里| 一个人在线看的黄色电影网站| 啊啊啊啊啊好大好舒服想要| 超碰97久久国| 涩涩这里只有精品视频| 男人久久天堂| 最新亚洲黄色免费电影| 一个人免费视频观看在线WWW| 高清无码在线播放网站| 人人插人人摸人人| AA丁香综合激情| 国产白嫩精品久久| 玖玖爱伊人玖玖爱| 熟妇色99| 国产毛片久久久久久久| 午夜男人一级A片7777| 青青国产精品在线| 亚洲欧洲无码一区夜| 夜夜操中文字幕| 美女刺激久久国产欧美| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 3p国产欧美99热| 天天日老熟妇| 91欧美性| 男啪女色黄无遮挡免费观看| 精品偷拍13p欧美dodk视频| 97婷婷色| 99热导航| 色图综合| 亚洲 一区二区 自拍| 亚洲,欧美,春色,另类| 乱老熟女一区二区三区| 亚洲交性| 操逼啊啊啊91| 亚洲s在线观看| 欧美,亚洲,日韩,v,天堂,手机在线观看 | 国产日韩欧美亚洲精品95| a网站免费观看| 熟女精品一区二区在线观看| 人干人人人操人人摸| 午夜舔阴达高潮视频免费看| 午夜一区二区三区国产| 亚洲天堂,男人| 日本高清熟女久久一区| 大JI巴好深好爽又大又粗视频| 最新日产中文在线麻豆| 九九热超碰97亚洲最新香蕉| 久久精品超碰| 睡产熟女乱伦| 77国产精品| 九九九精品成人免费视频小说| 亚洲人妻av| 亚洲系列欧美| 91午夜无码| 欧美在线伊人色| 久久久精品网| 九九色热| 亚州精品人妻一二三区| av最新免费中文字幕| 蜜桃传媒一区二区亚洲| 91亚洲人| 国产精品色色| 欧美色蜜桃97| 欧美精品自慰系列寂寞少妇| 欧美一区二区三区黄色影视| 亚洲图片激情综合另类| 色91综合网| 秋霞色色影院| 91逼逼女人91| 伊人国产成人av网站| 性色一线| 无码人妻精品酒店| 熟女丰满人妻一区| 操东北女人| 国产精品乱人伊人网| 国产强奸无码乱伦| 操我啊啊啊啊啊| 成年人黄色视频免费| 很黄很污的免费网站| 被窝影院午夜看片无码| 欧美第38页| 男人的天堂午夜av| 九九九九九九九九九九精品视频| 久久综合国产精品国产| 欧美成人色| 国产熟女完整版中字| 美女黑人91神马| 国产综合永久精品日韩鬼片| 亚洲se电影| 日本久久天堂| 在线观看中文字幕| 亚洲男人的天堂AV| 乱论91| 插插综合网天天影视网| 男人的天堂不卡一区二区| 久热一区二区| 75大香蕉| 精品国产www久久| 亚洲第一视频 欧美风情 日韩| 无码又爽又硬又激情免费视频| 欧成人精品H无码| 一区 欧美 日韩 麻豆| 国产东北女人在线视频| 亚洲AV色图一区| 丝袜美腿诱惑亚洲欧美视频在线观看 | 中文字幕神马久久| 亚洲精品久久久久久久蜜桃臀| 欧美色图电影| 青女在线| 这里只有精品视频在线| 久久久99免费| 玖色av| 黄色成品网站| 欧美精品自慰系列寂寞少妇| 超碰色综合| 任你干在线视频| 大香蕉伊人色偷偷在线| 嗯啊视频免费在线观看| 欧美日韩人妻精品系列一区二区三区| 欧美精品在线观看| 色噜噜精品一区二区三| 国产乱子伦久久精品综合一区二区三| 偷拍超碰| 久青草影院| 日韩欧美国产一区二区三区四区| 欧美天堂在线| 999九九精品| 精品国产乱码久久久久久久久1| 国产一级高跟丝袜| 91精品国产一区三一| 国产少妇高潮| 亚洲天堂性爱| 日韩女模中文造逼| 久久久久亚洲三级电影| 男人的天堂99| 亚洲偷拍欧美激情| wwe 天天干.com| 日本三级黄页| 新婚人妻扶着粗大强行坐下| 国内精品嫩模A∨私拍小视频| 亚州欧美在线| 国产乱青青草久久| 观看视频图片一区二区三区| 日韩在线观看中文字幕视频| 粉嫩av久久一区二区三区| 99999国产精品| 蜜臀在线看片| 91天射| 久久九七| 亚洲天堂人妻一区二区| 精品成人av一区二区三区在线| 午夜超爽| 国产午夜福利专区综合| 亚洲欧洲激情卡通另类文学四射小说网站| 国产女人9999| 97亚洲欧美日韩| 99 国产丝袜在线| 用力操死我| 91人妻丝袜无码| 国产久久一区二区午夜| 丁香六月婷婷| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | japan日本高清乱xxxx| 色y情视频免费看| 国产精品内射婷婷一级二| 99re99| 久久加勒比| 搡老女人老熟女91老熟女综合网| 麻豆天美AV传媒第一页| 99热国产精品| 97综合久第一页| 啊啊啊轻点在线观看| 欧美最大综合网| 日韩精品国模| 色偷偷超碰亚洲| 激情文学小说一区二区 | 韩国午夜理伦三级好看| 一牛影视成人片免费| 天堂俺去俺来也www久久婷婷| 亚洲精品尤物yw在线影院| 精品无码久久久久久国产浪潮| 免费福利视频中文字幕| 国产精品人妻熟女aⅴ| 欧美极品性爱天天射| 91爆操视频| 久草大| 中文字幕在线观看丝袜| 欧美午夜精品久久久久久超碰| 91九久| 久久久久久久久久黄色网 | A片 AV一级在线播放观看免费| 亚洲国产高清福利视频| 91丨九色丨国产打屁股| 欧美有码激情视频一区二区三区| 久久黄黄| 中文字幕日韩精品一区二区三区| 日本一天色道久久久精品视频| 亚州日韩97| 天天色综合影视网| 大香蕉78| 91碰超| 亚洲另类在线观看| 久久人人爽爽爽人久久久| 无码久| 在线洲亚线| 国产一级内射高清视频 | 四虎免费在线播放| 欧美日韩在线小说| 乱伦色图网址是多少| 综合自拍| 亚洲美女精品| 国产免费一区| 欧美 亚洲| 成人性爱av| 99亚洲天堂| 亚洲欧美九九九| 国产精品毛片| 欧美v日韩v亚洲v最新在线| 日韩欧美成人综合在线| 大香蕉人妻| 日日A∨| 亚洲欧美91| 色在线亚洲视频www| 婷婷色导航| 操死我了嗯嗯嗯| 日韩97在线| 黄色电影观看久久9| 久久超碰爱| 91男人天堂网| 天天干天天操天天操夜夜操天天操| 麻花传媒免费网站在线观看| 精品妇女一区二区三区| 加勒比伊人影院| 国产女大学生AV| 久久99精品视频| 久久久久亚洲一区女同性恋中文字幕| 久久久精品,3| 操逼国产免费| 刺激性视频黄页| 漂亮人妻被强中文字幕hd| www.久久制服糖| 久久男人的天堂国产| 四虎在线免费视频| 你懂的在线观看区国产| 天天日日夜夜| 亚洲女人毛茸茸91| 免费无码国产精品v片在线观看| 女同在线视频一区| 在线洲亚线| 熟女精品va中文字幕| 老熟女熟妇| 国产一级高清免费观看| 九九久久综合| 青青草原成人| 91成人久久 | 激情文学亚洲| 三级三级三级a级全黄三| 97超久碰| 欧美精品精品一区二区| 超碰av人人人| 日韩精品三级| 日本3级一区二区免费| 青青草玖玖爱| 国产中文大片资源中文字幕| 欧美熟妇精品黑人巨大一二三区| 久夜视频| 人人色97| 午夜精品久久99蜜桃的功能章节| 五月婷婷六月丁香| 久久蜜桃一区二区| 天天色播| 成人国产二区三区在线,男女精品。| 国产AV超爽| 国产97/欧美| 婷婷丁香五月激情啪啪| 亚洲玖玖爱| 欧美性生活综合| 97欧美资源| 亚州国产精品乱| 亚洲人久久久久日| 男人的天堂啪啪| www.男人的天堂| 韩国久久97| 色综合av综合久久| 91欧美偷拍| 精品国产乱码| 9长久久精品| 无码av永久免费专区网站| 加勒比av官网在线| 久久久久国产精品片区无码直播| 欧洲站一级二级三级h| 91精品大奶人妻| 欧美性性性| 午夜激情床戏激情| 亚洲AV秘无码一区..| 天天内射| av凤凰久久久| 校园春色五月天| 国产人伦精品一区二区三区| 少妇高潮流水av免费| 日韩中文字幕2020| 国产精品亚洲免费| 日本女人久久久| 日本不卡码黄色| 人人操人人插人www| 丰满欧美放荡少妇在线| 99免费视频| 国产成人拍国产亚洲精品| 国产精品天干天干综合网麻豆 | 色香伊人| 天天干一干| 国产兽交视频在线播放| 日本黄色XXX| 日韩草久视频| 日本免费人成视频播放120秒| 久久精品国产97欧美精品亚洲 | 久久一二三四五六七八九区区| 91在线精品| 天天日天天干天天操| 久久99草| 久久99热这里只频精品6学生| CCYY草草影院地址入口| 日本高清一本二本免费不卡| 久久精品亚洲婷婷| 黄在线| 91亚洲综合| 东京热大香焦| 蜜桃久久久久久久| 丁香五月激情综合国产| 啪啪啪精品| 99999亚洲| 黄色片G G G| 欧美日韩免费专区在线| 日本韩欧美在线播放a| 人人操,人人插| 欧美性色欧美| 亚洲图片 激情小说| 五月天丁香欧洲日韩| 思思在线免费视频| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 91一区二区| 蜜乳AV一区| 综合久久少妇中文字幕| 久久成人东京热人妻| 精品国产99| 开心激情站| 欧美成人黄网色网站| 一级岛国大片| 久久91| 男人天堂2019| 九九久精品| 秋霞鲁丝午夜无码一区二区三| 国产又黄又猛又粗又爽的网站| 亚洲欧洲综合视频在线| 99久久e免费热视| 九九精品无码专区免费| 男人天堂网址| 九九九精品美女| 亚州,欧美在线| 亚洲精品人伦一区二区| 日本不卡二三区| 97干色天堂| 91久久久久久久久久久| 男人的天堂网免费| 激情五月丁香五月| 国内精品伊人久久久久影院会| 中文字幕一区二区在线日韩精品| 亚洲**2021在线观看| V A在线| 大香蕉一级黄色片久久| 91综合网站| 啊啊啊啊啊在线| 国产精品久久久久久久久久久久久久吹| 2020中文字幕在线| 国产精品动态一区二区三区四四| 熟妇高潮精品一区二区三区下载| 国产传媒美日韩av| 色九月综合| 欧美性暴力猛交XXXX | 一区二区三区一亚洲中文字幕、综合区灬| 97超碰免费生活| 亚洲青青草| 91精品少妇搡搡搡| 蜜桃臀久久| 国产在线激情| 国产路线专区| 99热在线观看| 亚洲精品国语在线播放| 日本中文熟女视频| 国产91会所女技师在线观看| 中文字幕乱码人妻二区三区| 久久这里是精品| 91天堂色男人的天堂| 中文字幕av亚洲在线|